From 799827e9fb8c20d780a6719653085870ac0c19ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 23 Apr 2026 11:19:57 +0200 Subject: [PATCH] Revert "Remove unnecessary bindings from compute shader descriptor layout" This reverts commit 090efb95131171639fd5f8ffa8e071e800a6bea7. --- GPU/Vulkan/TextureCacheVulkan.cpp | 2 +- GPU/Vulkan/VulkanUtil.cpp | 54 +++++++++++++++++++++++++------ GPU/Vulkan/VulkanUtil.h | 2 +- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index 3aa02067c6..0ebe937b2d 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -479,7 +479,7 @@ bool TextureCacheVulkan::RunMultipassCompute(VulkanContext *vulkan, VkCommandBuf stage.useFinalOutputSize ? dstWidth : srcWidth * stage.dstWidthScale, stage.useFinalOutputSize ? dstHeight : srcHeight * stage.dstHeightScale, }; - VkDescriptorSet stageSet = computeShaderManager_.GetDescriptorSet(outputView, inputBuffer, inputOffset, inputRange); + VkDescriptorSet stageSet = computeShaderManager_.GetDescriptorSet(outputView, inputBuffer, inputOffset, inputRange, VK_NULL_HANDLE, 0, 0, inputImage); vkCmdBindPipeline(cmdInit, VK_PIPELINE_BIND_POINT_COMPUTE, computeShaderManager_.GetPipeline(multipassCS_[stage.shaderIndex])); vkCmdBindDescriptorSets(cmdInit, VK_PIPELINE_BIND_POINT_COMPUTE, computeShaderManager_.GetPipelineLayout(), 0, 1, &stageSet, 0, nullptr); vkCmdPushConstants(cmdInit, computeShaderManager_.GetPipelineLayout(), VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(params), ¶ms); diff --git a/GPU/Vulkan/VulkanUtil.cpp b/GPU/Vulkan/VulkanUtil.cpp index 81378b5c20..1e2cfa75d2 100644 --- a/GPU/Vulkan/VulkanUtil.cpp +++ b/GPU/Vulkan/VulkanUtil.cpp @@ -39,11 +39,6 @@ const VkComponentMapping VULKAN_1555_SWIZZLE = { VK_COMPONENT_SWIZZLE_B, VK_COMP const VkComponentMapping VULKAN_565_SWIZZLE = { VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_IDENTITY }; const VkComponentMapping VULKAN_8888_SWIZZLE = { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY }; -static const BindingType bindingTypes[] = { - BindingType::STORAGE_IMAGE_COMPUTE, - BindingType::STORAGE_BUFFER_COMPUTE, -}; - VkPresentModeKHR ConfigPresentModeToVulkan(Draw::DrawContext *draw) { g_frameTiming.ComputePresentMode(draw, false); Draw::PresentMode presentMode = g_frameTiming.PresentMode(); @@ -112,7 +107,14 @@ void VulkanComputeShaderManager::InitDeviceObjects(Draw::DrawContext *draw) { VkResult res = vkCreatePipelineCache(vulkan_->GetDevice(), &pc, nullptr, &pipelineCache_); _assert_(VK_SUCCESS == res); - VkDescriptorSetLayoutBinding bindings[ARRAY_SIZE(bindingTypes)] = {}; + static const BindingType bindingTypes[4] = { + BindingType::STORAGE_IMAGE_COMPUTE, + BindingType::STORAGE_BUFFER_COMPUTE, + BindingType::STORAGE_BUFFER_COMPUTE, + BindingType::STORAGE_IMAGE_COMPUTE, + }; + + VkDescriptorSetLayoutBinding bindings[4] = {}; bindings[0].descriptorCount = 1; bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; bindings[0].stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; @@ -121,6 +123,14 @@ void VulkanComputeShaderManager::InitDeviceObjects(Draw::DrawContext *draw) { bindings[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; bindings[1].stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; bindings[1].binding = 1; + bindings[2].descriptorCount = 1; + bindings[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + bindings[2].stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + bindings[2].binding = 2; + bindings[3].descriptorCount = 1; + bindings[3].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; + bindings[3].stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + bindings[3].binding = 3; VkDevice device = vulkan_->GetDevice(); @@ -171,7 +181,7 @@ void VulkanComputeShaderManager::DestroyDeviceObjects() { } } -VkDescriptorSet VulkanComputeShaderManager::GetDescriptorSet(VkImageView image, VkBuffer buffer, VkDeviceSize bufferOffset, VkDeviceSize bufferRange) { +VkDescriptorSet VulkanComputeShaderManager::GetDescriptorSet(VkImageView image, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize range, VkBuffer buffer2, VkDeviceSize offset2, VkDeviceSize range2, VkImageView image2) { int curFrame = vulkan_->GetCurFrame(); FrameData &frameData = frameData_[curFrame]; frameData.descPoolUsed = true; @@ -179,7 +189,7 @@ VkDescriptorSet VulkanComputeShaderManager::GetDescriptorSet(VkImageView image, frameData.descPool.Allocate(&desc, 1, &descriptorSetLayout_); _assert_(desc != VK_NULL_HANDLE); - VkWriteDescriptorSet writes[2]{}; + VkWriteDescriptorSet writes[4]{}; int n = 0; VkDescriptorImageInfo imageInfo[2] = {}; VkDescriptorBufferInfo bufferInfo[2] = {}; @@ -197,8 +207,8 @@ VkDescriptorSet VulkanComputeShaderManager::GetDescriptorSet(VkImageView image, } if (buffer) { bufferInfo[0].buffer = buffer; - bufferInfo[0].offset = bufferOffset; - bufferInfo[0].range = bufferRange; + bufferInfo[0].offset = offset; + bufferInfo[0].range = range; writes[n].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; writes[n].dstBinding = 1; writes[n].pBufferInfo = &bufferInfo[0]; @@ -207,6 +217,30 @@ VkDescriptorSet VulkanComputeShaderManager::GetDescriptorSet(VkImageView image, writes[n].dstSet = desc; n++; } + if (buffer2) { + bufferInfo[1].buffer = buffer2; + bufferInfo[1].offset = offset2; + bufferInfo[1].range = range2; + writes[n].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + writes[n].dstBinding = 2; + writes[n].pBufferInfo = &bufferInfo[1]; + writes[n].descriptorCount = 1; + writes[n].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + writes[n].dstSet = desc; + n++; + } + if (image2) { + imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_GENERAL; + imageInfo[1].imageView = image2; + imageInfo[1].sampler = VK_NULL_HANDLE; + writes[n].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + writes[n].dstBinding = 3; + writes[n].pImageInfo = &imageInfo[1]; + writes[n].descriptorCount = 1; + writes[n].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; + writes[n].dstSet = desc; + n++; + } vkUpdateDescriptorSets(vulkan_->GetDevice(), n, writes, 0, nullptr); return desc; } diff --git a/GPU/Vulkan/VulkanUtil.h b/GPU/Vulkan/VulkanUtil.h index f1b9a4dc75..fca4f2b847 100644 --- a/GPU/Vulkan/VulkanUtil.h +++ b/GPU/Vulkan/VulkanUtil.h @@ -55,7 +55,7 @@ public: } // Note: This doesn't cache. The descriptor is for immediate use only. - VkDescriptorSet GetDescriptorSet(VkImageView image, VkBuffer buffer, VkDeviceSize bufferOffset, VkDeviceSize bufferRange); + VkDescriptorSet GetDescriptorSet(VkImageView image, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize range, VkBuffer buffer2 = VK_NULL_HANDLE, VkDeviceSize offset2 = 0, VkDeviceSize range2 = 0, VkImageView image2 = VK_NULL_HANDLE); // This of course caches though. VkPipeline GetPipeline(VkShaderModule cs);