From 2485eefc80013c743a321b5feed8d140079c9636 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 6 Oct 2025 14:21:10 +0100 Subject: [PATCH] viewportCount can't be assumed to be the number of scissors * Although normally viewportCount == scissorCount, if viewport is DYNAMIC_WITH_COUNT and scissor is only dynamic (or fixed) the number of scissors must be used strictly. --- renderdoc/driver/vulkan/vk_info.cpp | 14 +++++++++++++- renderdoc/driver/vulkan/vk_info.h | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index a068f5463..f1ebb2ed5 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -1424,13 +1424,22 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, viewportCount = 0; viewports.resize(viewportCount); - scissors.resize(viewportCount); for(uint32_t i = 0; i < viewportCount; i++) { if(pCreateInfo->pViewportState->pViewports) viewports[i] = pCreateInfo->pViewportState->pViewports[i]; + } + if(pCreateInfo->pViewportState) + scissorCount = pCreateInfo->pViewportState->scissorCount; + else + scissorCount = 0; + + scissors.resize(scissorCount); + + for(uint32_t i = 0; i < scissorCount; i++) + { if(pCreateInfo->pViewportState->pScissors) scissors[i] = pCreateInfo->pViewportState->pScissors[i]; } @@ -1751,6 +1760,7 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, vertLayout = pipeInfo.vertLayout; viewportCount = pipeInfo.viewportCount; + scissorCount = pipeInfo.scissorCount; viewports = pipeInfo.viewports; scissors = pipeInfo.scissors; @@ -2013,6 +2023,7 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, Vulk tessellationDomainOrigin = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT; viewportCount = 0; + scissorCount = 0; // VkPipelineRasterStateCreateInfo depthClampEnable = false; @@ -2079,6 +2090,7 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, tessellationDomainOrigin = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT; viewportCount = 0; + scissorCount = 0; // VkPipelineRasterStateCreateInfo depthClampEnable = false; diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index 74f4b6873..bcd909e01 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -364,6 +364,7 @@ struct VulkanCreationInfo // VkPipelineViewportStateCreateInfo uint32_t viewportCount; + uint32_t scissorCount; rdcarray viewports; rdcarray scissors;