From 0f731a60c313f7fc7725cd9aaa77246a605d1696 Mon Sep 17 00:00:00 2001 From: Egor Yusov Date: Wed, 20 Mar 2019 10:22:35 -0700 Subject: Reworked GenerateMipsCS.csh Vulkan shader to be convertible to MSL on Mac and iOS. According to this discussion https://github.com/KhronosGroup/SPIRV-Cross/issues/888 this will fix https://github.com/DiligentGraphics/DiligentCore/issues/66 --- Graphics/GraphicsEngineVulkan/shaders/GenerateMipsCS.csh | 13 ++++++++----- .../GraphicsEngineVulkan/shaders/GenerateMipsCS_inc.h | 13 ++++++++----- .../GraphicsEngineVulkan/src/GenerateMipsVkHelper.cpp | 15 +++++++++++---- 3 files changed, 27 insertions(+), 14 deletions(-) (limited to 'Graphics/GraphicsEngineVulkan') diff --git a/Graphics/GraphicsEngineVulkan/shaders/GenerateMipsCS.csh b/Graphics/GraphicsEngineVulkan/shaders/GenerateMipsCS.csh index 4dd756ea..be18f341 100644 --- a/Graphics/GraphicsEngineVulkan/shaders/GenerateMipsCS.csh +++ b/Graphics/GraphicsEngineVulkan/shaders/GenerateMipsCS.csh @@ -10,7 +10,10 @@ #define IMG_FORMAT rgba8 #endif -layout(IMG_FORMAT) uniform writeonly image2DArray OutMip[4]; +layout(IMG_FORMAT) uniform writeonly image2DArray OutMip0; +layout(IMG_FORMAT) uniform writeonly image2DArray OutMip1; +layout(IMG_FORMAT) uniform writeonly image2DArray OutMip2; +layout(IMG_FORMAT) uniform writeonly image2DArray OutMip3; uniform sampler2DArray SrcMip; @@ -134,7 +137,7 @@ void main() Src1 *= 0.25; #endif - imageStore(OutMip[0], ivec3(GlobalInd.xy, ArraySlice), PackColor(Src1)); + imageStore(OutMip0, ivec3(GlobalInd.xy, ArraySlice), PackColor(Src1)); } // A scalar (constant) branch can exit all threads coherently. @@ -164,7 +167,7 @@ void main() vec4 Src4 = LoadColor(LocalInd + 0x09u); Src1 = 0.25 * (Src1 + Src2 + Src3 + Src4); - imageStore(OutMip[1], ivec3(GlobalInd.xy / 2u, ArraySlice), PackColor(Src1)); + imageStore(OutMip1, ivec3(GlobalInd.xy / 2u, ArraySlice), PackColor(Src1)); StoreColor(LocalInd, Src1); } } @@ -184,7 +187,7 @@ void main() vec4 Src4 = LoadColor(LocalInd + 0x12u); Src1 = 0.25 * (Src1 + Src2 + Src3 + Src4); - imageStore(OutMip[2], ivec3(GlobalInd.xy / 4u, ArraySlice), PackColor(Src1)); + imageStore(OutMip2, ivec3(GlobalInd.xy / 4u, ArraySlice), PackColor(Src1)); StoreColor(LocalInd, Src1); } } @@ -205,7 +208,7 @@ void main() vec4 Src4 = LoadColor(LocalInd + 0x24u); Src1 = 0.25 * (Src1 + Src2 + Src3 + Src4); - imageStore(OutMip[3], ivec3(GlobalInd.xy / 8u, ArraySlice), PackColor(Src1)); + imageStore(OutMip3, ivec3(GlobalInd.xy / 8u, ArraySlice), PackColor(Src1)); } } } diff --git a/Graphics/GraphicsEngineVulkan/shaders/GenerateMipsCS_inc.h b/Graphics/GraphicsEngineVulkan/shaders/GenerateMipsCS_inc.h index 48c24265..fc307e60 100644 --- a/Graphics/GraphicsEngineVulkan/shaders/GenerateMipsCS_inc.h +++ b/Graphics/GraphicsEngineVulkan/shaders/GenerateMipsCS_inc.h @@ -10,7 +10,10 @@ "#define IMG_FORMAT rgba8\n" "#endif\n" "\n" -"layout(IMG_FORMAT) uniform writeonly image2DArray OutMip[4];\n" +"layout(IMG_FORMAT) uniform writeonly image2DArray OutMip0;\n" +"layout(IMG_FORMAT) uniform writeonly image2DArray OutMip1;\n" +"layout(IMG_FORMAT) uniform writeonly image2DArray OutMip2;\n" +"layout(IMG_FORMAT) uniform writeonly image2DArray OutMip3;\n" "\n" "uniform sampler2DArray SrcMip;\n" "\n" @@ -134,7 +137,7 @@ " Src1 *= 0.25;\n" "#endif\n" "\n" -" imageStore(OutMip[0], ivec3(GlobalInd.xy, ArraySlice), PackColor(Src1));\n" +" imageStore(OutMip0, ivec3(GlobalInd.xy, ArraySlice), PackColor(Src1));\n" " }\n" "\n" " // A scalar (constant) branch can exit all threads coherently.\n" @@ -164,7 +167,7 @@ " vec4 Src4 = LoadColor(LocalInd + 0x09u);\n" " Src1 = 0.25 * (Src1 + Src2 + Src3 + Src4);\n" "\n" -" imageStore(OutMip[1], ivec3(GlobalInd.xy / 2u, ArraySlice), PackColor(Src1));\n" +" imageStore(OutMip1, ivec3(GlobalInd.xy / 2u, ArraySlice), PackColor(Src1));\n" " StoreColor(LocalInd, Src1);\n" " }\n" " }\n" @@ -184,7 +187,7 @@ " vec4 Src4 = LoadColor(LocalInd + 0x12u);\n" " Src1 = 0.25 * (Src1 + Src2 + Src3 + Src4);\n" "\n" -" imageStore(OutMip[2], ivec3(GlobalInd.xy / 4u, ArraySlice), PackColor(Src1));\n" +" imageStore(OutMip2, ivec3(GlobalInd.xy / 4u, ArraySlice), PackColor(Src1));\n" " StoreColor(LocalInd, Src1);\n" " }\n" " }\n" @@ -205,7 +208,7 @@ " vec4 Src4 = LoadColor(LocalInd + 0x24u);\n" " Src1 = 0.25 * (Src1 + Src2 + Src3 + Src4);\n" "\n" -" imageStore(OutMip[3], ivec3(GlobalInd.xy / 8u, ArraySlice), PackColor(Src1));\n" +" imageStore(OutMip3, ivec3(GlobalInd.xy / 8u, ArraySlice), PackColor(Src1));\n" " }\n" " }\n" "}\n" diff --git a/Graphics/GraphicsEngineVulkan/src/GenerateMipsVkHelper.cpp b/Graphics/GraphicsEngineVulkan/src/GenerateMipsVkHelper.cpp index 4ae8243e..4282b578 100644 --- a/Graphics/GraphicsEngineVulkan/src/GenerateMipsVkHelper.cpp +++ b/Graphics/GraphicsEngineVulkan/src/GenerateMipsVkHelper.cpp @@ -209,7 +209,13 @@ namespace Diligent const auto& ViewDesc = TexView.GetDesc(); auto* pSrcMipVar = SRB.GetVariable(SHADER_TYPE_COMPUTE, "SrcMip"); - auto* pOutMipVar = SRB.GetVariable(SHADER_TYPE_COMPUTE, "OutMip"); + IShaderResourceVariable* pOutMipVar[4] = + { + SRB.GetVariable(SHADER_TYPE_COMPUTE, "OutMip0"), + SRB.GetVariable(SHADER_TYPE_COMPUTE, "OutMip1"), + SRB.GetVariable(SHADER_TYPE_COMPUTE, "OutMip2"), + SRB.GetVariable(SHADER_TYPE_COMPUTE, "OutMip3") + }; auto& PSOs = FindPSOs(ViewDesc.Format); @@ -295,10 +301,11 @@ namespace Diligent } constexpr const Uint32 MaxMipsHandledByCS = 4; // Max number of mip levels processed by one CS shader invocation - std::array MipLevelUAVs; for (Uint32 u = 0; u < MaxMipsHandledByCS; ++u) - MipLevelUAVs[u] = pTexVk->GetMipLevelUAV(std::min(TopMip + u + 1, TexDesc.MipLevels - 1)); - pOutMipVar->SetArray(MipLevelUAVs.data(), 0, MaxMipsHandledByCS); + { + auto* MipLevelUAV = pTexVk->GetMipLevelUAV(std::min(TopMip + u + 1, TexDesc.MipLevels - 1)); + pOutMipVar[u]->Set(MipLevelUAV); + } SubresRange.baseMipLevel = TopMip + 1; SubresRange.levelCount = std::min(4u, TexDesc.MipLevels - (TopMip + 1)); -- cgit v1.2.3