/*
 * Copyright (C) 2011-2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ANDROID_RSD_SHADER_H
#define ANDROID_RSD_SHADER_H

#include <utils/String8.h>

// ---------------------------------------------------------------------------
namespace android {
namespace renderscript {

class Element;
class Context;
class Program;

}
}

class RsdShaderCache;

#define RS_SHADER_ATTR "ATTRIB_"
#define RS_SHADER_UNI "UNI_"

class RsdShader {
public:

    RsdShader(const android::renderscript::Program *p, uint32_t type,
              const char * shaderText, size_t shaderLength,
              const char** textureNames, size_t textureNamesCount,
              const size_t *textureNamesLength);
    virtual ~RsdShader();

    uint32_t getStateBasedShaderID(const android::renderscript::Context *);

    // Add ability to get all ID's to clean up the cached program objects
    uint32_t getStateBasedIDCount() const { return mStateBasedShaders.size(); }
    uint32_t getStateBasedID(uint32_t index) const {
        return mStateBasedShaders.itemAt(index)->mShaderID;
    }

    uint32_t getAttribCount() const {return mAttribCount;}
    uint32_t getUniformCount() const {return mUniformCount;}
    const android::String8 & getAttribName(uint32_t i) const {return mAttribNames[i];}
    const android::String8 & getUniformName(uint32_t i) const {return mUniformNames[i];}
    uint32_t getUniformArraySize(uint32_t i) const {return mUniformArraySizes[i];}

    android::String8 getGLSLInputString() const;

    bool isValid() const {return mIsValid;}
    void forceDirty() const {mDirty = true;}

    bool loadShader(const android::renderscript::Context *);
    void setup(const android::renderscript::Context *, RsdShaderCache *sc);

protected:

    class StateBasedKey {
    public:
        StateBasedKey(uint32_t texCount) : mShaderID(0) {
            mTextureTargets = new uint32_t[texCount];
        }
        ~StateBasedKey() {
            delete[] mTextureTargets;
        }
        uint32_t mShaderID;
        uint32_t *mTextureTargets;
    };

    bool createShader();
    StateBasedKey *getExistingState();

    const android::renderscript::Program *mRSProgram;
    bool mIsValid;

    // Applies to vertex and fragment shaders only
    void appendUserConstants();
    void setupUserConstants(const android::renderscript::Context *rsc,
                            RsdShaderCache *sc, bool isFragment);
    void initAddUserElement(const android::renderscript::Element *e,
                            android::String8 *names, uint32_t *arrayLengths,
                            uint32_t *count, const char *prefix);
    void setupTextures(const android::renderscript::Context *rsc, RsdShaderCache *sc);
    void setupSampler(const android::renderscript::Context *rsc,
                      const android::renderscript::Sampler *s,
                      const android::renderscript::Allocation *tex);

    void appendAttributes();
    void appendTextures();

    void initAttribAndUniformArray();

    mutable bool mDirty;
    android::String8 mShader;
    android::String8 mUserShader;
    uint32_t mType;

    uint32_t mTextureCount;
    StateBasedKey *mCurrentState;
    uint32_t mAttribCount;
    uint32_t mUniformCount;
    android::String8 *mAttribNames;
    android::String8 *mUniformNames;
    uint32_t *mUniformArraySizes;

    android::Vector<android::String8> mTextureNames;

    android::Vector<StateBasedKey*> mStateBasedShaders;

    int32_t mTextureUniformIndexStart;

    void logUniform(const android::renderscript::Element *field,
                    const float *fd, uint32_t arraySize);
    void setUniform(const android::renderscript::Context *rsc,
                    const android::renderscript::Element *field,
                    const float *fd, int32_t slot, uint32_t arraySize );
    void initMemberVars();
    void init(const char** textureNames, size_t textureNamesCount,
              const size_t *textureNamesLength);
};

#endif //ANDROID_RSD_SHADER_H




