Module: Mesa
Branch: master
Commit: 0c55a98330cc1e3b58177c47700defa5f720224e
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=0c55a98330cc1e3b58177c47700defa5f720224e

Author: Adam Jackson <[email protected]>
Date:   Wed Feb 24 17:31:53 2021 -0500

softpipe: Fix depth comparison with float Z formats

We just stuff the Z bits into [bq]zzzz literally for floats, but
comparing those like they're integers only works for == and !=.

Reviewed-by: Eric Anholt <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9287>

---

 src/gallium/drivers/softpipe/sp_quad_depth_test.c | 45 +++++++++++------------
 1 file changed, 21 insertions(+), 24 deletions(-)

diff --git a/src/gallium/drivers/softpipe/sp_quad_depth_test.c 
b/src/gallium/drivers/softpipe/sp_quad_depth_test.c
index 14f2a991016..2fb2c5b5ec0 100644
--- a/src/gallium/drivers/softpipe/sp_quad_depth_test.c
+++ b/src/gallium/drivers/softpipe/sp_quad_depth_test.c
@@ -542,6 +542,21 @@ depth_test_quad(struct quad_stage *qs,
    unsigned zmask = 0;
    unsigned j;
 
+#define DEPTHTEST(l, op, r) do { \
+      if (data->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT || \
+          data->format == PIPE_FORMAT_Z32_FLOAT) { \
+         for (j = 0; j < TGSI_QUAD_SIZE; j++) { \
+            if (((float *)l)[j] op ((float *)r)[j]) \
+               zmask |= (1 << j); \
+         } \
+      } else { \
+         for (j = 0; j < TGSI_QUAD_SIZE; j++) { \
+            if (l[j] op r[j]) \
+               zmask |= (1 << j); \
+         } \
+      } \
+   } while (0)
+
    switch (softpipe->depth_stencil->depth_func) {
    case PIPE_FUNC_NEVER:
       /* zmask = 0 */
@@ -550,40 +565,22 @@ depth_test_quad(struct quad_stage *qs,
       /* Note this is pretty much a single sse or cell instruction.  
        * Like this:  quad->mask &= (quad->outputs.depth < zzzz);
        */
-      for (j = 0; j < TGSI_QUAD_SIZE; j++) {
-        if (data->qzzzz[j] < data->bzzzz[j]) 
-           zmask |= 1 << j;
-      }
+      DEPTHTEST(data->qzzzz,  <, data->bzzzz);
       break;
    case PIPE_FUNC_EQUAL:
-      for (j = 0; j < TGSI_QUAD_SIZE; j++) {
-        if (data->qzzzz[j] == data->bzzzz[j]) 
-           zmask |= 1 << j;
-      }
+      DEPTHTEST(data->qzzzz, ==, data->bzzzz);
       break;
    case PIPE_FUNC_LEQUAL:
-      for (j = 0; j < TGSI_QUAD_SIZE; j++) {
-        if (data->qzzzz[j] <= data->bzzzz[j]) 
-           zmask |= (1 << j);
-      }
+      DEPTHTEST(data->qzzzz, <=, data->bzzzz);
       break;
    case PIPE_FUNC_GREATER:
-      for (j = 0; j < TGSI_QUAD_SIZE; j++) {
-        if (data->qzzzz[j] > data->bzzzz[j]) 
-           zmask |= (1 << j);
-      }
+      DEPTHTEST(data->qzzzz,  >, data->bzzzz);
       break;
    case PIPE_FUNC_NOTEQUAL:
-      for (j = 0; j < TGSI_QUAD_SIZE; j++) {
-        if (data->qzzzz[j] != data->bzzzz[j]) 
-           zmask |= (1 << j);
-      }
+      DEPTHTEST(data->qzzzz, !=, data->bzzzz);
       break;
    case PIPE_FUNC_GEQUAL:
-      for (j = 0; j < TGSI_QUAD_SIZE; j++) {
-        if (data->qzzzz[j] >= data->bzzzz[j]) 
-           zmask |= (1 << j);
-      }
+      DEPTHTEST(data->qzzzz, >=, data->bzzzz);
       break;
    case PIPE_FUNC_ALWAYS:
       zmask = MASK_ALL;

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to