1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2023 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker // ProgramExecutableGL.h: Implementation of ProgramExecutableImpl. 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_GL_PROGRAMEXECUTABLEGL_H_ 10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_GL_PROGRAMEXECUTABLEGL_H_ 11*8975f5c5SAndroid Build Coastguard Worker 12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ProgramExecutable.h" 13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/ProgramExecutableImpl.h" 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker namespace angle 16*8975f5c5SAndroid Build Coastguard Worker { 17*8975f5c5SAndroid Build Coastguard Worker struct FeaturesGL; 18*8975f5c5SAndroid Build Coastguard Worker } // namespace angle 19*8975f5c5SAndroid Build Coastguard Worker 20*8975f5c5SAndroid Build Coastguard Worker namespace rx 21*8975f5c5SAndroid Build Coastguard Worker { 22*8975f5c5SAndroid Build Coastguard Worker class FunctionsGL; 23*8975f5c5SAndroid Build Coastguard Worker class StateManagerGL; 24*8975f5c5SAndroid Build Coastguard Worker 25*8975f5c5SAndroid Build Coastguard Worker class ProgramExecutableGL : public ProgramExecutableImpl 26*8975f5c5SAndroid Build Coastguard Worker { 27*8975f5c5SAndroid Build Coastguard Worker public: 28*8975f5c5SAndroid Build Coastguard Worker ProgramExecutableGL(const gl::ProgramExecutable *executable); 29*8975f5c5SAndroid Build Coastguard Worker ~ProgramExecutableGL() override; 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard Worker void destroy(const gl::Context *context) override; 32*8975f5c5SAndroid Build Coastguard Worker 33*8975f5c5SAndroid Build Coastguard Worker void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override; 34*8975f5c5SAndroid Build Coastguard Worker void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) override; 35*8975f5c5SAndroid Build Coastguard Worker void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) override; 36*8975f5c5SAndroid Build Coastguard Worker void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) override; 37*8975f5c5SAndroid Build Coastguard Worker void setUniform1iv(GLint location, GLsizei count, const GLint *v) override; 38*8975f5c5SAndroid Build Coastguard Worker void setUniform2iv(GLint location, GLsizei count, const GLint *v) override; 39*8975f5c5SAndroid Build Coastguard Worker void setUniform3iv(GLint location, GLsizei count, const GLint *v) override; 40*8975f5c5SAndroid Build Coastguard Worker void setUniform4iv(GLint location, GLsizei count, const GLint *v) override; 41*8975f5c5SAndroid Build Coastguard Worker void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) override; 42*8975f5c5SAndroid Build Coastguard Worker void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) override; 43*8975f5c5SAndroid Build Coastguard Worker void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) override; 44*8975f5c5SAndroid Build Coastguard Worker void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) override; 45*8975f5c5SAndroid Build Coastguard Worker void setUniformMatrix2fv(GLint location, 46*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 47*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose, 48*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value) override; 49*8975f5c5SAndroid Build Coastguard Worker void setUniformMatrix3fv(GLint location, 50*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 51*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose, 52*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value) override; 53*8975f5c5SAndroid Build Coastguard Worker void setUniformMatrix4fv(GLint location, 54*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 55*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose, 56*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value) override; 57*8975f5c5SAndroid Build Coastguard Worker void setUniformMatrix2x3fv(GLint location, 58*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 59*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose, 60*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value) override; 61*8975f5c5SAndroid Build Coastguard Worker void setUniformMatrix3x2fv(GLint location, 62*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 63*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose, 64*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value) override; 65*8975f5c5SAndroid Build Coastguard Worker void setUniformMatrix2x4fv(GLint location, 66*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 67*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose, 68*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value) override; 69*8975f5c5SAndroid Build Coastguard Worker void setUniformMatrix4x2fv(GLint location, 70*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 71*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose, 72*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value) override; 73*8975f5c5SAndroid Build Coastguard Worker void setUniformMatrix3x4fv(GLint location, 74*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 75*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose, 76*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value) override; 77*8975f5c5SAndroid Build Coastguard Worker void setUniformMatrix4x3fv(GLint location, 78*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 79*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose, 80*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value) override; 81*8975f5c5SAndroid Build Coastguard Worker 82*8975f5c5SAndroid Build Coastguard Worker void getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const override; 83*8975f5c5SAndroid Build Coastguard Worker void getUniformiv(const gl::Context *context, GLint location, GLint *params) const override; 84*8975f5c5SAndroid Build Coastguard Worker void getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const override; 85*8975f5c5SAndroid Build Coastguard Worker 86*8975f5c5SAndroid Build Coastguard Worker void updateEnabledClipDistances(uint8_t enabledClipDistancesPacked) const; 87*8975f5c5SAndroid Build Coastguard Worker 88*8975f5c5SAndroid Build Coastguard Worker void updateEmulatedClipOrigin(gl::ClipOrigin origin) const; 89*8975f5c5SAndroid Build Coastguard Worker 90*8975f5c5SAndroid Build Coastguard Worker void enableLayeredRenderingPath(int baseViewIndex) const; 91*8975f5c5SAndroid Build Coastguard Worker 92*8975f5c5SAndroid Build Coastguard Worker void syncUniformBlockBindings(); 93*8975f5c5SAndroid Build Coastguard Worker getProgramID()94*8975f5c5SAndroid Build Coastguard Worker GLuint getProgramID() const { return mProgramID; } 95*8975f5c5SAndroid Build Coastguard Worker 96*8975f5c5SAndroid Build Coastguard Worker private: 97*8975f5c5SAndroid Build Coastguard Worker friend class ProgramGL; 98*8975f5c5SAndroid Build Coastguard Worker 99*8975f5c5SAndroid Build Coastguard Worker void reset(); 100*8975f5c5SAndroid Build Coastguard Worker void postLink(const FunctionsGL *functions, 101*8975f5c5SAndroid Build Coastguard Worker StateManagerGL *stateManager, 102*8975f5c5SAndroid Build Coastguard Worker const angle::FeaturesGL &features, 103*8975f5c5SAndroid Build Coastguard Worker GLuint programID); 104*8975f5c5SAndroid Build Coastguard Worker 105*8975f5c5SAndroid Build Coastguard Worker // Helper function, makes it simpler to type. uniLoc(GLint glLocation)106*8975f5c5SAndroid Build Coastguard Worker GLint uniLoc(GLint glLocation) const { return mUniformRealLocationMap[glLocation]; } 107*8975f5c5SAndroid Build Coastguard Worker 108*8975f5c5SAndroid Build Coastguard Worker void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding); 109*8975f5c5SAndroid Build Coastguard Worker void reapplyUBOBindings(); 110*8975f5c5SAndroid Build Coastguard Worker 111*8975f5c5SAndroid Build Coastguard Worker std::vector<GLint> mUniformRealLocationMap; 112*8975f5c5SAndroid Build Coastguard Worker std::vector<GLuint> mUniformBlockRealLocationMap; 113*8975f5c5SAndroid Build Coastguard Worker 114*8975f5c5SAndroid Build Coastguard Worker bool mHasAppliedTransformFeedbackVaryings; 115*8975f5c5SAndroid Build Coastguard Worker 116*8975f5c5SAndroid Build Coastguard Worker GLint mClipDistanceEnabledUniformLocation; 117*8975f5c5SAndroid Build Coastguard Worker 118*8975f5c5SAndroid Build Coastguard Worker GLint mClipOriginUniformLocation; 119*8975f5c5SAndroid Build Coastguard Worker 120*8975f5c5SAndroid Build Coastguard Worker GLint mMultiviewBaseViewLayerIndexUniformLocation; 121*8975f5c5SAndroid Build Coastguard Worker 122*8975f5c5SAndroid Build Coastguard Worker // Indiciates which uniform blocks have had their bindings changed since last sync. These 123*8975f5c5SAndroid Build Coastguard Worker // changes are a result of calls to glUniformBlockBinding, and only the GL backend needs to 124*8975f5c5SAndroid Build Coastguard Worker // directly act on them (which is why it's not tracked by the front-end, the other backends 125*8975f5c5SAndroid Build Coastguard Worker // combine this info with the actual buffer bindings). 126*8975f5c5SAndroid Build Coastguard Worker angle::BitSet<gl::IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS> 127*8975f5c5SAndroid Build Coastguard Worker mDirtyUniformBlockBindings; 128*8975f5c5SAndroid Build Coastguard Worker 129*8975f5c5SAndroid Build Coastguard Worker // The program for which the executable was built 130*8975f5c5SAndroid Build Coastguard Worker GLuint mProgramID; 131*8975f5c5SAndroid Build Coastguard Worker const FunctionsGL *mFunctions; 132*8975f5c5SAndroid Build Coastguard Worker StateManagerGL *mStateManager; 133*8975f5c5SAndroid Build Coastguard Worker }; 134*8975f5c5SAndroid Build Coastguard Worker 135*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 136*8975f5c5SAndroid Build Coastguard Worker 137*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_GL_PROGRAMEXECUTABLEGL_H_ 138