llvmpipe: Respect gl_rasterization_rules in primitive setup.

Based on Michal's identical commit for softpipe
(ca9c413647).
This commit is contained in:
José Fonseca 2009-11-03 13:10:58 +00:00
parent 3e8f665c1e
commit 677a055fa0

View file

@ -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)));
}
}