blob: aa382ddb965ee0356923e8fd7c876e532b8d2073 [file] [log] [blame]
Jamie Madill9e54b5a2016-05-25 12:57:39 -04001//
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
Jamie Madill5547b382017-10-23 18:16:01 -040013#include "libANGLE/Constants.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040014#include "libANGLE/renderer/ProgramImpl.h"
Jamie Madill8ecf7f92017-01-13 17:29:52 -050015#include "libANGLE/renderer/vulkan/renderervk_utils.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040016
Jamie Madill5547b382017-10-23 18:16:01 -040017#include <array>
18
Jamie Madill9e54b5a2016-05-25 12:57:39 -040019namespace rx
20{
21
22class ProgramVk : public ProgramImpl
23{
24 public:
25 ProgramVk(const gl::ProgramState &state);
26 ~ProgramVk() override;
Jamie Madillc564c072017-06-01 12:45:42 -040027 void destroy(const gl::Context *context) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040028
Jamie Madill9cf9e872017-06-05 12:59:25 -040029 gl::LinkResult load(const gl::Context *context,
30 gl::InfoLog &infoLog,
31 gl::BinaryInputStream *stream) override;
Jamie Madill27a60632017-06-30 15:12:01 -040032 void save(const gl::Context *context, gl::BinaryOutputStream *stream) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040033 void setBinaryRetrievableHint(bool retrievable) override;
Yunchao He61afff12017-03-14 15:34:03 +080034 void setSeparable(bool separable) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040035
Jamie Madill9cf9e872017-06-05 12:59:25 -040036 gl::LinkResult link(const gl::Context *context,
Jamie Madillc9727f32017-11-07 12:37:07 -050037 const gl::ProgramLinkedResources &resources,
Jamie Madill9cf9e872017-06-05 12:59:25 -040038 gl::InfoLog &infoLog) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040039 GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
40
41 void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
42 void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) override;
43 void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) override;
44 void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) override;
45 void setUniform1iv(GLint location, GLsizei count, const GLint *v) override;
46 void setUniform2iv(GLint location, GLsizei count, const GLint *v) override;
47 void setUniform3iv(GLint location, GLsizei count, const GLint *v) override;
48 void setUniform4iv(GLint location, GLsizei count, const GLint *v) override;
49 void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) override;
50 void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) override;
51 void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) override;
52 void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) override;
53 void setUniformMatrix2fv(GLint location,
54 GLsizei count,
55 GLboolean transpose,
56 const GLfloat *value) override;
57 void setUniformMatrix3fv(GLint location,
58 GLsizei count,
59 GLboolean transpose,
60 const GLfloat *value) override;
61 void setUniformMatrix4fv(GLint location,
62 GLsizei count,
63 GLboolean transpose,
64 const GLfloat *value) override;
65 void setUniformMatrix2x3fv(GLint location,
66 GLsizei count,
67 GLboolean transpose,
68 const GLfloat *value) override;
69 void setUniformMatrix3x2fv(GLint location,
70 GLsizei count,
71 GLboolean transpose,
72 const GLfloat *value) override;
73 void setUniformMatrix2x4fv(GLint location,
74 GLsizei count,
75 GLboolean transpose,
76 const GLfloat *value) override;
77 void setUniformMatrix4x2fv(GLint location,
78 GLsizei count,
79 GLboolean transpose,
80 const GLfloat *value) override;
81 void setUniformMatrix3x4fv(GLint location,
82 GLsizei count,
83 GLboolean transpose,
84 const GLfloat *value) override;
85 void setUniformMatrix4x3fv(GLint location,
86 GLsizei count,
87 GLboolean transpose,
88 const GLfloat *value) override;
89
Jamie Madill54164b02017-08-28 15:17:37 -040090 void getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const override;
91 void getUniformiv(const gl::Context *context, GLint location, GLint *params) const override;
92 void getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const override;
93
Jamie Madill9e54b5a2016-05-25 12:57:39 -040094 // TODO: synchronize in syncState when dirty bits exist.
95 void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) override;
96
Sami Väisänen46eaa942016-06-29 10:26:37 +030097 void setPathFragmentInputGen(const std::string &inputName,
98 GLenum genMode,
99 GLint components,
100 const GLfloat *coeffs) override;
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500101
102 const vk::ShaderModule &getLinkedVertexModule() const;
103 const vk::ShaderModule &getLinkedFragmentModule() const;
Jamie Madillc5143482017-10-15 20:20:06 -0400104 const vk::PipelineLayout &getPipelineLayout() const;
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500105
Jamie Madill76e471e2017-10-21 09:56:01 -0400106 vk::Error updateUniforms(ContextVk *contextVk);
107
Jamie Madill5547b382017-10-23 18:16:01 -0400108 const std::vector<VkDescriptorSet> &getDescriptorSets() const;
109
110 // In Vulkan, it is invalid to pass in a NULL descriptor set to vkCmdBindDescriptorSets.
111 // However, it's valid to leave them in an undefined, unbound state, if they are never used.
112 // This means when we want to ignore a descriptor set index, we need to pass in an offset
113 // parameter to BindDescriptorSets, which is an offset into the getDescriptorSets array.
114 uint32_t getDescriptorSetOffset() const;
115
116 void updateTexturesDescriptorSet(ContextVk *contextVk);
117 void invalidateTextures();
Jamie Madill76e471e2017-10-21 09:56:01 -0400118
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500119 private:
Jamie Madillc5143482017-10-15 20:20:06 -0400120 void reset(VkDevice device);
121 vk::Error initPipelineLayout(ContextVk *context);
Jamie Madill76e471e2017-10-21 09:56:01 -0400122 vk::Error initDescriptorSets(ContextVk *contextVk);
123 gl::Error initDefaultUniformBlocks(const gl::Context *glContext);
124 vk::Error updateDefaultUniformsDescriptorSet(ContextVk *contextVk);
125
126 template <typename T>
127 void setUniformImpl(GLint location, GLsizei count, const T *v, GLenum entryPointType);
Jamie Madillc5143482017-10-15 20:20:06 -0400128
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500129 vk::ShaderModule mLinkedVertexModule;
130 vk::ShaderModule mLinkedFragmentModule;
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500131 vk::PipelineLayout mPipelineLayout;
Jamie Madill76e471e2017-10-21 09:56:01 -0400132 std::vector<vk::DescriptorSetLayout> mDescriptorSetLayouts;
133
134 // State for the default uniform blocks.
135 struct DefaultUniformBlock final : private angle::NonCopyable
136 {
137 DefaultUniformBlock();
138
139 vk::BufferAndMemory storage;
140
141 // Shadow copies of the shader uniform data.
142 angle::MemoryBuffer uniformData;
143 bool uniformsDirty;
144
145 // Since the default blocks are laid out in std140, this tells us where to write on a call
146 // to a setUniform method. They are arranged in uniform location order.
147 std::vector<sh::BlockMemberInfo> uniformLayout;
148 };
149
150 std::array<DefaultUniformBlock, 2> mDefaultUniformBlocks;
151
152 // This is a special "empty" placeholder buffer for when a shader has no uniforms.
153 // It is necessary because we want to keep a compatible pipeline layout in all cases,
154 // and Vulkan does not tolerate having null handles in a descriptor set.
155 vk::BufferAndMemory mEmptyUniformBlockStorage;
156
Jamie Madill5547b382017-10-23 18:16:01 -0400157 // Descriptor sets for uniform blocks and textures for this program.
158 std::vector<VkDescriptorSet> mDescriptorSets;
159 uint32_t mDescriptorSetOffset;
160 bool mDirtyTextures;
161
162 template <typename T>
163 using ShaderTextureArray = std::array<T, gl::IMPLEMENTATION_MAX_SHADER_TEXTURES>;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400164};
165
166} // namespace rx
167
168#endif // LIBANGLE_RENDERER_VULKAN_PROGRAMVK_H_