xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/ProgramExecutableVk.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2020 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 // ProgramExecutableVk.h: Collects the information and interfaces common to both ProgramVks and
8*8975f5c5SAndroid Build Coastguard Worker // ProgramPipelineVks in order to execute/draw with either.
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_PROGRAMEXECUTABLEVK_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_PROGRAMEXECUTABLEVK_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "common/bitset_utils.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "common/mathutil.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "common/utilities.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/InfoLog.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ProgramExecutable.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/ProgramExecutableImpl.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/ContextVk.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/ShaderInterfaceVariableInfoMap.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/spv_utils.h"
23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_cache_utils.h"
24*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_helpers.h"
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker namespace rx
27*8975f5c5SAndroid Build Coastguard Worker {
28*8975f5c5SAndroid Build Coastguard Worker 
29*8975f5c5SAndroid Build Coastguard Worker class ShaderInfo final : angle::NonCopyable
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker   public:
32*8975f5c5SAndroid Build Coastguard Worker     ShaderInfo();
33*8975f5c5SAndroid Build Coastguard Worker     ~ShaderInfo();
34*8975f5c5SAndroid Build Coastguard Worker 
35*8975f5c5SAndroid Build Coastguard Worker     angle::Result initShaders(vk::Context *context,
36*8975f5c5SAndroid Build Coastguard Worker                               const gl::ShaderBitSet &linkedShaderStages,
37*8975f5c5SAndroid Build Coastguard Worker                               const gl::ShaderMap<const angle::spirv::Blob *> &spirvBlobs,
38*8975f5c5SAndroid Build Coastguard Worker                               const ShaderInterfaceVariableInfoMap &variableInfoMap,
39*8975f5c5SAndroid Build Coastguard Worker                               bool isGLES1);
40*8975f5c5SAndroid Build Coastguard Worker     void initShaderFromProgram(gl::ShaderType shaderType, const ShaderInfo &programShaderInfo);
41*8975f5c5SAndroid Build Coastguard Worker     void clear();
42*8975f5c5SAndroid Build Coastguard Worker 
valid()43*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE bool valid() const { return mIsInitialized; }
44*8975f5c5SAndroid Build Coastguard Worker 
getSpirvBlobs()45*8975f5c5SAndroid Build Coastguard Worker     const gl::ShaderMap<angle::spirv::Blob> &getSpirvBlobs() const { return mSpirvBlobs; }
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     // Save and load implementation for GLES Program Binary support.
48*8975f5c5SAndroid Build Coastguard Worker     void load(gl::BinaryInputStream *stream);
49*8975f5c5SAndroid Build Coastguard Worker     void save(gl::BinaryOutputStream *stream);
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker   private:
52*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<angle::spirv::Blob> mSpirvBlobs;
53*8975f5c5SAndroid Build Coastguard Worker     bool mIsInitialized = false;
54*8975f5c5SAndroid Build Coastguard Worker };
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker union ProgramTransformOptions final
57*8975f5c5SAndroid Build Coastguard Worker {
58*8975f5c5SAndroid Build Coastguard Worker     struct
59*8975f5c5SAndroid Build Coastguard Worker     {
60*8975f5c5SAndroid Build Coastguard Worker         uint8_t surfaceRotation : 1;
61*8975f5c5SAndroid Build Coastguard Worker         uint8_t removeTransformFeedbackEmulation : 1;
62*8975f5c5SAndroid Build Coastguard Worker         uint8_t multiSampleFramebufferFetch : 1;
63*8975f5c5SAndroid Build Coastguard Worker         uint8_t enableSampleShading : 1;
64*8975f5c5SAndroid Build Coastguard Worker         uint8_t reserved : 4;  // must initialize to zero
65*8975f5c5SAndroid Build Coastguard Worker     };
66*8975f5c5SAndroid Build Coastguard Worker     uint8_t permutationIndex;
67*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint32_t kPermutationCount = 0x1 << 4;
68*8975f5c5SAndroid Build Coastguard Worker };
69*8975f5c5SAndroid Build Coastguard Worker static_assert(sizeof(ProgramTransformOptions) == 1, "Size check failed");
70*8975f5c5SAndroid Build Coastguard Worker static_assert(static_cast<int>(SurfaceRotation::EnumCount) <= 8, "Size check failed");
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker class ProgramInfo final : angle::NonCopyable
73*8975f5c5SAndroid Build Coastguard Worker {
74*8975f5c5SAndroid Build Coastguard Worker   public:
75*8975f5c5SAndroid Build Coastguard Worker     ProgramInfo();
76*8975f5c5SAndroid Build Coastguard Worker     ~ProgramInfo();
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker     angle::Result initProgram(vk::Context *context,
79*8975f5c5SAndroid Build Coastguard Worker                               gl::ShaderType shaderType,
80*8975f5c5SAndroid Build Coastguard Worker                               bool isLastPreFragmentStage,
81*8975f5c5SAndroid Build Coastguard Worker                               bool isTransformFeedbackProgram,
82*8975f5c5SAndroid Build Coastguard Worker                               const ShaderInfo &shaderInfo,
83*8975f5c5SAndroid Build Coastguard Worker                               ProgramTransformOptions optionBits,
84*8975f5c5SAndroid Build Coastguard Worker                               const ShaderInterfaceVariableInfoMap &variableInfoMap);
85*8975f5c5SAndroid Build Coastguard Worker     void release(ContextVk *contextVk);
86*8975f5c5SAndroid Build Coastguard Worker 
valid(gl::ShaderType shaderType)87*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE bool valid(gl::ShaderType shaderType) const
88*8975f5c5SAndroid Build Coastguard Worker     {
89*8975f5c5SAndroid Build Coastguard Worker         return mProgramHelper.valid(shaderType);
90*8975f5c5SAndroid Build Coastguard Worker     }
91*8975f5c5SAndroid Build Coastguard Worker 
getShaderProgram()92*8975f5c5SAndroid Build Coastguard Worker     vk::ShaderProgramHelper &getShaderProgram() { return mProgramHelper; }
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker   private:
95*8975f5c5SAndroid Build Coastguard Worker     vk::ShaderProgramHelper mProgramHelper;
96*8975f5c5SAndroid Build Coastguard Worker     vk::ShaderModuleMap mShaders;
97*8975f5c5SAndroid Build Coastguard Worker };
98*8975f5c5SAndroid Build Coastguard Worker 
99*8975f5c5SAndroid Build Coastguard Worker using ImmutableSamplerIndexMap = angle::HashMap<vk::YcbcrConversionDesc, uint32_t>;
100*8975f5c5SAndroid Build Coastguard Worker 
101*8975f5c5SAndroid Build Coastguard Worker class ProgramExecutableVk : public ProgramExecutableImpl
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker   public:
104*8975f5c5SAndroid Build Coastguard Worker     ProgramExecutableVk(const gl::ProgramExecutable *executable);
105*8975f5c5SAndroid Build Coastguard Worker     ~ProgramExecutableVk() override;
106*8975f5c5SAndroid Build Coastguard Worker 
107*8975f5c5SAndroid Build Coastguard Worker     void destroy(const gl::Context *context) override;
108*8975f5c5SAndroid Build Coastguard Worker 
109*8975f5c5SAndroid Build Coastguard Worker     void save(ContextVk *contextVk, bool isSeparable, gl::BinaryOutputStream *stream);
110*8975f5c5SAndroid Build Coastguard Worker     angle::Result load(ContextVk *contextVk,
111*8975f5c5SAndroid Build Coastguard Worker                        bool isSeparable,
112*8975f5c5SAndroid Build Coastguard Worker                        gl::BinaryInputStream *stream,
113*8975f5c5SAndroid Build Coastguard Worker                        egl::CacheGetResult *resultOut);
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker     void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
116*8975f5c5SAndroid Build Coastguard Worker     void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) override;
117*8975f5c5SAndroid Build Coastguard Worker     void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) override;
118*8975f5c5SAndroid Build Coastguard Worker     void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) override;
119*8975f5c5SAndroid Build Coastguard Worker     void setUniform1iv(GLint location, GLsizei count, const GLint *v) override;
120*8975f5c5SAndroid Build Coastguard Worker     void setUniform2iv(GLint location, GLsizei count, const GLint *v) override;
121*8975f5c5SAndroid Build Coastguard Worker     void setUniform3iv(GLint location, GLsizei count, const GLint *v) override;
122*8975f5c5SAndroid Build Coastguard Worker     void setUniform4iv(GLint location, GLsizei count, const GLint *v) override;
123*8975f5c5SAndroid Build Coastguard Worker     void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) override;
124*8975f5c5SAndroid Build Coastguard Worker     void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) override;
125*8975f5c5SAndroid Build Coastguard Worker     void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) override;
126*8975f5c5SAndroid Build Coastguard Worker     void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) override;
127*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix2fv(GLint location,
128*8975f5c5SAndroid Build Coastguard Worker                              GLsizei count,
129*8975f5c5SAndroid Build Coastguard Worker                              GLboolean transpose,
130*8975f5c5SAndroid Build Coastguard Worker                              const GLfloat *value) override;
131*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix3fv(GLint location,
132*8975f5c5SAndroid Build Coastguard Worker                              GLsizei count,
133*8975f5c5SAndroid Build Coastguard Worker                              GLboolean transpose,
134*8975f5c5SAndroid Build Coastguard Worker                              const GLfloat *value) override;
135*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix4fv(GLint location,
136*8975f5c5SAndroid Build Coastguard Worker                              GLsizei count,
137*8975f5c5SAndroid Build Coastguard Worker                              GLboolean transpose,
138*8975f5c5SAndroid Build Coastguard Worker                              const GLfloat *value) override;
139*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix2x3fv(GLint location,
140*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
141*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
142*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
143*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix3x2fv(GLint location,
144*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
145*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
146*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
147*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix2x4fv(GLint location,
148*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
149*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
150*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
151*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix4x2fv(GLint location,
152*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
153*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
154*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
155*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix3x4fv(GLint location,
156*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
157*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
158*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
159*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix4x3fv(GLint location,
160*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
161*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
162*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
163*8975f5c5SAndroid Build Coastguard Worker 
164*8975f5c5SAndroid Build Coastguard Worker     void getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const override;
165*8975f5c5SAndroid Build Coastguard Worker     void getUniformiv(const gl::Context *context, GLint location, GLint *params) const override;
166*8975f5c5SAndroid Build Coastguard Worker     void getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const override;
167*8975f5c5SAndroid Build Coastguard Worker 
168*8975f5c5SAndroid Build Coastguard Worker     void clearVariableInfoMap();
169*8975f5c5SAndroid Build Coastguard Worker 
getCurrentDefaultUniformBufferSerial()170*8975f5c5SAndroid Build Coastguard Worker     vk::BufferSerial getCurrentDefaultUniformBufferSerial() const
171*8975f5c5SAndroid Build Coastguard Worker     {
172*8975f5c5SAndroid Build Coastguard Worker         return mCurrentDefaultUniformBufferSerial;
173*8975f5c5SAndroid Build Coastguard Worker     }
174*8975f5c5SAndroid Build Coastguard Worker 
175*8975f5c5SAndroid Build Coastguard Worker     // Get the graphics pipeline if already created.
176*8975f5c5SAndroid Build Coastguard Worker     angle::Result getGraphicsPipeline(ContextVk *contextVk,
177*8975f5c5SAndroid Build Coastguard Worker                                       vk::GraphicsPipelineSubset pipelineSubset,
178*8975f5c5SAndroid Build Coastguard Worker                                       const vk::GraphicsPipelineDesc &desc,
179*8975f5c5SAndroid Build Coastguard Worker                                       const vk::GraphicsPipelineDesc **descPtrOut,
180*8975f5c5SAndroid Build Coastguard Worker                                       vk::PipelineHelper **pipelineOut);
181*8975f5c5SAndroid Build Coastguard Worker 
182*8975f5c5SAndroid Build Coastguard Worker     angle::Result createGraphicsPipeline(ContextVk *contextVk,
183*8975f5c5SAndroid Build Coastguard Worker                                          vk::GraphicsPipelineSubset pipelineSubset,
184*8975f5c5SAndroid Build Coastguard Worker                                          vk::PipelineCacheAccess *pipelineCache,
185*8975f5c5SAndroid Build Coastguard Worker                                          PipelineSource source,
186*8975f5c5SAndroid Build Coastguard Worker                                          const vk::GraphicsPipelineDesc &desc,
187*8975f5c5SAndroid Build Coastguard Worker                                          const vk::GraphicsPipelineDesc **descPtrOut,
188*8975f5c5SAndroid Build Coastguard Worker                                          vk::PipelineHelper **pipelineOut);
189*8975f5c5SAndroid Build Coastguard Worker 
190*8975f5c5SAndroid Build Coastguard Worker     angle::Result linkGraphicsPipelineLibraries(ContextVk *contextVk,
191*8975f5c5SAndroid Build Coastguard Worker                                                 vk::PipelineCacheAccess *pipelineCache,
192*8975f5c5SAndroid Build Coastguard Worker                                                 const vk::GraphicsPipelineDesc &desc,
193*8975f5c5SAndroid Build Coastguard Worker                                                 vk::PipelineHelper *vertexInputPipeline,
194*8975f5c5SAndroid Build Coastguard Worker                                                 vk::PipelineHelper *shadersPipeline,
195*8975f5c5SAndroid Build Coastguard Worker                                                 vk::PipelineHelper *fragmentOutputPipeline,
196*8975f5c5SAndroid Build Coastguard Worker                                                 const vk::GraphicsPipelineDesc **descPtrOut,
197*8975f5c5SAndroid Build Coastguard Worker                                                 vk::PipelineHelper **pipelineOut);
198*8975f5c5SAndroid Build Coastguard Worker 
199*8975f5c5SAndroid Build Coastguard Worker     angle::Result getOrCreateComputePipeline(vk::Context *context,
200*8975f5c5SAndroid Build Coastguard Worker                                              vk::PipelineCacheAccess *pipelineCache,
201*8975f5c5SAndroid Build Coastguard Worker                                              PipelineSource source,
202*8975f5c5SAndroid Build Coastguard Worker                                              vk::PipelineRobustness pipelineRobustness,
203*8975f5c5SAndroid Build Coastguard Worker                                              vk::PipelineProtectedAccess pipelineProtectedAccess,
204*8975f5c5SAndroid Build Coastguard Worker                                              vk::PipelineHelper **pipelineOut);
205*8975f5c5SAndroid Build Coastguard Worker 
getPipelineLayout()206*8975f5c5SAndroid Build Coastguard Worker     const vk::PipelineLayout &getPipelineLayout() const { return *mPipelineLayout; }
207*8975f5c5SAndroid Build Coastguard Worker     void resetLayout(ContextVk *contextVk);
208*8975f5c5SAndroid Build Coastguard Worker     angle::Result createPipelineLayout(vk::Context *context,
209*8975f5c5SAndroid Build Coastguard Worker                                        PipelineLayoutCache *pipelineLayoutCache,
210*8975f5c5SAndroid Build Coastguard Worker                                        DescriptorSetLayoutCache *descriptorSetLayoutCache,
211*8975f5c5SAndroid Build Coastguard Worker                                        gl::ActiveTextureArray<TextureVk *> *activeTextures);
212*8975f5c5SAndroid Build Coastguard Worker     angle::Result initializeDescriptorPools(
213*8975f5c5SAndroid Build Coastguard Worker         vk::Context *context,
214*8975f5c5SAndroid Build Coastguard Worker         DescriptorSetLayoutCache *descriptorSetLayoutCache,
215*8975f5c5SAndroid Build Coastguard Worker         vk::DescriptorSetArray<vk::MetaDescriptorPool> *metaDescriptorPools);
216*8975f5c5SAndroid Build Coastguard Worker 
217*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateTexturesDescriptorSet(vk::Context *context,
218*8975f5c5SAndroid Build Coastguard Worker                                               uint32_t currentFrame,
219*8975f5c5SAndroid Build Coastguard Worker                                               const gl::ActiveTextureArray<TextureVk *> &textures,
220*8975f5c5SAndroid Build Coastguard Worker                                               const gl::SamplerBindingVector &samplers,
221*8975f5c5SAndroid Build Coastguard Worker                                               PipelineType pipelineType,
222*8975f5c5SAndroid Build Coastguard Worker                                               UpdateDescriptorSetsBuilder *updateBuilder);
223*8975f5c5SAndroid Build Coastguard Worker 
224*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateShaderResourcesDescriptorSet(
225*8975f5c5SAndroid Build Coastguard Worker         vk::Context *context,
226*8975f5c5SAndroid Build Coastguard Worker         uint32_t currentFrame,
227*8975f5c5SAndroid Build Coastguard Worker         UpdateDescriptorSetsBuilder *updateBuilder,
228*8975f5c5SAndroid Build Coastguard Worker         const vk::WriteDescriptorDescs &writeDescriptorDescs,
229*8975f5c5SAndroid Build Coastguard Worker         const vk::DescriptorSetDescBuilder &shaderResourcesDesc,
230*8975f5c5SAndroid Build Coastguard Worker         vk::SharedDescriptorSetCacheKey *newSharedCacheKeyOut);
231*8975f5c5SAndroid Build Coastguard Worker 
232*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateUniformsAndXfbDescriptorSet(
233*8975f5c5SAndroid Build Coastguard Worker         vk::Context *context,
234*8975f5c5SAndroid Build Coastguard Worker         uint32_t currentFrame,
235*8975f5c5SAndroid Build Coastguard Worker         UpdateDescriptorSetsBuilder *updateBuilder,
236*8975f5c5SAndroid Build Coastguard Worker         const vk::WriteDescriptorDescs &writeDescriptorDescs,
237*8975f5c5SAndroid Build Coastguard Worker         vk::BufferHelper *defaultUniformBuffer,
238*8975f5c5SAndroid Build Coastguard Worker         vk::DescriptorSetDescBuilder *uniformsAndXfbDesc,
239*8975f5c5SAndroid Build Coastguard Worker         vk::SharedDescriptorSetCacheKey *sharedCacheKeyOut);
240*8975f5c5SAndroid Build Coastguard Worker 
241*8975f5c5SAndroid Build Coastguard Worker     template <typename CommandBufferT>
242*8975f5c5SAndroid Build Coastguard Worker     angle::Result bindDescriptorSets(vk::Context *context,
243*8975f5c5SAndroid Build Coastguard Worker                                      uint32_t currentFrame,
244*8975f5c5SAndroid Build Coastguard Worker                                      vk::CommandBufferHelperCommon *commandBufferHelper,
245*8975f5c5SAndroid Build Coastguard Worker                                      CommandBufferT *commandBuffer,
246*8975f5c5SAndroid Build Coastguard Worker                                      PipelineType pipelineType);
247*8975f5c5SAndroid Build Coastguard Worker 
usesDynamicUniformBufferDescriptors()248*8975f5c5SAndroid Build Coastguard Worker     bool usesDynamicUniformBufferDescriptors() const
249*8975f5c5SAndroid Build Coastguard Worker     {
250*8975f5c5SAndroid Build Coastguard Worker         return mUniformBufferDescriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
251*8975f5c5SAndroid Build Coastguard Worker     }
getUniformBufferDescriptorType()252*8975f5c5SAndroid Build Coastguard Worker     VkDescriptorType getUniformBufferDescriptorType() const { return mUniformBufferDescriptorType; }
usesDynamicShaderStorageBufferDescriptors()253*8975f5c5SAndroid Build Coastguard Worker     bool usesDynamicShaderStorageBufferDescriptors() const { return false; }
getStorageBufferDescriptorType()254*8975f5c5SAndroid Build Coastguard Worker     VkDescriptorType getStorageBufferDescriptorType() const
255*8975f5c5SAndroid Build Coastguard Worker     {
256*8975f5c5SAndroid Build Coastguard Worker         return VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
257*8975f5c5SAndroid Build Coastguard Worker     }
getAtomicCounterBufferDescriptorType()258*8975f5c5SAndroid Build Coastguard Worker     VkDescriptorType getAtomicCounterBufferDescriptorType() const
259*8975f5c5SAndroid Build Coastguard Worker     {
260*8975f5c5SAndroid Build Coastguard Worker         return VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
261*8975f5c5SAndroid Build Coastguard Worker     }
usesDynamicAtomicCounterBufferDescriptors()262*8975f5c5SAndroid Build Coastguard Worker     bool usesDynamicAtomicCounterBufferDescriptors() const { return false; }
263*8975f5c5SAndroid Build Coastguard Worker 
areImmutableSamplersCompatible(const ImmutableSamplerIndexMap & immutableSamplerIndexMap)264*8975f5c5SAndroid Build Coastguard Worker     bool areImmutableSamplersCompatible(
265*8975f5c5SAndroid Build Coastguard Worker         const ImmutableSamplerIndexMap &immutableSamplerIndexMap) const
266*8975f5c5SAndroid Build Coastguard Worker     {
267*8975f5c5SAndroid Build Coastguard Worker         return (mImmutableSamplerIndexMap == immutableSamplerIndexMap);
268*8975f5c5SAndroid Build Coastguard Worker     }
269*8975f5c5SAndroid Build Coastguard Worker 
getDefaultUniformAlignedSize(vk::Context * context,gl::ShaderType shaderType)270*8975f5c5SAndroid Build Coastguard Worker     size_t getDefaultUniformAlignedSize(vk::Context *context, gl::ShaderType shaderType) const
271*8975f5c5SAndroid Build Coastguard Worker     {
272*8975f5c5SAndroid Build Coastguard Worker         vk::Renderer *renderer = context->getRenderer();
273*8975f5c5SAndroid Build Coastguard Worker         size_t alignment       = static_cast<size_t>(
274*8975f5c5SAndroid Build Coastguard Worker             renderer->getPhysicalDeviceProperties().limits.minUniformBufferOffsetAlignment);
275*8975f5c5SAndroid Build Coastguard Worker         return roundUp(mDefaultUniformBlocks[shaderType]->uniformData.size(), alignment);
276*8975f5c5SAndroid Build Coastguard Worker     }
277*8975f5c5SAndroid Build Coastguard Worker 
getSharedDefaultUniformBlock(gl::ShaderType shaderType)278*8975f5c5SAndroid Build Coastguard Worker     std::shared_ptr<BufferAndLayout> &getSharedDefaultUniformBlock(gl::ShaderType shaderType)
279*8975f5c5SAndroid Build Coastguard Worker     {
280*8975f5c5SAndroid Build Coastguard Worker         return mDefaultUniformBlocks[shaderType];
281*8975f5c5SAndroid Build Coastguard Worker     }
282*8975f5c5SAndroid Build Coastguard Worker 
updateAndCheckDirtyUniforms()283*8975f5c5SAndroid Build Coastguard Worker     bool updateAndCheckDirtyUniforms()
284*8975f5c5SAndroid Build Coastguard Worker     {
285*8975f5c5SAndroid Build Coastguard Worker         if (ANGLE_LIKELY(!mExecutable->IsPPO()))
286*8975f5c5SAndroid Build Coastguard Worker         {
287*8975f5c5SAndroid Build Coastguard Worker             return mDefaultUniformBlocksDirty.any();
288*8975f5c5SAndroid Build Coastguard Worker         }
289*8975f5c5SAndroid Build Coastguard Worker 
290*8975f5c5SAndroid Build Coastguard Worker         const auto &ppoExecutables = mExecutable->getPPOProgramExecutables();
291*8975f5c5SAndroid Build Coastguard Worker         for (gl::ShaderType shaderType : mExecutable->getLinkedShaderStages())
292*8975f5c5SAndroid Build Coastguard Worker         {
293*8975f5c5SAndroid Build Coastguard Worker             ProgramExecutableVk *executableVk = vk::GetImpl(ppoExecutables[shaderType].get());
294*8975f5c5SAndroid Build Coastguard Worker             if (executableVk->mDefaultUniformBlocksDirty.test(shaderType))
295*8975f5c5SAndroid Build Coastguard Worker             {
296*8975f5c5SAndroid Build Coastguard Worker                 mDefaultUniformBlocksDirty.set(shaderType);
297*8975f5c5SAndroid Build Coastguard Worker                 // Note: this relies on onProgramBind marking everything as dirty
298*8975f5c5SAndroid Build Coastguard Worker                 executableVk->mDefaultUniformBlocksDirty.reset(shaderType);
299*8975f5c5SAndroid Build Coastguard Worker             }
300*8975f5c5SAndroid Build Coastguard Worker         }
301*8975f5c5SAndroid Build Coastguard Worker 
302*8975f5c5SAndroid Build Coastguard Worker         return mDefaultUniformBlocksDirty.any();
303*8975f5c5SAndroid Build Coastguard Worker     }
304*8975f5c5SAndroid Build Coastguard Worker 
305*8975f5c5SAndroid Build Coastguard Worker     void setAllDefaultUniformsDirty();
306*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateUniforms(vk::Context *context,
307*8975f5c5SAndroid Build Coastguard Worker                                  uint32_t currentFrame,
308*8975f5c5SAndroid Build Coastguard Worker                                  UpdateDescriptorSetsBuilder *updateBuilder,
309*8975f5c5SAndroid Build Coastguard Worker                                  vk::BufferHelper *emptyBuffer,
310*8975f5c5SAndroid Build Coastguard Worker                                  vk::DynamicBuffer *defaultUniformStorage,
311*8975f5c5SAndroid Build Coastguard Worker                                  bool isTransformFeedbackActiveUnpaused,
312*8975f5c5SAndroid Build Coastguard Worker                                  TransformFeedbackVk *transformFeedbackVk);
313*8975f5c5SAndroid Build Coastguard Worker     void onProgramBind();
314*8975f5c5SAndroid Build Coastguard Worker 
getVariableInfoMap()315*8975f5c5SAndroid Build Coastguard Worker     const ShaderInterfaceVariableInfoMap &getVariableInfoMap() const { return mVariableInfoMap; }
316*8975f5c5SAndroid Build Coastguard Worker 
warmUpPipelineCache(vk::Renderer * renderer,vk::PipelineRobustness pipelineRobustness,vk::PipelineProtectedAccess pipelineProtectedAccess)317*8975f5c5SAndroid Build Coastguard Worker     angle::Result warmUpPipelineCache(vk::Renderer *renderer,
318*8975f5c5SAndroid Build Coastguard Worker                                       vk::PipelineRobustness pipelineRobustness,
319*8975f5c5SAndroid Build Coastguard Worker                                       vk::PipelineProtectedAccess pipelineProtectedAccess)
320*8975f5c5SAndroid Build Coastguard Worker     {
321*8975f5c5SAndroid Build Coastguard Worker         return getPipelineCacheWarmUpTasks(renderer, pipelineRobustness, pipelineProtectedAccess,
322*8975f5c5SAndroid Build Coastguard Worker                                            nullptr);
323*8975f5c5SAndroid Build Coastguard Worker     }
324*8975f5c5SAndroid Build Coastguard Worker     angle::Result getPipelineCacheWarmUpTasks(
325*8975f5c5SAndroid Build Coastguard Worker         vk::Renderer *renderer,
326*8975f5c5SAndroid Build Coastguard Worker         vk::PipelineRobustness pipelineRobustness,
327*8975f5c5SAndroid Build Coastguard Worker         vk::PipelineProtectedAccess pipelineProtectedAccess,
328*8975f5c5SAndroid Build Coastguard Worker         std::vector<std::shared_ptr<LinkSubTask>> *postLinkSubTasksOut);
329*8975f5c5SAndroid Build Coastguard Worker 
waitForPostLinkTasks(const gl::Context * context)330*8975f5c5SAndroid Build Coastguard Worker     void waitForPostLinkTasks(const gl::Context *context) override
331*8975f5c5SAndroid Build Coastguard Worker     {
332*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk = vk::GetImpl(context);
333*8975f5c5SAndroid Build Coastguard Worker         waitForPostLinkTasksImpl(contextVk);
334*8975f5c5SAndroid Build Coastguard Worker     }
waitForComputePostLinkTasks(ContextVk * contextVk)335*8975f5c5SAndroid Build Coastguard Worker     void waitForComputePostLinkTasks(ContextVk *contextVk)
336*8975f5c5SAndroid Build Coastguard Worker     {
337*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mExecutable->hasLinkedShaderStage(gl::ShaderType::Compute));
338*8975f5c5SAndroid Build Coastguard Worker         waitForPostLinkTasksImpl(contextVk);
339*8975f5c5SAndroid Build Coastguard Worker     }
340*8975f5c5SAndroid Build Coastguard Worker     void waitForGraphicsPostLinkTasks(ContextVk *contextVk,
341*8975f5c5SAndroid Build Coastguard Worker                                       const vk::GraphicsPipelineDesc &currentGraphicsPipelineDesc);
342*8975f5c5SAndroid Build Coastguard Worker 
343*8975f5c5SAndroid Build Coastguard Worker     angle::Result mergePipelineCacheToRenderer(vk::Context *context) const;
344*8975f5c5SAndroid Build Coastguard Worker 
getShaderResourceWriteDescriptorDescs()345*8975f5c5SAndroid Build Coastguard Worker     const vk::WriteDescriptorDescs &getShaderResourceWriteDescriptorDescs() const
346*8975f5c5SAndroid Build Coastguard Worker     {
347*8975f5c5SAndroid Build Coastguard Worker         return mShaderResourceWriteDescriptorDescs;
348*8975f5c5SAndroid Build Coastguard Worker     }
getDefaultUniformWriteDescriptorDescs(TransformFeedbackVk * transformFeedbackVk)349*8975f5c5SAndroid Build Coastguard Worker     const vk::WriteDescriptorDescs &getDefaultUniformWriteDescriptorDescs(
350*8975f5c5SAndroid Build Coastguard Worker         TransformFeedbackVk *transformFeedbackVk) const
351*8975f5c5SAndroid Build Coastguard Worker     {
352*8975f5c5SAndroid Build Coastguard Worker         return transformFeedbackVk == nullptr ? mDefaultUniformWriteDescriptorDescs
353*8975f5c5SAndroid Build Coastguard Worker                                               : mDefaultUniformAndXfbWriteDescriptorDescs;
354*8975f5c5SAndroid Build Coastguard Worker     }
355*8975f5c5SAndroid Build Coastguard Worker 
getTextureWriteDescriptorDescs()356*8975f5c5SAndroid Build Coastguard Worker     const vk::WriteDescriptorDescs &getTextureWriteDescriptorDescs() const
357*8975f5c5SAndroid Build Coastguard Worker     {
358*8975f5c5SAndroid Build Coastguard Worker         return mTextureWriteDescriptorDescs;
359*8975f5c5SAndroid Build Coastguard Worker     }
360*8975f5c5SAndroid Build Coastguard Worker     // The following functions are for internal use of programs, including from a threaded link job:
361*8975f5c5SAndroid Build Coastguard Worker     angle::Result resizeUniformBlockMemory(vk::Context *context,
362*8975f5c5SAndroid Build Coastguard Worker                                            const gl::ShaderMap<size_t> &requiredBufferSize);
363*8975f5c5SAndroid Build Coastguard Worker     void resolvePrecisionMismatch(const gl::ProgramMergedVaryings &mergedVaryings);
initShaders(vk::Context * context,const gl::ShaderBitSet & linkedShaderStages,const gl::ShaderMap<const angle::spirv::Blob * > & spirvBlobs,bool isGLES1)364*8975f5c5SAndroid Build Coastguard Worker     angle::Result initShaders(vk::Context *context,
365*8975f5c5SAndroid Build Coastguard Worker                               const gl::ShaderBitSet &linkedShaderStages,
366*8975f5c5SAndroid Build Coastguard Worker                               const gl::ShaderMap<const angle::spirv::Blob *> &spirvBlobs,
367*8975f5c5SAndroid Build Coastguard Worker                               bool isGLES1)
368*8975f5c5SAndroid Build Coastguard Worker     {
369*8975f5c5SAndroid Build Coastguard Worker         return mOriginalShaderInfo.initShaders(context, linkedShaderStages, spirvBlobs,
370*8975f5c5SAndroid Build Coastguard Worker                                                mVariableInfoMap, isGLES1);
371*8975f5c5SAndroid Build Coastguard Worker     }
assignAllSpvLocations(vk::Context * context,const gl::ProgramState & programState,const gl::ProgramLinkedResources & resources)372*8975f5c5SAndroid Build Coastguard Worker     void assignAllSpvLocations(vk::Context *context,
373*8975f5c5SAndroid Build Coastguard Worker                                const gl::ProgramState &programState,
374*8975f5c5SAndroid Build Coastguard Worker                                const gl::ProgramLinkedResources &resources)
375*8975f5c5SAndroid Build Coastguard Worker     {
376*8975f5c5SAndroid Build Coastguard Worker         SpvSourceOptions options = SpvCreateSourceOptions(
377*8975f5c5SAndroid Build Coastguard Worker             context->getFeatures(), context->getRenderer()->getMaxColorInputAttachmentCount());
378*8975f5c5SAndroid Build Coastguard Worker         SpvAssignAllLocations(options, programState, resources, &mVariableInfoMap);
379*8975f5c5SAndroid Build Coastguard Worker     }
380*8975f5c5SAndroid Build Coastguard Worker 
381*8975f5c5SAndroid Build Coastguard Worker   private:
382*8975f5c5SAndroid Build Coastguard Worker     class WarmUpTaskCommon;
383*8975f5c5SAndroid Build Coastguard Worker     class WarmUpComputeTask;
384*8975f5c5SAndroid Build Coastguard Worker     class WarmUpGraphicsTask;
385*8975f5c5SAndroid Build Coastguard Worker 
386*8975f5c5SAndroid Build Coastguard Worker     friend class ProgramVk;
387*8975f5c5SAndroid Build Coastguard Worker     friend class ProgramPipelineVk;
388*8975f5c5SAndroid Build Coastguard Worker 
389*8975f5c5SAndroid Build Coastguard Worker     void reset(ContextVk *contextVk);
390*8975f5c5SAndroid Build Coastguard Worker 
391*8975f5c5SAndroid Build Coastguard Worker     void addInterfaceBlockDescriptorSetDesc(const std::vector<gl::InterfaceBlock> &blocks,
392*8975f5c5SAndroid Build Coastguard Worker                                             gl::ShaderBitSet shaderTypes,
393*8975f5c5SAndroid Build Coastguard Worker                                             VkDescriptorType descType,
394*8975f5c5SAndroid Build Coastguard Worker                                             vk::DescriptorSetLayoutDesc *descOut);
395*8975f5c5SAndroid Build Coastguard Worker     void addAtomicCounterBufferDescriptorSetDesc(
396*8975f5c5SAndroid Build Coastguard Worker         const std::vector<gl::AtomicCounterBuffer> &atomicCounterBuffers,
397*8975f5c5SAndroid Build Coastguard Worker         vk::DescriptorSetLayoutDesc *descOut);
398*8975f5c5SAndroid Build Coastguard Worker     void addImageDescriptorSetDesc(vk::DescriptorSetLayoutDesc *descOut);
399*8975f5c5SAndroid Build Coastguard Worker     void addInputAttachmentDescriptorSetDesc(vk::Context *context,
400*8975f5c5SAndroid Build Coastguard Worker                                              vk::DescriptorSetLayoutDesc *descOut);
401*8975f5c5SAndroid Build Coastguard Worker     angle::Result addTextureDescriptorSetDesc(
402*8975f5c5SAndroid Build Coastguard Worker         vk::Context *context,
403*8975f5c5SAndroid Build Coastguard Worker         const gl::ActiveTextureArray<TextureVk *> *activeTextures,
404*8975f5c5SAndroid Build Coastguard Worker         vk::DescriptorSetLayoutDesc *descOut);
405*8975f5c5SAndroid Build Coastguard Worker 
406*8975f5c5SAndroid Build Coastguard Worker     size_t calcUniformUpdateRequiredSpace(vk::Context *context,
407*8975f5c5SAndroid Build Coastguard Worker                                           gl::ShaderMap<VkDeviceSize> *uniformOffsets) const;
408*8975f5c5SAndroid Build Coastguard Worker 
initProgram(vk::Context * context,gl::ShaderType shaderType,bool isLastPreFragmentStage,bool isTransformFeedbackProgram,ProgramTransformOptions optionBits,ProgramInfo * programInfo,const ShaderInterfaceVariableInfoMap & variableInfoMap)409*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE angle::Result initProgram(vk::Context *context,
410*8975f5c5SAndroid Build Coastguard Worker                                            gl::ShaderType shaderType,
411*8975f5c5SAndroid Build Coastguard Worker                                            bool isLastPreFragmentStage,
412*8975f5c5SAndroid Build Coastguard Worker                                            bool isTransformFeedbackProgram,
413*8975f5c5SAndroid Build Coastguard Worker                                            ProgramTransformOptions optionBits,
414*8975f5c5SAndroid Build Coastguard Worker                                            ProgramInfo *programInfo,
415*8975f5c5SAndroid Build Coastguard Worker                                            const ShaderInterfaceVariableInfoMap &variableInfoMap)
416*8975f5c5SAndroid Build Coastguard Worker     {
417*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mOriginalShaderInfo.valid());
418*8975f5c5SAndroid Build Coastguard Worker 
419*8975f5c5SAndroid Build Coastguard Worker         // Create the program pipeline.  This is done lazily and once per combination of
420*8975f5c5SAndroid Build Coastguard Worker         // specialization constants.
421*8975f5c5SAndroid Build Coastguard Worker         if (!programInfo->valid(shaderType))
422*8975f5c5SAndroid Build Coastguard Worker         {
423*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(programInfo->initProgram(context, shaderType, isLastPreFragmentStage,
424*8975f5c5SAndroid Build Coastguard Worker                                                isTransformFeedbackProgram, mOriginalShaderInfo,
425*8975f5c5SAndroid Build Coastguard Worker                                                optionBits, variableInfoMap));
426*8975f5c5SAndroid Build Coastguard Worker         }
427*8975f5c5SAndroid Build Coastguard Worker         ASSERT(programInfo->valid(shaderType));
428*8975f5c5SAndroid Build Coastguard Worker 
429*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
430*8975f5c5SAndroid Build Coastguard Worker     }
431*8975f5c5SAndroid Build Coastguard Worker 
initGraphicsShaderProgram(vk::Context * context,gl::ShaderType shaderType,bool isLastPreFragmentStage,bool isTransformFeedbackProgram,ProgramTransformOptions optionBits,ProgramInfo * programInfo,const ShaderInterfaceVariableInfoMap & variableInfoMap)432*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE angle::Result initGraphicsShaderProgram(
433*8975f5c5SAndroid Build Coastguard Worker         vk::Context *context,
434*8975f5c5SAndroid Build Coastguard Worker         gl::ShaderType shaderType,
435*8975f5c5SAndroid Build Coastguard Worker         bool isLastPreFragmentStage,
436*8975f5c5SAndroid Build Coastguard Worker         bool isTransformFeedbackProgram,
437*8975f5c5SAndroid Build Coastguard Worker         ProgramTransformOptions optionBits,
438*8975f5c5SAndroid Build Coastguard Worker         ProgramInfo *programInfo,
439*8975f5c5SAndroid Build Coastguard Worker         const ShaderInterfaceVariableInfoMap &variableInfoMap)
440*8975f5c5SAndroid Build Coastguard Worker     {
441*8975f5c5SAndroid Build Coastguard Worker         mValidGraphicsPermutations.set(optionBits.permutationIndex);
442*8975f5c5SAndroid Build Coastguard Worker         return initProgram(context, shaderType, isLastPreFragmentStage, isTransformFeedbackProgram,
443*8975f5c5SAndroid Build Coastguard Worker                            optionBits, programInfo, variableInfoMap);
444*8975f5c5SAndroid Build Coastguard Worker     }
445*8975f5c5SAndroid Build Coastguard Worker 
initComputeProgram(vk::Context * context,ProgramInfo * programInfo,const ShaderInterfaceVariableInfoMap & variableInfoMap,const vk::ComputePipelineOptions & pipelineOptions)446*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE angle::Result initComputeProgram(
447*8975f5c5SAndroid Build Coastguard Worker         vk::Context *context,
448*8975f5c5SAndroid Build Coastguard Worker         ProgramInfo *programInfo,
449*8975f5c5SAndroid Build Coastguard Worker         const ShaderInterfaceVariableInfoMap &variableInfoMap,
450*8975f5c5SAndroid Build Coastguard Worker         const vk::ComputePipelineOptions &pipelineOptions)
451*8975f5c5SAndroid Build Coastguard Worker     {
452*8975f5c5SAndroid Build Coastguard Worker         mValidComputePermutations.set(pipelineOptions.permutationIndex);
453*8975f5c5SAndroid Build Coastguard Worker         ProgramTransformOptions optionBits = {};
454*8975f5c5SAndroid Build Coastguard Worker         return initProgram(context, gl::ShaderType::Compute, false, false, optionBits, programInfo,
455*8975f5c5SAndroid Build Coastguard Worker                            variableInfoMap);
456*8975f5c5SAndroid Build Coastguard Worker     }
457*8975f5c5SAndroid Build Coastguard Worker 
458*8975f5c5SAndroid Build Coastguard Worker     ProgramTransformOptions getTransformOptions(ContextVk *contextVk,
459*8975f5c5SAndroid Build Coastguard Worker                                                 const vk::GraphicsPipelineDesc &desc);
460*8975f5c5SAndroid Build Coastguard Worker     angle::Result initGraphicsShaderPrograms(vk::Context *context,
461*8975f5c5SAndroid Build Coastguard Worker                                              ProgramTransformOptions transformOptions);
462*8975f5c5SAndroid Build Coastguard Worker     angle::Result initProgramThenCreateGraphicsPipeline(vk::Context *context,
463*8975f5c5SAndroid Build Coastguard Worker                                                         ProgramTransformOptions transformOptions,
464*8975f5c5SAndroid Build Coastguard Worker                                                         vk::GraphicsPipelineSubset pipelineSubset,
465*8975f5c5SAndroid Build Coastguard Worker                                                         vk::PipelineCacheAccess *pipelineCache,
466*8975f5c5SAndroid Build Coastguard Worker                                                         PipelineSource source,
467*8975f5c5SAndroid Build Coastguard Worker                                                         const vk::GraphicsPipelineDesc &desc,
468*8975f5c5SAndroid Build Coastguard Worker                                                         const vk::RenderPass &compatibleRenderPass,
469*8975f5c5SAndroid Build Coastguard Worker                                                         const vk::GraphicsPipelineDesc **descPtrOut,
470*8975f5c5SAndroid Build Coastguard Worker                                                         vk::PipelineHelper **pipelineOut);
471*8975f5c5SAndroid Build Coastguard Worker     angle::Result createGraphicsPipelineImpl(vk::Context *context,
472*8975f5c5SAndroid Build Coastguard Worker                                              ProgramTransformOptions transformOptions,
473*8975f5c5SAndroid Build Coastguard Worker                                              vk::GraphicsPipelineSubset pipelineSubset,
474*8975f5c5SAndroid Build Coastguard Worker                                              vk::PipelineCacheAccess *pipelineCache,
475*8975f5c5SAndroid Build Coastguard Worker                                              PipelineSource source,
476*8975f5c5SAndroid Build Coastguard Worker                                              const vk::GraphicsPipelineDesc &desc,
477*8975f5c5SAndroid Build Coastguard Worker                                              const vk::RenderPass &compatibleRenderPass,
478*8975f5c5SAndroid Build Coastguard Worker                                              const vk::GraphicsPipelineDesc **descPtrOut,
479*8975f5c5SAndroid Build Coastguard Worker                                              vk::PipelineHelper **pipelineOut);
480*8975f5c5SAndroid Build Coastguard Worker     angle::Result prepareForWarmUpPipelineCache(
481*8975f5c5SAndroid Build Coastguard Worker         vk::Context *context,
482*8975f5c5SAndroid Build Coastguard Worker         vk::PipelineRobustness pipelineRobustness,
483*8975f5c5SAndroid Build Coastguard Worker         vk::PipelineProtectedAccess pipelineProtectedAccess,
484*8975f5c5SAndroid Build Coastguard Worker         vk::GraphicsPipelineSubset subset,
485*8975f5c5SAndroid Build Coastguard Worker         bool *isComputeOut,
486*8975f5c5SAndroid Build Coastguard Worker         angle::FixedVector<bool, 2> *surfaceRotationVariationsOut,
487*8975f5c5SAndroid Build Coastguard Worker         vk::GraphicsPipelineDesc **graphicsPipelineDescOut,
488*8975f5c5SAndroid Build Coastguard Worker         vk::RenderPass *renderPassOut);
489*8975f5c5SAndroid Build Coastguard Worker     angle::Result warmUpComputePipelineCache(vk::Context *context,
490*8975f5c5SAndroid Build Coastguard Worker                                              vk::PipelineRobustness pipelineRobustness,
491*8975f5c5SAndroid Build Coastguard Worker                                              vk::PipelineProtectedAccess pipelineProtectedAccess);
492*8975f5c5SAndroid Build Coastguard Worker     angle::Result warmUpGraphicsPipelineCache(vk::Context *context,
493*8975f5c5SAndroid Build Coastguard Worker                                               vk::PipelineRobustness pipelineRobustness,
494*8975f5c5SAndroid Build Coastguard Worker                                               vk::PipelineProtectedAccess pipelineProtectedAccess,
495*8975f5c5SAndroid Build Coastguard Worker                                               vk::GraphicsPipelineSubset subset,
496*8975f5c5SAndroid Build Coastguard Worker                                               const bool isSurfaceRotated,
497*8975f5c5SAndroid Build Coastguard Worker                                               const vk::GraphicsPipelineDesc &graphicsPipelineDesc,
498*8975f5c5SAndroid Build Coastguard Worker                                               const vk::RenderPass &renderPass,
499*8975f5c5SAndroid Build Coastguard Worker                                               vk::PipelineHelper *placeholderPipelineHelper);
500*8975f5c5SAndroid Build Coastguard Worker     void waitForPostLinkTasksImpl(ContextVk *contextVk);
501*8975f5c5SAndroid Build Coastguard Worker 
502*8975f5c5SAndroid Build Coastguard Worker     angle::Result getOrAllocateDescriptorSet(vk::Context *context,
503*8975f5c5SAndroid Build Coastguard Worker                                              uint32_t currentFrame,
504*8975f5c5SAndroid Build Coastguard Worker                                              UpdateDescriptorSetsBuilder *updateBuilder,
505*8975f5c5SAndroid Build Coastguard Worker                                              const vk::DescriptorSetDescBuilder &descriptorSetDesc,
506*8975f5c5SAndroid Build Coastguard Worker                                              const vk::WriteDescriptorDescs &writeDescriptorDescs,
507*8975f5c5SAndroid Build Coastguard Worker                                              DescriptorSetIndex setIndex,
508*8975f5c5SAndroid Build Coastguard Worker                                              vk::SharedDescriptorSetCacheKey *newSharedCacheKeyOut);
509*8975f5c5SAndroid Build Coastguard Worker 
510*8975f5c5SAndroid Build Coastguard Worker     // When loading from cache / binary, initialize the pipeline cache with given data.  Otherwise
511*8975f5c5SAndroid Build Coastguard Worker     // the cache is lazily created as needed.
512*8975f5c5SAndroid Build Coastguard Worker     angle::Result initializePipelineCache(vk::Context *context,
513*8975f5c5SAndroid Build Coastguard Worker                                           bool compressed,
514*8975f5c5SAndroid Build Coastguard Worker                                           const std::vector<uint8_t> &pipelineData);
515*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensurePipelineCacheInitialized(vk::Context *context);
516*8975f5c5SAndroid Build Coastguard Worker 
517*8975f5c5SAndroid Build Coastguard Worker     void initializeWriteDescriptorDesc(vk::Context *context);
518*8975f5c5SAndroid Build Coastguard Worker 
519*8975f5c5SAndroid Build Coastguard Worker     // Descriptor sets and pools for shader resources for this program.
520*8975f5c5SAndroid Build Coastguard Worker     vk::DescriptorSetArray<vk::DescriptorSetPointer> mDescriptorSets;
521*8975f5c5SAndroid Build Coastguard Worker     vk::DescriptorSetArray<vk::DynamicDescriptorPoolPointer> mDynamicDescriptorPools;
522*8975f5c5SAndroid Build Coastguard Worker     vk::BufferSerial mCurrentDefaultUniformBufferSerial;
523*8975f5c5SAndroid Build Coastguard Worker 
524*8975f5c5SAndroid Build Coastguard Worker     // We keep a reference to the pipeline and descriptor set layouts. This ensures they don't get
525*8975f5c5SAndroid Build Coastguard Worker     // deleted while this program is in use.
526*8975f5c5SAndroid Build Coastguard Worker     uint32_t mImmutableSamplersMaxDescriptorCount;
527*8975f5c5SAndroid Build Coastguard Worker     ImmutableSamplerIndexMap mImmutableSamplerIndexMap;
528*8975f5c5SAndroid Build Coastguard Worker     vk::PipelineLayoutPtr mPipelineLayout;
529*8975f5c5SAndroid Build Coastguard Worker     vk::DescriptorSetLayoutPointerArray mDescriptorSetLayouts;
530*8975f5c5SAndroid Build Coastguard Worker 
531*8975f5c5SAndroid Build Coastguard Worker     // A set of dynamic offsets used with vkCmdBindDescriptorSets for the default uniform buffers.
532*8975f5c5SAndroid Build Coastguard Worker     VkDescriptorType mUniformBufferDescriptorType;
533*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderVector<uint32_t> mDynamicUniformDescriptorOffsets;
534*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint32_t> mDynamicShaderResourceDescriptorOffsets;
535*8975f5c5SAndroid Build Coastguard Worker 
536*8975f5c5SAndroid Build Coastguard Worker     ShaderInterfaceVariableInfoMap mVariableInfoMap;
537*8975f5c5SAndroid Build Coastguard Worker 
538*8975f5c5SAndroid Build Coastguard Worker     static_assert((ProgramTransformOptions::kPermutationCount == 16),
539*8975f5c5SAndroid Build Coastguard Worker                   "ProgramTransformOptions::kPermutationCount must be 16.");
540*8975f5c5SAndroid Build Coastguard Worker     angle::BitSet16<ProgramTransformOptions::kPermutationCount> mValidGraphicsPermutations;
541*8975f5c5SAndroid Build Coastguard Worker 
542*8975f5c5SAndroid Build Coastguard Worker     static_assert((vk::ComputePipelineOptions::kPermutationCount == 4),
543*8975f5c5SAndroid Build Coastguard Worker                   "ComputePipelineOptions::kPermutationCount must be 4.");
544*8975f5c5SAndroid Build Coastguard Worker     angle::BitSet8<vk::ComputePipelineOptions::kPermutationCount> mValidComputePermutations;
545*8975f5c5SAndroid Build Coastguard Worker 
546*8975f5c5SAndroid Build Coastguard Worker     // We store all permutations of surface rotation and transformed SPIR-V programs here. We may
547*8975f5c5SAndroid Build Coastguard Worker     // need some LRU algorithm to free least used programs to reduce the number of programs.
548*8975f5c5SAndroid Build Coastguard Worker     ProgramInfo mGraphicsProgramInfos[ProgramTransformOptions::kPermutationCount];
549*8975f5c5SAndroid Build Coastguard Worker     ProgramInfo mComputeProgramInfo;
550*8975f5c5SAndroid Build Coastguard Worker 
551*8975f5c5SAndroid Build Coastguard Worker     // Pipeline caches.  The pipelines are tightly coupled with the shaders they are created for, so
552*8975f5c5SAndroid Build Coastguard Worker     // they live in the program executable.  With VK_EXT_graphics_pipeline_library, the pipeline is
553*8975f5c5SAndroid Build Coastguard Worker     // divided in subsets; the "shaders" subset is created based on the shaders, so its cache lives
554*8975f5c5SAndroid Build Coastguard Worker     // in the program executable.  The "vertex input" and "fragment output" pipelines are
555*8975f5c5SAndroid Build Coastguard Worker     // independent, and live in the context.
556*8975f5c5SAndroid Build Coastguard Worker     CompleteGraphicsPipelineCache
557*8975f5c5SAndroid Build Coastguard Worker         mCompleteGraphicsPipelines[ProgramTransformOptions::kPermutationCount];
558*8975f5c5SAndroid Build Coastguard Worker     ShadersGraphicsPipelineCache
559*8975f5c5SAndroid Build Coastguard Worker         mShadersGraphicsPipelines[ProgramTransformOptions::kPermutationCount];
560*8975f5c5SAndroid Build Coastguard Worker     vk::ComputePipelineCache mComputePipelines;
561*8975f5c5SAndroid Build Coastguard Worker 
562*8975f5c5SAndroid Build Coastguard Worker     DefaultUniformBlockMap mDefaultUniformBlocks;
563*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderBitSet mDefaultUniformBlocksDirty;
564*8975f5c5SAndroid Build Coastguard Worker 
565*8975f5c5SAndroid Build Coastguard Worker     ShaderInfo mOriginalShaderInfo;
566*8975f5c5SAndroid Build Coastguard Worker 
567*8975f5c5SAndroid Build Coastguard Worker     // The pipeline cache specific to this program executable.  Currently:
568*8975f5c5SAndroid Build Coastguard Worker     //
569*8975f5c5SAndroid Build Coastguard Worker     // - This is used during warm up (at link time)
570*8975f5c5SAndroid Build Coastguard Worker     // - The contents are merged to Renderer's pipeline cache immediately after warm up
571*8975f5c5SAndroid Build Coastguard Worker     // - The contents are returned as part of program binary
572*8975f5c5SAndroid Build Coastguard Worker     // - Draw-time pipeline creation uses Renderer's cache
573*8975f5c5SAndroid Build Coastguard Worker     //
574*8975f5c5SAndroid Build Coastguard Worker     // Without VK_EXT_graphics_pipeline_library, this cache is not used for draw-time pipeline
575*8975f5c5SAndroid Build Coastguard Worker     // creations to allow reuse of other blobs that are independent of the actual shaders; vertex
576*8975f5c5SAndroid Build Coastguard Worker     // input fetch, fragment output and blend.
577*8975f5c5SAndroid Build Coastguard Worker     //
578*8975f5c5SAndroid Build Coastguard Worker     // With VK_EXT_graphics_pipeline_library, this cache is used for the "shaders" subset of the
579*8975f5c5SAndroid Build Coastguard Worker     // pipeline.
580*8975f5c5SAndroid Build Coastguard Worker     vk::PipelineCache mPipelineCache;
581*8975f5c5SAndroid Build Coastguard Worker 
582*8975f5c5SAndroid Build Coastguard Worker     vk::GraphicsPipelineDesc mWarmUpGraphicsPipelineDesc;
583*8975f5c5SAndroid Build Coastguard Worker 
584*8975f5c5SAndroid Build Coastguard Worker     // The "layout" information for descriptorSets
585*8975f5c5SAndroid Build Coastguard Worker     vk::WriteDescriptorDescs mShaderResourceWriteDescriptorDescs;
586*8975f5c5SAndroid Build Coastguard Worker     vk::WriteDescriptorDescs mTextureWriteDescriptorDescs;
587*8975f5c5SAndroid Build Coastguard Worker     vk::WriteDescriptorDescs mDefaultUniformWriteDescriptorDescs;
588*8975f5c5SAndroid Build Coastguard Worker     vk::WriteDescriptorDescs mDefaultUniformAndXfbWriteDescriptorDescs;
589*8975f5c5SAndroid Build Coastguard Worker 
590*8975f5c5SAndroid Build Coastguard Worker     vk::DescriptorSetLayoutDesc mShaderResourceSetDesc;
591*8975f5c5SAndroid Build Coastguard Worker     vk::DescriptorSetLayoutDesc mTextureSetDesc;
592*8975f5c5SAndroid Build Coastguard Worker     vk::DescriptorSetLayoutDesc mDefaultUniformAndXfbSetDesc;
593*8975f5c5SAndroid Build Coastguard Worker };
594*8975f5c5SAndroid Build Coastguard Worker 
595*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
596*8975f5c5SAndroid Build Coastguard Worker 
597*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_VULKAN_PROGRAMEXECUTABLEVK_H_
598