softpipe: clean up the buffer clear and tile cache code a little

This commit is contained in:
Brian Paul
2009-04-06 15:31:58 -06:00
parent 87c356a222
commit f4d744af24
3 changed files with 15 additions and 39 deletions
+3 -2
View File
@@ -65,7 +65,7 @@ softpipe_clear(struct pipe_context *pipe, unsigned buffers, const float *rgba,
struct pipe_surface *ps = softpipe->framebuffer.cbufs[i];
util_pack_color(rgba, ps->format, &cv);
sp_tile_cache_clear(softpipe->cbuf_cache[i], cv);
sp_tile_cache_clear(softpipe->cbuf_cache[i], rgba, cv);
#if !TILE_CLEAR_OPTIMIZATION
/* non-cached surface */
@@ -75,10 +75,11 @@ softpipe_clear(struct pipe_context *pipe, unsigned buffers, const float *rgba,
}
if (buffers & PIPE_CLEAR_DEPTHSTENCIL) {
static const float zero[4] = { 0.0F, 0.0F, 0.0F, 0.0F };
struct pipe_surface *ps = softpipe->framebuffer.zsbuf;
cv = util_pack_z_stencil(ps->format, depth, stencil);
sp_tile_cache_clear(softpipe->zsbuf_cache, cv);
sp_tile_cache_clear(softpipe->zsbuf_cache, zero, cv);
#if !TILE_CLEAR_OPTIMIZATION
/* non-cached surface */
+10 -36
View File
@@ -57,9 +57,9 @@ struct softpipe_tile_cache
struct pipe_texture *texture; /**< if caching a texture */
struct softpipe_cached_tile entries[NUM_ENTRIES];
uint clear_flags[(MAX_WIDTH / TILE_SIZE) * (MAX_HEIGHT / TILE_SIZE) / 32];
float clear_color[4];
uint clear_val;
boolean depth_stencil; /** Is the surface a depth/stencil format? */
float clear_color[4]; /**< for color bufs */
uint clear_val; /**< for z+stencil, or packed color clear value */
boolean depth_stencil; /**< Is the surface a depth/stencil format? */
struct pipe_transfer *tex_trans;
void *tex_trans_map;
@@ -599,44 +599,18 @@ sp_get_cached_tile_tex(struct softpipe_context *sp,
* Save the color and set a 'clearflag' for each tile of the screen.
*/
void
sp_tile_cache_clear(struct softpipe_tile_cache *tc, uint clearValue)
sp_tile_cache_clear(struct softpipe_tile_cache *tc, const float *rgba,
uint clearValue)
{
uint r, g, b, a;
uint pos;
tc->clear_color[0] = rgba[0];
tc->clear_color[1] = rgba[1];
tc->clear_color[2] = rgba[2];
tc->clear_color[3] = rgba[3];
tc->clear_val = clearValue;
switch (tc->transfer->format) {
case PIPE_FORMAT_R8G8B8A8_UNORM:
case PIPE_FORMAT_R8G8B8X8_UNORM:
r = (clearValue >> 24) & 0xff;
g = (clearValue >> 16) & 0xff;
b = (clearValue >> 8) & 0xff;
a = (clearValue ) & 0xff;
break;
case PIPE_FORMAT_A8R8G8B8_UNORM:
case PIPE_FORMAT_X8R8G8B8_UNORM:
r = (clearValue >> 16) & 0xff;
g = (clearValue >> 8) & 0xff;
b = (clearValue ) & 0xff;
a = (clearValue >> 24) & 0xff;
break;
case PIPE_FORMAT_B8G8R8A8_UNORM:
case PIPE_FORMAT_B8G8R8X8_UNORM:
r = (clearValue >> 8) & 0xff;
g = (clearValue >> 16) & 0xff;
b = (clearValue >> 24) & 0xff;
a = (clearValue ) & 0xff;
break;
default:
r = g = b = a = 0;
}
tc->clear_color[0] = r / 255.0f;
tc->clear_color[1] = g / 255.0f;
tc->clear_color[2] = b / 255.0f;
tc->clear_color[3] = a / 255.0f;
#if TILE_CLEAR_OPTIMIZATION
/* set flags to indicate all the tiles are cleared */
memset(tc->clear_flags, 255, sizeof(tc->clear_flags));
+2 -1
View File
@@ -89,7 +89,8 @@ sp_flush_tile_cache(struct softpipe_context *softpipe,
struct softpipe_tile_cache *tc);
extern void
sp_tile_cache_clear(struct softpipe_tile_cache *tc, uint clearValue);
sp_tile_cache_clear(struct softpipe_tile_cache *tc, const float *rgba,
uint clearValue);
extern struct softpipe_cached_tile *
sp_get_cached_tile(struct softpipe_context *softpipe,