diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index e54af8ad0..2c9470812 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -966,17 +966,16 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, // this is used to e.g. filter specified dynamic states so we only consider the ones valid for // this pipeline. If we're not using libraries, all states are valid - VkGraphicsPipelineLibraryFlagsEXT availStages = - VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT | - VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT | - VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT | - VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT; + availStages = VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT | + VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT | + VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT | + VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT; const VkGraphicsPipelineLibraryCreateInfoEXT *graphicsLibraryCreate = (const VkGraphicsPipelineLibraryCreateInfoEXT *)FindNextStruct( pCreateInfo, VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT); if(graphicsLibraryCreate) - availStages = libraryFlags = graphicsLibraryCreate->flags; + availStages = graphicsLibraryCreate->flags; vertLayout = fragLayout = GetResID(pCreateInfo->layout); renderpass = GetResID(pCreateInfo->renderPass); @@ -1451,7 +1450,7 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, for(size_t i = 0; i < VkDynamicCount; i++) dynamicStates[i] |= pipeInfo.dynamicStates[i]; - if(pipeInfo.libraryFlags & VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT) + if(pipeInfo.availStages & VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT) { vertexBindings = pipeInfo.vertexBindings; vertexAttrs = pipeInfo.vertexAttrs; @@ -1460,7 +1459,7 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, primitiveRestartEnable = pipeInfo.primitiveRestartEnable; } - if(pipeInfo.libraryFlags & VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT) + if(pipeInfo.availStages & VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT) { renderpass = pipeInfo.renderpass; subpass = pipeInfo.subpass; @@ -1511,7 +1510,7 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, flags |= pipeInfo.flags; } - if(pipeInfo.libraryFlags & VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT) + if(pipeInfo.availStages & VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT) { renderpass = pipeInfo.renderpass; subpass = pipeInfo.subpass; @@ -1540,7 +1539,7 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, flags |= pipeInfo.flags; } - if(pipeInfo.libraryFlags & VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT) + if(pipeInfo.availStages & VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT) { renderpass = pipeInfo.renderpass; subpass = pipeInfo.subpass; diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index f52b5cb08..c4aa42470 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -240,7 +240,7 @@ struct VulkanCreationInfo bool graphicsPipe = false; // VkGraphicsPipelineLibraryCreateInfoEXT - VkGraphicsPipelineLibraryFlagsEXT libraryFlags; + VkGraphicsPipelineLibraryFlagsEXT availStages; rdcarray parentLibraries; ResourceId compLayout; diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index cd63ce3fb..4f84942ce 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -4850,6 +4850,17 @@ void VulkanReplay::RefreshDerivedReplacements() ResourceId pipesrcid = it->first; const VulkanCreationInfo::Pipeline &pipeInfo = it->second; + // don't replace incomplete pipeline libraries (we already pull the full state into the final + // pipeline, so these are not used in replay; the libraries contain invalid dummy data for the + // non-available parts) + if(!(pipeInfo.availStages & VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT) || + !(pipeInfo.availStages & VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT) || + !(pipeInfo.availStages & VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT) || + !(pipeInfo.availStages & VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT)) + { + continue; + } + ResourceId origsrcid = rm->GetOriginalID(pipesrcid); // only look at pipelines from the capture, no replay-time programs.