• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************
2  *
3  * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4  * Copyright 2010 VMware, Inc.
5  * All Rights Reserved.
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the
9  * "Software"), to deal in the Software without restriction, including
10  * without limitation the rights to use, copy, modify, merge, publish,
11  * distribute, sub license, and/or sell copies of the Software, and to
12  * permit persons to whom the Software is furnished to do so, subject to
13  * the following conditions:
14  *
15  * The above copyright notice and this permission notice (including the
16  * next paragraph) shall be included in all copies or substantial portions
17  * of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22  * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR
23  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26  *
27  **************************************************************************/
28 
29 /**
30  * \brief  Quad depth / stencil testing
31  */
32 
33 #include "pipe/p_defines.h"
34 #include "util/u_format.h"
35 #include "util/u_math.h"
36 #include "util/u_memory.h"
37 #include "tgsi/tgsi_scan.h"
38 #include "sp_context.h"
39 #include "sp_quad.h"
40 #include "sp_quad_pipe.h"
41 #include "sp_tile_cache.h"
42 #include "sp_state.h"           /* for sp_fragment_shader */
43 
44 
45 struct depth_data {
46    struct pipe_surface *ps;
47    enum pipe_format format;
48    unsigned bzzzz[TGSI_QUAD_SIZE];  /**< Z values fetched from depth buffer */
49    unsigned qzzzz[TGSI_QUAD_SIZE];  /**< Z values from the quad */
50    ubyte stencilVals[TGSI_QUAD_SIZE];
51    boolean use_shader_stencil_refs;
52    ubyte shader_stencil_refs[TGSI_QUAD_SIZE];
53    struct softpipe_cached_tile *tile;
54 };
55 
56 
57 
58 static void
get_depth_stencil_values(struct depth_data * data,const struct quad_header * quad)59 get_depth_stencil_values( struct depth_data *data,
60                           const struct quad_header *quad )
61 {
62    unsigned j;
63    const struct softpipe_cached_tile *tile = data->tile;
64 
65    switch (data->format) {
66    case PIPE_FORMAT_Z16_UNORM:
67       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
68          int x = quad->input.x0 % TILE_SIZE + (j & 1);
69          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
70          data->bzzzz[j] = tile->data.depth16[y][x];
71       }
72       break;
73    case PIPE_FORMAT_Z32_UNORM:
74       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
75          int x = quad->input.x0 % TILE_SIZE + (j & 1);
76          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
77          data->bzzzz[j] = tile->data.depth32[y][x];
78       }
79       break;
80    case PIPE_FORMAT_Z24X8_UNORM:
81    case PIPE_FORMAT_Z24_UNORM_S8_UINT:
82       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
83          int x = quad->input.x0 % TILE_SIZE + (j & 1);
84          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
85          data->bzzzz[j] = tile->data.depth32[y][x] & 0xffffff;
86          data->stencilVals[j] = tile->data.depth32[y][x] >> 24;
87       }
88       break;
89    case PIPE_FORMAT_X8Z24_UNORM:
90    case PIPE_FORMAT_S8_UINT_Z24_UNORM:
91       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
92          int x = quad->input.x0 % TILE_SIZE + (j & 1);
93          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
94          data->bzzzz[j] = tile->data.depth32[y][x] >> 8;
95          data->stencilVals[j] = tile->data.depth32[y][x] & 0xff;
96       }
97       break;
98    case PIPE_FORMAT_S8_UINT:
99       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
100          int x = quad->input.x0 % TILE_SIZE + (j & 1);
101          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
102          data->bzzzz[j] = 0;
103          data->stencilVals[j] = tile->data.stencil8[y][x];
104       }
105       break;
106    case PIPE_FORMAT_Z32_FLOAT:
107       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
108          int x = quad->input.x0 % TILE_SIZE + (j & 1);
109          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
110          data->bzzzz[j] = tile->data.depth32[y][x];
111       }
112       break;
113    case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
114       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
115          int x = quad->input.x0 % TILE_SIZE + (j & 1);
116          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
117          data->bzzzz[j] = tile->data.depth64[y][x] & 0xffffffff;
118          data->stencilVals[j] = (tile->data.depth64[y][x] >> 32) & 0xff;
119       }
120       break;
121    default:
122       assert(0);
123    }
124 }
125 
126 
127 /**
128  * If the shader has not been run, interpolate the depth values
129  * ourselves.
130  */
131 static void
interpolate_quad_depth(struct quad_header * quad)132 interpolate_quad_depth( struct quad_header *quad )
133 {
134    const float fx = (float) quad->input.x0;
135    const float fy = (float) quad->input.y0;
136    const float dzdx = quad->posCoef->dadx[2];
137    const float dzdy = quad->posCoef->dady[2];
138    const float z0 = quad->posCoef->a0[2] + dzdx * fx + dzdy * fy;
139 
140    quad->output.depth[0] = z0;
141    quad->output.depth[1] = z0 + dzdx;
142    quad->output.depth[2] = z0 + dzdy;
143    quad->output.depth[3] = z0 + dzdx + dzdy;
144 }
145 
146 
147 /**
148  * Compute the depth_data::qzzzz[] values from the float fragment Z values.
149  */
150 static void
convert_quad_depth(struct depth_data * data,const struct quad_header * quad)151 convert_quad_depth( struct depth_data *data,
152                     const struct quad_header *quad )
153 {
154    unsigned j;
155 
156    /* Convert quad's float depth values to int depth values (qzzzz).
157     * If the Z buffer stores integer values, we _have_ to do the depth
158     * compares with integers (not floats).  Otherwise, the float->int->float
159     * conversion of Z values (which isn't an identity function) will cause
160     * Z-fighting errors.
161     */
162    switch (data->format) {
163    case PIPE_FORMAT_Z16_UNORM:
164       {
165          float scale = 65535.0;
166 
167          for (j = 0; j < TGSI_QUAD_SIZE; j++) {
168             data->qzzzz[j] = (unsigned) (quad->output.depth[j] * scale);
169          }
170       }
171       break;
172    case PIPE_FORMAT_Z32_UNORM:
173       {
174          double scale = (double) (uint) ~0UL;
175 
176          for (j = 0; j < TGSI_QUAD_SIZE; j++) {
177             data->qzzzz[j] = (unsigned) (quad->output.depth[j] * scale);
178          }
179       }
180       break;
181    case PIPE_FORMAT_Z24X8_UNORM:
182    case PIPE_FORMAT_Z24_UNORM_S8_UINT:
183       {
184          float scale = (float) ((1 << 24) - 1);
185 
186          for (j = 0; j < TGSI_QUAD_SIZE; j++) {
187             data->qzzzz[j] = (unsigned) (quad->output.depth[j] * scale);
188          }
189       }
190       break;
191    case PIPE_FORMAT_X8Z24_UNORM:
192    case PIPE_FORMAT_S8_UINT_Z24_UNORM:
193       {
194          float scale = (float) ((1 << 24) - 1);
195 
196          for (j = 0; j < TGSI_QUAD_SIZE; j++) {
197             data->qzzzz[j] = (unsigned) (quad->output.depth[j] * scale);
198          }
199       }
200       break;
201    case PIPE_FORMAT_Z32_FLOAT:
202    case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
203       {
204          union fi fui;
205 
206          for (j = 0; j < TGSI_QUAD_SIZE; j++) {
207             fui.f = quad->output.depth[j];
208             data->qzzzz[j] = fui.ui;
209          }
210       }
211       break;
212    default:
213       assert(0);
214    }
215 }
216 
217 
218 /**
219  * Compute the depth_data::shader_stencil_refs[] values from the float
220  * fragment stencil values.
221  */
222 static void
convert_quad_stencil(struct depth_data * data,const struct quad_header * quad)223 convert_quad_stencil( struct depth_data *data,
224                       const struct quad_header *quad )
225 {
226    unsigned j;
227 
228    data->use_shader_stencil_refs = TRUE;
229    /* Copy quads stencil values
230     */
231    switch (data->format) {
232    case PIPE_FORMAT_Z24X8_UNORM:
233    case PIPE_FORMAT_Z24_UNORM_S8_UINT:
234    case PIPE_FORMAT_X8Z24_UNORM:
235    case PIPE_FORMAT_S8_UINT_Z24_UNORM:
236    case PIPE_FORMAT_S8_UINT:
237    case PIPE_FORMAT_Z32_FLOAT:
238    case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
239       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
240          data->shader_stencil_refs[j] = ((unsigned)(quad->output.stencil[j]));
241       }
242       break;
243    default:
244       assert(0);
245    }
246 }
247 
248 
249 /**
250  * Write data->bzzzz[] values and data->stencilVals into the Z/stencil buffer.
251  */
252 static void
write_depth_stencil_values(struct depth_data * data,struct quad_header * quad)253 write_depth_stencil_values( struct depth_data *data,
254                             struct quad_header *quad )
255 {
256    struct softpipe_cached_tile *tile = data->tile;
257    unsigned j;
258 
259    /* put updated Z values back into cached tile */
260    switch (data->format) {
261    case PIPE_FORMAT_Z16_UNORM:
262       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
263          int x = quad->input.x0 % TILE_SIZE + (j & 1);
264          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
265          tile->data.depth16[y][x] = (ushort) data->bzzzz[j];
266       }
267       break;
268    case PIPE_FORMAT_Z24X8_UNORM:
269    case PIPE_FORMAT_Z32_UNORM:
270       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
271          int x = quad->input.x0 % TILE_SIZE + (j & 1);
272          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
273          tile->data.depth32[y][x] = data->bzzzz[j];
274       }
275       break;
276    case PIPE_FORMAT_Z24_UNORM_S8_UINT:
277       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
278          int x = quad->input.x0 % TILE_SIZE + (j & 1);
279          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
280          tile->data.depth32[y][x] = (data->stencilVals[j] << 24) | data->bzzzz[j];
281       }
282       break;
283    case PIPE_FORMAT_S8_UINT_Z24_UNORM:
284       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
285          int x = quad->input.x0 % TILE_SIZE + (j & 1);
286          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
287          tile->data.depth32[y][x] = (data->bzzzz[j] << 8) | data->stencilVals[j];
288       }
289       break;
290    case PIPE_FORMAT_X8Z24_UNORM:
291       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
292          int x = quad->input.x0 % TILE_SIZE + (j & 1);
293          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
294          tile->data.depth32[y][x] = data->bzzzz[j] << 8;
295       }
296       break;
297    case PIPE_FORMAT_S8_UINT:
298       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
299          int x = quad->input.x0 % TILE_SIZE + (j & 1);
300          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
301          tile->data.stencil8[y][x] = data->stencilVals[j];
302       }
303       break;
304    case PIPE_FORMAT_Z32_FLOAT:
305       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
306          int x = quad->input.x0 % TILE_SIZE + (j & 1);
307          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
308          tile->data.depth32[y][x] = data->bzzzz[j];
309       }
310       break;
311    case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
312       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
313          int x = quad->input.x0 % TILE_SIZE + (j & 1);
314          int y = quad->input.y0 % TILE_SIZE + (j >> 1);
315          tile->data.depth64[y][x] = (uint64_t)data->bzzzz[j] | ((uint64_t)data->stencilVals[j] << 32);
316       }
317       break;
318    default:
319       assert(0);
320    }
321 }
322 
323 
324 
325 /** Only 8-bit stencil supported */
326 #define STENCIL_MAX 0xff
327 
328 
329 /**
330  * Do the basic stencil test (compare stencil buffer values against the
331  * reference value.
332  *
333  * \param data->stencilVals  the stencil values from the stencil buffer
334  * \param func  the stencil func (PIPE_FUNC_x)
335  * \param ref  the stencil reference value
336  * \param valMask  the stencil value mask indicating which bits of the stencil
337  *                 values and ref value are to be used.
338  * \return mask indicating which pixels passed the stencil test
339  */
340 static unsigned
do_stencil_test(struct depth_data * data,unsigned func,unsigned ref,unsigned valMask)341 do_stencil_test(struct depth_data *data,
342                 unsigned func,
343                 unsigned ref, unsigned valMask)
344 {
345    unsigned passMask = 0x0;
346    unsigned j;
347    ubyte refs[TGSI_QUAD_SIZE];
348 
349    for (j = 0; j < TGSI_QUAD_SIZE; j++) {
350       if (data->use_shader_stencil_refs)
351          refs[j] = data->shader_stencil_refs[j] & valMask;
352       else
353          refs[j] = ref & valMask;
354    }
355 
356    switch (func) {
357    case PIPE_FUNC_NEVER:
358       /* passMask = 0x0 */
359       break;
360    case PIPE_FUNC_LESS:
361       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
362          if (refs[j] < (data->stencilVals[j] & valMask)) {
363             passMask |= (1 << j);
364          }
365       }
366       break;
367    case PIPE_FUNC_EQUAL:
368       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
369          if (refs[j] == (data->stencilVals[j] & valMask)) {
370             passMask |= (1 << j);
371          }
372       }
373       break;
374    case PIPE_FUNC_LEQUAL:
375       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
376          if (refs[j] <= (data->stencilVals[j] & valMask)) {
377             passMask |= (1 << j);
378          }
379       }
380       break;
381    case PIPE_FUNC_GREATER:
382       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
383          if (refs[j] > (data->stencilVals[j] & valMask)) {
384             passMask |= (1 << j);
385          }
386       }
387       break;
388    case PIPE_FUNC_NOTEQUAL:
389       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
390          if (refs[j] != (data->stencilVals[j] & valMask)) {
391             passMask |= (1 << j);
392          }
393       }
394       break;
395    case PIPE_FUNC_GEQUAL:
396       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
397          if (refs[j] >= (data->stencilVals[j] & valMask)) {
398             passMask |= (1 << j);
399          }
400       }
401       break;
402    case PIPE_FUNC_ALWAYS:
403       passMask = MASK_ALL;
404       break;
405    default:
406       assert(0);
407    }
408 
409    return passMask;
410 }
411 
412 
413 /**
414  * Apply the stencil operator to stencil values.
415  *
416  * \param data->stencilVals  the stencil buffer values (read and written)
417  * \param mask  indicates which pixels to update
418  * \param op  the stencil operator (PIPE_STENCIL_OP_x)
419  * \param ref  the stencil reference value
420  * \param wrtMask  writemask controlling which bits are changed in the
421  *                 stencil values
422  */
423 static void
apply_stencil_op(struct depth_data * data,unsigned mask,unsigned op,ubyte ref,ubyte wrtMask)424 apply_stencil_op(struct depth_data *data,
425                  unsigned mask, unsigned op, ubyte ref, ubyte wrtMask)
426 {
427    unsigned j;
428    ubyte newstencil[TGSI_QUAD_SIZE];
429    ubyte refs[TGSI_QUAD_SIZE];
430 
431    for (j = 0; j < TGSI_QUAD_SIZE; j++) {
432       newstencil[j] = data->stencilVals[j];
433       if (data->use_shader_stencil_refs)
434          refs[j] = data->shader_stencil_refs[j];
435       else
436          refs[j] = ref;
437    }
438 
439    switch (op) {
440    case PIPE_STENCIL_OP_KEEP:
441       /* no-op */
442       break;
443    case PIPE_STENCIL_OP_ZERO:
444       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
445          if (mask & (1 << j)) {
446             newstencil[j] = 0;
447          }
448       }
449       break;
450    case PIPE_STENCIL_OP_REPLACE:
451       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
452          if (mask & (1 << j)) {
453             newstencil[j] = refs[j];
454          }
455       }
456       break;
457    case PIPE_STENCIL_OP_INCR:
458       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
459          if (mask & (1 << j)) {
460             if (data->stencilVals[j] < STENCIL_MAX) {
461                newstencil[j] = data->stencilVals[j] + 1;
462             }
463          }
464       }
465       break;
466    case PIPE_STENCIL_OP_DECR:
467       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
468          if (mask & (1 << j)) {
469             if (data->stencilVals[j] > 0) {
470                newstencil[j] = data->stencilVals[j] - 1;
471             }
472          }
473       }
474       break;
475    case PIPE_STENCIL_OP_INCR_WRAP:
476       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
477          if (mask & (1 << j)) {
478             newstencil[j] = data->stencilVals[j] + 1;
479          }
480       }
481       break;
482    case PIPE_STENCIL_OP_DECR_WRAP:
483       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
484          if (mask & (1 << j)) {
485             newstencil[j] = data->stencilVals[j] - 1;
486          }
487       }
488       break;
489    case PIPE_STENCIL_OP_INVERT:
490       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
491          if (mask & (1 << j)) {
492             newstencil[j] = ~data->stencilVals[j];
493          }
494       }
495       break;
496    default:
497       assert(0);
498    }
499 
500    /*
501     * update the stencil values
502     */
503    if (wrtMask != STENCIL_MAX) {
504       /* apply bit-wise stencil buffer writemask */
505       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
506          data->stencilVals[j] = (wrtMask & newstencil[j]) | (~wrtMask & data->stencilVals[j]);
507       }
508    }
509    else {
510       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
511          data->stencilVals[j] = newstencil[j];
512       }
513    }
514 }
515 
516 
517 
518 /**
519  * To increase efficiency, we should probably have multiple versions
520  * of this function that are specifically for Z16, Z32 and FP Z buffers.
521  * Try to effectively do that with codegen...
522  */
523 static boolean
depth_test_quad(struct quad_stage * qs,struct depth_data * data,struct quad_header * quad)524 depth_test_quad(struct quad_stage *qs,
525                 struct depth_data *data,
526                 struct quad_header *quad)
527 {
528    struct softpipe_context *softpipe = qs->softpipe;
529    unsigned zmask = 0;
530    unsigned j;
531 
532    switch (softpipe->depth_stencil->depth.func) {
533    case PIPE_FUNC_NEVER:
534       /* zmask = 0 */
535       break;
536    case PIPE_FUNC_LESS:
537       /* Note this is pretty much a single sse or cell instruction.
538        * Like this:  quad->mask &= (quad->outputs.depth < zzzz);
539        */
540       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
541 	 if (data->qzzzz[j] < data->bzzzz[j])
542 	    zmask |= 1 << j;
543       }
544       break;
545    case PIPE_FUNC_EQUAL:
546       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
547 	 if (data->qzzzz[j] == data->bzzzz[j])
548 	    zmask |= 1 << j;
549       }
550       break;
551    case PIPE_FUNC_LEQUAL:
552       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
553 	 if (data->qzzzz[j] <= data->bzzzz[j])
554 	    zmask |= (1 << j);
555       }
556       break;
557    case PIPE_FUNC_GREATER:
558       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
559 	 if (data->qzzzz[j] > data->bzzzz[j])
560 	    zmask |= (1 << j);
561       }
562       break;
563    case PIPE_FUNC_NOTEQUAL:
564       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
565 	 if (data->qzzzz[j] != data->bzzzz[j])
566 	    zmask |= (1 << j);
567       }
568       break;
569    case PIPE_FUNC_GEQUAL:
570       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
571 	 if (data->qzzzz[j] >= data->bzzzz[j])
572 	    zmask |= (1 << j);
573       }
574       break;
575    case PIPE_FUNC_ALWAYS:
576       zmask = MASK_ALL;
577       break;
578    default:
579       assert(0);
580    }
581 
582    quad->inout.mask &= zmask;
583    if (quad->inout.mask == 0)
584       return FALSE;
585 
586    /* Update our internal copy only if writemask set.  Even if
587     * depth.writemask is FALSE, may still need to write out buffer
588     * data due to stencil changes.
589     */
590    if (softpipe->depth_stencil->depth.writemask) {
591       for (j = 0; j < TGSI_QUAD_SIZE; j++) {
592          if (quad->inout.mask & (1 << j)) {
593             data->bzzzz[j] = data->qzzzz[j];
594          }
595       }
596    }
597 
598    return TRUE;
599 }
600 
601 
602 
603 /**
604  * Do stencil (and depth) testing.  Stenciling depends on the outcome of
605  * depth testing.
606  */
607 static void
depth_stencil_test_quad(struct quad_stage * qs,struct depth_data * data,struct quad_header * quad)608 depth_stencil_test_quad(struct quad_stage *qs,
609                         struct depth_data *data,
610                         struct quad_header *quad)
611 {
612    struct softpipe_context *softpipe = qs->softpipe;
613    unsigned func, zFailOp, zPassOp, failOp;
614    ubyte ref, wrtMask, valMask;
615    uint face = quad->input.facing;
616 
617    if (!softpipe->depth_stencil->stencil[1].enabled) {
618       /* single-sided stencil test, use front (face=0) state */
619       face = 0;
620    }
621 
622    /* 0 = front-face, 1 = back-face */
623    assert(face == 0 || face == 1);
624 
625    /* choose front or back face function, operator, etc */
626    /* XXX we could do these initializations once per primitive */
627    func    = softpipe->depth_stencil->stencil[face].func;
628    failOp  = softpipe->depth_stencil->stencil[face].fail_op;
629    zFailOp = softpipe->depth_stencil->stencil[face].zfail_op;
630    zPassOp = softpipe->depth_stencil->stencil[face].zpass_op;
631    ref     = softpipe->stencil_ref.ref_value[face];
632    wrtMask = softpipe->depth_stencil->stencil[face].writemask;
633    valMask = softpipe->depth_stencil->stencil[face].valuemask;
634 
635    /* do the stencil test first */
636    {
637       unsigned passMask, failMask;
638       passMask = do_stencil_test(data, func, ref, valMask);
639       failMask = quad->inout.mask & ~passMask;
640       quad->inout.mask &= passMask;
641 
642       if (failOp != PIPE_STENCIL_OP_KEEP) {
643          apply_stencil_op(data, failMask, failOp, ref, wrtMask);
644       }
645    }
646 
647    if (quad->inout.mask) {
648       /* now the pixels that passed the stencil test are depth tested */
649       if (softpipe->depth_stencil->depth.enabled) {
650          const unsigned origMask = quad->inout.mask;
651 
652          depth_test_quad(qs, data, quad);  /* quad->mask is updated */
653 
654          /* update stencil buffer values according to z pass/fail result */
655          if (zFailOp != PIPE_STENCIL_OP_KEEP) {
656             const unsigned zFailMask = origMask & ~quad->inout.mask;
657             apply_stencil_op(data, zFailMask, zFailOp, ref, wrtMask);
658          }
659 
660          if (zPassOp != PIPE_STENCIL_OP_KEEP) {
661             const unsigned zPassMask = origMask & quad->inout.mask;
662             apply_stencil_op(data, zPassMask, zPassOp, ref, wrtMask);
663          }
664       }
665       else {
666          /* no depth test, apply Zpass operator to stencil buffer values */
667          apply_stencil_op(data, quad->inout.mask, zPassOp, ref, wrtMask);
668       }
669    }
670 }
671 
672 
673 #define ALPHATEST( FUNC, COMP )                                         \
674    static unsigned                                                      \
675    alpha_test_quads_##FUNC( struct quad_stage *qs,                      \
676                            struct quad_header *quads[],                 \
677                            unsigned nr )                                \
678    {                                                                    \
679       const float ref = qs->softpipe->depth_stencil->alpha.ref_value;   \
680       const uint cbuf = 0; /* only output[0].alpha is tested */         \
681       unsigned pass_nr = 0;                                             \
682       unsigned i;                                                       \
683                                                                         \
684       for (i = 0; i < nr; i++) {                                        \
685          const float *aaaa = quads[i]->output.color[cbuf][3];           \
686          unsigned passMask = 0;                                         \
687                                                                         \
688          if (aaaa[0] COMP ref) passMask |= (1 << 0);                    \
689          if (aaaa[1] COMP ref) passMask |= (1 << 1);                    \
690          if (aaaa[2] COMP ref) passMask |= (1 << 2);                    \
691          if (aaaa[3] COMP ref) passMask |= (1 << 3);                    \
692                                                                         \
693          quads[i]->inout.mask &= passMask;                              \
694                                                                         \
695          if (quads[i]->inout.mask)                                      \
696             quads[pass_nr++] = quads[i];                                \
697       }                                                                 \
698                                                                         \
699       return pass_nr;                                                   \
700    }
701 
702 
703 ALPHATEST( LESS,     < )
704 ALPHATEST( EQUAL,    == )
705 ALPHATEST( LEQUAL,   <= )
706 ALPHATEST( GREATER,  > )
707 ALPHATEST( NOTEQUAL, != )
708 ALPHATEST( GEQUAL,   >= )
709 
710 
711 /* XXX: Incorporate into shader using KILP.
712  */
713 static unsigned
alpha_test_quads(struct quad_stage * qs,struct quad_header * quads[],unsigned nr)714 alpha_test_quads(struct quad_stage *qs,
715                  struct quad_header *quads[],
716                  unsigned nr)
717 {
718    switch (qs->softpipe->depth_stencil->alpha.func) {
719    case PIPE_FUNC_LESS:
720       return alpha_test_quads_LESS( qs, quads, nr );
721    case PIPE_FUNC_EQUAL:
722       return alpha_test_quads_EQUAL( qs, quads, nr );
723    case PIPE_FUNC_LEQUAL:
724       return alpha_test_quads_LEQUAL( qs, quads, nr );
725    case PIPE_FUNC_GREATER:
726       return alpha_test_quads_GREATER( qs, quads, nr );
727    case PIPE_FUNC_NOTEQUAL:
728       return alpha_test_quads_NOTEQUAL( qs, quads, nr );
729    case PIPE_FUNC_GEQUAL:
730       return alpha_test_quads_GEQUAL( qs, quads, nr );
731    case PIPE_FUNC_ALWAYS:
732       return nr;
733    case PIPE_FUNC_NEVER:
734    default:
735       return 0;
736    }
737 }
738 
739 
740 static unsigned mask_count[16] =
741 {
742    0,                           /* 0x0 */
743    1,                           /* 0x1 */
744    1,                           /* 0x2 */
745    2,                           /* 0x3 */
746    1,                           /* 0x4 */
747    2,                           /* 0x5 */
748    2,                           /* 0x6 */
749    3,                           /* 0x7 */
750    1,                           /* 0x8 */
751    2,                           /* 0x9 */
752    2,                           /* 0xa */
753    3,                           /* 0xb */
754    2,                           /* 0xc */
755    3,                           /* 0xd */
756    3,                           /* 0xe */
757    4,                           /* 0xf */
758 };
759 
760 
761 
762 /**
763  * General depth/stencil test function.  Used when there's no fast-path.
764  */
765 static void
depth_test_quads_fallback(struct quad_stage * qs,struct quad_header * quads[],unsigned nr)766 depth_test_quads_fallback(struct quad_stage *qs,
767                           struct quad_header *quads[],
768                           unsigned nr)
769 {
770    unsigned i, pass = 0;
771    const struct tgsi_shader_info *fsInfo = &qs->softpipe->fs_variant->info;
772    boolean interp_depth = !fsInfo->writes_z;
773    boolean shader_stencil_ref = fsInfo->writes_stencil;
774    struct depth_data data;
775 
776    data.use_shader_stencil_refs = FALSE;
777 
778    if (qs->softpipe->depth_stencil->alpha.enabled) {
779       nr = alpha_test_quads(qs, quads, nr);
780    }
781 
782    if (qs->softpipe->framebuffer.zsbuf &&
783          (qs->softpipe->depth_stencil->depth.enabled ||
784           qs->softpipe->depth_stencil->stencil[0].enabled)) {
785 
786       data.ps = qs->softpipe->framebuffer.zsbuf;
787       data.format = data.ps->format;
788       data.tile = sp_get_cached_tile(qs->softpipe->zsbuf_cache,
789                                      quads[0]->input.x0,
790                                      quads[0]->input.y0);
791 
792       for (i = 0; i < nr; i++) {
793          get_depth_stencil_values(&data, quads[i]);
794 
795          if (qs->softpipe->depth_stencil->depth.enabled) {
796             if (interp_depth)
797                interpolate_quad_depth(quads[i]);
798 
799             convert_quad_depth(&data, quads[i]);
800          }
801 
802          if (qs->softpipe->depth_stencil->stencil[0].enabled) {
803             if (shader_stencil_ref)
804                convert_quad_stencil(&data, quads[i]);
805 
806             depth_stencil_test_quad(qs, &data, quads[i]);
807             write_depth_stencil_values(&data, quads[i]);
808          }
809          else {
810             if (!depth_test_quad(qs, &data, quads[i]))
811                continue;
812 
813             if (qs->softpipe->depth_stencil->depth.writemask)
814                write_depth_stencil_values(&data, quads[i]);
815          }
816 
817          quads[pass++] = quads[i];
818       }
819 
820       nr = pass;
821    }
822 
823    if (qs->softpipe->active_query_count) {
824       for (i = 0; i < nr; i++)
825          qs->softpipe->occlusion_count += mask_count[quads[i]->inout.mask];
826    }
827 
828    if (nr)
829       qs->next->run(qs->next, quads, nr);
830 }
831 
832 
833 /**
834  * Special-case Z testing for 16-bit Zbuffer and Z buffer writes enabled.
835  */
836 
837 #define NAME depth_interp_z16_less_write
838 #define OPERATOR <
839 #include "sp_quad_depth_test_tmp.h"
840 
841 #define NAME depth_interp_z16_equal_write
842 #define OPERATOR ==
843 #include "sp_quad_depth_test_tmp.h"
844 
845 #define NAME depth_interp_z16_lequal_write
846 #define OPERATOR <=
847 #include "sp_quad_depth_test_tmp.h"
848 
849 #define NAME depth_interp_z16_greater_write
850 #define OPERATOR >
851 #include "sp_quad_depth_test_tmp.h"
852 
853 #define NAME depth_interp_z16_notequal_write
854 #define OPERATOR !=
855 #include "sp_quad_depth_test_tmp.h"
856 
857 #define NAME depth_interp_z16_gequal_write
858 #define OPERATOR >=
859 #include "sp_quad_depth_test_tmp.h"
860 
861 #define NAME depth_interp_z16_always_write
862 #define ALWAYS 1
863 #include "sp_quad_depth_test_tmp.h"
864 
865 
866 
867 static void
depth_noop(struct quad_stage * qs,struct quad_header * quads[],unsigned nr)868 depth_noop(struct quad_stage *qs,
869            struct quad_header *quads[],
870            unsigned nr)
871 {
872    qs->next->run(qs->next, quads, nr);
873 }
874 
875 
876 
877 static void
choose_depth_test(struct quad_stage * qs,struct quad_header * quads[],unsigned nr)878 choose_depth_test(struct quad_stage *qs,
879                   struct quad_header *quads[],
880                   unsigned nr)
881 {
882    const struct tgsi_shader_info *fsInfo = &qs->softpipe->fs_variant->info;
883 
884    boolean interp_depth = !fsInfo->writes_z;
885 
886    boolean alpha = qs->softpipe->depth_stencil->alpha.enabled;
887 
888    boolean depth = qs->softpipe->depth_stencil->depth.enabled;
889 
890    unsigned depthfunc = qs->softpipe->depth_stencil->depth.func;
891 
892    boolean stencil = qs->softpipe->depth_stencil->stencil[0].enabled;
893 
894    boolean depthwrite = qs->softpipe->depth_stencil->depth.writemask;
895 
896    boolean occlusion = qs->softpipe->active_query_count;
897 
898    if(!qs->softpipe->framebuffer.zsbuf)
899       depth = depthwrite = stencil = FALSE;
900 
901    /* default */
902    qs->run = depth_test_quads_fallback;
903 
904    /* look for special cases */
905    if (!alpha &&
906        !depth &&
907        !occlusion &&
908        !stencil) {
909       qs->run = depth_noop;
910    }
911    else if (!alpha &&
912             interp_depth &&
913             depth &&
914             depthwrite &&
915             !occlusion &&
916             !stencil)
917    {
918       if (qs->softpipe->framebuffer.zsbuf->format == PIPE_FORMAT_Z16_UNORM) {
919          switch (depthfunc) {
920          case PIPE_FUNC_NEVER:
921             qs->run = depth_test_quads_fallback;
922             break;
923          case PIPE_FUNC_LESS:
924             qs->run = depth_interp_z16_less_write;
925             break;
926          case PIPE_FUNC_EQUAL:
927             qs->run = depth_interp_z16_equal_write;
928             break;
929          case PIPE_FUNC_LEQUAL:
930             qs->run = depth_interp_z16_lequal_write;
931             break;
932          case PIPE_FUNC_GREATER:
933             qs->run = depth_interp_z16_greater_write;
934             break;
935          case PIPE_FUNC_NOTEQUAL:
936             qs->run = depth_interp_z16_notequal_write;
937             break;
938          case PIPE_FUNC_GEQUAL:
939             qs->run = depth_interp_z16_gequal_write;
940             break;
941          case PIPE_FUNC_ALWAYS:
942             qs->run = depth_interp_z16_always_write;
943             break;
944          default:
945             qs->run = depth_test_quads_fallback;
946             break;
947          }
948       }
949    }
950 
951    /* next quad/fragment stage */
952    qs->run( qs, quads, nr );
953 }
954 
955 
956 
957 static void
depth_test_begin(struct quad_stage * qs)958 depth_test_begin(struct quad_stage *qs)
959 {
960    qs->run = choose_depth_test;
961    qs->next->begin(qs->next);
962 }
963 
964 
965 static void
depth_test_destroy(struct quad_stage * qs)966 depth_test_destroy(struct quad_stage *qs)
967 {
968    FREE( qs );
969 }
970 
971 
972 struct quad_stage *
sp_quad_depth_test_stage(struct softpipe_context * softpipe)973 sp_quad_depth_test_stage(struct softpipe_context *softpipe)
974 {
975    struct quad_stage *stage = CALLOC_STRUCT(quad_stage);
976 
977    stage->softpipe = softpipe;
978    stage->begin = depth_test_begin;
979    stage->run = choose_depth_test;
980    stage->destroy = depth_test_destroy;
981 
982    return stage;
983 }
984