[PATCH 2/2] ddraw/tests: Prefer D24S8 over D24X8.
Stefan Dösinger
stefan at codeweavers.com
Sun Jan 23 10:08:17 CST 2022
It works better for depth readback on modern Radeon GPUs.
Signed-off-by: Stefan Dösinger <stefan at codeweavers.com>
---
Also compare to the readback mess that is test_depth_readback. On Nvidia
cards test_depth_readback is broken for D24S8, but works for some cards
with D16 or D24X8. That's not necessarily contradictory: test_depth_readback
draws actual geometry, whereas test_color_fill just uses DDBLT_DEPTHFILL.
If any Nvidia GPU I did not test now fails test_color_fill we can make
the chosen format card dependent. I'll avoid that for now though.
---
dlls/ddraw/tests/ddraw4.c | 12 ++++++++++++
dlls/ddraw/tests/ddraw7.c | 12 ++++++++++++
2 files changed, 24 insertions(+)
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index a8b68b8a20b..451dabff20a 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -432,8 +432,20 @@ static HRESULT CALLBACK enum_z_fmt(DDPIXELFORMAT *format, void *ctx)
{
DDPIXELFORMAT *z_fmt = ctx;
+ /* Prefer higher Z precision over lower, and prefer D24S8 over
+ * D24X8. See also test_depth_readback for some GPU specific
+ * limitations. Note that test_depth_readback reads back depth
+ * values from draws, while users of this functions usually do
+ * not. */
if (U1(*format).dwZBufferBitDepth > U1(*z_fmt).dwZBufferBitDepth)
+ {
*z_fmt = *format;
+ }
+ else if (U1(*format).dwZBufferBitDepth == U1(*z_fmt).dwZBufferBitDepth
+ && U2(*format).dwStencilBitDepth > U2(*z_fmt).dwStencilBitDepth)
+ {
+ *z_fmt = *format;
+ }
return DDENUMRET_OK;
}
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index c7a38ab7701..fe09766eddb 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -455,8 +455,20 @@ static HRESULT CALLBACK enum_z_fmt(DDPIXELFORMAT *format, void *ctx)
{
DDPIXELFORMAT *z_fmt = ctx;
+ /* Prefer higher Z precision over lower, and prefer D24S8 over
+ * D24X8. See also test_depth_readback for some GPU specific
+ * limitations. Note that test_depth_readback reads back depth
+ * values from draws, while users of this functions usually do
+ * not. */
if (U1(*format).dwZBufferBitDepth > U1(*z_fmt).dwZBufferBitDepth)
+ {
*z_fmt = *format;
+ }
+ else if (U1(*format).dwZBufferBitDepth == U1(*z_fmt).dwZBufferBitDepth
+ && U2(*format).dwStencilBitDepth > U2(*z_fmt).dwStencilBitDepth)
+ {
+ *z_fmt = *format;
+ }
return DDENUMRET_OK;
}
--
2.34.1
More information about the wine-devel
mailing list