Revert "draw: no need to rearrange most primitives in vcache for flatshade-first"

This reverts commit ad44e68706.
This commit is contained in:
Keith Whitwell 2008-06-10 16:56:32 +01:00
parent ad44e68706
commit aa7c21a45b
2 changed files with 56 additions and 72 deletions

View file

@ -114,10 +114,7 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch,
fetch->translate = translate_cache_find(fetch->cache, &key);
{
static struct vertex_header vh = { 0,
1, /* edgeflag */
0,
0xffff };
static struct vertex_header vh = { 0, 1, 0, 0xffff };
fetch->translate->set_buffer(fetch->translate,
draw->pt.nr_vertex_buffers,
&vh,

View file

@ -7,18 +7,15 @@ static void FUNC( struct draw_pt_front_end *frontend,
{
struct vcache_frontend *vcache = (struct vcache_frontend *)frontend;
struct draw_context *draw = vcache->draw;
boolean flatfirst = (draw->rasterizer->flatshade &&
draw->rasterizer->flatshade_first);
unsigned i;
ushort flags;
if (0) debug_printf("%s %d\n", __FUNCTION__, count);
/* Note that no adjustment is made here for flatshade provoking
* vertex. This was previously the case, but was incorrect as the
* same logic would be applied twice both here & in the pipeline
* code or driver. The rule is now that we just preserve the
* original order in this code, and leave identification of the PV
* to the pipeline and driver.
*/
switch (vcache->input_prim) {
case PIPE_PRIM_POINTS:
for (i = 0; i < count; i ++) {
@ -75,23 +72,45 @@ static void FUNC( struct draw_pt_front_end *frontend,
break;
case PIPE_PRIM_TRIANGLE_STRIP:
for (i = 0; i+2 < count; i++) {
TRIANGLE( vcache,
DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
get_elt(elts, i + 0 + (i&1)),
get_elt(elts, i + 1 - (i&1)),
get_elt(elts, i + 2 ));
if (flatfirst) {
for (i = 0; i+2 < count; i++) {
TRIANGLE( vcache,
DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
get_elt(elts, i + 0),
get_elt(elts, i + 1 + (i&1)),
get_elt(elts, i + 2 - (i&1)));
}
}
else {
for (i = 0; i+2 < count; i++) {
TRIANGLE( vcache,
DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
get_elt(elts, i + 0 + (i&1)),
get_elt(elts, i + 1 - (i&1)),
get_elt(elts, i + 2 ));
}
}
break;
case PIPE_PRIM_TRIANGLE_FAN:
if (count >= 3) {
for (i = 0; i+2 < count; i++) {
TRIANGLE( vcache,
DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
get_elt(elts, i + 1),
get_elt(elts, i + 2),
get_elt(elts, 0 ));
if (flatfirst) {
for (i = 0; i+2 < count; i++) {
TRIANGLE( vcache,
DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
get_elt(elts, i + 1),
get_elt(elts, i + 2),
get_elt(elts, 0 ));
}
}
else {
for (i = 0; i+2 < count; i++) {
TRIANGLE( vcache,
DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
get_elt(elts, 0),
get_elt(elts, i + 1),
get_elt(elts, i + 2 ));
}
}
}
break;
@ -119,58 +138,26 @@ static void FUNC( struct draw_pt_front_end *frontend,
case PIPE_PRIM_POLYGON:
{
boolean flatfirst = (draw->rasterizer->flatshade &&
draw->rasterizer->flatshade_first);
/* These bitflags look a little odd because we submit the
* vertices as (1,2,0) to satisfy flatshade requirements.
*
* Polygon is defined has having vertex 0 be the provoking
* flatshade vertex and all known API's match this usage.
* However, the PV's for the triangles we emit from this
* decomposition vary according to the API, and hence we have
* to choose between two ways of emitting the triangles.
*/
if (flatfirst) {
const ushort edge_first = DRAW_PIPE_EDGE_FLAG_0;
const ushort edge_middle = DRAW_PIPE_EDGE_FLAG_1;
const ushort edge_last = DRAW_PIPE_EDGE_FLAG_2;
flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
for (i = 0; i+2 < count; i++, flags = edge_middle) {
if (i + 3 == count)
flags |= edge_last;
/* PV is first vertex */
TRIANGLE( vcache,
flags,
get_elt(elts, 0),
get_elt(elts, i + 1),
get_elt(elts, i + 2));
}
}
else {
const ushort edge_first = DRAW_PIPE_EDGE_FLAG_2;
const ushort edge_middle = DRAW_PIPE_EDGE_FLAG_0;
const ushort edge_last = DRAW_PIPE_EDGE_FLAG_1;
flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
for (i = 0; i+2 < count; i++, flags = edge_middle) {
if (i + 3 == count)
flags |= edge_last;
/* PV is third vertex */
TRIANGLE( vcache,
flags,
get_elt(elts, i + 1),
get_elt(elts, i + 2),
get_elt(elts, 0));
}
}
const ushort edge_first = DRAW_PIPE_EDGE_FLAG_2;
const ushort edge_middle = DRAW_PIPE_EDGE_FLAG_0;
const ushort edge_last = DRAW_PIPE_EDGE_FLAG_1;
flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
for (i = 0; i+2 < count; i++, flags = edge_middle) {
if (i + 3 == count)
flags |= edge_last;
TRIANGLE( vcache,
flags,
get_elt(elts, i + 1),
get_elt(elts, i + 2),
get_elt(elts, 0));
}
}
break;