Selaa lähdekoodia

llvmpipe: Add a new scene state to describe scenes which only have state changes.

It's a rare condition, but it may happen if all primitives are
clipped/culled.

For now we just do a no-op rasterization, but we could bypass it.
tags/mesa-7.9-rc1
José Fonseca 15 vuotta sitten
vanhempi
commit
a2311400fe

+ 22
- 16
src/gallium/drivers/llvmpipe/lp_setup.c Näytä tiedosto

@@ -63,15 +63,7 @@ struct lp_scene *
lp_setup_get_current_scene(struct lp_setup_context *setup)
{
if (!setup->scene) {

/* wait for a free/empty scene
*/
setup->scene = lp_scene_dequeue(setup->empty_scenes, TRUE);

assert(lp_scene_is_empty(setup->scene));

lp_scene_begin_binning(setup->scene,
&setup->fb );
set_scene_state( setup, SETUP_EMPTY );
}
return setup->scene;
}
@@ -233,22 +225,36 @@ set_scene_state( struct lp_setup_context *setup,
LP_DBG(DEBUG_SETUP, "%s old %d new %d\n", __FUNCTION__, old_state, new_state);

switch (new_state) {
case SETUP_ACTIVE:
begin_binning( setup );
case SETUP_EMPTY:
assert(old_state == SETUP_FLUSHED);
assert(setup->scene == NULL);

/* wait for a free/empty scene
*/
setup->scene = lp_scene_dequeue(setup->empty_scenes, TRUE);
assert(lp_scene_is_empty(setup->scene));
lp_scene_begin_binning(setup->scene,
&setup->fb );
break;

case SETUP_CLEARED:
if (old_state == SETUP_ACTIVE) {
assert(0);
return;
}
assert(old_state == SETUP_EMPTY);
assert(setup->scene != NULL);
break;

case SETUP_ACTIVE:
assert(old_state == SETUP_EMPTY ||
old_state == SETUP_CLEARED);
assert(setup->scene != NULL);
begin_binning( setup );
break;
case SETUP_FLUSHED:
if (old_state == SETUP_CLEARED)
execute_clears( setup );
else
lp_setup_rasterize_scene( setup );
assert(setup->scene == NULL);
break;

default:

+ 4
- 3
src/gallium/drivers/llvmpipe/lp_setup_context.h Näytä tiedosto

@@ -101,9 +101,10 @@ struct lp_setup_context
} clear;

enum setup_state {
SETUP_FLUSHED,
SETUP_CLEARED,
SETUP_ACTIVE
SETUP_FLUSHED, /**< scene is null */
SETUP_EMPTY, /**< scene exists but has only state changes */
SETUP_CLEARED, /**< scene exists but has only clears */
SETUP_ACTIVE /**< scene exists and has at least one draw/query */
} state;
struct {

Loading…
Peruuta
Tallenna