mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-06 01:50:38 +00:00
Only use basePipeline* if VK_PIPELINE_CREATE_DERIVATIVE_BIT was set
* This prevents us from trying to read an invalid index or handle that shouldn't be used at all.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user