xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/gl/ProgramGL.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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 #include "libANGLE/renderer/gl/ProgramExecutableGL.h"
17 
18 namespace angle
19 {
20 struct FeaturesGL;
21 }  // namespace angle
22 
23 namespace rx
24 {
25 
26 class FunctionsGL;
27 class RendererGL;
28 class StateManagerGL;
29 
30 class ProgramGL : public ProgramImpl
31 {
32   public:
33     ProgramGL(const gl::ProgramState &data,
34               const FunctionsGL *functions,
35               const angle::FeaturesGL &features,
36               StateManagerGL *stateManager,
37               const std::shared_ptr<RendererGL> &renderer);
38     ~ProgramGL() override;
39 
40     void destroy(const gl::Context *context) override;
41 
42     angle::Result load(const gl::Context *context,
43                        gl::BinaryInputStream *stream,
44                        std::shared_ptr<LinkTask> *loadTaskOut,
45                        egl::CacheGetResult *resultOut) override;
46     void save(const gl::Context *context, gl::BinaryOutputStream *stream) override;
47     void setBinaryRetrievableHint(bool retrievable) override;
48     void setSeparable(bool separable) override;
49 
50     void prepareForLink(const gl::ShaderMap<ShaderImpl *> &shaders) override;
51     angle::Result link(const gl::Context *contextImpl,
52                        std::shared_ptr<LinkTask> *linkTaskOut) override;
53     GLboolean validate(const gl::Caps &caps) override;
54 
55     void markUnusedUniformLocations(std::vector<gl::VariableLocation> *uniformLocations,
56                                     std::vector<gl::SamplerBinding> *samplerBindings,
57                                     std::vector<gl::ImageBinding> *imageBindings) override;
58 
getProgramID()59     ANGLE_INLINE GLuint getProgramID() const { return mProgramID; }
60 
61     void onUniformBlockBinding(gl::UniformBlockIndex uniformBlockIndex) override;
62 
getExecutable()63     const ProgramExecutableGL *getExecutable() const
64     {
65         return GetImplAs<ProgramExecutableGL>(&mState.getExecutable());
66     }
getExecutable()67     ProgramExecutableGL *getExecutable()
68     {
69         return GetImplAs<ProgramExecutableGL>(&mState.getExecutable());
70     }
71 
72   private:
73     class LinkTaskGL;
74     class PostLinkGL;
75 
76     friend class LinkTaskGL;
77     friend class PostLinkGL;
78 
79     angle::Result linkJobImpl(const gl::Extensions &extensions);
80     angle::Result postLinkJobImpl(const gl::ProgramLinkedResources &resources);
81 
82     bool checkLinkStatus();
83 
84     bool getUniformBlockSize(const std::string &blockName,
85                              const std::string &blockMappedName,
86                              size_t *sizeOut) const;
87     bool getUniformBlockMemberInfo(const std::string &memberUniformName,
88                                    const std::string &memberUniformMappedName,
89                                    sh::BlockMemberInfo *memberInfoOut) const;
90     bool getShaderStorageBlockMemberInfo(const std::string &memberName,
91                                          const std::string &memberMappedName,
92                                          sh::BlockMemberInfo *memberInfoOut) const;
93     bool getShaderStorageBlockSize(const std::string &blockName,
94                                    const std::string &blockMappedName,
95                                    size_t *sizeOut) const;
96     void getAtomicCounterBufferSizeMap(std::map<int, unsigned int> *sizeMapOut) const;
97 
98     void linkResources(const gl::ProgramLinkedResources &resources);
99 
100     const FunctionsGL *mFunctions;
101     const angle::FeaturesGL &mFeatures;
102     StateManagerGL *mStateManager;
103 
104     gl::ShaderMap<GLuint> mAttachedShaders;
105 
106     GLuint mProgramID;
107 
108     std::shared_ptr<RendererGL> mRenderer;
109 };
110 
111 }  // namespace rx
112 
113 #endif  // LIBANGLE_RENDERER_GL_PROGRAMGL_H_
114