diff --git a/filament/backend/src/vulkan/VulkanDescriptorSetLayoutSerializer.cpp b/filament/backend/src/vulkan/VulkanDescriptorSetLayoutSerializer.cpp index b951c7ece2..f6d96cb834 100644 --- a/filament/backend/src/vulkan/VulkanDescriptorSetLayoutSerializer.cpp +++ b/filament/backend/src/vulkan/VulkanDescriptorSetLayoutSerializer.cpp @@ -18,15 +18,19 @@ VulkanDescriptorSetLayoutSerializer::VulkanDescriptorSetLayoutSerializer( buffer << "{" << std::endl; buffer << "\"binding\":" << info.pBindings[i].binding << "," << std::endl; buffer << "\"descriptor_type\":" << info.pBindings[i].descriptorType << "," << std::endl; - buffer << "\"stage_flags\":" << info.pBindings[i].stageFlags << "," << std::endl; - buffer << "\"immutable_samplers\":[" << std::endl; - for (uint32_t i = 0; i < immutableSamplers.size(); ++i) { - buffer << immutableSamplers[i]; - if (i < immutableSamplers.size() - 1) { - buffer << ","; + buffer << "\"stage_flags\":" << info.pBindings[i].stageFlags; + if (immutableSamplers.size()) { + buffer << "," << std::endl; + buffer << "\"immutable_samplers\":[" << std::endl; + for (uint32_t i = 0; i < immutableSamplers.size(); ++i) { + buffer << immutableSamplers[i]; + if (i < immutableSamplers.size() - 1) { + buffer << ","; + } } + buffer << "]"; } - buffer << "]" << std::endl; + buffer << std::endl; buffer << "}"; if (i < info.bindingCount - 1) { buffer << ","; diff --git a/filament/backend/src/vulkan/VulkanDriver.cpp b/filament/backend/src/vulkan/VulkanDriver.cpp index d2bf19ae68..e381e8a013 100644 --- a/filament/backend/src/vulkan/VulkanDriver.cpp +++ b/filament/backend/src/vulkan/VulkanDriver.cpp @@ -1666,7 +1666,7 @@ void VulkanDriver::beginRenderPass(Handle rth, const RenderPassP rpkey.subpassMask = uint8_t(params.subpassMask); VkRenderPass renderPass = mFramebufferCache.getRenderPass(rpkey); - mPipelineCache.bindRenderPass(renderPass, 0); + mPipelineCache.bindRenderPass(renderPass, mFramebufferCache.getRenderPassKey(renderPass), 0); // Create the VkFramebuffer or fetch it from cache. VulkanFboCache::FboKey fbkey = rt->getFboKey(); @@ -1785,6 +1785,7 @@ void VulkanDriver::nextSubpass(int) { VK_SUBPASS_CONTENTS_INLINE); mPipelineCache.bindRenderPass(mCurrentRenderPass.renderPass, + mFramebufferCache.getRenderPassKey(mCurrentRenderPass.renderPass), ++mCurrentRenderPass.currentSubpass); if (mCurrentRenderPass.params.subpassMask & 0x1) { diff --git a/filament/backend/src/vulkan/VulkanPipelineCache.cpp b/filament/backend/src/vulkan/VulkanPipelineCache.cpp index 414e4450d5..b3ddd9bb2d 100644 --- a/filament/backend/src/vulkan/VulkanPipelineCache.cpp +++ b/filament/backend/src/vulkan/VulkanPipelineCache.cpp @@ -202,6 +202,8 @@ VulkanPipelineCache::PipelineCacheEntry* VulkanPipelineCache::createPipeline() n //layout serializer.setPipelineLayoutKey(mPipelineLayoutKey); + // renderPass + serializer.setRenderPassKey(mRenderPassKey); VkGraphicsPipelineCreateInfo pipelineCreateInfo = { .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, @@ -256,7 +258,10 @@ VulkanPipelineCache::PipelineCacheEntry* VulkanPipelineCache::createPipeline() n FVK_LOGE << "vkCreateGraphicsPipelines error " << error; return nullptr; } - serializer.setID(cacheEntry.handle); + + PipelineHashFn hashFunc; + + serializer.setID(hashFunc(mPipelineRequirements)); return &mPipelines.emplace(mPipelineRequirements, cacheEntry).first.value(); } @@ -281,9 +286,10 @@ void VulkanPipelineCache::bindRasterState(RasterState const& rasterState) noexce mPipelineRequirements.rasterState = rasterState; } -void VulkanPipelineCache::bindRenderPass(VkRenderPass renderPass, int subpassIndex) noexcept { +void VulkanPipelineCache::bindRenderPass(VkRenderPass renderPass, uint32_t passKey, int subpassIndex) noexcept { mPipelineRequirements.renderPass = renderPass; mPipelineRequirements.subpassIndex = subpassIndex; + mRenderPassKey = passKey; } void VulkanPipelineCache::bindPrimitiveTopology(VkPrimitiveTopology topology) noexcept { diff --git a/filament/backend/src/vulkan/VulkanPipelineCache.h b/filament/backend/src/vulkan/VulkanPipelineCache.h index 155b9c0993..169f90863d 100644 --- a/filament/backend/src/vulkan/VulkanPipelineCache.h +++ b/filament/backend/src/vulkan/VulkanPipelineCache.h @@ -96,7 +96,7 @@ public: // Each of the following methods are fast and do not make Vulkan calls. void bindProgram(fvkmemory::resource_ptr program) noexcept; void bindRasterState(RasterState const& rasterState) noexcept; - void bindRenderPass(VkRenderPass renderPass, int subpassIndex) noexcept; + void bindRenderPass(VkRenderPass renderPass, uint32_t passKey, int subpassIndex) noexcept; void bindPrimitiveTopology(VkPrimitiveTopology topology) noexcept; void bindVertexArray(VkVertexInputAttributeDescription const* attribDesc, VkVertexInputBindingDescription const* bufferDesc, uint8_t count); @@ -211,6 +211,7 @@ private: uint64_t mVertexShaderHash; uint64_t mFragmentShaderHash; uint32_t mPipelineLayoutKey; + uint32_t mRenderPassKey; // Current bindings for the pipeline and descriptor sets. PipelineKey mBoundPipeline = {}; diff --git a/filament/backend/src/vulkan/VulkanPipelineStateSerializer.cpp b/filament/backend/src/vulkan/VulkanPipelineStateSerializer.cpp index 790265cabc..149cf2521e 100644 --- a/filament/backend/src/vulkan/VulkanPipelineStateSerializer.cpp +++ b/filament/backend/src/vulkan/VulkanPipelineStateSerializer.cpp @@ -98,9 +98,13 @@ void VulkanPipelineStateSerializer::setPipelineLayoutKey(uint32_t pipelineLayout mBuffer << "\"layout\":" << pipelineLayoutKey << "," << std::endl; } -void VulkanPipelineStateSerializer::setID(VkPipeline cache) { +void VulkanPipelineStateSerializer::setRenderPassKey(uint32_t renderPassKey) { + mBuffer << "\"render_pass\":" << renderPassKey << "," << std::endl; +} + +void VulkanPipelineStateSerializer::setID(uint32_t key) { std::stringstream temp; - temp << "pipeline_" << cache << ".json"; + temp << "pipeline_" << key << ".json"; temp >> mFileName; } diff --git a/filament/backend/src/vulkan/VulkanPipelineStateSerializer.h b/filament/backend/src/vulkan/VulkanPipelineStateSerializer.h index 1bb858dd2d..2db841d353 100644 --- a/filament/backend/src/vulkan/VulkanPipelineStateSerializer.h +++ b/filament/backend/src/vulkan/VulkanPipelineStateSerializer.h @@ -39,8 +39,9 @@ public: VulkanPipelineStateSerializer(const utils::CString& name); ~VulkanPipelineStateSerializer(); - void setID(VkPipeline cache); + void setID(uint32_t key); void setPipelineLayoutKey(uint32_t pipelineLayoutKey); + void setRenderPassKey(uint32_t renderPassKey); VulkanPipelineStateSerializer& operator<<( const VkPipelineInputAssemblyStateCreateInfo& inputAsm); VulkanPipelineStateSerializer& operator<<(const VkPipelineViewportStateCreateInfo& viewport); diff --git a/filament/backend/src/vulkan/VulkanSamplerStateSerializer.cpp b/filament/backend/src/vulkan/VulkanSamplerStateSerializer.cpp index f6b8df2cf6..3246435ecd 100644 --- a/filament/backend/src/vulkan/VulkanSamplerStateSerializer.cpp +++ b/filament/backend/src/vulkan/VulkanSamplerStateSerializer.cpp @@ -54,7 +54,6 @@ VulkanSamplerStateSerializer::VulkanSamplerStateSerializer(const VulkanSamplerCa buffer << "\"anisotropy_log2\":" << uint32_t(samplerParams.anisotropyLog2) << "," << std::endl; buffer << "\"compare_mode\":" << uint32_t(samplerParams.compareMode) << "," << std::endl; buffer << "\"compare_func\":" << uint32_t(samplerParams.compareFunc) << "," << std::endl; - buffer << "\"filter_min\":" << uint32_t(samplerParams.filterMin) << "," << std::endl; buffer << "\"ycbcr_conv_key\":" << ycbcr_conv_key << std::endl; buffer << "}" << std::endl;