Skip to content

Commit 7677673

Browse files
committed
GS/HW: Refactor alpha test method selection.
1 parent 2005a4c commit 7677673

File tree

7 files changed

+477
-344
lines changed

7 files changed

+477
-344
lines changed

bin/resources/shaders/dx11/tfx.fx

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@
3333
#define AFAIL_RGB_ONLY 3
3434
#endif
3535

36+
#ifndef PS_ATST_NONE
37+
#define PS_ATST_NONE 0
38+
#define PS_ATST_LEQUAL 1
39+
#define PS_ATST_GEQUAL 2
40+
#define PS_ATST_EQUAL 3
41+
#define PS_ATST_NOTEQUAL 4
42+
#endif
43+
3644
#ifndef PS_FST
3745
#define PS_IIP 0
3846
#define PS_FST 0
@@ -154,7 +162,7 @@ struct PS_OUTPUT
154162
#endif
155163
#endif
156164
#endif
157-
#if PS_ZCLAMP || (PS_DEPTH_FEEDBACK && AFAIL_NEEDS_DEPTH)
165+
#if PS_ZCLAMP
158166
float depth : SV_Depth;
159167
#endif
160168
};
@@ -729,27 +737,27 @@ bool atst(float4 C)
729737
{
730738
float a = C.a;
731739

732-
if(PS_ATST == 1)
733-
{
734-
return (a <= AREF);
735-
}
736-
else if(PS_ATST == 2)
737-
{
738-
return (a >= AREF);
739-
}
740-
else if(PS_ATST == 3)
741-
{
742-
return (abs(a - AREF) <= 0.5f);
743-
}
744-
else if(PS_ATST == 4)
745-
{
746-
return (abs(a - AREF) >= 0.5f);
747-
}
748-
else
749-
{
750-
// nothing to do
751-
return true;
752-
}
740+
#if PS_ATST == PS_ATST_LEQUAL
741+
742+
return (a <= AREF);
743+
744+
#elif PS_ATST == PS_ATST_GEQUAL
745+
746+
return (a >= AREF);
747+
748+
#elif PS_ATST == PS_ATST_EQUAL
749+
750+
return (abs(a - AREF) <= 0.5f);
751+
752+
#elif PS_ATST == PS_ATST_NOTEQUAL
753+
754+
return (abs(a - AREF) >= 0.5f);
755+
756+
#else
757+
758+
return true;
759+
760+
#endif
753761
}
754762

755763
float4 fog(float4 c, float f)
@@ -1225,7 +1233,7 @@ PS_OUTPUT ps_main(PS_INPUT input)
12251233
#endif
12261234

12271235
// Alpha test with feedback
1228-
#if (PS_AFAIL == AFAIL_FB_ONLY) && PS_DEPTH_FEEDBACK
1236+
#if (PS_AFAIL == AFAIL_FB_ONLY) && PS_DEPTH_FEEDBACK && PS_ZCLAMP
12291237
if (!atst_pass)
12301238
input.p.z = DepthTexture.Load(int3(input.p.xy, 0)).r;
12311239
#elif (PS_AFAIL == AFAIL_ZB_ONLY) && PS_COLOR_FEEDBACK
@@ -1237,7 +1245,7 @@ PS_OUTPUT ps_main(PS_INPUT input)
12371245
#if PS_COLOR_FEEDBACK && PS_NO_COLOR1 // No dual src blend
12381246
output.c0.a = RtTexture.Load(int3(input.p.xy, 0)).a;
12391247
#endif
1240-
#if PS_DEPTH_FEEDBACK
1248+
#if PS_DEPTH_FEEDBACK && PS_ZCLAMP
12411249
input.p.z = DepthTexture.Load(int3(input.p.xy, 0)).r;
12421250
#endif
12431251
}
@@ -1249,8 +1257,6 @@ PS_OUTPUT ps_main(PS_INPUT input)
12491257

12501258
#if PS_ZCLAMP
12511259
output.depth = min(input.p.z, MaxDepthPS);
1252-
#elif PS_DEPTH_FEEDBACK && AFAIL_NEEDS_DEPTH
1253-
output.depth = input.p.z; // Output depth value for ATST pass/fail
12541260
#endif
12551261

12561262
return output;

bin/resources/shaders/opengl/tfx_fs.glsl

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@
2323
#define AFAIL_RGB_ONLY 3
2424
#endif
2525

26+
#ifndef PS_ATST_NONE
27+
#define PS_ATST_NONE 0
28+
#define PS_ATST_LEQUAL 1
29+
#define PS_ATST_GEQUAL 2
30+
#define PS_ATST_EQUAL 3
31+
#define PS_ATST_NOTEQUAL 4
32+
#endif
33+
2634
// TEX_COORD_DEBUG output the uv coordinate as color. It is useful
2735
// to detect bad sampling due to upscaling
2836
//#define TEX_COORD_DEBUG
@@ -655,17 +663,26 @@ bool atst(vec4 C)
655663
{
656664
float a = C.a;
657665

658-
#if (PS_ATST == 1)
666+
#if PS_ATST == PS_ATST_LEQUAL
667+
659668
return (a <= AREF);
660-
#elif (PS_ATST == 2)
669+
670+
#elif PS_ATST == PS_ATST_GEQUAL
671+
661672
return (a >= AREF);
662-
#elif (PS_ATST == 3)
673+
674+
#elif PS_ATST == PS_ATST_EQUAL
675+
663676
return (abs(a - AREF) <= 0.5f);
664-
#elif (PS_ATST == 4)
677+
678+
#elif PS_ATST == PS_ATST_NOTEQUAL
679+
665680
return (abs(a - AREF) >= 0.5f);
681+
666682
#else
667-
// nothing to do
683+
668684
return true;
685+
669686
#endif
670687
}
671688

@@ -1172,7 +1189,7 @@ void ps_main()
11721189
#endif
11731190

11741191
// Alpha test with feedback
1175-
#if (PS_AFAIL == AFAIL_FB_ONLY) && NEEDS_DEPTH
1192+
#if (PS_AFAIL == AFAIL_FB_ONLY) && NEED_DEPTH && PS_ZCLAMP
11761193
if (!atst_pass)
11771194
FragCoord.z = sample_from_depth().r;
11781195
#elif (PS_AFAIL == AFAIL_ZB_ONLY) && NEEDS_RT
@@ -1184,7 +1201,7 @@ void ps_main()
11841201
#if NEEDS_RT && PS_NO_COLOR1 // No dual src blend
11851202
SV_Target0.a = sample_from_rt().a;
11861203
#endif
1187-
#if NEEDS_DEPTH
1204+
#if NEED_DEPTH && PS_ZCLAMP
11881205
FragCoord.z = sample_from_depth().r;
11891206
#endif
11901207
}
@@ -1197,7 +1214,5 @@ void ps_main()
11971214

11981215
#if PS_ZCLAMP
11991216
gl_FragDepth = min(FragCoord.z, MaxDepthPS);
1200-
#elif NEEDS_DEPTH && AFAIL_NEEDS_DEPTH
1201-
gl_FragDepth = FragCoord.z; // Output depth value for ATST pass/fail
12021217
#endif
12031218
}

bin/resources/shaders/vulkan/tfx.glsl

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,14 @@ void main()
257257
#define AFAIL_RGB_ONLY 3
258258
#endif
259259

260+
#ifndef PS_ATST_NONE
261+
#define PS_ATST_NONE 0
262+
#define PS_ATST_LEQUAL 1
263+
#define PS_ATST_GEQUAL 2
264+
#define PS_ATST_EQUAL 3
265+
#define PS_ATST_NOTEQUAL 4
266+
#endif
267+
260268
#ifndef PS_FST
261269
#define PS_FST 0
262270
#define PS_WMS 0
@@ -920,28 +928,27 @@ bool atst(vec4 C)
920928
{
921929
float a = C.a;
922930

923-
#if (PS_ATST == 1)
924-
{
925-
return (a <= AREF);
926-
}
927-
#elif (PS_ATST == 2)
928-
{
929-
return (a >= AREF);
930-
}
931-
#elif (PS_ATST == 3)
932-
{
933-
return (abs(a - AREF) <= 0.5f);
934-
}
935-
#elif (PS_ATST == 4)
936-
{
937-
return (abs(a - AREF) >= 0.5f);
938-
}
939-
#else
940-
{
941-
// nothing to do
942-
return true;
943-
}
944-
#endif
931+
#if PS_ATST == PS_ATST_LEQUAL
932+
933+
return (a <= AREF);
934+
935+
#elif PS_ATST == PS_ATST_GEQUAL
936+
937+
return (a >= AREF);
938+
939+
#elif PS_ATST == PS_ATST_EQUAL
940+
941+
return (abs(a - AREF) <= 0.5f);
942+
943+
#elif PS_ATST == PS_ATST_NOTEQUAL
944+
945+
return (abs(a - AREF) >= 0.5f);
946+
947+
#else
948+
949+
return true;
950+
951+
#endif
945952
}
946953

947954
vec4 fog(vec4 c, float f)
@@ -1447,7 +1454,7 @@ void main()
14471454
#endif
14481455

14491456
// Alpha test with feedback
1450-
#if (PS_AFAIL == AFAIL_FB_ONLY) && PS_FEEDBACK_LOOP_IS_NEEDED_DEPTH
1457+
#if (PS_AFAIL == AFAIL_FB_ONLY) && PS_FEEDBACK_LOOP_IS_NEEDED_DEPTH && PS_ZCLAMP
14511458
if (!atst_pass)
14521459
FragCoord.z = sample_from_depth().r;
14531460
#elif (PS_AFAIL == AFAIL_ZB_ONLY) && PS_FEEDBACK_LOOP_IS_NEEDED_RT
@@ -1459,7 +1466,7 @@ void main()
14591466
#if PS_FEEDBACK_LOOP_IS_NEEDED_RT && PS_NO_COLOR1 // No dual src blend
14601467
o_col0.a = sample_from_rt().a;
14611468
#endif
1462-
#if PS_FEEDBACK_LOOP_IS_NEEDED_DEPTH
1469+
#if PS_FEEDBACK_LOOP_IS_NEEDED_DEPTH && PS_ZCLAMP
14631470
FragCoord.z = sample_from_depth().r;
14641471
#endif
14651472
}
@@ -1468,8 +1475,6 @@ void main()
14681475

14691476
#if PS_ZCLAMP
14701477
gl_FragDepth = min(FragCoord.z, MaxDepthPS);
1471-
#elif PS_FEEDBACK_LOOP_IS_NEEDED_DEPTH && AFAIL_NEEDS_DEPTH
1472-
gl_FragDepth = FragCoord.z; // Output depth value for ATST pass/fail
14731478
#endif
14741479
#endif // PS_DATE
14751480
}

pcsx2/GS/GSRegs.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,15 @@ enum GS_AFAIL
201201
AFAIL_RGB_ONLY = 3,
202202
};
203203

204+
enum GS_ALPHA_BITS
205+
{
206+
ALPHA_ABC_CS = 0,
207+
ALPHA_ABC_CD = 1,
208+
ALPHA_C_AS = 0,
209+
ALPHA_C_AD = 1,
210+
ALPHA_C_FIX = 2,
211+
};
212+
204213
enum class GS_MIN_FILTER : uint8_t
205214
{
206215
Nearest = 0,
@@ -773,8 +782,6 @@ REG64_(GIFReg, TEST)
773782
u32 _PAD1 : 13;
774783
u32 _PAD2 : 32;
775784
REG_END2
776-
__forceinline bool DoFirstPass() const { return !ATE || ATST != ATST_NEVER; } // not all pixels fail automatically
777-
__forceinline bool DoSecondPass() const { return ATE && ATST != ATST_ALWAYS && AFAIL != AFAIL_KEEP; } // pixels may fail, write fb/z
778785
__forceinline u32 GetAFAIL(u32 fpsm) const { return (AFAIL == AFAIL_RGB_ONLY && (fpsm & 0xF) != 0) ? static_cast<u32>(AFAIL_FB_ONLY) : AFAIL; } // FB Only when not 32bit Framebuffer
779786
REG_END2
780787

pcsx2/GS/Renderers/Common/GSDevice.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,16 @@ struct alignas(16) GSHWDrawConfig
328328
__fi bool UseExpandIndexBuffer() const { return (expand == VSExpand::Point || expand == VSExpand::Sprite); }
329329
};
330330
static_assert(sizeof(VSSelector) == 1, "VSSelector is a single byte");
331+
332+
enum PSAlphaTest
333+
{
334+
PS_ATST_NONE = 0,
335+
PS_ATST_LEQUAL = 1,
336+
PS_ATST_GEQUAL = 2,
337+
PS_ATST_EQUAL = 3,
338+
PS_ATST_NOTEQUAL = 4
339+
};
340+
331341
#pragma pack(pop)
332342
#pragma pack(push, 4)
333343
struct PSSelector
@@ -401,7 +411,7 @@ struct alignas(16) GSHWDrawConfig
401411
u32 dither : 2;
402412
u32 dither_adjust : 1;
403413

404-
// Depth clamp
414+
// Depth clamp - also indicates SW depth write.
405415
u32 zclamp : 1;
406416

407417
// Hack

0 commit comments

Comments
 (0)