draw: add switch for drivers to force vertex data passthrough

This commit is contained in:
Keith Whitwell
2008-10-06 12:22:55 +01:00
parent 23e62c94ee
commit c48da7d78b
4 changed files with 32 additions and 18 deletions

View File

@@ -272,6 +272,14 @@ draw_enable_point_sprites(struct draw_context *draw, boolean enable)
}
void
draw_set_force_passthrough( struct draw_context *draw, boolean enable )
{
draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
draw->force_passthrough = enable;
}
/**
* Ask the draw module for the location/slot of the given vertex attribute in
* a post-transformed vertex.

View File

@@ -160,6 +160,9 @@ void draw_set_render( struct draw_context *draw,
void draw_set_driver_clipping( struct draw_context *draw,
boolean bypass_clipping );
void draw_set_force_passthrough( struct draw_context *draw,
boolean enable );
/*******************************************************************************
* Draw pipeline
*/

View File

@@ -163,12 +163,15 @@ struct draw_context
struct {
boolean bypass_clipping;
boolean bypass_vs;
} driver;
boolean flushing; /**< debugging/sanity */
boolean suspend_flushing; /**< internally set */
boolean bypass_clipping; /**< set if either api or driver bypass_clipping true */
boolean force_passthrough; /**< never clip or shade */
/* pipe state that we need: */
const struct pipe_rasterizer_state *rasterizer;
struct pipe_viewport_state viewport;

View File

@@ -69,26 +69,26 @@ draw_pt_arrays(struct draw_context *draw,
return TRUE;
}
if (!draw->force_passthrough) {
if (!draw->render) {
opt |= PT_PIPELINE;
}
if (draw_need_pipeline(draw,
draw->rasterizer,
prim)) {
opt |= PT_PIPELINE;
}
if (!draw->render) {
opt |= PT_PIPELINE;
if (!draw->bypass_clipping && !draw->pt.test_fse) {
opt |= PT_CLIPTEST;
}
if (!draw->rasterizer->bypass_vs) {
opt |= PT_SHADE;
}
}
if (draw_need_pipeline(draw,
draw->rasterizer,
prim)) {
opt |= PT_PIPELINE;
}
if (!draw->bypass_clipping && !draw->pt.test_fse) {
opt |= PT_CLIPTEST;
}
if (!draw->rasterizer->bypass_vs) {
opt |= PT_SHADE;
}
if (opt == 0)
middle = draw->pt.middle.fetch_emit;
else if (opt == PT_SHADE && !draw->pt.no_fse)