diff options
| author | José Fonseca <jfonseca@vmware.com> | 2009-11-03 13:10:58 +0000 | 
|---|---|---|
| committer | José Fonseca <jfonseca@vmware.com> | 2009-11-03 17:12:34 +0000 | 
| commit | 677a055fa0cf7b6476c716be187513c41060d417 (patch) | |
| tree | 8bb7e39ff9538f56cf514f3e4930a23abc4e7520 /src/gallium/drivers | |
| parent | 3e8f665c1eae5c93c1349e04476950dcd7a42073 (diff) | |
llvmpipe: Respect gl_rasterization_rules in primitive setup.
Based on Michal's identical commit for softpipe
(ca9c413647bf9efb5ed770e3a655bc758075aec7).
Diffstat (limited to 'src/gallium/drivers')
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_setup.c | 48 | 
1 files changed, 30 insertions, 18 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c index c43b3da450..11ebfa0236 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup.c +++ b/src/gallium/drivers/llvmpipe/lp_setup.c @@ -90,6 +90,8 @@ struct setup_context {     float oneoverarea;     int facing; +   float pixel_offset; +     struct quad_header quad[MAX_QUADS];     struct quad_header *quad_ptrs[MAX_QUADS];     unsigned count; @@ -483,6 +485,16 @@ static boolean setup_sort_vertices( struct setup_context *setup,        ((det > 0.0) ^          (setup->llvmpipe->rasterizer->front_winding == PIPE_WINDING_CW)); +   /* Prepare pixel offset for rasterisation: +    *  - pixel center (0.5, 0.5) for GL, or +    *  - assume (0.0, 0.0) for other APIs. +    */ +   if (setup->llvmpipe->rasterizer->gl_rasterization_rules) { +      setup->pixel_offset = 0.5f; +   } else { +      setup->pixel_offset = 0.0f; +   } +     return TRUE;  } @@ -508,7 +520,7 @@ static void tri_pos_coeff( struct setup_context *setup,     /* calculate a0 as the value which would be sampled for the      * fragment at (0,0), taking into account that we want to sample at -    * pixel centers, in other words (0.5, 0.5). +    * pixel centers, in other words (pixel_offset, pixel_offset).      *      * this is neat but unfortunately not a good way to do things for      * triangles with very large values of dadx or dady as it will @@ -519,8 +531,8 @@ static void tri_pos_coeff( struct setup_context *setup,      * instead - i'll switch to this later.      */     setup->coef.a0[0][i] = (setup->vmin[vertSlot][i] - -                           (dadx * (setup->vmin[0][0] - 0.5f) + -                            dady * (setup->vmin[0][1] - 0.5f))); +                           (dadx * (setup->vmin[0][0] - setup->pixel_offset) + +                            dady * (setup->vmin[0][1] - setup->pixel_offset)));     /*     debug_printf("attr[%d].%c: %f dx:%f dy:%f\n", @@ -609,8 +621,8 @@ static void tri_linear_coeff( struct setup_context *setup,         * instead - i'll switch to this later.         */        setup->coef.a0[1 + attrib][i] = (setup->vmin[vertSlot][i] - -                     (dadx * (setup->vmin[0][0] - 0.5f) + -                      dady * (setup->vmin[0][1] - 0.5f))); +                     (dadx * (setup->vmin[0][0] - setup->pixel_offset) + +                      dady * (setup->vmin[0][1] - setup->pixel_offset)));        /*        debug_printf("attr[%d].%c: %f dx:%f dy:%f\n", @@ -661,8 +673,8 @@ static void tri_persp_coeff( struct setup_context *setup,        setup->coef.dadx[1 + attrib][i] = dadx;        setup->coef.dady[1 + attrib][i] = dady;        setup->coef.a0[1 + attrib][i] = (mina - -                     (dadx * (setup->vmin[0][0] - 0.5f) + -                      dady * (setup->vmin[0][1] - 0.5f))); +                     (dadx * (setup->vmin[0][0] - setup->pixel_offset) + +                      dady * (setup->vmin[0][1] - setup->pixel_offset)));     }  } @@ -746,12 +758,12 @@ static void setup_tri_coefficients( struct setup_context *setup )  static void setup_tri_edges( struct setup_context *setup )  { -   float vmin_x = setup->vmin[0][0] + 0.5f; -   float vmid_x = setup->vmid[0][0] + 0.5f; +   float vmin_x = setup->vmin[0][0] + setup->pixel_offset; +   float vmid_x = setup->vmid[0][0] + setup->pixel_offset; -   float vmin_y = setup->vmin[0][1] - 0.5f; -   float vmid_y = setup->vmid[0][1] - 0.5f; -   float vmax_y = setup->vmax[0][1] - 0.5f; +   float vmin_y = setup->vmin[0][1] - setup->pixel_offset; +   float vmid_y = setup->vmid[0][1] - setup->pixel_offset; +   float vmax_y = setup->vmax[0][1] - setup->pixel_offset;     setup->emaj.sy = ceilf(vmin_y);     setup->emaj.lines = (int) ceilf(vmax_y - setup->emaj.sy); @@ -950,8 +962,8 @@ linear_pos_coeff(struct setup_context *setup,     setup->coef.dadx[0][i] = dadx;     setup->coef.dady[0][i] = dady;     setup->coef.a0[0][i] = (setup->vmin[vertSlot][i] - -                           (dadx * (setup->vmin[0][0] - 0.5f) + -                            dady * (setup->vmin[0][1] - 0.5f))); +                           (dadx * (setup->vmin[0][0] - setup->pixel_offset) + +                            dady * (setup->vmin[0][1] - setup->pixel_offset)));  } @@ -972,8 +984,8 @@ line_linear_coeff(struct setup_context *setup,        setup->coef.dadx[1 + attrib][i] = dadx;        setup->coef.dady[1 + attrib][i] = dady;        setup->coef.a0[1 + attrib][i] = (setup->vmin[vertSlot][i] - -                     (dadx * (setup->vmin[0][0] - 0.5f) + -                      dady * (setup->vmin[0][1] - 0.5f))); +                     (dadx * (setup->vmin[0][0] - setup->pixel_offset) + +                      dady * (setup->vmin[0][1] - setup->pixel_offset)));     }  } @@ -998,8 +1010,8 @@ line_persp_coeff(struct setup_context *setup,        setup->coef.dadx[1 + attrib][i] = dadx;        setup->coef.dady[1 + attrib][i] = dady;        setup->coef.a0[1 + attrib][i] = (setup->vmin[vertSlot][i] - -                     (dadx * (setup->vmin[0][0] - 0.5f) + -                      dady * (setup->vmin[0][1] - 0.5f))); +                     (dadx * (setup->vmin[0][0] - setup->pixel_offset) + +                      dady * (setup->vmin[0][1] - setup->pixel_offset)));     }  }  | 
