llvmpipe: clean up deferred zstencil clears

This commit is contained in:
Keith Whitwell 2010-08-27 17:30:07 +01:00
parent 18452c1e87
commit c512ba88a7
6 changed files with 40 additions and 78 deletions

View file

@ -255,9 +255,8 @@ lp_rast_clear_zstencil(struct lp_rasterizer_task *task,
const union lp_rast_cmd_arg arg)
{
struct lp_rasterizer *rast = task->rast;
const struct lp_rast_clearzs *clearzs = arg.clear_zstencil;
unsigned clear_value = clearzs->clearzs_value;
unsigned clear_mask = clearzs->clearzs_mask;
unsigned clear_value = arg.clear_zstencil.value;
unsigned clear_mask = arg.clear_zstencil.mask;
const unsigned height = TILE_SIZE / TILE_VECTOR_HEIGHT;
const unsigned width = TILE_SIZE * TILE_VECTOR_HEIGHT;
const unsigned block_size = rast->zsbuf.blocksize;

View file

@ -88,10 +88,6 @@ struct lp_rast_shader_inputs {
const struct lp_rast_state *state;
};
struct lp_rast_clearzs {
unsigned clearzs_value;
unsigned clearzs_mask;
};
struct lp_rast_plane {
/* one-pixel sized trivial accept offsets for each plane */
@ -151,7 +147,10 @@ union lp_rast_cmd_arg {
} triangle;
const struct lp_rast_state *set_state;
uint8_t clear_color[4];
const struct lp_rast_clearzs *clear_zstencil;
struct {
unsigned value;
unsigned mask;
} clear_zstencil;
struct lp_fence *fence;
struct llvmpipe_query *query_obj;
};
@ -195,13 +194,15 @@ lp_rast_arg_fence( struct lp_fence *fence )
static INLINE union lp_rast_cmd_arg
lp_rast_arg_clearzs( const struct lp_rast_clearzs *clearzs )
lp_rast_arg_clearzs( unsigned value, unsigned mask )
{
union lp_rast_cmd_arg arg;
arg.clear_zstencil = clearzs;
arg.clear_zstencil.value = value;
arg.clear_zstencil.mask = mask;
return arg;
}
static INLINE union lp_rast_cmd_arg
lp_rast_arg_null( void )
{

View file

@ -206,7 +206,6 @@ lp_scene_reset(struct lp_scene *scene )
scene->scene_size = 0;
scene->has_color_clear = FALSE;
scene->has_depthstencil_clear = FALSE;
}

View file

@ -125,7 +125,6 @@ struct lp_scene {
*/
unsigned scene_size;
boolean has_color_clear;
boolean has_depthstencil_clear;
/**

View file

@ -135,8 +135,7 @@ static void reset_context( struct lp_setup_context *setup )
/* Reset some state:
*/
setup->clear.flags = 0;
setup->clear.clearzs.clearzs_mask = 0;
memset(&setup->clear, 0, sizeof setup->clear);
/* Have an explicit "start-binning" call and get rid of this
* pointer twiddling?
@ -195,7 +194,6 @@ begin_binning( struct lp_setup_context *setup )
lp_scene_bin_everywhere( scene,
lp_rast_clear_color,
setup->clear.color );
scene->has_color_clear = TRUE;
}
}
@ -205,7 +203,9 @@ begin_binning( struct lp_setup_context *setup )
scene->has_depthstencil_clear = TRUE;
lp_scene_bin_everywhere( scene,
lp_rast_clear_zstencil,
lp_rast_arg_clearzs(&setup->clear.clearzs) );
lp_rast_arg_clearzs(
setup->clear.zsmask,
setup->clear.zsvalue));
}
}
@ -341,67 +341,26 @@ lp_setup_clear( struct lp_setup_context *setup,
unsigned flags )
{
struct lp_scene *scene = lp_setup_get_current_scene(setup);
uint32_t zsmask = 0;
uint32_t zsvalue = 0;
uint8_t clear_color[4];
unsigned i;
boolean full_zs_clear = TRUE;
uint32_t mask = 0;
LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state);
if (flags & PIPE_CLEAR_COLOR) {
for (i = 0; i < 4; ++i)
setup->clear.color.clear_color[i] = float_to_ubyte(color[i]);
for (i = 0; i < 4; i++)
clear_color[i] = float_to_ubyte(color[i]);
}
if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
if (setup->fb.zsbuf &&
((flags & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) &&
util_format_is_depth_and_stencil(setup->fb.zsbuf->format))
full_zs_clear = FALSE;
zsvalue = util_pack_z_stencil(setup->fb.zsbuf->format,
depth,
stencil);
if (full_zs_clear) {
setup->clear.clearzs.clearzs_value =
util_pack_z_stencil(setup->fb.zsbuf->format,
depth,
stencil);
setup->clear.clearzs.clearzs_mask = 0xffffffff;
}
else {
/* hmm */
uint32_t tmpval;
if (flags & PIPE_CLEAR_DEPTH) {
tmpval = util_pack_z(setup->fb.zsbuf->format,
depth);
switch (setup->fb.zsbuf->format) {
case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
mask = 0xffffff;
break;
case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
mask = 0xffffff00;
break;
default:
assert(0);
}
}
else {
switch (setup->fb.zsbuf->format) {
case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
mask = 0xff000000;
tmpval = stencil << 24;
break;
case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
mask = 0xff;
tmpval = stencil;
break;
default:
assert(0);
tmpval = 0;
}
}
setup->clear.clearzs.clearzs_mask |= mask;
setup->clear.clearzs.clearzs_value =
(setup->clear.clearzs.clearzs_value & ~mask) | (tmpval & mask);
}
zsmask = util_pack_uint_z_stencil(setup->fb.zsbuf->format,
0xffffffff,
0xff);
}
if (setup->state == SETUP_ACTIVE) {
@ -415,21 +374,13 @@ lp_setup_clear( struct lp_setup_context *setup,
lp_scene_bin_everywhere( scene,
lp_rast_clear_color,
setup->clear.color );
scene->has_color_clear = TRUE;
}
if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
if (full_zs_clear)
scene->has_depthstencil_clear = TRUE;
else
setup->clear.clearzs.clearzs_mask = mask;
lp_scene_bin_everywhere( scene,
lp_rast_clear_zstencil,
lp_rast_arg_clearzs(&setup->clear.clearzs) );
lp_rast_arg_clearzs(zsmask, zsvalue) );
}
}
else {
/* Put ourselves into the 'pre-clear' state, specifically to try
@ -440,6 +391,18 @@ lp_setup_clear( struct lp_setup_context *setup,
set_scene_state( setup, SETUP_CLEARED );
setup->clear.flags |= flags;
if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
setup->clear.zsmask |= zsmask;
setup->clear.zsvalue =
(setup->clear.zsvalue & ~zsmask) | (zsvalue & zsmask);
}
if (flags & PIPE_CLEAR_COLOR) {
memcpy(setup->clear.color.clear_color,
clear_color,
sizeof clear_color);
}
}
}

View file

@ -108,7 +108,8 @@ struct lp_setup_context
struct {
unsigned flags;
union lp_rast_cmd_arg color; /**< lp_rast_clear_color() cmd */
struct lp_rast_clearzs clearzs; /**< lp_rast_clear_zstencil() cmd */
unsigned zsmask;
unsigned zsvalue; /**< lp_rast_clear_zstencil() cmd */
} clear;
enum setup_state {