1 // 2 // Copyright 2015 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 // ProgramGL.h: Defines the class interface for ProgramGL. 8 9 #ifndef LIBANGLE_RENDERER_GL_PROGRAMGL_H_ 10 #define LIBANGLE_RENDERER_GL_PROGRAMGL_H_ 11 12 #include <string> 13 #include <vector> 14 15 #include "libANGLE/renderer/ProgramImpl.h" 16 17 namespace angle 18 { 19 struct FeaturesGL; 20 } // namespace angle 21 22 namespace rx 23 { 24 25 class FunctionsGL; 26 class RendererGL; 27 class StateManagerGL; 28 29 class ProgramGL : public ProgramImpl 30 { 31 public: 32 ProgramGL(const gl::ProgramState &data, 33 const FunctionsGL *functions, 34 const angle::FeaturesGL &features, 35 StateManagerGL *stateManager, 36 bool enablePathRendering, 37 const std::shared_ptr<RendererGL> &renderer); 38 ~ProgramGL() override; 39 40 std::unique_ptr<LinkEvent> load(const gl::Context *context, 41 gl::BinaryInputStream *stream, 42 gl::InfoLog &infoLog) override; 43 void save(const gl::Context *context, gl::BinaryOutputStream *stream) override; 44 void setBinaryRetrievableHint(bool retrievable) override; 45 void setSeparable(bool separable) override; 46 47 std::unique_ptr<LinkEvent> link(const gl::Context *contextImpl, 48 const gl::ProgramLinkedResources &resources, 49 gl::InfoLog &infoLog) override; 50 GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override; 51 52 void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override; 53 void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) override; 54 void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) override; 55 void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) override; 56 void setUniform1iv(GLint location, GLsizei count, const GLint *v) override; 57 void setUniform2iv(GLint location, GLsizei count, const GLint *v) override; 58 void setUniform3iv(GLint location, GLsizei count, const GLint *v) override; 59 void setUniform4iv(GLint location, GLsizei count, const GLint *v) override; 60 void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) override; 61 void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) override; 62 void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) override; 63 void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) override; 64 void setUniformMatrix2fv(GLint location, 65 GLsizei count, 66 GLboolean transpose, 67 const GLfloat *value) override; 68 void setUniformMatrix3fv(GLint location, 69 GLsizei count, 70 GLboolean transpose, 71 const GLfloat *value) override; 72 void setUniformMatrix4fv(GLint location, 73 GLsizei count, 74 GLboolean transpose, 75 const GLfloat *value) override; 76 void setUniformMatrix2x3fv(GLint location, 77 GLsizei count, 78 GLboolean transpose, 79 const GLfloat *value) override; 80 void setUniformMatrix3x2fv(GLint location, 81 GLsizei count, 82 GLboolean transpose, 83 const GLfloat *value) override; 84 void setUniformMatrix2x4fv(GLint location, 85 GLsizei count, 86 GLboolean transpose, 87 const GLfloat *value) override; 88 void setUniformMatrix4x2fv(GLint location, 89 GLsizei count, 90 GLboolean transpose, 91 const GLfloat *value) override; 92 void setUniformMatrix3x4fv(GLint location, 93 GLsizei count, 94 GLboolean transpose, 95 const GLfloat *value) override; 96 void setUniformMatrix4x3fv(GLint location, 97 GLsizei count, 98 GLboolean transpose, 99 const GLfloat *value) override; 100 101 void getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const override; 102 void getUniformiv(const gl::Context *context, GLint location, GLint *params) const override; 103 void getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const override; 104 105 void setPathFragmentInputGen(const std::string &inputName, 106 GLenum genMode, 107 GLint components, 108 const GLfloat *coeffs) override; 109 110 void markUnusedUniformLocations(std::vector<gl::VariableLocation> *uniformLocations, 111 std::vector<gl::SamplerBinding> *samplerBindings, 112 std::vector<gl::ImageBinding> *imageBindings) override; 113 getProgramID()114 ANGLE_INLINE GLuint getProgramID() const { return mProgramID; } 115 116 void enableSideBySideRenderingPath() const; 117 void enableLayeredRenderingPath(int baseViewIndex) const; 118 119 angle::Result syncState(const gl::Context *context, 120 const gl::Program::DirtyBits &dirtyBits) override; 121 122 private: 123 class LinkTask; 124 class LinkEventNativeParallel; 125 class LinkEventGL; 126 127 void preLink(); 128 bool checkLinkStatus(gl::InfoLog &infoLog); 129 void postLink(); 130 131 void reapplyUBOBindingsIfNeeded(const gl::Context *context); 132 133 bool getUniformBlockSize(const std::string &blockName, 134 const std::string &blockMappedName, 135 size_t *sizeOut) const; 136 bool getUniformBlockMemberInfo(const std::string &memberUniformName, 137 const std::string &memberUniformMappedName, 138 sh::BlockMemberInfo *memberInfoOut) const; 139 bool getShaderStorageBlockMemberInfo(const std::string &memberName, 140 const std::string &memberMappedName, 141 sh::BlockMemberInfo *memberInfoOut) const; 142 bool getShaderStorageBlockSize(const std::string &blockName, 143 const std::string &blockMappedName, 144 size_t *sizeOut) const; 145 void getAtomicCounterBufferSizeMap(std::map<int, unsigned int> *sizeMapOut) const; 146 147 void linkResources(const gl::ProgramLinkedResources &resources); 148 void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding); 149 150 // Helper function, makes it simpler to type. uniLoc(GLint glLocation)151 GLint uniLoc(GLint glLocation) const { return mUniformRealLocationMap[glLocation]; } 152 153 const FunctionsGL *mFunctions; 154 const angle::FeaturesGL &mFeatures; 155 StateManagerGL *mStateManager; 156 157 std::vector<GLint> mUniformRealLocationMap; 158 std::vector<GLuint> mUniformBlockRealLocationMap; 159 160 struct PathRenderingFragmentInput 161 { 162 std::string mappedName; 163 GLint location; 164 }; 165 std::vector<PathRenderingFragmentInput> mPathRenderingFragmentInputs; 166 167 bool mEnablePathRendering; 168 GLint mMultiviewBaseViewLayerIndexUniformLocation; 169 170 GLuint mProgramID; 171 172 std::shared_ptr<RendererGL> mRenderer; 173 174 bool mLinkedInParallel; 175 }; 176 177 } // namespace rx 178 179 #endif // LIBANGLE_RENDERER_GL_PROGRAMGL_H_ 180