• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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