Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. /**
  3.  * quad polygon stipple stage
  4.  */
  5.  
  6. #include "sp_context.h"
  7. #include "sp_quad.h"
  8. #include "sp_quad_pipe.h"
  9. #include "pipe/p_defines.h"
  10. #include "util/u_memory.h"
  11.  
  12.  
  13. /**
  14.  * Apply polygon stipple to quads produced by triangle rasterization
  15.  */
  16. static void
  17. stipple_quad(struct quad_stage *qs, struct quad_header *quads[], unsigned nr)
  18. {
  19.    static const uint bit31 = 1 << 31;
  20.    static const uint bit30 = 1 << 30;
  21.    unsigned pass = nr;
  22.  
  23.    struct softpipe_context *softpipe = qs->softpipe;
  24.    unsigned q;
  25.  
  26.    pass = 0;
  27.  
  28.    for (q = 0; q < nr; q++)  {
  29.       struct quad_header *quad = quads[q];
  30.  
  31.       const int col0 = quad->input.x0 % 32;
  32.       const int y0 = quad->input.y0;
  33.       const int y1 = y0 + 1;
  34.       const uint stipple0 = softpipe->poly_stipple.stipple[y0 % 32];
  35.       const uint stipple1 = softpipe->poly_stipple.stipple[y1 % 32];
  36.  
  37.       /* turn off quad mask bits that fail the stipple test */
  38.       if ((stipple0 & (bit31 >> col0)) == 0)
  39.          quad->inout.mask &= ~MASK_TOP_LEFT;
  40.  
  41.       if ((stipple0 & (bit30 >> col0)) == 0)
  42.          quad->inout.mask &= ~MASK_TOP_RIGHT;
  43.  
  44.       if ((stipple1 & (bit31 >> col0)) == 0)
  45.          quad->inout.mask &= ~MASK_BOTTOM_LEFT;
  46.  
  47.       if ((stipple1 & (bit30 >> col0)) == 0)
  48.          quad->inout.mask &= ~MASK_BOTTOM_RIGHT;
  49.  
  50.       if (quad->inout.mask)
  51.          quads[pass++] = quad;
  52.    }
  53.  
  54.    qs->next->run(qs->next, quads, pass);
  55. }
  56.  
  57.  
  58. static void stipple_begin(struct quad_stage *qs)
  59. {
  60.    qs->next->begin(qs->next);
  61. }
  62.  
  63.  
  64. static void stipple_destroy(struct quad_stage *qs)
  65. {
  66.    FREE( qs );
  67. }
  68.  
  69.  
  70. struct quad_stage *
  71. sp_quad_polygon_stipple_stage( struct softpipe_context *softpipe )
  72. {
  73.    struct quad_stage *stage = CALLOC_STRUCT(quad_stage);
  74.  
  75.    stage->softpipe = softpipe;
  76.    stage->begin = stipple_begin;
  77.    stage->run = stipple_quad;
  78.    stage->destroy = stipple_destroy;
  79.  
  80.    return stage;
  81. }
  82.