summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2019-03-20 17:22:35 +0000
committerEgor Yusov <egor.yusov@gmail.com>2019-03-20 17:22:35 +0000
commit0f731a60c313f7fc7725cd9aaa77246a605d1696 (patch)
tree4a1cbf7ee41cdfea807f56c577db6616cd2c9113 /Graphics/GraphicsEngineVulkan
parentAdded error message when attempting to create typeless texture with GENERAT_M... (diff)
downloadDiligentCore-0f731a60c313f7fc7725cd9aaa77246a605d1696.tar.gz
DiligentCore-0f731a60c313f7fc7725cd9aaa77246a605d1696.zip
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
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/shaders/GenerateMipsCS.csh13
-rw-r--r--Graphics/GraphicsEngineVulkan/shaders/GenerateMipsCS_inc.h13
-rw-r--r--Graphics/GraphicsEngineVulkan/src/GenerateMipsVkHelper.cpp15
3 files changed, 27 insertions, 14 deletions
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<IDeviceObject*, MaxMipsHandledByCS> 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));