1 // 2 // Copyright 2016 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 // ProgramVk.h: 7 // Defines the class interface for ProgramVk, implementing ProgramImpl. 8 // 9 10 #ifndef LIBANGLE_RENDERER_VULKAN_PROGRAMVK_H_ 11 #define LIBANGLE_RENDERER_VULKAN_PROGRAMVK_H_ 12 13 #include <array> 14 15 #include "common/utilities.h" 16 #include "libANGLE/renderer/ProgramImpl.h" 17 #include "libANGLE/renderer/glslang_wrapper_utils.h" 18 #include "libANGLE/renderer/vulkan/ContextVk.h" 19 #include "libANGLE/renderer/vulkan/ProgramExecutableVk.h" 20 #include "libANGLE/renderer/vulkan/RendererVk.h" 21 #include "libANGLE/renderer/vulkan/TransformFeedbackVk.h" 22 #include "libANGLE/renderer/vulkan/vk_helpers.h" 23 24 namespace rx 25 { 26 class ProgramVk : public ProgramImpl 27 { 28 public: 29 ProgramVk(const gl::ProgramState &state); 30 ~ProgramVk() override; 31 void destroy(const gl::Context *context) override; 32 33 std::unique_ptr<LinkEvent> load(const gl::Context *context, 34 gl::BinaryInputStream *stream, 35 gl::InfoLog &infoLog) override; 36 void save(const gl::Context *context, gl::BinaryOutputStream *stream) override; 37 void setBinaryRetrievableHint(bool retrievable) override; 38 void setSeparable(bool separable) override; 39 40 std::unique_ptr<LinkEvent> link(const gl::Context *context, 41 const gl::ProgramLinkedResources &resources, 42 gl::InfoLog &infoLog, 43 const gl::ProgramMergedVaryings &mergedVaryings) override; 44 GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override; 45 46 void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override; 47 void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) override; 48 void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) override; 49 void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) override; 50 void setUniform1iv(GLint location, GLsizei count, const GLint *v) override; 51 void setUniform2iv(GLint location, GLsizei count, const GLint *v) override; 52 void setUniform3iv(GLint location, GLsizei count, const GLint *v) override; 53 void setUniform4iv(GLint location, GLsizei count, const GLint *v) override; 54 void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) override; 55 void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) override; 56 void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) override; 57 void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) override; 58 void setUniformMatrix2fv(GLint location, 59 GLsizei count, 60 GLboolean transpose, 61 const GLfloat *value) override; 62 void setUniformMatrix3fv(GLint location, 63 GLsizei count, 64 GLboolean transpose, 65 const GLfloat *value) override; 66 void setUniformMatrix4fv(GLint location, 67 GLsizei count, 68 GLboolean transpose, 69 const GLfloat *value) override; 70 void setUniformMatrix2x3fv(GLint location, 71 GLsizei count, 72 GLboolean transpose, 73 const GLfloat *value) override; 74 void setUniformMatrix3x2fv(GLint location, 75 GLsizei count, 76 GLboolean transpose, 77 const GLfloat *value) override; 78 void setUniformMatrix2x4fv(GLint location, 79 GLsizei count, 80 GLboolean transpose, 81 const GLfloat *value) override; 82 void setUniformMatrix4x2fv(GLint location, 83 GLsizei count, 84 GLboolean transpose, 85 const GLfloat *value) override; 86 void setUniformMatrix3x4fv(GLint location, 87 GLsizei count, 88 GLboolean transpose, 89 const GLfloat *value) override; 90 void setUniformMatrix4x3fv(GLint location, 91 GLsizei count, 92 GLboolean transpose, 93 const GLfloat *value) override; 94 95 void getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const override; 96 void getUniformiv(const gl::Context *context, GLint location, GLint *params) const override; 97 void getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const override; 98 areShaderUniformsDirty(gl::ShaderType shaderType)99 bool areShaderUniformsDirty(gl::ShaderType shaderType) const 100 { 101 return mExecutable.mDefaultUniformBlocksDirty[shaderType]; 102 } setShaderUniformDirtyBit(gl::ShaderType shaderType)103 void setShaderUniformDirtyBit(gl::ShaderType shaderType) 104 { 105 if (!mExecutable.mDefaultUniformBlocks[shaderType]->uniformData.empty()) 106 { 107 mExecutable.mDefaultUniformBlocksDirty.set(shaderType); 108 } 109 } clearShaderUniformDirtyBit(gl::ShaderType shaderType)110 void clearShaderUniformDirtyBit(gl::ShaderType shaderType) 111 { 112 mExecutable.mDefaultUniformBlocksDirty.reset(shaderType); 113 } 114 getExecutable()115 const ProgramExecutableVk &getExecutable() const { return mExecutable; } getExecutable()116 ProgramExecutableVk &getExecutable() { return mExecutable; } 117 getGlslangProgramInterfaceInfo()118 const GlslangProgramInterfaceInfo &getGlslangProgramInterfaceInfo() 119 { 120 return mGlslangProgramInterfaceInfo; 121 } 122 123 private: 124 template <int cols, int rows> 125 void setUniformMatrixfv(GLint location, 126 GLsizei count, 127 GLboolean transpose, 128 const GLfloat *value); 129 130 void reset(ContextVk *contextVk); 131 angle::Result initDefaultUniformBlocks(const gl::Context *glContext); 132 void generateUniformLayoutMapping(gl::ShaderMap<sh::BlockLayoutMap> &layoutMap, 133 gl::ShaderMap<size_t> &requiredBufferSize); 134 void initDefaultUniformLayoutMapping(gl::ShaderMap<sh::BlockLayoutMap> &layoutMap); 135 136 template <class T> 137 void getUniformImpl(GLint location, T *v, GLenum entryPointType) const; 138 139 template <typename T> 140 void setUniformImpl(GLint location, GLsizei count, const T *v, GLenum entryPointType); 141 void linkResources(const gl::ProgramLinkedResources &resources); 142 143 angle::Result createGraphicsPipelineWithDefaultState(const gl::Context *context); 144 145 // We keep the SPIR-V code to use for draw call pipeline creation. 146 GlslangProgramInterfaceInfo mGlslangProgramInterfaceInfo; 147 148 ProgramExecutableVk mExecutable; 149 }; 150 151 } // namespace rx 152 153 #endif // LIBANGLE_RENDERER_VULKAN_PROGRAMVK_H_ 154