Home | History | Annotate | Download | only in libGLESv2
      1 //
      2 // Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
      3 // Use of this source code is governed by a BSD-style license that can be
      4 // found in the LICENSE file.
      5 //
      6 
      7 // Program.h: Defines the gl::Program class. Implements GL program objects
      8 // and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28.
      9 
     10 #ifndef LIBGLESV2_PROGRAM_BINARY_H_
     11 #define LIBGLESV2_PROGRAM_BINARY_H_
     12 
     13 #include <GLES3/gl3.h>
     14 #include <GLES3/gl3ext.h>
     15 #include <GLES2/gl2.h>
     16 #include <GLES2/gl2ext.h>
     17 
     18 #include <string>
     19 #include <vector>
     20 
     21 #include "common/RefCountObject.h"
     22 #include "angletypes.h"
     23 #include "common/mathutil.h"
     24 #include "libGLESv2/Uniform.h"
     25 #include "libGLESv2/Shader.h"
     26 #include "libGLESv2/Constants.h"
     27 #include "libGLESv2/renderer/VertexDataManager.h"
     28 
     29 namespace rx
     30 {
     31 class ShaderExecutable;
     32 class Renderer;
     33 struct TranslatedAttribute;
     34 class UniformStorage;
     35 class DynamicHLSL;
     36 }
     37 
     38 namespace gl
     39 {
     40 class FragmentShader;
     41 class VertexShader;
     42 class InfoLog;
     43 class AttributeBindings;
     44 class Buffer;
     45 
     46 // Struct used for correlating uniforms/elements of uniform arrays to handles
     47 struct VariableLocation
     48 {
     49     VariableLocation()
     50     {
     51     }
     52 
     53     VariableLocation(const std::string &name, unsigned int element, unsigned int index);
     54 
     55     std::string name;
     56     unsigned int element;
     57     unsigned int index;
     58 };
     59 
     60 struct LinkedVarying
     61 {
     62     LinkedVarying();
     63     LinkedVarying(const std::string &name, GLenum type, GLsizei size, const std::string &semanticName,
     64                   unsigned int semanticIndex, unsigned int semanticIndexCount);
     65 
     66     // Original GL name
     67     std::string name;
     68 
     69     GLenum type;
     70     GLsizei size;
     71 
     72     // DirectX semantic information
     73     std::string semanticName;
     74     unsigned int semanticIndex;
     75     unsigned int semanticIndexCount;
     76 };
     77 
     78 // This is the result of linking a program. It is the state that would be passed to ProgramBinary.
     79 class ProgramBinary : public RefCountObject
     80 {
     81   public:
     82     explicit ProgramBinary(rx::Renderer *renderer);
     83     ~ProgramBinary();
     84 
     85     rx::ShaderExecutable *getPixelExecutable() const;
     86     rx::ShaderExecutable *getVertexExecutableForInputLayout(const VertexFormat inputLayout[MAX_VERTEX_ATTRIBS]);
     87     rx::ShaderExecutable *getGeometryExecutable() const;
     88 
     89     GLuint getAttributeLocation(const char *name);
     90     int getSemanticIndex(int attributeIndex);
     91 
     92     GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex);
     93     TextureType getSamplerTextureType(SamplerType type, unsigned int samplerIndex);
     94     GLint getUsedSamplerRange(SamplerType type);
     95     bool usesPointSize() const;
     96     bool usesPointSpriteEmulation() const;
     97     bool usesGeometryShader() const;
     98 
     99     GLint getUniformLocation(std::string name);
    100     GLuint getUniformIndex(std::string name);
    101     GLuint getUniformBlockIndex(std::string name);
    102     void setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
    103     void setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
    104     void setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
    105     void setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
    106     void setUniform1iv(GLint location, GLsizei count, const GLint *v);
    107     void setUniform2iv(GLint location, GLsizei count, const GLint *v);
    108     void setUniform3iv(GLint location, GLsizei count, const GLint *v);
    109     void setUniform4iv(GLint location, GLsizei count, const GLint *v);
    110     void setUniform1uiv(GLint location, GLsizei count, const GLuint *v);
    111     void setUniform2uiv(GLint location, GLsizei count, const GLuint *v);
    112     void setUniform3uiv(GLint location, GLsizei count, const GLuint *v);
    113     void setUniform4uiv(GLint location, GLsizei count, const GLuint *v);
    114     void setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
    115     void setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
    116     void setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
    117     void setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
    118     void setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
    119     void setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
    120     void setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
    121     void setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
    122     void setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
    123 
    124     bool getUniformfv(GLint location, GLsizei *bufSize, GLfloat *params);
    125     bool getUniformiv(GLint location, GLsizei *bufSize, GLint *params);
    126     bool getUniformuiv(GLint location, GLsizei *bufSize, GLuint *params);
    127 
    128     void dirtyAllUniforms();
    129     void applyUniforms();
    130     bool applyUniformBuffers(const std::vector<Buffer*> boundBuffers);
    131 
    132     bool load(InfoLog &infoLog, const void *binary, GLsizei length);
    133     bool save(void* binary, GLsizei bufSize, GLsizei *length);
    134     GLint getLength();
    135 
    136     bool link(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader,
    137               const std::vector<std::string>& transformFeedbackVaryings, GLenum transformFeedbackBufferMode);
    138     void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
    139 
    140     void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
    141     GLint getActiveAttributeCount() const;
    142     GLint getActiveAttributeMaxLength() const;
    143 
    144     void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
    145     GLint getActiveUniformCount() const;
    146     GLint getActiveUniformMaxLength() const;
    147     GLint getActiveUniformi(GLuint index, GLenum pname) const;
    148     bool isValidUniformLocation(GLint location) const;
    149     LinkedUniform *getUniformByLocation(GLint location) const;
    150 
    151     void getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const;
    152     void getActiveUniformBlockiv(GLuint uniformBlockIndex, GLenum pname, GLint *params) const;
    153     GLuint getActiveUniformBlockCount() const;
    154     GLuint getActiveUniformBlockMaxLength() const;
    155     UniformBlock *getUniformBlockByIndex(GLuint blockIndex);
    156 
    157     GLint getFragDataLocation(const char *name) const;
    158 
    159     size_t getTransformFeedbackVaryingCount() const;
    160     const LinkedVarying &getTransformFeedbackVarying(size_t idx) const;
    161     GLenum getTransformFeedbackBufferMode() const;
    162 
    163     void validate(InfoLog &infoLog);
    164     bool validateSamplers(InfoLog *infoLog);
    165     bool isValidated() const;
    166 
    167     unsigned int getSerial() const;
    168     int getShaderVersion() const;
    169 
    170     void initAttributesByLayout();
    171     void sortAttributesByLayout(rx::TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS], int sortedSemanticIndices[MAX_VERTEX_ATTRIBS]) const;
    172 
    173     const std::vector<LinkedUniform*> &getUniforms() const { return mUniforms; }
    174     const rx::UniformStorage &getVertexUniformStorage() const { return *mVertexUniformStorage; }
    175     const rx::UniformStorage &getFragmentUniformStorage() const { return *mFragmentUniformStorage; }
    176 
    177   private:
    178     DISALLOW_COPY_AND_ASSIGN(ProgramBinary);
    179 
    180     bool linkVaryings(InfoLog &infoLog, FragmentShader *fragmentShader, VertexShader *vertexShader);
    181     bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader);
    182 
    183     typedef std::vector<BlockMemberInfo>::const_iterator BlockInfoItr;
    184 
    185     template <class ShaderVarType>
    186     bool linkValidateFields(InfoLog &infoLog, const std::string &varName, const ShaderVarType &vertexVar, const ShaderVarType &fragmentVar);
    187     bool linkValidateVariablesBase(InfoLog &infoLog, const std::string &variableName, const ShaderVariable &vertexVariable, const ShaderVariable &fragmentVariable, bool validatePrecision);
    188 
    189     bool linkValidateVariables(InfoLog &infoLog, const std::string &uniformName, const Uniform &vertexUniform, const Uniform &fragmentUniform);
    190     bool linkValidateVariables(InfoLog &infoLog, const std::string &varyingName, const Varying &vertexVarying, const Varying &fragmentVarying);
    191     bool linkValidateVariables(InfoLog &infoLog, const std::string &uniformName, const InterfaceBlockField &vertexUniform, const InterfaceBlockField &fragmentUniform);
    192     bool linkUniforms(InfoLog &infoLog, const std::vector<Uniform> &vertexUniforms, const std::vector<Uniform> &fragmentUniforms);
    193     bool defineUniform(GLenum shader, const Uniform &constant, InfoLog &infoLog);
    194     bool areMatchingInterfaceBlocks(InfoLog &infoLog, const InterfaceBlock &vertexInterfaceBlock, const InterfaceBlock &fragmentInterfaceBlock);
    195     bool linkUniformBlocks(InfoLog &infoLog, const std::vector<InterfaceBlock> &vertexUniformBlocks, const std::vector<InterfaceBlock> &fragmentUniformBlocks);
    196     bool gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std::vector<LinkedVarying> &linkedVaryings,
    197                                                const std::vector<std::string> &transformFeedbackVaryingNames,
    198                                                GLenum transformFeedbackBufferMode,
    199                                                std::vector<LinkedVarying> *outTransformFeedbackLinkedVaryings) const;
    200     void defineUniformBlockMembers(const std::vector<InterfaceBlockField> &fields, const std::string &prefix, int blockIndex, BlockInfoItr *blockInfoItr, std::vector<unsigned int> *blockUniformIndexes);
    201     bool defineUniformBlock(InfoLog &infoLog, GLenum shader, const InterfaceBlock &interfaceBlock);
    202     bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex);
    203     void defineOutputVariables(FragmentShader *fragmentShader);
    204     void initializeUniformStorage();
    205 
    206     template <typename T>
    207     void setUniform(GLint location, GLsizei count, const T* v, GLenum targetUniformType);
    208 
    209     template <int cols, int rows>
    210     void setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum targetUniformType);
    211 
    212     template <typename T>
    213     bool getUniformv(GLint location, GLsizei *bufSize, T *params, GLenum uniformType);
    214 
    215     static TextureType getTextureType(GLenum samplerType, InfoLog &infoLog);
    216 
    217     class VertexExecutable
    218     {
    219       public:
    220         VertexExecutable(rx::Renderer *const renderer,
    221                          const VertexFormat inputLayout[MAX_VERTEX_ATTRIBS],
    222                          const GLenum signature[MAX_VERTEX_ATTRIBS],
    223                          rx::ShaderExecutable *shaderExecutable);
    224         ~VertexExecutable();
    225 
    226         bool matchesSignature(const GLenum convertedLayout[MAX_VERTEX_ATTRIBS]) const;
    227 
    228         const VertexFormat *inputs() const { return mInputs; }
    229         const GLenum *signature() const { return mSignature; }
    230         rx::ShaderExecutable *shaderExecutable() const { return mShaderExecutable; }
    231 
    232       private:
    233         VertexFormat mInputs[MAX_VERTEX_ATTRIBS];
    234         GLenum mSignature[MAX_VERTEX_ATTRIBS];
    235         rx::ShaderExecutable *mShaderExecutable;
    236     };
    237 
    238     rx::Renderer *const mRenderer;
    239     DynamicHLSL *mDynamicHLSL;
    240 
    241     std::string mVertexHLSL;
    242     rx::D3DWorkaroundType mVertexWorkarounds;
    243     std::vector<VertexExecutable *> mVertexExecutables;
    244     rx::ShaderExecutable *mGeometryExecutable;
    245     rx::ShaderExecutable *mPixelExecutable;
    246 
    247     Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
    248     Attribute mShaderAttributes[MAX_VERTEX_ATTRIBS];
    249     int mSemanticIndex[MAX_VERTEX_ATTRIBS];
    250     int mAttributesByLayout[MAX_VERTEX_ATTRIBS];
    251 
    252     GLenum mTransformFeedbackBufferMode;
    253     std::vector<LinkedVarying> mTransformFeedbackLinkedVaryings;
    254 
    255     struct Sampler
    256     {
    257         Sampler();
    258 
    259         bool active;
    260         GLint logicalTextureUnit;
    261         TextureType textureType;
    262     };
    263 
    264     Sampler mSamplersPS[MAX_TEXTURE_IMAGE_UNITS];
    265     Sampler mSamplersVS[IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS];
    266     GLuint mUsedVertexSamplerRange;
    267     GLuint mUsedPixelSamplerRange;
    268     bool mUsesPointSize;
    269     int mShaderVersion;
    270 
    271     std::vector<LinkedUniform*> mUniforms;
    272     std::vector<UniformBlock*> mUniformBlocks;
    273     std::vector<VariableLocation> mUniformIndex;
    274     std::map<int, VariableLocation> mOutputVariables;
    275     rx::UniformStorage *mVertexUniformStorage;
    276     rx::UniformStorage *mFragmentUniformStorage;
    277 
    278     bool mValidated;
    279 
    280     const unsigned int mSerial;
    281 
    282     static unsigned int issueSerial();
    283     static unsigned int mCurrentSerial;
    284 };
    285 
    286 }
    287 
    288 #endif   // LIBGLESV2_PROGRAM_BINARY_H_
    289