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