move ms/compute shader system to single descriptorset

This commit is contained in:
Remi Palandri
2022-05-03 12:33:46 +01:00
committed by Baldur Karlsson
parent 85789e6209
commit acde46de57
6 changed files with 142 additions and 175 deletions
+11 -9
View File
@@ -40,6 +40,7 @@ layout(push_constant) uniform multisamplePush
int sampleOffset;
int byteSize;
int maxInvocationID;
int dispatchOffset;
}
mscopy;
@@ -48,6 +49,7 @@ mscopy;
#define sampleOffset (mscopy.sampleOffset)
#define byteSize (mscopy.byteSize)
#define maxInvocationID (mscopy.maxInvocationID)
#define dispatchOffset (mscopy.dispatchOffset)
void main()
{
@@ -64,7 +66,7 @@ void main()
uvec4 data;
if(byteSize == 1)
{
data.x = srcData[idx];
data.x = srcData[dispatchOffset + idx];
int pxIdx = int(idx * 4);
int x0 = (pxIdx + 0) % texWidth;
int y0 = (pxIdx + 0) / texWidth;
@@ -82,7 +84,7 @@ void main()
}
else if(byteSize == 2)
{
data.x = srcData[idx];
data.x = srcData[dispatchOffset + idx];
int pxIdx = int(idx * 2);
int x0 = (pxIdx + 0) % texWidth;
int y0 = (pxIdx + 0) / texWidth;
@@ -96,25 +98,25 @@ void main()
{
int x0 = int(idx) % texWidth;
int y0 = int(idx) / texWidth;
data.x = srcData[idx];
data.x = srcData[dispatchOffset + idx];
imageStore(dstMS, ivec3(x0, y0, slice), sampleIdx, data);
}
else if(byteSize == 8)
{
int x0 = int(idx) % texWidth;
int y0 = int(idx) / texWidth;
data.x = srcData[idx * 2];
data.y = srcData[idx * 2 + 1];
data.x = srcData[dispatchOffset + (idx * 2)];
data.y = srcData[dispatchOffset + (idx * 2 + 1)];
imageStore(dstMS, ivec3(x0, y0, slice), sampleIdx, data);
}
else if(byteSize == 16)
{
int x0 = int(idx) % texWidth;
int y0 = int(idx) / texWidth;
data.x = srcData[idx * 4];
data.y = srcData[idx * 4 + 1];
data.z = srcData[idx * 4 + 2];
data.w = srcData[idx * 4 + 3];
data.x = srcData[dispatchOffset + (idx * 4)];
data.y = srcData[dispatchOffset + (idx * 4 + 1)];
data.z = srcData[dispatchOffset + (idx * 4 + 2)];
data.w = srcData[dispatchOffset + (idx * 4 + 3)];
imageStore(dstMS, ivec3(x0, y0, slice), sampleIdx, data);
}
}
+9 -7
View File
@@ -48,6 +48,7 @@ layout(push_constant) uniform multisamplePush
int baseSample;
int format;
int maxInvocationID;
int dispatchOffset;
}
mscopy;
@@ -56,6 +57,7 @@ mscopy;
#define baseSample (mscopy.baseSample)
#define format (mscopy.format)
#define maxInvocationID (mscopy.maxInvocationID)
#define dispatchOffset (mscopy.dispatchOffset)
void main()
{
@@ -82,35 +84,35 @@ void main()
vec2 depth = vec2(texelFetch(srcDepthMS, ivec3(x0, y0, slice), sampleIdx).x,
texelFetch(srcDepthMS, ivec3(x1, y1, slice), sampleIdx).x);
result[idx] = (floatToD16(depth.x) << 0) | (floatToD16(depth.y) << 16);
result[dispatchOffset + idx] = (floatToD16(depth.x) << 0) | (floatToD16(depth.y) << 16);
}
else if(format == SHADER_D16_UNORM_S8_UINT)
{
float depth = texelFetch(srcDepthMS, coord, sampleIdx).x;
uint stencil = texelFetch(srcStencilMS, coord, sampleIdx).x;
result[idx] = (floatToD16(depth) << 0) | (stencil << 16);
result[dispatchOffset + idx] = (floatToD16(depth) << 0) | (stencil << 16);
}
else if(format == SHADER_X8_D24_UNORM_PACK32)
{
float depth = texelFetch(srcDepthMS, coord, sampleIdx).x;
result[idx] = (floatToD24(depth) << 0);
result[dispatchOffset + idx] = (floatToD24(depth) << 0);
}
else if(format == SHADER_D24_UNORM_S8_UINT)
{
float depth = texelFetch(srcDepthMS, coord, sampleIdx).x;
uint stencil = texelFetch(srcStencilMS, coord, sampleIdx).x;
result[idx] = (floatToD24(depth) << 0) | (stencil << 24);
result[dispatchOffset + idx] = (floatToD24(depth) << 0) | (stencil << 24);
}
else if(format == SHADER_D32_SFLOAT)
{
float depth = texelFetch(srcDepthMS, coord, sampleIdx).x;
result[idx] = floatBitsToUint(depth);
result[dispatchOffset + idx] = floatBitsToUint(depth);
}
else if(format == SHADER_D32_SFLOAT_S8_UINT)
{
float depth = texelFetch(srcDepthMS, coord, sampleIdx).x;
uint stencil = texelFetch(srcStencilMS, coord, sampleIdx).x;
result[idx * 2 + 0] = floatBitsToUint(depth);
result[idx * 2 + 1] = stencil;
result[dispatchOffset + (idx * 2 + 0)] = floatBitsToUint(depth);
result[dispatchOffset + (idx * 2 + 1)] = stencil;
}
}
+11 -9
View File
@@ -42,6 +42,7 @@ layout(push_constant) uniform multisamplePush
int baseSample;
int byteSize;
int maxInvocationID;
int dispatchOffset;
}
mscopy;
@@ -50,6 +51,7 @@ mscopy;
#define baseSample (mscopy.baseSample)
#define byteSize (mscopy.byteSize)
#define maxInvocationID (mscopy.maxInvocationID)
#define dispatchOffset (mscopy.dispatchOffset)
void main()
{
@@ -78,7 +80,7 @@ void main()
texelFetch(srcMS, ivec3(x1, y1, slice), sampleIdx).x,
texelFetch(srcMS, ivec3(x2, y2, slice), sampleIdx).x,
texelFetch(srcMS, ivec3(x3, y3, slice), sampleIdx).x);
result[idx] = (data.x << 0 | data.y << 8 | data.z << 16 | data.w << 24);
result[dispatchOffset + idx] = (data.x << 0 | data.y << 8 | data.z << 16 | data.w << 24);
}
else if(byteSize == 2)
{
@@ -90,31 +92,31 @@ void main()
uvec2 data = uvec2(texelFetch(srcMS, ivec3(x0, y0, slice), sampleIdx).x,
texelFetch(srcMS, ivec3(x1, y1, slice), sampleIdx).x);
result[idx] = (data.x << 0 | data.y << 16);
result[dispatchOffset + idx] = (data.x << 0 | data.y << 16);
}
else if(byteSize == 4)
{
int x0 = int(idx) % textureWidth;
int y0 = int(idx) / textureWidth;
uint data = texelFetch(srcMS, ivec3(x0, y0, slice), sampleIdx).x;
result[idx] = data;
result[dispatchOffset + idx] = data;
}
else if(byteSize == 8)
{
int x0 = int(idx) % textureWidth;
int y0 = int(idx) / textureWidth;
uvec2 data = texelFetch(srcMS, ivec3(x0, y0, slice), sampleIdx).xy;
result[idx * 2] = data.x;
result[idx * 2 + 1] = data.y;
result[dispatchOffset + (idx * 2)] = data.x;
result[dispatchOffset + (idx * 2 + 1)] = data.y;
}
else if(byteSize == 16)
{
int x0 = int(idx) % textureWidth;
int y0 = int(idx) / textureWidth;
uvec4 data = texelFetch(srcMS, ivec3(x0, y0, slice), sampleIdx);
result[idx * 4] = data.x;
result[idx * 4 + 1] = data.y;
result[idx * 4 + 2] = data.z;
result[idx * 4 + 3] = data.w;
result[dispatchOffset + (idx * 4)] = data.x;
result[dispatchOffset + (idx * 4 + 1)] = data.y;
result[dispatchOffset + (idx * 4 + 2)] = data.z;
result[dispatchOffset + (idx * 4 + 3)] = data.w;
}
}