X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsoftpipe%2Fsp_quad_depth_test.c;h=4cce9e9bc127e5b957951f1ef898ee8e89021f97;hb=d67b9ba9a1af18306aa68f16ee1b9bbc124da42e;hp=72117c233e525c882f09b581d3a8febf7ff7b1ae;hpb=1fa7789e828d1005e2473fc7cd364bd45eb30843;p=mesa.git diff --git a/src/gallium/drivers/softpipe/sp_quad_depth_test.c b/src/gallium/drivers/softpipe/sp_quad_depth_test.c index 72117c233e5..4cce9e9bc12 100644 --- a/src/gallium/drivers/softpipe/sp_quad_depth_test.c +++ b/src/gallium/drivers/softpipe/sp_quad_depth_test.c @@ -1,6 +1,6 @@ /************************************************************************** * - * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. + * Copyright 2007 VMware, Inc. * Copyright 2010 VMware, Inc. * All Rights Reserved. * @@ -32,6 +32,7 @@ #include "pipe/p_defines.h" #include "util/u_format.h" +#include "util/u_math.h" #include "util/u_memory.h" #include "tgsi/tgsi_scan.h" #include "sp_context.h" @@ -44,10 +45,14 @@ struct depth_data { struct pipe_surface *ps; enum pipe_format format; - unsigned bzzzz[QUAD_SIZE]; /**< Z values fetched from depth buffer */ - unsigned qzzzz[QUAD_SIZE]; /**< Z values from the quad */ - ubyte stencilVals[QUAD_SIZE]; + unsigned bzzzz[TGSI_QUAD_SIZE]; /**< Z values fetched from depth buffer */ + unsigned qzzzz[TGSI_QUAD_SIZE]; /**< Z values from the quad */ + ubyte stencilVals[TGSI_QUAD_SIZE]; + boolean use_shader_stencil_refs; + ubyte shader_stencil_refs[TGSI_QUAD_SIZE]; struct softpipe_cached_tile *tile; + float minval, maxval; + bool clamp; }; @@ -61,37 +66,60 @@ get_depth_stencil_values( struct depth_data *data, switch (data->format) { case PIPE_FORMAT_Z16_UNORM: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { int x = quad->input.x0 % TILE_SIZE + (j & 1); int y = quad->input.y0 % TILE_SIZE + (j >> 1); data->bzzzz[j] = tile->data.depth16[y][x]; } break; case PIPE_FORMAT_Z32_UNORM: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { int x = quad->input.x0 % TILE_SIZE + (j & 1); int y = quad->input.y0 % TILE_SIZE + (j >> 1); data->bzzzz[j] = tile->data.depth32[y][x]; } break; case PIPE_FORMAT_Z24X8_UNORM: - case PIPE_FORMAT_Z24_UNORM_S8_USCALED: - for (j = 0; j < QUAD_SIZE; j++) { + case PIPE_FORMAT_Z24_UNORM_S8_UINT: + for (j = 0; j < TGSI_QUAD_SIZE; j++) { int x = quad->input.x0 % TILE_SIZE + (j & 1); int y = quad->input.y0 % TILE_SIZE + (j >> 1); data->bzzzz[j] = tile->data.depth32[y][x] & 0xffffff; data->stencilVals[j] = tile->data.depth32[y][x] >> 24; } - break; + break; case PIPE_FORMAT_X8Z24_UNORM: - case PIPE_FORMAT_S8_USCALED_Z24_UNORM: - for (j = 0; j < QUAD_SIZE; j++) { + case PIPE_FORMAT_S8_UINT_Z24_UNORM: + for (j = 0; j < TGSI_QUAD_SIZE; j++) { int x = quad->input.x0 % TILE_SIZE + (j & 1); int y = quad->input.y0 % TILE_SIZE + (j >> 1); data->bzzzz[j] = tile->data.depth32[y][x] >> 8; data->stencilVals[j] = tile->data.depth32[y][x] & 0xff; } break; + case PIPE_FORMAT_S8_UINT: + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + int x = quad->input.x0 % TILE_SIZE + (j & 1); + int y = quad->input.y0 % TILE_SIZE + (j >> 1); + data->bzzzz[j] = 0; + data->stencilVals[j] = tile->data.stencil8[y][x]; + } + break; + case PIPE_FORMAT_Z32_FLOAT: + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + int x = quad->input.x0 % TILE_SIZE + (j & 1); + int y = quad->input.y0 % TILE_SIZE + (j >> 1); + data->bzzzz[j] = tile->data.depth32[y][x]; + } + break; + case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + int x = quad->input.x0 % TILE_SIZE + (j & 1); + int y = quad->input.y0 % TILE_SIZE + (j >> 1); + data->bzzzz[j] = tile->data.depth64[y][x] & 0xffffffff; + data->stencilVals[j] = (tile->data.depth64[y][x] >> 32) & 0xff; + } + break; default: assert(0); } @@ -126,6 +154,7 @@ convert_quad_depth( struct depth_data *data, const struct quad_header *quad ) { unsigned j; + float dvals[TGSI_QUAD_SIZE]; /* Convert quad's float depth values to int depth values (qzzzz). * If the Z buffer stores integer values, we _have_ to do the depth @@ -133,13 +162,23 @@ convert_quad_depth( struct depth_data *data, * conversion of Z values (which isn't an identity function) will cause * Z-fighting errors. */ + if (data->clamp) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + dvals[j] = CLAMP(quad->output.depth[j], data->minval, data->maxval); + } + } else { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + dvals[j] = quad->output.depth[j]; + } + } + switch (data->format) { case PIPE_FORMAT_Z16_UNORM: { float scale = 65535.0; - for (j = 0; j < QUAD_SIZE; j++) { - data->qzzzz[j] = (unsigned) (quad->output.depth[j] * scale); + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + data->qzzzz[j] = (unsigned) (dvals[j] * scale); } } break; @@ -147,28 +186,39 @@ convert_quad_depth( struct depth_data *data, { double scale = (double) (uint) ~0UL; - for (j = 0; j < QUAD_SIZE; j++) { - data->qzzzz[j] = (unsigned) (quad->output.depth[j] * scale); + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + data->qzzzz[j] = (unsigned) (dvals[j] * scale); } } break; case PIPE_FORMAT_Z24X8_UNORM: - case PIPE_FORMAT_Z24_UNORM_S8_USCALED: + case PIPE_FORMAT_Z24_UNORM_S8_UINT: { float scale = (float) ((1 << 24) - 1); - for (j = 0; j < QUAD_SIZE; j++) { - data->qzzzz[j] = (unsigned) (quad->output.depth[j] * scale); + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + data->qzzzz[j] = (unsigned) (dvals[j] * scale); } } break; case PIPE_FORMAT_X8Z24_UNORM: - case PIPE_FORMAT_S8_USCALED_Z24_UNORM: + case PIPE_FORMAT_S8_UINT_Z24_UNORM: { float scale = (float) ((1 << 24) - 1); - for (j = 0; j < QUAD_SIZE; j++) { - data->qzzzz[j] = (unsigned) (quad->output.depth[j] * scale); + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + data->qzzzz[j] = (unsigned) (dvals[j] * scale); + } + } + break; + case PIPE_FORMAT_Z32_FLOAT: + case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: + { + union fi fui; + + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + fui.f = dvals[j]; + data->qzzzz[j] = fui.ui; } } break; @@ -178,6 +228,36 @@ convert_quad_depth( struct depth_data *data, } +/** + * Compute the depth_data::shader_stencil_refs[] values from the float + * fragment stencil values. + */ +static void +convert_quad_stencil( struct depth_data *data, + const struct quad_header *quad ) +{ + unsigned j; + + data->use_shader_stencil_refs = TRUE; + /* Copy quads stencil values + */ + switch (data->format) { + case PIPE_FORMAT_Z24X8_UNORM: + case PIPE_FORMAT_Z24_UNORM_S8_UINT: + case PIPE_FORMAT_X8Z24_UNORM: + case PIPE_FORMAT_S8_UINT_Z24_UNORM: + case PIPE_FORMAT_S8_UINT: + case PIPE_FORMAT_Z32_FLOAT: + case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + data->shader_stencil_refs[j] = ((unsigned)(quad->output.stencil[j])); + } + break; + default: + assert(0); + } +} + /** * Write data->bzzzz[] values and data->stencilVals into the Z/stencil buffer. @@ -192,7 +272,7 @@ write_depth_stencil_values( struct depth_data *data, /* put updated Z values back into cached tile */ switch (data->format) { case PIPE_FORMAT_Z16_UNORM: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { int x = quad->input.x0 % TILE_SIZE + (j & 1); int y = quad->input.y0 % TILE_SIZE + (j >> 1); tile->data.depth16[y][x] = (ushort) data->bzzzz[j]; @@ -200,33 +280,54 @@ write_depth_stencil_values( struct depth_data *data, break; case PIPE_FORMAT_Z24X8_UNORM: case PIPE_FORMAT_Z32_UNORM: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { int x = quad->input.x0 % TILE_SIZE + (j & 1); int y = quad->input.y0 % TILE_SIZE + (j >> 1); tile->data.depth32[y][x] = data->bzzzz[j]; } break; - case PIPE_FORMAT_Z24_UNORM_S8_USCALED: - for (j = 0; j < QUAD_SIZE; j++) { + case PIPE_FORMAT_Z24_UNORM_S8_UINT: + for (j = 0; j < TGSI_QUAD_SIZE; j++) { int x = quad->input.x0 % TILE_SIZE + (j & 1); int y = quad->input.y0 % TILE_SIZE + (j >> 1); tile->data.depth32[y][x] = (data->stencilVals[j] << 24) | data->bzzzz[j]; } break; - case PIPE_FORMAT_S8_USCALED_Z24_UNORM: - for (j = 0; j < QUAD_SIZE; j++) { + case PIPE_FORMAT_S8_UINT_Z24_UNORM: + for (j = 0; j < TGSI_QUAD_SIZE; j++) { int x = quad->input.x0 % TILE_SIZE + (j & 1); int y = quad->input.y0 % TILE_SIZE + (j >> 1); tile->data.depth32[y][x] = (data->bzzzz[j] << 8) | data->stencilVals[j]; } break; case PIPE_FORMAT_X8Z24_UNORM: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { int x = quad->input.x0 % TILE_SIZE + (j & 1); int y = quad->input.y0 % TILE_SIZE + (j >> 1); tile->data.depth32[y][x] = data->bzzzz[j] << 8; } break; + case PIPE_FORMAT_S8_UINT: + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + int x = quad->input.x0 % TILE_SIZE + (j & 1); + int y = quad->input.y0 % TILE_SIZE + (j >> 1); + tile->data.stencil8[y][x] = data->stencilVals[j]; + } + break; + case PIPE_FORMAT_Z32_FLOAT: + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + int x = quad->input.x0 % TILE_SIZE + (j & 1); + int y = quad->input.y0 % TILE_SIZE + (j >> 1); + tile->data.depth32[y][x] = data->bzzzz[j]; + } + break; + case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + int x = quad->input.x0 % TILE_SIZE + (j & 1); + int y = quad->input.y0 % TILE_SIZE + (j >> 1); + tile->data.depth64[y][x] = (uint64_t)data->bzzzz[j] | ((uint64_t)data->stencilVals[j] << 32); + } + break; default: assert(0); } @@ -256,51 +357,57 @@ do_stencil_test(struct depth_data *data, { unsigned passMask = 0x0; unsigned j; + ubyte refs[TGSI_QUAD_SIZE]; - ref &= valMask; + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + if (data->use_shader_stencil_refs) + refs[j] = data->shader_stencil_refs[j] & valMask; + else + refs[j] = ref & valMask; + } switch (func) { case PIPE_FUNC_NEVER: /* passMask = 0x0 */ break; case PIPE_FUNC_LESS: - for (j = 0; j < QUAD_SIZE; j++) { - if (ref < (data->stencilVals[j] & valMask)) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + if (refs[j] < (data->stencilVals[j] & valMask)) { passMask |= (1 << j); } } break; case PIPE_FUNC_EQUAL: - for (j = 0; j < QUAD_SIZE; j++) { - if (ref == (data->stencilVals[j] & valMask)) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + if (refs[j] == (data->stencilVals[j] & valMask)) { passMask |= (1 << j); } } break; case PIPE_FUNC_LEQUAL: - for (j = 0; j < QUAD_SIZE; j++) { - if (ref <= (data->stencilVals[j] & valMask)) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + if (refs[j] <= (data->stencilVals[j] & valMask)) { passMask |= (1 << j); } } break; case PIPE_FUNC_GREATER: - for (j = 0; j < QUAD_SIZE; j++) { - if (ref > (data->stencilVals[j] & valMask)) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + if (refs[j] > (data->stencilVals[j] & valMask)) { passMask |= (1 << j); } } break; case PIPE_FUNC_NOTEQUAL: - for (j = 0; j < QUAD_SIZE; j++) { - if (ref != (data->stencilVals[j] & valMask)) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + if (refs[j] != (data->stencilVals[j] & valMask)) { passMask |= (1 << j); } } break; case PIPE_FUNC_GEQUAL: - for (j = 0; j < QUAD_SIZE; j++) { - if (ref >= (data->stencilVals[j] & valMask)) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + if (refs[j] >= (data->stencilVals[j] & valMask)) { passMask |= (1 << j); } } @@ -331,10 +438,15 @@ apply_stencil_op(struct depth_data *data, unsigned mask, unsigned op, ubyte ref, ubyte wrtMask) { unsigned j; - ubyte newstencil[QUAD_SIZE]; + ubyte newstencil[TGSI_QUAD_SIZE]; + ubyte refs[TGSI_QUAD_SIZE]; - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { newstencil[j] = data->stencilVals[j]; + if (data->use_shader_stencil_refs) + refs[j] = data->shader_stencil_refs[j]; + else + refs[j] = ref; } switch (op) { @@ -342,21 +454,21 @@ apply_stencil_op(struct depth_data *data, /* no-op */ break; case PIPE_STENCIL_OP_ZERO: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (mask & (1 << j)) { newstencil[j] = 0; } } break; case PIPE_STENCIL_OP_REPLACE: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (mask & (1 << j)) { - newstencil[j] = ref; + newstencil[j] = refs[j]; } } break; case PIPE_STENCIL_OP_INCR: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (mask & (1 << j)) { if (data->stencilVals[j] < STENCIL_MAX) { newstencil[j] = data->stencilVals[j] + 1; @@ -365,7 +477,7 @@ apply_stencil_op(struct depth_data *data, } break; case PIPE_STENCIL_OP_DECR: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (mask & (1 << j)) { if (data->stencilVals[j] > 0) { newstencil[j] = data->stencilVals[j] - 1; @@ -374,21 +486,21 @@ apply_stencil_op(struct depth_data *data, } break; case PIPE_STENCIL_OP_INCR_WRAP: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (mask & (1 << j)) { newstencil[j] = data->stencilVals[j] + 1; } } break; case PIPE_STENCIL_OP_DECR_WRAP: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (mask & (1 << j)) { newstencil[j] = data->stencilVals[j] - 1; } } break; case PIPE_STENCIL_OP_INVERT: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (mask & (1 << j)) { newstencil[j] = ~data->stencilVals[j]; } @@ -403,12 +515,12 @@ apply_stencil_op(struct depth_data *data, */ if (wrtMask != STENCIL_MAX) { /* apply bit-wise stencil buffer writemask */ - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { data->stencilVals[j] = (wrtMask & newstencil[j]) | (~wrtMask & data->stencilVals[j]); } } else { - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { data->stencilVals[j] = newstencil[j]; } } @@ -438,37 +550,37 @@ 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 < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (data->qzzzz[j] < data->bzzzz[j]) zmask |= 1 << j; } break; case PIPE_FUNC_EQUAL: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (data->qzzzz[j] == data->bzzzz[j]) zmask |= 1 << j; } break; case PIPE_FUNC_LEQUAL: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (data->qzzzz[j] <= data->bzzzz[j]) zmask |= (1 << j); } break; case PIPE_FUNC_GREATER: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (data->qzzzz[j] > data->bzzzz[j]) zmask |= (1 << j); } break; case PIPE_FUNC_NOTEQUAL: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (data->qzzzz[j] != data->bzzzz[j]) zmask |= (1 << j); } break; case PIPE_FUNC_GEQUAL: - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (data->qzzzz[j] >= data->bzzzz[j]) zmask |= (1 << j); } @@ -489,7 +601,7 @@ depth_test_quad(struct quad_stage *qs, * data due to stencil changes. */ if (softpipe->depth_stencil->depth.writemask) { - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { if (quad->inout.mask & (1 << j)) { data->bzzzz[j] = data->qzzzz[j]; } @@ -572,7 +684,7 @@ depth_stencil_test_quad(struct quad_stage *qs, #define ALPHATEST( FUNC, COMP ) \ - static int \ + static unsigned \ alpha_test_quads_##FUNC( struct quad_stage *qs, \ struct quad_header *quads[], \ unsigned nr ) \ @@ -609,9 +721,9 @@ ALPHATEST( NOTEQUAL, != ) ALPHATEST( GEQUAL, >= ) -/* XXX: Incorporate into shader using KILP. +/* XXX: Incorporate into shader using KILL_IF. */ -static int +static unsigned alpha_test_quads(struct quad_stage *qs, struct quad_header *quads[], unsigned nr) @@ -621,7 +733,6 @@ alpha_test_quads(struct quad_stage *qs, return alpha_test_quads_LESS( qs, quads, nr ); case PIPE_FUNC_EQUAL: return alpha_test_quads_EQUAL( qs, quads, nr ); - break; case PIPE_FUNC_LEQUAL: return alpha_test_quads_LEQUAL( qs, quads, nr ); case PIPE_FUNC_GREATER: @@ -661,20 +772,6 @@ static unsigned mask_count[16] = -/** helper to get number of Z buffer bits */ -static unsigned -get_depth_bits(struct quad_stage *qs) -{ - struct pipe_surface *zsurf = qs->softpipe->framebuffer.zsbuf; - if (zsurf) - return util_format_get_component_bits(zsurf->format, - UTIL_FORMAT_COLORSPACE_ZS, 0); - else - return 0; -} - - - /** * General depth/stencil test function. Used when there's no fast-path. */ @@ -684,24 +781,34 @@ depth_test_quads_fallback(struct quad_stage *qs, unsigned nr) { unsigned i, pass = 0; - const struct sp_fragment_shader *fs = qs->softpipe->fs; - boolean interp_depth = !fs->info.writes_z; + const struct tgsi_shader_info *fsInfo = &qs->softpipe->fs_variant->info; + boolean interp_depth = !fsInfo->writes_z; + boolean shader_stencil_ref = fsInfo->writes_stencil; struct depth_data data; + unsigned vp_idx = quads[0]->input.viewport_index; + data.use_shader_stencil_refs = FALSE; if (qs->softpipe->depth_stencil->alpha.enabled) { nr = alpha_test_quads(qs, quads, nr); } - if (get_depth_bits(qs) > 0 && - (qs->softpipe->depth_stencil->depth.enabled || - qs->softpipe->depth_stencil->stencil[0].enabled)) { + if (qs->softpipe->framebuffer.zsbuf && + (qs->softpipe->depth_stencil->depth.enabled || + qs->softpipe->depth_stencil->stencil[0].enabled)) { + float near_val, far_val; data.ps = qs->softpipe->framebuffer.zsbuf; data.format = data.ps->format; data.tile = sp_get_cached_tile(qs->softpipe->zsbuf_cache, quads[0]->input.x0, - quads[0]->input.y0); + quads[0]->input.y0, quads[0]->input.layer); + data.clamp = !qs->softpipe->rasterizer->depth_clip; + + near_val = qs->softpipe->viewports[vp_idx].translate[2] - qs->softpipe->viewports[vp_idx].scale[2]; + far_val = near_val + (qs->softpipe->viewports[vp_idx].scale[2] * 2.0); + data.minval = MIN2(near_val, far_val); + data.maxval = MAX2(near_val, far_val); for (i = 0; i < nr; i++) { get_depth_stencil_values(&data, quads[i]); @@ -714,6 +821,9 @@ depth_test_quads_fallback(struct quad_stage *qs, } if (qs->softpipe->depth_stencil->stencil[0].enabled) { + if (shader_stencil_ref) + convert_quad_stencil(&data, quads[i]); + depth_stencil_test_quad(qs, &data, quads[i]); write_depth_stencil_values(&data, quads[i]); } @@ -790,12 +900,13 @@ choose_depth_test(struct quad_stage *qs, struct quad_header *quads[], unsigned nr) { - boolean interp_depth = !qs->softpipe->fs->info.writes_z; + const struct tgsi_shader_info *fsInfo = &qs->softpipe->fs_variant->info; + + boolean interp_depth = !fsInfo->writes_z; boolean alpha = qs->softpipe->depth_stencil->alpha.enabled; - boolean depth = (get_depth_bits(qs) > 0 && - qs->softpipe->depth_stencil->depth.enabled); + boolean depth = qs->softpipe->depth_stencil->depth.enabled; unsigned depthfunc = qs->softpipe->depth_stencil->depth.func; @@ -805,12 +916,19 @@ choose_depth_test(struct quad_stage *qs, boolean occlusion = qs->softpipe->active_query_count; + boolean clipped = !qs->softpipe->rasterizer->depth_clip; + + if(!qs->softpipe->framebuffer.zsbuf) + depth = depthwrite = stencil = FALSE; + /* default */ qs->run = depth_test_quads_fallback; /* look for special cases */ if (!alpha && !depth && + !occlusion && + !clipped && !stencil) { qs->run = depth_noop; } @@ -819,6 +937,7 @@ choose_depth_test(struct quad_stage *qs, depth && depthwrite && !occlusion && + !clipped && !stencil) { if (qs->softpipe->framebuffer.zsbuf->format == PIPE_FORMAT_Z16_UNORM) {