xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/ProgramImpl.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 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 // ProgramImpl.h: Defines the abstract rx::ProgramImpl class.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_PROGRAMIMPL_H_
10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_PROGRAMIMPL_H_
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "common/BinaryStream.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "common/WorkerThread.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Constants.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Program.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Shader.h"
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker #include <functional>
20*8975f5c5SAndroid Build Coastguard Worker #include <map>
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker namespace gl
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker class Context;
25*8975f5c5SAndroid Build Coastguard Worker struct ProgramLinkedResources;
26*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker namespace sh
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker struct BlockMemberInfo;
31*8975f5c5SAndroid Build Coastguard Worker }
32*8975f5c5SAndroid Build Coastguard Worker 
33*8975f5c5SAndroid Build Coastguard Worker namespace rx
34*8975f5c5SAndroid Build Coastguard Worker {
35*8975f5c5SAndroid Build Coastguard Worker // The link job is split as such:
36*8975f5c5SAndroid Build Coastguard Worker //
37*8975f5c5SAndroid Build Coastguard Worker // - Front-end link
38*8975f5c5SAndroid Build Coastguard Worker // - Back-end link
39*8975f5c5SAndroid Build Coastguard Worker // - Independent back-end link subtasks (typically native driver compile jobs)
40*8975f5c5SAndroid Build Coastguard Worker // - Post-link finalization
41*8975f5c5SAndroid Build Coastguard Worker //
42*8975f5c5SAndroid Build Coastguard Worker // Each step depends on the previous.  These steps are executed as such:
43*8975f5c5SAndroid Build Coastguard Worker //
44*8975f5c5SAndroid Build Coastguard Worker // 1. Program::link calls into ProgramImpl::link
45*8975f5c5SAndroid Build Coastguard Worker //   - ProgramImpl::link runs whatever needs the Context, such as releasing resources
46*8975f5c5SAndroid Build Coastguard Worker //   - ProgramImpl::link returns a LinkTask
47*8975f5c5SAndroid Build Coastguard Worker // 2. Program::link implements a closure that calls the front-end link and passes the results to
48*8975f5c5SAndroid Build Coastguard Worker //    the backend's LinkTask.
49*8975f5c5SAndroid Build Coastguard Worker // 3. The LinkTask potentially returns a set of LinkSubTasks to be scheduled by the worker pool
50*8975f5c5SAndroid Build Coastguard Worker // 4. Once the link is resolved, the post-link finalization is run
51*8975f5c5SAndroid Build Coastguard Worker //
52*8975f5c5SAndroid Build Coastguard Worker // In the above, steps 1 and 4 are done under the share group lock.  Steps 2 and 3 can be done in
53*8975f5c5SAndroid Build Coastguard Worker // threads or without holding the share group lock if the backend supports it.
54*8975f5c5SAndroid Build Coastguard Worker class LinkSubTask : public angle::Closure
55*8975f5c5SAndroid Build Coastguard Worker {
56*8975f5c5SAndroid Build Coastguard Worker   public:
57*8975f5c5SAndroid Build Coastguard Worker     ~LinkSubTask() override                                                           = default;
58*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result getResult(const gl::Context *context, gl::InfoLog &infoLog) = 0;
59*8975f5c5SAndroid Build Coastguard Worker };
60*8975f5c5SAndroid Build Coastguard Worker class LinkTask
61*8975f5c5SAndroid Build Coastguard Worker {
62*8975f5c5SAndroid Build Coastguard Worker   public:
63*8975f5c5SAndroid Build Coastguard Worker     virtual ~LinkTask() = default;
64*8975f5c5SAndroid Build Coastguard Worker     // Used for link()
65*8975f5c5SAndroid Build Coastguard Worker     // Backends should populate only one of linkSubTasksOut or postLinkSubTasksOut.
66*8975f5c5SAndroid Build Coastguard Worker     virtual void link(const gl::ProgramLinkedResources &resources,
67*8975f5c5SAndroid Build Coastguard Worker                       const gl::ProgramMergedVaryings &mergedVaryings,
68*8975f5c5SAndroid Build Coastguard Worker                       std::vector<std::shared_ptr<LinkSubTask>> *linkSubTasksOut,
69*8975f5c5SAndroid Build Coastguard Worker                       std::vector<std::shared_ptr<LinkSubTask>> *postLinkSubTasksOut);
70*8975f5c5SAndroid Build Coastguard Worker     // Used for load()
71*8975f5c5SAndroid Build Coastguard Worker     // Backends should populate only one of linkSubTasksOut or postLinkSubTasksOut.
72*8975f5c5SAndroid Build Coastguard Worker     virtual void load(std::vector<std::shared_ptr<LinkSubTask>> *linkSubTasksOut,
73*8975f5c5SAndroid Build Coastguard Worker                       std::vector<std::shared_ptr<LinkSubTask>> *postLinkSubTasksOut);
74*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result getResult(const gl::Context *context, gl::InfoLog &infoLog) = 0;
75*8975f5c5SAndroid Build Coastguard Worker 
76*8975f5c5SAndroid Build Coastguard Worker     // Used by the GL backend to query whether the driver is linking in parallel internally.
77*8975f5c5SAndroid Build Coastguard Worker     virtual bool isLinkingInternally();
78*8975f5c5SAndroid Build Coastguard Worker };
79*8975f5c5SAndroid Build Coastguard Worker 
80*8975f5c5SAndroid Build Coastguard Worker class ProgramImpl : angle::NonCopyable
81*8975f5c5SAndroid Build Coastguard Worker {
82*8975f5c5SAndroid Build Coastguard Worker   public:
ProgramImpl(const gl::ProgramState & state)83*8975f5c5SAndroid Build Coastguard Worker     ProgramImpl(const gl::ProgramState &state) : mState(state) {}
~ProgramImpl()84*8975f5c5SAndroid Build Coastguard Worker     virtual ~ProgramImpl() {}
destroy(const gl::Context * context)85*8975f5c5SAndroid Build Coastguard Worker     virtual void destroy(const gl::Context *context) {}
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result load(const gl::Context *context,
88*8975f5c5SAndroid Build Coastguard Worker                                gl::BinaryInputStream *stream,
89*8975f5c5SAndroid Build Coastguard Worker                                std::shared_ptr<LinkTask> *loadTaskOut,
90*8975f5c5SAndroid Build Coastguard Worker                                egl::CacheGetResult *resultOut)                    = 0;
91*8975f5c5SAndroid Build Coastguard Worker     virtual void save(const gl::Context *context, gl::BinaryOutputStream *stream) = 0;
92*8975f5c5SAndroid Build Coastguard Worker     virtual void setBinaryRetrievableHint(bool retrievable)                       = 0;
93*8975f5c5SAndroid Build Coastguard Worker     virtual void setSeparable(bool separable)                                     = 0;
94*8975f5c5SAndroid Build Coastguard Worker 
prepareForLink(const gl::ShaderMap<ShaderImpl * > & shaders)95*8975f5c5SAndroid Build Coastguard Worker     virtual void prepareForLink(const gl::ShaderMap<ShaderImpl *> &shaders) {}
96*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result link(const gl::Context *context,
97*8975f5c5SAndroid Build Coastguard Worker                                std::shared_ptr<LinkTask> *linkTaskOut) = 0;
98*8975f5c5SAndroid Build Coastguard Worker     virtual GLboolean validate(const gl::Caps &caps)                   = 0;
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker     // Implementation-specific method for ignoring unreferenced uniforms. Some implementations may
101*8975f5c5SAndroid Build Coastguard Worker     // perform more extensive analysis and ignore some locations that ANGLE doesn't detect as
102*8975f5c5SAndroid Build Coastguard Worker     // unreferenced. This method is not required to be overriden by a back-end.
markUnusedUniformLocations(std::vector<gl::VariableLocation> * uniformLocations,std::vector<gl::SamplerBinding> * samplerBindings,std::vector<gl::ImageBinding> * imageBindings)103*8975f5c5SAndroid Build Coastguard Worker     virtual void markUnusedUniformLocations(std::vector<gl::VariableLocation> *uniformLocations,
104*8975f5c5SAndroid Build Coastguard Worker                                             std::vector<gl::SamplerBinding> *samplerBindings,
105*8975f5c5SAndroid Build Coastguard Worker                                             std::vector<gl::ImageBinding> *imageBindings)
106*8975f5c5SAndroid Build Coastguard Worker     {}
107*8975f5c5SAndroid Build Coastguard Worker 
getState()108*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramState &getState() const { return mState; }
109*8975f5c5SAndroid Build Coastguard Worker 
110*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result onLabelUpdate(const gl::Context *context);
111*8975f5c5SAndroid Build Coastguard Worker 
112*8975f5c5SAndroid Build Coastguard Worker     // Called when glUniformBlockBinding is called.
onUniformBlockBinding(gl::UniformBlockIndex uniformBlockIndex)113*8975f5c5SAndroid Build Coastguard Worker     virtual void onUniformBlockBinding(gl::UniformBlockIndex uniformBlockIndex) {}
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker   protected:
116*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramState &mState;
117*8975f5c5SAndroid Build Coastguard Worker };
118*8975f5c5SAndroid Build Coastguard Worker 
119*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
120*8975f5c5SAndroid Build Coastguard Worker 
121*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_PROGRAMIMPL_H_
122