mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-07-31 20:01:12 +00:00
Fix discard patterns to work correctly with multisampled UINT textures
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user