diff options
author | Brian <[email protected]> | 2007-07-10 16:25:43 -0600 |
---|---|---|
committer | Brian <[email protected]> | 2007-07-10 16:25:43 -0600 |
commit | d015d2e0f45ad8e79ccb256b612597ef8ed51d4a (patch) | |
tree | e534f2026f90f9bd585c9397af06f92ccf1e1e07 /src/mesa/pipe | |
parent | 093d1b42d0d867dae1bcb59d36f3f309994badff (diff) |
Fill in remaining switch cases. Only call next stage if quad->mask != 0.
Diffstat (limited to 'src/mesa/pipe')
-rw-r--r-- | src/mesa/pipe/softpipe/sp_quad_alpha_test.c | 57 | ||||
-rw-r--r-- | src/mesa/pipe/softpipe/sp_quad_depth_test.c | 26 |
2 files changed, 61 insertions, 22 deletions
diff --git a/src/mesa/pipe/softpipe/sp_quad_alpha_test.c b/src/mesa/pipe/softpipe/sp_quad_alpha_test.c index e0f7225d748..8c28a824be5 100644 --- a/src/mesa/pipe/softpipe/sp_quad_alpha_test.c +++ b/src/mesa/pipe/softpipe/sp_quad_alpha_test.c @@ -15,8 +15,8 @@ static void alpha_test_quad(struct quad_stage *qs, struct quad_header *quad) { struct softpipe_context *softpipe = qs->softpipe; - GLuint j; const GLfloat ref = softpipe->alpha_test.ref; + GLuint passMask = 0x0, j; switch (softpipe->alpha_test.func) { case PIPE_FUNC_NEVER: @@ -24,44 +24,61 @@ alpha_test_quad(struct quad_stage *qs, struct quad_header *quad) break; case PIPE_FUNC_LESS: /* - * If quad->mask were an array [4] we could do this SIMD-style: - * quad->mask &= (quad->outputs.color[3] <= vec4(ref)); + * If mask were an array [4] we could do this SIMD-style: + * passMask = (quad->outputs.color[3] <= vec4(ref)); */ for (j = 0; j < QUAD_SIZE; j++) { - if (quad->mask & (1 << j)) { - if (quad->outputs.color[3][j] >= ref) { - /* fail */ - quad->mask &= (1 << j); - } + if (quad->outputs.color[3][j] < ref) { + passMask |= (1 << j); } } break; case PIPE_FUNC_EQUAL: for (j = 0; j < QUAD_SIZE; j++) { - if (quad->mask & (1 << j)) { - if (quad->outputs.color[3][j] != ref) { - /* fail */ - quad->mask &= (1 << j); - } + if (quad->outputs.color[3][j] == ref) { + passMask |= (1 << j); } } break; case PIPE_FUNC_LEQUAL: for (j = 0; j < QUAD_SIZE; j++) { - if (quad->mask & (1 << j)) { - if (quad->outputs.color[3][j] > ref) { - /* fail */ - quad->mask &= (1 << j); - } + if (quad->outputs.color[3][j] <= ref) { + passMask |= (1 << j); } } break; - /* XXX fill in remaining cases */ + case PIPE_FUNC_GREATER: + for (j = 0; j < QUAD_SIZE; j++) { + if (quad->outputs.color[3][j] > ref) { + passMask |= (1 << j); + } + } + break; + case PIPE_FUNC_NOTEQUAL: + for (j = 0; j < QUAD_SIZE; j++) { + if (quad->outputs.color[3][j] != ref) { + passMask |= (1 << j); + } + } + break; + case PIPE_FUNC_GEQUAL: + for (j = 0; j < QUAD_SIZE; j++) { + if (quad->outputs.color[3][j] >= ref) { + passMask |= (1 << j); + } + } + break; + case PIPE_FUNC_ALWAYS: + passMask = MASK_ALL; + break; default: abort(); } - qs->next->run(qs->next, quad); + quad->mask &= passMask; + + if (quad->mask) + qs->next->run(qs->next, quad); } diff --git a/src/mesa/pipe/softpipe/sp_quad_depth_test.c b/src/mesa/pipe/softpipe/sp_quad_depth_test.c index 0b5d909b2db..268a1f947ec 100644 --- a/src/mesa/pipe/softpipe/sp_quad_depth_test.c +++ b/src/mesa/pipe/softpipe/sp_quad_depth_test.c @@ -74,6 +74,7 @@ depth_test_quad(struct quad_stage *qs, struct quad_header *quad) switch (softpipe->depth_test.func) { case PIPE_FUNC_NEVER: + /* zmask = 0 */ break; case PIPE_FUNC_LESS: /* Note this is pretty much a single sse or cell instruction. @@ -96,7 +97,27 @@ depth_test_quad(struct quad_stage *qs, struct quad_header *quad) zmask |= (1 << j); } break; - /* XXX fill in remaining cases */ + case PIPE_FUNC_GREATER: + for (j = 0; j < QUAD_SIZE; j++) { + if (qzzzz[j] > bzzzz[j]) + zmask |= (1 << j); + } + break; + case PIPE_FUNC_NOTEQUAL: + for (j = 0; j < QUAD_SIZE; j++) { + if (qzzzz[j] != bzzzz[j]) + zmask |= (1 << j); + } + break; + case PIPE_FUNC_GEQUAL: + for (j = 0; j < QUAD_SIZE; j++) { + if (qzzzz[j] >= bzzzz[j]) + zmask |= (1 << j); + } + break; + case PIPE_FUNC_ALWAYS: + zmask = MASK_ALL; + break; default: abort(); } @@ -117,7 +138,8 @@ depth_test_quad(struct quad_stage *qs, struct quad_header *quad) sps->write_quad_z(sps, quad->x0, quad->y0, bzzzz); } - qs->next->run(qs->next, quad); + if (quad->mask) + qs->next->run(qs->next, quad); } |