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:
baldurk
2018-12-04 13:19:53 +00:00
parent 3889ecb552
commit bc051afbe2
3 changed files with 95 additions and 43 deletions
+22 -4
View File
@@ -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;
+13 -3
View File
@@ -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);