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