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