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 <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9287>
This commit is contained in:
Adam Jackson
2021-02-24 17:31:53 -05:00
committed by Marge Bot
parent cac0191baa
commit 0c55a98330

View File

@@ -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;