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