14a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk/*
24a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
34a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk *
44a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
54a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * you may not use this file except in compliance with the License.
64a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * You may obtain a copy of the License at
74a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk *
84a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
94a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk *
104a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
114a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
124a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * See the License for the specific language governing permissions and
144a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * limitations under the License.
154a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk */
164a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
174a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#ifndef ANDROID_RSD_SHADER_H
184a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#define ANDROID_RSD_SHADER_H
194a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
204a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#include <utils/String8.h>
214a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
224a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk// ---------------------------------------------------------------------------
234a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouknamespace android {
244a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouknamespace renderscript {
254a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
264a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukclass Element;
274a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukclass Context;
284a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukclass Program;
294a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
304a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk}
314a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk}
324a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
334a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukclass RsdShaderCache;
344a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
354a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#define RS_SHADER_ATTR "ATTRIB_"
364a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#define RS_SHADER_UNI "UNI_"
374a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
384a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukclass RsdShader {
394a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukpublic:
404a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
414a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    RsdShader(const android::renderscript::Program *p, uint32_t type,
424a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk               const char * shaderText, uint32_t shaderLength);
434a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    virtual ~RsdShader();
444a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
454a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    bool createShader();
464a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
474a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    uint32_t getShaderID() const {return mShaderID;}
484a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
494a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    uint32_t getAttribCount() const {return mAttribCount;}
504a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    uint32_t getUniformCount() const {return mUniformCount;}
514a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    const android::String8 & getAttribName(uint32_t i) const {return mAttribNames[i];}
524a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    const android::String8 & getUniformName(uint32_t i) const {return mUniformNames[i];}
534a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    uint32_t getUniformArraySize(uint32_t i) const {return mUniformArraySizes[i];}
544a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
554a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    android::String8 getGLSLInputString() const;
564a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
574a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    bool isValid() const {return mIsValid;}
584a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void forceDirty() const {mDirty = true;}
594a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
604a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    bool loadShader(const android::renderscript::Context *);
614a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void setup(const android::renderscript::Context *, RsdShaderCache *sc);
624a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
634a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukprotected:
644a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
654a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    const android::renderscript::Program *mRSProgram;
664a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    bool mIsValid;
674a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
684a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    // Applies to vertex and fragment shaders only
694a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void appendUserConstants();
704a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void setupUserConstants(const android::renderscript::Context *rsc, RsdShaderCache *sc, bool isFragment);
714a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void initAddUserElement(const android::renderscript::Element *e, android::String8 *names, uint32_t *arrayLengths, uint32_t *count, const char *prefix);
724a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void setupTextures(const android::renderscript::Context *rsc, RsdShaderCache *sc);
73438505431c253fd891f3deda38033c30268913e8Alex Sakhartchouk    void setupSampler(const android::renderscript::Context *rsc, const android::renderscript::Sampler *s, const android::renderscript::Allocation *tex);
744a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
754a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void appendAttributes();
764a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void appendTextures();
774a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
784a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void initAttribAndUniformArray();
794a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
804a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    mutable bool mDirty;
814a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    android::String8 mShader;
824a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    android::String8 mUserShader;
834a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    uint32_t mShaderID;
844a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    uint32_t mType;
854a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
864a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    uint32_t mTextureCount;
87bbc41c034b0b851287c24c3a51a17586d9960026Alex Sakhartchouk    uint32_t *mTextureTargets;
884a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    uint32_t mAttribCount;
894a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    uint32_t mUniformCount;
904a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    android::String8 *mAttribNames;
914a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    android::String8 *mUniformNames;
924a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    uint32_t *mUniformArraySizes;
934a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
944a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    int32_t mTextureUniformIndexStart;
954a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
964a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void logUniform(const android::renderscript::Element *field, const float *fd, uint32_t arraySize );
974a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void setUniform(const android::renderscript::Context *rsc, const android::renderscript::Element *field, const float *fd, int32_t slot, uint32_t arraySize );
984a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void initMemberVars();
994a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void init();
1004a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk};
1014a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
1024a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#endif //ANDROID_RSD_SHADER_H
1034a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
1044a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
1054a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
1064a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
107