draw: add switch for drivers to force vertex data passthrough
This commit is contained in:
@@ -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
|
* Ask the draw module for the location/slot of the given vertex attribute in
|
||||||
* a post-transformed vertex.
|
* a post-transformed vertex.
|
||||||
|
@@ -160,6 +160,9 @@ void draw_set_render( struct draw_context *draw,
|
|||||||
void draw_set_driver_clipping( struct draw_context *draw,
|
void draw_set_driver_clipping( struct draw_context *draw,
|
||||||
boolean bypass_clipping );
|
boolean bypass_clipping );
|
||||||
|
|
||||||
|
void draw_set_force_passthrough( struct draw_context *draw,
|
||||||
|
boolean enable );
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Draw pipeline
|
* Draw pipeline
|
||||||
*/
|
*/
|
||||||
|
@@ -163,12 +163,15 @@ struct draw_context
|
|||||||
|
|
||||||
struct {
|
struct {
|
||||||
boolean bypass_clipping;
|
boolean bypass_clipping;
|
||||||
|
boolean bypass_vs;
|
||||||
} driver;
|
} driver;
|
||||||
|
|
||||||
boolean flushing; /**< debugging/sanity */
|
boolean flushing; /**< debugging/sanity */
|
||||||
boolean suspend_flushing; /**< internally set */
|
boolean suspend_flushing; /**< internally set */
|
||||||
boolean bypass_clipping; /**< set if either api or driver bypass_clipping true */
|
boolean bypass_clipping; /**< set if either api or driver bypass_clipping true */
|
||||||
|
|
||||||
|
boolean force_passthrough; /**< never clip or shade */
|
||||||
|
|
||||||
/* pipe state that we need: */
|
/* pipe state that we need: */
|
||||||
const struct pipe_rasterizer_state *rasterizer;
|
const struct pipe_rasterizer_state *rasterizer;
|
||||||
struct pipe_viewport_state viewport;
|
struct pipe_viewport_state viewport;
|
||||||
|
@@ -69,26 +69,26 @@ draw_pt_arrays(struct draw_context *draw,
|
|||||||
return TRUE;
|
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) {
|
if (!draw->bypass_clipping && !draw->pt.test_fse) {
|
||||||
opt |= PT_PIPELINE;
|
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)
|
if (opt == 0)
|
||||||
middle = draw->pt.middle.fetch_emit;
|
middle = draw->pt.middle.fetch_emit;
|
||||||
else if (opt == PT_SHADE && !draw->pt.no_fse)
|
else if (opt == PT_SHADE && !draw->pt.no_fse)
|
||||||
|
Reference in New Issue
Block a user