From 8f103f3f4760a4a2219ee23d53f8c0fcaed3728a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 6 Nov 2022 16:56:21 +0100 Subject: [PATCH] Extract the Vulkan descriptor binding cleanup from #16345 --- GPU/Common/FragmentShaderGenerator.cpp | 11 ++++++----- GPU/Common/VertexShaderGenerator.cpp | 13 +++++++------ GPU/Vulkan/DrawEngineVulkan.cpp | 17 ++--------------- GPU/Vulkan/DrawEngineVulkan.h | 14 ++++++++++++++ assets/lang/en_US.ini | 2 +- assets/lang/sv_SE.ini | 2 +- 6 files changed, 31 insertions(+), 28 deletions(-) diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 9e90a707f3..dee1dfb431 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -31,6 +31,7 @@ #include "GPU/Common/ShaderId.h" #include "GPU/Common/ShaderUniforms.h" #include "GPU/Common/FragmentShaderGenerator.h" +#include "GPU/Vulkan/DrawEngineVulkan.h" #include "GPU/ge_constants.h" #include "GPU/GPUState.h" @@ -187,23 +188,23 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, "layout (depth_unchanged) out float gl_FragDepth;\n"); } - WRITE(p, "layout (std140, set = 1, binding = 3) uniform baseUBO {\n%s};\n", ub_baseStr); + WRITE(p, "layout (std140, set = 1, binding = %d) uniform baseUBO {\n%s};\n", DRAW_BINDING_DYNUBO_BASE, ub_baseStr); if (doTexture) { - WRITE(p, "layout (set = 1, binding = 0) uniform %s%s tex;\n", texture3D ? "sampler3D" : "sampler2D", arrayTexture ? "Array" : ""); + WRITE(p, "layout (set = 1, binding = %d) uniform %s%s tex;\n", DRAW_BINDING_TEXTURE, texture3D ? "sampler3D" : "sampler2D", arrayTexture ? "Array" : ""); } if (readFramebufferTex) { // The framebuffer texture is always bound as an array. - p.C("layout (set = 1, binding = 1) uniform sampler2DArray fbotex;\n"); + p.F("layout (set = 1, binding = %d) uniform sampler2DArray fbotex;\n", DRAW_BINDING_2ND_TEXTURE); } else if (fetchFramebuffer) { - p.C("layout (input_attachment_index = 0, set = 1, binding = 9) uniform subpassInput inputColor;\n"); + p.F("layout (input_attachment_index = 0, set = 1, binding = %d) uniform subpassInput inputColor;\n", DRAW_BINDING_INPUT_ATTACHMENT); if (fragmentShaderFlags) { *fragmentShaderFlags |= FragmentShaderFlags::INPUT_ATTACHMENT; } } if (shaderDepalMode != ShaderDepalMode::OFF) { - WRITE(p, "layout (set = 1, binding = 2) uniform sampler2D pal;\n"); + WRITE(p, "layout (set = 1, binding = %d) uniform sampler2D pal;\n", DRAW_BINDING_DEPAL_TEXTURE); } // Note: the precision qualifiers must match the vertex shader! diff --git a/GPU/Common/VertexShaderGenerator.cpp b/GPU/Common/VertexShaderGenerator.cpp index 57e5e9675f..7e9d2cadb8 100644 --- a/GPU/Common/VertexShaderGenerator.cpp +++ b/GPU/Common/VertexShaderGenerator.cpp @@ -30,6 +30,7 @@ #include "GPU/Common/ShaderUniforms.h" #include "GPU/Common/VertexDecoderCommon.h" #include "GPU/Common/VertexShaderGenerator.h" +#include "GPU/Vulkan/DrawEngineVulkan.h" #undef WRITE @@ -256,11 +257,11 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag WRITE(p, "layout (std140, set = 0, binding = 0) uniform frameVars {\n%s};\n", ub_frameStr); } - WRITE(p, "layout (std140, set = 1, binding = 3) uniform baseVars {\n%s};\n", ub_baseStr); + WRITE(p, "layout (std140, set = 1, binding = %d) uniform baseVars {\n%s};\n", DRAW_BINDING_DYNUBO_BASE, ub_baseStr); if (enableLighting || doShadeMapping) - WRITE(p, "layout (std140, set = 1, binding = 4) uniform lightVars {\n%s};\n", ub_vs_lightsStr); + WRITE(p, "layout (std140, set = 1, binding = %d) uniform lightVars {\n%s};\n", DRAW_BINDING_DYNUBO_LIGHT, ub_vs_lightsStr); if (enableBones) - WRITE(p, "layout (std140, set = 1, binding = 5) uniform boneVars {\n%s};\n", ub_vs_bonesStr); + WRITE(p, "layout (std140, set = 1, binding = %d) uniform boneVars {\n%s};\n", DRAW_BINDING_DYNUBO_BONE, ub_vs_bonesStr); if (enableBones) { WRITE(p, "%s", boneWeightDecl[numBoneWeights]); @@ -638,7 +639,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag WRITE(p, " vec4 tex;\n"); WRITE(p, " vec4 col;\n"); WRITE(p, "};\n"); - WRITE(p, "layout (std430, set = 1, binding = 6) readonly buffer s_tess_data {\n"); + WRITE(p, "layout (std430, set = 1, binding = %d) readonly buffer s_tess_data {\n", DRAW_BINDING_TESS_STORAGE_BUF); WRITE(p, " TessData tess_data[];\n"); WRITE(p, "};\n"); @@ -646,10 +647,10 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag WRITE(p, " vec4 basis;\n"); WRITE(p, " vec4 deriv;\n"); WRITE(p, "};\n"); - WRITE(p, "layout (std430, set = 1, binding = 7) readonly buffer s_tess_weights_u {\n"); + WRITE(p, "layout (std430, set = 1, binding = %d) readonly buffer s_tess_weights_u {\n", DRAW_BINDING_TESS_STORAGE_BUF_WU); WRITE(p, " TessWeight tess_weights_u[];\n"); WRITE(p, "};\n"); - WRITE(p, "layout (std430, set = 1, binding = 8) readonly buffer s_tess_weights_v {\n"); + WRITE(p, "layout (std430, set = 1, binding = %d) readonly buffer s_tess_weights_v {\n", DRAW_BINDING_TESS_STORAGE_BUF_WV); WRITE(p, " TessWeight tess_weights_v[];\n"); WRITE(p, "};\n"); } else if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) { diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index 3a683f3238..a26b14320f 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -62,19 +62,6 @@ enum { enum { VAI_KILL_AGE = 120, VAI_UNRELIABLE_KILL_AGE = 240, VAI_UNRELIABLE_KILL_MAX = 4 }; -enum { - DRAW_BINDING_TEXTURE = 0, - DRAW_BINDING_2ND_TEXTURE = 1, - DRAW_BINDING_DEPAL_TEXTURE = 2, - DRAW_BINDING_DYNUBO_BASE = 3, - DRAW_BINDING_DYNUBO_LIGHT = 4, - DRAW_BINDING_DYNUBO_BONE = 5, - DRAW_BINDING_TESS_STORAGE_BUF = 6, - DRAW_BINDING_TESS_STORAGE_BUF_WU = 7, - DRAW_BINDING_TESS_STORAGE_BUF_WV = 8, - DRAW_BINDING_INPUT_ATTACHMENT = 9, -}; - enum { TRANSFORMED_VERTEX_BUFFER_SIZE = VERTEX_BUFFER_MAX * sizeof(TransformedVertex) }; @@ -97,7 +84,7 @@ void DrawEngineVulkan::InitDeviceObjects() { // TODO: Make things more flexible, so we at least have specialized layouts for input attachments and tess. // Note that it becomes a support matrix.. - VkDescriptorSetLayoutBinding bindings[10]{}; + VkDescriptorSetLayoutBinding bindings[DRAW_BINDING_COUNT]{}; bindings[0].descriptorCount = 1; bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; bindings[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; @@ -415,7 +402,7 @@ VkDescriptorSet DrawEngineVulkan::GetOrCreateDescriptorSet(VkImageView imageView _assert_msg_(desc != VK_NULL_HANDLE, "Ran out of descriptor space in pool. sz=%d", (int)frame.descSets.size()); // We just don't write to the slots we don't care about, which is fine. - VkWriteDescriptorSet writes[9]{}; + VkWriteDescriptorSet writes[DRAW_BINDING_COUNT]{}; // Main texture int n = 0; VkDescriptorImageInfo tex[3]{}; diff --git a/GPU/Vulkan/DrawEngineVulkan.h b/GPU/Vulkan/DrawEngineVulkan.h index 035bc595df..7d069c4305 100644 --- a/GPU/Vulkan/DrawEngineVulkan.h +++ b/GPU/Vulkan/DrawEngineVulkan.h @@ -121,6 +121,20 @@ private: VkDescriptorBufferInfo bufInfo_[3]{}; }; +enum { + DRAW_BINDING_TEXTURE = 0, + DRAW_BINDING_2ND_TEXTURE = 1, + DRAW_BINDING_DEPAL_TEXTURE = 2, + DRAW_BINDING_DYNUBO_BASE = 3, + DRAW_BINDING_DYNUBO_LIGHT = 4, + DRAW_BINDING_DYNUBO_BONE = 5, + DRAW_BINDING_TESS_STORAGE_BUF = 6, + DRAW_BINDING_TESS_STORAGE_BUF_WU = 7, + DRAW_BINDING_TESS_STORAGE_BUF_WV = 8, + DRAW_BINDING_INPUT_ATTACHMENT = 9, + DRAW_BINDING_COUNT = 10, +}; + // Handles transform, lighting and drawing. class DrawEngineVulkan : public DrawEngineCommon { public: diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index 20450f8351..802cf62e42 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -569,7 +569,7 @@ Screen Scaling Filter = Screen scaling filter Show Debug Statistics = Show debug statistics Show FPS Counter = Show FPS counter Skip GPU Readbacks = Skip GPU Readbacks -Software Rendering = Software rendering (slow) +Software Rendering = Software rendering (slow, accurate) Software Skinning = Software skinning SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games Speed = Speed diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index c55bd25529..2e38abbc3b 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -546,7 +546,7 @@ Screen Scaling Filter = Skärmskalningsfilter Show Debug Statistics = Visa debugstatistik Show FPS Counter = Visa FPS-räknare Skip GPU Readbacks = Skip GPU Readbacks -Software Rendering = Mjukvarurendering (experiment) +Software Rendering = Mjukvarurendering (långsam men ofta mer korrekt) Software Skinning = Software Skinning SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games Speed = Hastighet