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 ¤tGraphicsPipelineDesc); 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