Fix discard patterns to work correctly with multisampled UINT textures

This commit is contained in:
baldurk
2021-05-27 14:18:05 +01:00
parent c41a6b3740
commit 1ed4b561e6
16 changed files with 223 additions and 71 deletions
+37 -15
View File
@@ -31,7 +31,8 @@
layout(set = 0, binding = 0, std140) uniform DiscardUBOData
{
vec4 pattern[(PATTERN_WIDTH * PATTERN_HEIGHT) / 4];
vec4 floatpattern[(PATTERN_WIDTH * PATTERN_HEIGHT) / 4];
uvec4 intpattern[(PATTERN_WIDTH * PATTERN_HEIGHT) / 4];
}
Pattern;
@@ -63,7 +64,8 @@ in vec2 uv;
uniform DiscardUBOData
{
vec4 pattern[(PATTERN_WIDTH * PATTERN_HEIGHT) / 4];
vec4 floatpattern[(PATTERN_WIDTH * PATTERN_HEIGHT) / 4];
uvec4 intpattern[(PATTERN_WIDTH * PATTERN_HEIGHT) / 4];
}
Pattern;
@@ -71,14 +73,34 @@ uniform uint flags;
#endif
FRAG_OUT(0) out vec4 col0;
FRAG_OUT(1) out vec4 col1;
FRAG_OUT(2) out vec4 col2;
FRAG_OUT(3) out vec4 col3;
FRAG_OUT(4) out vec4 col4;
FRAG_OUT(5) out vec4 col5;
FRAG_OUT(6) out vec4 col6;
FRAG_OUT(7) out vec4 col7;
#if defined(SHADER_BASETYPE) && SHADER_BASETYPE == 1
#define srcpattern intpattern
#define patternType uvec4
#define valType uint
#elif defined(SHADER_BASETYPE) && SHADER_BASETYPE == 2
#define srcpattern intpattern
#define patternType ivec4
#define valType int
#else
#define srcpattern floatpattern
#define patternType vec4
#define valType float
#endif
FRAG_OUT(0) out patternType col0;
FRAG_OUT(1) out patternType col1;
FRAG_OUT(2) out patternType col2;
FRAG_OUT(3) out patternType col3;
FRAG_OUT(4) out patternType col4;
FRAG_OUT(5) out patternType col5;
FRAG_OUT(6) out patternType col6;
FRAG_OUT(7) out patternType col7;
void main()
{
@@ -91,18 +113,18 @@ void main()
int idx = ((y * 64) + x);
float val = Pattern.pattern[idx / 4][idx % 4];
valType val = valType(Pattern.srcpattern[idx / 4][idx % 4]);
uint stencilPass = (flags & 0xfu);
if(stencilPass == 1u && val >= 0.5f)
if(stencilPass == 1u && float(val) >= 0.5f)
discard;
else if(stencilPass == 2u && val < 0.5f)
else if(stencilPass == 2u && float(val) < 0.5f)
discard;
gl_FragDepth = clamp(val, 0.0, 1.0);
gl_FragDepth = clamp(float(val), 0.0f, 1.0f);
vec4 vecval = vec4(val, val, val, val);
patternType vecval = patternType(val, val, val, val);
col0 = col1 = col2 = col3 = col4 = col5 = col6 = col7 = vecval;
}
+22 -6
View File
@@ -87,7 +87,8 @@ float4 RENDERDOC_CheckerboardPS(float4 pos : SV_Position) : SV_Target0
cbuffer discarddata : register(b0)
{
float4 pattern[(PATTERN_WIDTH * PATTERN_HEIGHT) / 4];
float4 floatpattern[(PATTERN_WIDTH * PATTERN_HEIGHT) / 4];
uint4 intpattern[(PATTERN_WIDTH * PATTERN_HEIGHT) / 4];
};
cbuffer discardopts : register(b1)
@@ -95,14 +96,14 @@ cbuffer discardopts : register(b1)
uint discardPass;
};
MultipleOutput RENDERDOC_DiscardPS(float4 pos : SV_Position, out float depth : SV_Depth)
float4 RENDERDOC_DiscardFloatPS(float4 pos : SV_Position, out float depth : SV_Depth) : SV_Target0
{
uint x = uint(pos.x) % PATTERN_WIDTH;
uint y = uint(pos.y) % PATTERN_HEIGHT;
uint idx = ((y * 64) + x);
float val = pattern[idx / 4][idx % 4];
float val = floatpattern[idx / 4][idx % 4];
if(discardPass == 1 && val >= 0.5f)
clip(-1);
@@ -111,9 +112,24 @@ MultipleOutput RENDERDOC_DiscardPS(float4 pos : SV_Position, out float depth : S
depth = saturate(val);
MultipleOutput OUT = (MultipleOutput)0;
return val.xxxx;
}
OUT.col0 = OUT.col1 = OUT.col2 = OUT.col3 = OUT.col4 = OUT.col5 = OUT.col6 = OUT.col7 = val.xxxx;
uint4 RENDERDOC_DiscardIntPS(float4 pos : SV_Position, out float depth : SV_Depth) : SV_Target0
{
uint x = uint(pos.x) % PATTERN_WIDTH;
uint y = uint(pos.y) % PATTERN_HEIGHT;
return OUT;
uint idx = ((y * 64) + x);
uint val = intpattern[idx / 4][idx % 4];
if(discardPass == 1 && val > 0)
clip(-1);
else if(discardPass == 2 && val == 0)
clip(-1);
depth = saturate(float(val));
return val.xxxx;
}