llvmpipe: remove backwards dependency from tilecache to llvmpipe

The tile cache is a utility, it shouldn't know anything about the
entity which is making use of it (ie llvmpipe).

Remove llvmpipe parameter to all the tilecache function calls, and
also remove the need to keep a llvmpipe pointer in the sampler structs.
This commit is contained in:
Keith Whitwell
2009-07-16 14:14:32 +01:00
committed by José Fonseca
parent c9a5930fe4
commit 3121484a8b
14 changed files with 62 additions and 65 deletions

View File

@@ -73,8 +73,8 @@ llvmpipe_unmap_transfers(struct llvmpipe_context *lp)
uint i; uint i;
for (i = 0; i < lp->framebuffer.nr_cbufs; i++) for (i = 0; i < lp->framebuffer.nr_cbufs; i++)
lp_flush_tile_cache(lp, lp->cbuf_cache[i]); lp_flush_tile_cache(lp->cbuf_cache[i]);
lp_flush_tile_cache(lp, lp->zsbuf_cache); lp_flush_tile_cache(lp->zsbuf_cache);
for (i = 0; i < lp->framebuffer.nr_cbufs; i++) { for (i = 0; i < lp->framebuffer.nr_cbufs; i++) {
lp_tile_cache_unmap_transfers(lp->cbuf_cache[i]); lp_tile_cache_unmap_transfers(lp->cbuf_cache[i]);
@@ -254,8 +254,6 @@ llvmpipe_create( struct pipe_screen *screen )
/* vertex shader samplers */ /* vertex shader samplers */
for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
llvmpipe->tgsi.vert_samplers[i].base.get_samples = lp_get_samples_vertex; llvmpipe->tgsi.vert_samplers[i].base.get_samples = lp_get_samples_vertex;
llvmpipe->tgsi.vert_samplers[i].unit = i;
llvmpipe->tgsi.vert_samplers[i].lp = llvmpipe;
llvmpipe->tgsi.vert_samplers[i].cache = llvmpipe->tex_cache[i]; llvmpipe->tgsi.vert_samplers[i].cache = llvmpipe->tex_cache[i];
llvmpipe->tgsi.vert_samplers_list[i] = &llvmpipe->tgsi.vert_samplers[i]; llvmpipe->tgsi.vert_samplers_list[i] = &llvmpipe->tgsi.vert_samplers[i];
} }
@@ -263,8 +261,6 @@ llvmpipe_create( struct pipe_screen *screen )
/* fragment shader samplers */ /* fragment shader samplers */
for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
llvmpipe->tgsi.frag_samplers[i].base.get_samples = lp_get_samples_fragment; llvmpipe->tgsi.frag_samplers[i].base.get_samples = lp_get_samples_fragment;
llvmpipe->tgsi.frag_samplers[i].unit = i;
llvmpipe->tgsi.frag_samplers[i].lp = llvmpipe;
llvmpipe->tgsi.frag_samplers[i].cache = llvmpipe->tex_cache[i]; llvmpipe->tgsi.frag_samplers[i].cache = llvmpipe->tex_cache[i];
llvmpipe->tgsi.frag_samplers_list[i] = &llvmpipe->tgsi.frag_samplers[i]; llvmpipe->tgsi.frag_samplers_list[i] = &llvmpipe->tgsi.frag_samplers[i];
} }

View File

@@ -52,17 +52,17 @@ llvmpipe_flush( struct pipe_context *pipe,
if (flags & PIPE_FLUSH_TEXTURE_CACHE) { if (flags & PIPE_FLUSH_TEXTURE_CACHE) {
for (i = 0; i < llvmpipe->num_textures; i++) { for (i = 0; i < llvmpipe->num_textures; i++) {
lp_flush_tile_cache(llvmpipe, llvmpipe->tex_cache[i]); lp_flush_tile_cache(llvmpipe->tex_cache[i]);
} }
} }
if (flags & PIPE_FLUSH_RENDER_CACHE) { if (flags & PIPE_FLUSH_RENDER_CACHE) {
for (i = 0; i < llvmpipe->framebuffer.nr_cbufs; i++) for (i = 0; i < llvmpipe->framebuffer.nr_cbufs; i++)
if (llvmpipe->cbuf_cache[i]) if (llvmpipe->cbuf_cache[i])
lp_flush_tile_cache(llvmpipe, llvmpipe->cbuf_cache[i]); lp_flush_tile_cache(llvmpipe->cbuf_cache[i]);
if (llvmpipe->zsbuf_cache) if (llvmpipe->zsbuf_cache)
lp_flush_tile_cache(llvmpipe, llvmpipe->zsbuf_cache); lp_flush_tile_cache(llvmpipe->zsbuf_cache);
/* Need this call for hardware buffers before swapbuffers. /* Need this call for hardware buffers before swapbuffers.
* *

View File

@@ -130,8 +130,7 @@ logicop_quad(struct quad_stage *qs, struct quad_header *quad)
uint *dst4 = (uint *) dst; uint *dst4 = (uint *) dst;
uint *res4 = (uint *) res; uint *res4 = (uint *) res;
struct llvmpipe_cached_tile * struct llvmpipe_cached_tile *
tile = lp_get_cached_tile(llvmpipe, tile = lp_get_cached_tile(llvmpipe->cbuf_cache[cbuf],
llvmpipe->cbuf_cache[cbuf],
quad->input.x0, quad->input.y0); quad->input.x0, quad->input.y0);
float (*quadColor)[4] = quad->output.color[cbuf]; float (*quadColor)[4] = quad->output.color[cbuf];
uint i, j; uint i, j;
@@ -260,8 +259,7 @@ blend_quad(struct quad_stage *qs, struct quad_header *quad)
for (cbuf = 0; cbuf < llvmpipe->framebuffer.nr_cbufs; cbuf++) { for (cbuf = 0; cbuf < llvmpipe->framebuffer.nr_cbufs; cbuf++) {
float source[4][QUAD_SIZE], dest[4][QUAD_SIZE]; float source[4][QUAD_SIZE], dest[4][QUAD_SIZE];
struct llvmpipe_cached_tile *tile struct llvmpipe_cached_tile *tile
= lp_get_cached_tile(llvmpipe, = lp_get_cached_tile(llvmpipe->cbuf_cache[cbuf],
llvmpipe->cbuf_cache[cbuf],
quad->input.x0, quad->input.y0); quad->input.x0, quad->input.y0);
float (*quadColor)[4] = quad->output.color[cbuf]; float (*quadColor)[4] = quad->output.color[cbuf];
uint i, j; uint i, j;

View File

@@ -54,8 +54,7 @@ colormask_quad(struct quad_stage *qs, struct quad_header *quad)
for (cbuf = 0; cbuf < llvmpipe->framebuffer.nr_cbufs; cbuf++) { for (cbuf = 0; cbuf < llvmpipe->framebuffer.nr_cbufs; cbuf++) {
float dest[4][QUAD_SIZE]; float dest[4][QUAD_SIZE];
struct llvmpipe_cached_tile *tile struct llvmpipe_cached_tile *tile
= lp_get_cached_tile(llvmpipe, = lp_get_cached_tile(llvmpipe->cbuf_cache[cbuf],
llvmpipe->cbuf_cache[cbuf],
quad->input.x0, quad->input.y0); quad->input.x0, quad->input.y0);
float (*quadColor)[4] = quad->output.color[cbuf]; float (*quadColor)[4] = quad->output.color[cbuf];
uint i, j; uint i, j;

View File

@@ -60,7 +60,7 @@ lp_depth_test_quad(struct quad_stage *qs, struct quad_header *quad)
unsigned zmask = 0; unsigned zmask = 0;
unsigned j; unsigned j;
struct llvmpipe_cached_tile *tile struct llvmpipe_cached_tile *tile
= lp_get_cached_tile(llvmpipe, llvmpipe->zsbuf_cache, quad->input.x0, quad->input.y0); = lp_get_cached_tile(llvmpipe->zsbuf_cache, quad->input.x0, quad->input.y0);
assert(ps); /* shouldn't get here if there's no zbuffer */ assert(ps); /* shouldn't get here if there's no zbuffer */

View File

@@ -50,8 +50,7 @@ output_quad(struct quad_stage *qs, struct quad_header *quad)
/* loop over colorbuffer outputs */ /* loop over colorbuffer outputs */
for (cbuf = 0; cbuf < llvmpipe->framebuffer.nr_cbufs; cbuf++) { for (cbuf = 0; cbuf < llvmpipe->framebuffer.nr_cbufs; cbuf++) {
struct llvmpipe_cached_tile *tile struct llvmpipe_cached_tile *tile
= lp_get_cached_tile(llvmpipe, = lp_get_cached_tile(llvmpipe->cbuf_cache[cbuf],
llvmpipe->cbuf_cache[cbuf],
quad->input.x0, quad->input.y0); quad->input.x0, quad->input.y0);
float (*quadColor)[4] = quad->output.color[cbuf]; float (*quadColor)[4] = quad->output.color[cbuf];
int i, j; int i, j;

View File

@@ -206,7 +206,7 @@ stencil_test_quad(struct quad_stage *qs, struct quad_header *quad)
ubyte ref, wrtMask, valMask; ubyte ref, wrtMask, valMask;
ubyte stencilVals[QUAD_SIZE]; ubyte stencilVals[QUAD_SIZE];
struct llvmpipe_cached_tile *tile struct llvmpipe_cached_tile *tile
= lp_get_cached_tile(llvmpipe, llvmpipe->zsbuf_cache, quad->input.x0, quad->input.y0); = lp_get_cached_tile(llvmpipe->zsbuf_cache, quad->input.x0, quad->input.y0);
uint j; uint j;
uint face = quad->input.facing; uint face = quad->input.facing;

View File

@@ -184,11 +184,33 @@ compute_cliprect(struct llvmpipe_context *lp)
} }
static void
update_tgsi_samplers( struct llvmpipe_context *llvmpipe )
{
unsigned i;
/* vertex shader samplers */
for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
llvmpipe->tgsi.vert_samplers[i].sampler = llvmpipe->sampler[i];
llvmpipe->tgsi.vert_samplers[i].texture = llvmpipe->texture[i];
}
/* fragment shader samplers */
for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
llvmpipe->tgsi.frag_samplers[i].sampler = llvmpipe->sampler[i];
llvmpipe->tgsi.frag_samplers[i].texture = llvmpipe->texture[i];
}
}
/* Hopefully this will remain quite simple, otherwise need to pull in /* Hopefully this will remain quite simple, otherwise need to pull in
* something like the state tracker mechanism. * something like the state tracker mechanism.
*/ */
void llvmpipe_update_derived( struct llvmpipe_context *llvmpipe ) void llvmpipe_update_derived( struct llvmpipe_context *llvmpipe )
{ {
if (llvmpipe->dirty & (LP_NEW_SAMPLER |
LP_NEW_TEXTURE))
update_tgsi_samplers( llvmpipe );
if (llvmpipe->dirty & (LP_NEW_RASTERIZER | if (llvmpipe->dirty & (LP_NEW_RASTERIZER |
LP_NEW_FS | LP_NEW_FS |
LP_NEW_VS)) LP_NEW_VS))

View File

@@ -97,7 +97,7 @@ llvmpipe_set_sampler_textures(struct pipe_context *pipe,
struct pipe_texture *tex = i < num ? texture[i] : NULL; struct pipe_texture *tex = i < num ? texture[i] : NULL;
pipe_texture_reference(&llvmpipe->texture[i], tex); pipe_texture_reference(&llvmpipe->texture[i], tex);
lp_tile_cache_set_texture(pipe, llvmpipe->tex_cache[i], tex); lp_tile_cache_set_texture(llvmpipe->tex_cache[i], tex);
} }
llvmpipe->num_textures = num; llvmpipe->num_textures = num;

View File

@@ -53,7 +53,7 @@ llvmpipe_set_framebuffer_state(struct pipe_context *pipe,
/* check if changing cbuf */ /* check if changing cbuf */
if (lp->framebuffer.cbufs[i] != fb->cbufs[i]) { if (lp->framebuffer.cbufs[i] != fb->cbufs[i]) {
/* flush old */ /* flush old */
lp_flush_tile_cache(lp, lp->cbuf_cache[i]); lp_flush_tile_cache(lp->cbuf_cache[i]);
/* assign new */ /* assign new */
lp->framebuffer.cbufs[i] = fb->cbufs[i]; lp->framebuffer.cbufs[i] = fb->cbufs[i];
@@ -68,7 +68,7 @@ llvmpipe_set_framebuffer_state(struct pipe_context *pipe,
/* zbuf changing? */ /* zbuf changing? */
if (lp->framebuffer.zsbuf != fb->zsbuf) { if (lp->framebuffer.zsbuf != fb->zsbuf) {
/* flush old */ /* flush old */
lp_flush_tile_cache(lp, lp->zsbuf_cache); lp_flush_tile_cache(lp->zsbuf_cache);
/* assign new */ /* assign new */
lp->framebuffer.zsbuf = fb->zsbuf; lp->framebuffer.zsbuf = fb->zsbuf;

View File

@@ -668,10 +668,8 @@ get_texel(const struct tgsi_sampler *tgsi_sampler,
float rgba[NUM_CHANNELS][QUAD_SIZE], unsigned j) float rgba[NUM_CHANNELS][QUAD_SIZE], unsigned j)
{ {
const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler); const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler);
struct llvmpipe_context *lp = samp->lp; const struct pipe_texture *texture = samp->texture;
const uint unit = samp->unit; const struct pipe_sampler_state *sampler = samp->sampler;
const struct pipe_texture *texture = lp->texture[unit];
const struct pipe_sampler_state *sampler = lp->sampler[unit];
if (x < 0 || x >= (int) texture->width[level] || if (x < 0 || x >= (int) texture->width[level] ||
y < 0 || y >= (int) texture->height[level] || y < 0 || y >= (int) texture->height[level] ||
@@ -685,7 +683,7 @@ get_texel(const struct tgsi_sampler *tgsi_sampler,
const int tx = x % TILE_SIZE; const int tx = x % TILE_SIZE;
const int ty = y % TILE_SIZE; const int ty = y % TILE_SIZE;
const struct llvmpipe_cached_tile *tile const struct llvmpipe_cached_tile *tile
= lp_get_cached_tile_tex(lp, samp->cache, = lp_get_cached_tile_tex(samp->cache,
x, y, z, face, level); x, y, z, face, level);
rgba[0][j] = tile->data.color[ty][tx][0]; rgba[0][j] = tile->data.color[ty][tx][0];
rgba[1][j] = tile->data.color[ty][tx][1]; rgba[1][j] = tile->data.color[ty][tx][1];
@@ -840,10 +838,8 @@ lp_get_samples_2d_common(const struct tgsi_sampler *tgsi_sampler,
const unsigned faces[4]) const unsigned faces[4])
{ {
const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler); const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler);
const struct llvmpipe_context *lp = samp->lp; const struct pipe_texture *texture = samp->texture;
const uint unit = samp->unit; const struct pipe_sampler_state *sampler = samp->sampler;
const struct pipe_texture *texture = lp->texture[unit];
const struct pipe_sampler_state *sampler = lp->sampler[unit];
unsigned level0, level1, j, imgFilter; unsigned level0, level1, j, imgFilter;
int width, height; int width, height;
float levelBlend; float levelBlend;
@@ -992,10 +988,8 @@ lp_get_samples_3d(const struct tgsi_sampler *tgsi_sampler,
float rgba[NUM_CHANNELS][QUAD_SIZE]) float rgba[NUM_CHANNELS][QUAD_SIZE])
{ {
const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler); const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler);
const struct llvmpipe_context *lp = samp->lp; const struct pipe_texture *texture = samp->texture;
const uint unit = samp->unit; const struct pipe_sampler_state *sampler = samp->sampler;
const struct pipe_texture *texture = lp->texture[unit];
const struct pipe_sampler_state *sampler = lp->sampler[unit];
/* get/map pipe_surfaces corresponding to 3D tex slices */ /* get/map pipe_surfaces corresponding to 3D tex slices */
unsigned level0, level1, j, imgFilter; unsigned level0, level1, j, imgFilter;
int width, height, depth; int width, height, depth;
@@ -1139,10 +1133,8 @@ lp_get_samples_rect(const struct tgsi_sampler *tgsi_sampler,
float rgba[NUM_CHANNELS][QUAD_SIZE]) float rgba[NUM_CHANNELS][QUAD_SIZE])
{ {
const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler); const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler);
const struct llvmpipe_context *lp = samp->lp; const struct pipe_texture *texture = samp->texture;
const uint unit = samp->unit; const struct pipe_sampler_state *sampler = samp->sampler;
const struct pipe_texture *texture = lp->texture[unit];
const struct pipe_sampler_state *sampler = lp->sampler[unit];
const uint face = 0; const uint face = 0;
unsigned level0, level1, j, imgFilter; unsigned level0, level1, j, imgFilter;
int width, height; int width, height;
@@ -1216,10 +1208,8 @@ lp_get_samples(struct tgsi_sampler *tgsi_sampler,
float rgba[NUM_CHANNELS][QUAD_SIZE]) float rgba[NUM_CHANNELS][QUAD_SIZE])
{ {
const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler); const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler);
const struct llvmpipe_context *lp = samp->lp; const struct pipe_texture *texture = samp->texture;
const uint unit = samp->unit; const struct pipe_sampler_state *sampler = samp->sampler;
const struct pipe_texture *texture = lp->texture[unit];
const struct pipe_sampler_state *sampler = lp->sampler[unit];
if (!texture) if (!texture)
return; return;

View File

@@ -39,8 +39,9 @@ struct lp_shader_sampler
{ {
struct tgsi_sampler base; /**< base class */ struct tgsi_sampler base; /**< base class */
uint unit; const struct pipe_texture *texture;
struct llvmpipe_context *lp; const struct pipe_sampler_state *sampler;
struct llvmpipe_tile_cache *cache; struct llvmpipe_tile_cache *cache;
}; };

View File

@@ -236,8 +236,7 @@ lp_tile_cache_unmap_transfers(struct llvmpipe_tile_cache *tc)
* Specify the texture to cache. * Specify the texture to cache.
*/ */
void void
lp_tile_cache_set_texture(struct pipe_context *pipe, lp_tile_cache_set_texture(struct llvmpipe_tile_cache *tc,
struct llvmpipe_tile_cache *tc,
struct pipe_texture *texture) struct pipe_texture *texture)
{ {
uint i; uint i;
@@ -344,8 +343,7 @@ clear_tile(struct llvmpipe_cached_tile *tile,
* Actually clear the tiles which were flagged as being in a clear state. * Actually clear the tiles which were flagged as being in a clear state.
*/ */
static void static void
lp_tile_cache_flush_clear(struct pipe_context *pipe, lp_tile_cache_flush_clear(struct llvmpipe_tile_cache *tc)
struct llvmpipe_tile_cache *tc)
{ {
struct pipe_transfer *pt = tc->transfer; struct pipe_transfer *pt = tc->transfer;
const uint w = tc->transfer->width; const uint w = tc->transfer->width;
@@ -382,8 +380,7 @@ lp_tile_cache_flush_clear(struct pipe_context *pipe,
* any tiles "flagged" as cleared will be "really" cleared. * any tiles "flagged" as cleared will be "really" cleared.
*/ */
void void
lp_flush_tile_cache(struct llvmpipe_context *llvmpipe, lp_flush_tile_cache(struct llvmpipe_tile_cache *tc)
struct llvmpipe_tile_cache *tc)
{ {
struct pipe_transfer *pt = tc->transfer; struct pipe_transfer *pt = tc->transfer;
int inuse = 0, pos; int inuse = 0, pos;
@@ -409,7 +406,7 @@ lp_flush_tile_cache(struct llvmpipe_context *llvmpipe,
} }
#if TILE_CLEAR_OPTIMIZATION #if TILE_CLEAR_OPTIMIZATION
lp_tile_cache_flush_clear(&llvmpipe->pipe, tc); lp_tile_cache_flush_clear(tc);
#endif #endif
} }
else if (tc->texture) { else if (tc->texture) {
@@ -431,8 +428,7 @@ lp_flush_tile_cache(struct llvmpipe_context *llvmpipe,
* \param x, y position of tile, in pixels * \param x, y position of tile, in pixels
*/ */
struct llvmpipe_cached_tile * struct llvmpipe_cached_tile *
lp_get_cached_tile(struct llvmpipe_context *llvmpipe, lp_get_cached_tile(struct llvmpipe_tile_cache *tc, int x, int y)
struct llvmpipe_tile_cache *tc, int x, int y)
{ {
struct pipe_transfer *pt = tc->transfer; struct pipe_transfer *pt = tc->transfer;
@@ -513,11 +509,11 @@ tex_cache_pos(int x, int y, int z, int face, int level)
* Tiles are read-only and indexed with more params. * Tiles are read-only and indexed with more params.
*/ */
const struct llvmpipe_cached_tile * const struct llvmpipe_cached_tile *
lp_get_cached_tile_tex(struct llvmpipe_context *lp, lp_get_cached_tile_tex(struct llvmpipe_tile_cache *tc,
struct llvmpipe_tile_cache *tc, int x, int y, int z, int x, int y, int z,
int face, int level) int face, int level)
{ {
struct pipe_screen *screen = lp->pipe.screen; struct pipe_screen *screen = tc->screen;
/* tile pos in framebuffer: */ /* tile pos in framebuffer: */
const int tile_x = x & ~(TILE_SIZE - 1); const int tile_x = x & ~(TILE_SIZE - 1);
const int tile_y = y & ~(TILE_SIZE - 1); const int tile_y = y & ~(TILE_SIZE - 1);

View File

@@ -80,25 +80,21 @@ extern void
lp_tile_cache_unmap_transfers(struct llvmpipe_tile_cache *tc); lp_tile_cache_unmap_transfers(struct llvmpipe_tile_cache *tc);
extern void extern void
lp_tile_cache_set_texture(struct pipe_context *pipe, lp_tile_cache_set_texture(struct llvmpipe_tile_cache *tc,
struct llvmpipe_tile_cache *tc,
struct pipe_texture *texture); struct pipe_texture *texture);
extern void extern void
lp_flush_tile_cache(struct llvmpipe_context *llvmpipe, lp_flush_tile_cache(struct llvmpipe_tile_cache *tc);
struct llvmpipe_tile_cache *tc);
extern void extern void
lp_tile_cache_clear(struct llvmpipe_tile_cache *tc, const float *rgba, lp_tile_cache_clear(struct llvmpipe_tile_cache *tc, const float *rgba,
uint clearValue); uint clearValue);
extern struct llvmpipe_cached_tile * extern struct llvmpipe_cached_tile *
lp_get_cached_tile(struct llvmpipe_context *llvmpipe, lp_get_cached_tile(struct llvmpipe_tile_cache *tc, int x, int y);
struct llvmpipe_tile_cache *tc, int x, int y);
extern const struct llvmpipe_cached_tile * extern const struct llvmpipe_cached_tile *
lp_get_cached_tile_tex(struct llvmpipe_context *llvmpipe, lp_get_cached_tile_tex(struct llvmpipe_tile_cache *tc, int x, int y, int z,
struct llvmpipe_tile_cache *tc, int x, int y, int z,
int face, int level); int face, int level);