diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index ba28b6937..8f27bb28e 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -308,9 +308,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, UnwrapInPlace(out->commandPool)); \ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, VkCommandBufferInheritanceInfo, \ UnwrapInPlace(out->renderPass), UnwrapInPlace(out->framebuffer)); \ - UNWRAP_STRUCT(VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, VkComputePipelineCreateInfo, \ - UnwrapInPlace(out->stage.module), UnwrapInPlace(out->layout), \ - UnwrapInPlace(out->basePipelineHandle)); \ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET, VkCopyDescriptorSet, \ UnwrapInPlace(out->srcSet), UnwrapInPlace(out->dstSet)); \ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV, \ @@ -554,6 +551,11 @@ size_t GetNextPatchSize(const void *pNext) memSize += info->stageCount * sizeof(VkPipelineShaderStageCreateInfo); break; } + case VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO: + { + memSize += sizeof(VkComputePipelineCreateInfo); + break; + } case VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO: { memSize += sizeof(VkPipelineLayoutCreateInfo); @@ -983,7 +985,8 @@ void UnwrapNextChain(CaptureState state, const char *structName, byte *&tempMem, *out = *in; UnwrapInPlace(out->layout); UnwrapInPlace(out->renderPass); - UnwrapInPlace(out->basePipelineHandle); + if(out->flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + UnwrapInPlace(out->basePipelineHandle); out->pStages = outShaders; for(uint32_t i = 0; i < in->stageCount; i++) @@ -991,6 +994,21 @@ void UnwrapNextChain(CaptureState state, const char *structName, byte *&tempMem, break; } + case VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO: + { + const VkComputePipelineCreateInfo *in = (const VkComputePipelineCreateInfo *)nextInput; + VkComputePipelineCreateInfo *out = (VkComputePipelineCreateInfo *)tempMem; + + *out = *in; + UnwrapInPlace(out->layout); + UnwrapInPlace(out->stage.module); + if(out->flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + UnwrapInPlace(out->basePipelineHandle); + + AppendModifiedChainedStruct(tempMem, out, nextChainTail); + + break; + } case VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO: { const VkPipelineLayoutCreateInfo *in = (const VkPipelineLayoutCreateInfo *)nextInput; diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index c4c3699fe..c49fc4765 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -2291,8 +2291,13 @@ void DoSerialise(SerialiserType &ser, VkGraphicsPipelineCreateInfo &el) SERIALISE_MEMBER(layout); SERIALISE_MEMBER(renderPass); SERIALISE_MEMBER(subpass); - SERIALISE_MEMBER(basePipelineHandle); - SERIALISE_MEMBER(basePipelineIndex); + + if(el.flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + SERIALISE_MEMBER(basePipelineHandle); + else + SERIALISE_MEMBER_EMPTY(basePipelineHandle); + + SERIALISE_MEMBER_EMPTY(basePipelineIndex); } template <> @@ -2363,7 +2368,12 @@ void DoSerialise(SerialiserType &ser, VkComputePipelineCreateInfo &el) SERIALISE_MEMBER_TYPED(VkPipelineCreateFlagBits, flags); SERIALISE_MEMBER(stage); SERIALISE_MEMBER(layout); - SERIALISE_MEMBER(basePipelineHandle); + + if(el.flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + SERIALISE_MEMBER(basePipelineHandle); + else + SERIALISE_MEMBER_EMPTY(basePipelineHandle); + SERIALISE_MEMBER(basePipelineIndex); } diff --git a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp index 04bd4aab2..c2812b6d0 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp @@ -36,7 +36,8 @@ VkComputePipelineCreateInfo *WrappedVulkan::UnwrapInfos(const VkComputePipelineC unwrapped[i] = info[i]; unwrapped[i].stage.module = Unwrap(unwrapped[i].stage.module); unwrapped[i].layout = Unwrap(unwrapped[i].layout); - unwrapped[i].basePipelineHandle = Unwrap(unwrapped[i].basePipelineHandle); + if(unwrapped[i].flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + unwrapped[i].basePipelineHandle = Unwrap(unwrapped[i].basePipelineHandle); } return unwrapped; @@ -70,7 +71,8 @@ VkGraphicsPipelineCreateInfo *WrappedVulkan::UnwrapInfos(const VkGraphicsPipelin unwrappedInfos[i].pStages = unwrappedStages; unwrappedInfos[i].layout = Unwrap(unwrappedInfos[i].layout); unwrappedInfos[i].renderPass = Unwrap(unwrappedInfos[i].renderPass); - unwrappedInfos[i].basePipelineHandle = Unwrap(unwrappedInfos[i].basePipelineHandle); + if(unwrappedInfos[i].flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + unwrappedInfos[i].basePipelineHandle = Unwrap(unwrappedInfos[i].basePipelineHandle); } return unwrappedInfos; @@ -473,8 +475,11 @@ bool WrappedVulkan::Serialise_vkCreateGraphicsPipelines( DerivedResource(device, Pipeline); if(origCache != VK_NULL_HANDLE) DerivedResource(origCache, Pipeline); - if(CreateInfo.basePipelineHandle != VK_NULL_HANDLE) - DerivedResource(CreateInfo.basePipelineHandle, Pipeline); + if(CreateInfo.flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + { + if(CreateInfo.basePipelineHandle != VK_NULL_HANDLE) + DerivedResource(CreateInfo.basePipelineHandle, Pipeline); + } DerivedResource(origRP, Pipeline); DerivedResource(CreateInfo.layout, Pipeline); for(uint32_t i = 0; i < CreateInfo.stageCount; i++) @@ -512,13 +517,17 @@ VkResult WrappedVulkan::vkCreateGraphicsPipelines(VkDevice device, VkPipelineCac VkGraphicsPipelineCreateInfo modifiedCreateInfo; const VkGraphicsPipelineCreateInfo *createInfo = &pCreateInfos[i]; - // since we serialise one by one, we need to fixup basePipelineIndex - if(createInfo->basePipelineIndex != -1 && createInfo->basePipelineIndex < (int)i) + if(createInfo->flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) { - modifiedCreateInfo = *createInfo; - modifiedCreateInfo.basePipelineHandle = pPipelines[modifiedCreateInfo.basePipelineIndex]; - modifiedCreateInfo.basePipelineIndex = -1; - createInfo = &modifiedCreateInfo; + // since we serialise one by one, we need to fixup basePipelineIndex + if(createInfo->basePipelineIndex != -1 && createInfo->basePipelineIndex < (int)i) + { + modifiedCreateInfo = *createInfo; + modifiedCreateInfo.basePipelineHandle = + pPipelines[modifiedCreateInfo.basePipelineIndex]; + modifiedCreateInfo.basePipelineIndex = -1; + createInfo = &modifiedCreateInfo; + } } SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCreateGraphicsPipelines); @@ -531,18 +540,22 @@ VkResult WrappedVulkan::vkCreateGraphicsPipelines(VkDevice device, VkPipelineCac VkResourceRecord *record = GetResourceManager()->AddResourceRecord(pPipelines[i]); record->AddChunk(chunk); - if(pCreateInfos[i].basePipelineHandle != VK_NULL_HANDLE) + if(pCreateInfos[i].flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) { - VkResourceRecord *baserecord = GetRecord(pCreateInfos[i].basePipelineHandle); - record->AddParent(baserecord); + if(pCreateInfos[i].basePipelineHandle != VK_NULL_HANDLE) + { + VkResourceRecord *baserecord = GetRecord(pCreateInfos[i].basePipelineHandle); + record->AddParent(baserecord); - RDCDEBUG("Creating pipeline %llu base is %llu", record->GetResourceID(), - baserecord->GetResourceID()); - } - else if(pCreateInfos[i].basePipelineIndex != -1 && pCreateInfos[i].basePipelineIndex < (int)i) - { - VkResourceRecord *baserecord = GetRecord(pPipelines[pCreateInfos[i].basePipelineIndex]); - record->AddParent(baserecord); + RDCDEBUG("Creating pipeline %llu base is %llu", record->GetResourceID(), + baserecord->GetResourceID()); + } + else if(pCreateInfos[i].basePipelineIndex != -1 && + pCreateInfos[i].basePipelineIndex < (int)i) + { + VkResourceRecord *baserecord = GetRecord(pPipelines[pCreateInfos[i].basePipelineIndex]); + record->AddParent(baserecord); + } } if(pipelineCache != VK_NULL_HANDLE) @@ -637,8 +650,11 @@ bool WrappedVulkan::Serialise_vkCreateComputePipelines(SerialiserType &ser, VkDe DerivedResource(device, Pipeline); if(origCache != VK_NULL_HANDLE) DerivedResource(origCache, Pipeline); - if(CreateInfo.basePipelineHandle != VK_NULL_HANDLE) - DerivedResource(CreateInfo.basePipelineHandle, Pipeline); + if(CreateInfo.flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + { + if(CreateInfo.basePipelineHandle != VK_NULL_HANDLE) + DerivedResource(CreateInfo.basePipelineHandle, Pipeline); + } DerivedResource(CreateInfo.layout, Pipeline); DerivedResource(CreateInfo.stage.module, Pipeline); } @@ -673,13 +689,17 @@ VkResult WrappedVulkan::vkCreateComputePipelines(VkDevice device, VkPipelineCach VkComputePipelineCreateInfo modifiedCreateInfo; const VkComputePipelineCreateInfo *createInfo = &pCreateInfos[i]; - // since we serialise one by one, we need to fixup basePipelineIndex - if(createInfo->basePipelineIndex != -1 && createInfo->basePipelineIndex < (int)i) + if(createInfo->flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) { - modifiedCreateInfo = *createInfo; - modifiedCreateInfo.basePipelineHandle = pPipelines[modifiedCreateInfo.basePipelineIndex]; - modifiedCreateInfo.basePipelineIndex = -1; - createInfo = &modifiedCreateInfo; + // since we serialise one by one, we need to fixup basePipelineIndex + if(createInfo->basePipelineIndex != -1 && createInfo->basePipelineIndex < (int)i) + { + modifiedCreateInfo = *createInfo; + modifiedCreateInfo.basePipelineHandle = + pPipelines[modifiedCreateInfo.basePipelineIndex]; + modifiedCreateInfo.basePipelineIndex = -1; + createInfo = &modifiedCreateInfo; + } } SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCreateComputePipelines); @@ -698,15 +718,19 @@ VkResult WrappedVulkan::vkCreateComputePipelines(VkDevice device, VkPipelineCach record->AddParent(cacherecord); } - if(pCreateInfos[i].basePipelineHandle != VK_NULL_HANDLE) + if(pCreateInfos[i].flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) { - VkResourceRecord *baserecord = GetRecord(pCreateInfos[i].basePipelineHandle); - record->AddParent(baserecord); - } - else if(pCreateInfos[i].basePipelineIndex != -1 && pCreateInfos[i].basePipelineIndex < (int)i) - { - VkResourceRecord *baserecord = GetRecord(pPipelines[pCreateInfos[i].basePipelineIndex]); - record->AddParent(baserecord); + if(pCreateInfos[i].basePipelineHandle != VK_NULL_HANDLE) + { + VkResourceRecord *baserecord = GetRecord(pCreateInfos[i].basePipelineHandle); + record->AddParent(baserecord); + } + else if(pCreateInfos[i].basePipelineIndex != -1 && + pCreateInfos[i].basePipelineIndex < (int)i) + { + VkResourceRecord *baserecord = GetRecord(pPipelines[pCreateInfos[i].basePipelineIndex]); + record->AddParent(baserecord); + } } VkResourceRecord *layoutrecord = GetRecord(pCreateInfos[i].layout);