uint i;
for (i = 0; i < lp->framebuffer.nr_cbufs; i++)
- lp_flush_tile_cache(lp, lp->cbuf_cache[i]);
- lp_flush_tile_cache(lp, lp->zsbuf_cache);
+ lp_flush_tile_cache(lp->cbuf_cache[i]);
+ lp_flush_tile_cache(lp->zsbuf_cache);
for (i = 0; i < lp->framebuffer.nr_cbufs; i++) {
lp_tile_cache_unmap_transfers(lp->cbuf_cache[i]);
/* vertex shader samplers */
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].unit = i;
- llvmpipe->tgsi.vert_samplers[i].lp = llvmpipe;
llvmpipe->tgsi.vert_samplers[i].cache = llvmpipe->tex_cache[i];
llvmpipe->tgsi.vert_samplers_list[i] = &llvmpipe->tgsi.vert_samplers[i];
}
/* fragment shader samplers */
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].unit = i;
- llvmpipe->tgsi.frag_samplers[i].lp = llvmpipe;
llvmpipe->tgsi.frag_samplers[i].cache = llvmpipe->tex_cache[i];
llvmpipe->tgsi.frag_samplers_list[i] = &llvmpipe->tgsi.frag_samplers[i];
}
if (flags & PIPE_FLUSH_TEXTURE_CACHE) {
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) {
for (i = 0; i < llvmpipe->framebuffer.nr_cbufs; 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)
- lp_flush_tile_cache(llvmpipe, llvmpipe->zsbuf_cache);
+ lp_flush_tile_cache(llvmpipe->zsbuf_cache);
/* Need this call for hardware buffers before swapbuffers.
*
uint *dst4 = (uint *) dst;
uint *res4 = (uint *) res;
struct llvmpipe_cached_tile *
- tile = lp_get_cached_tile(llvmpipe,
- llvmpipe->cbuf_cache[cbuf],
+ tile = lp_get_cached_tile(llvmpipe->cbuf_cache[cbuf],
quad->input.x0, quad->input.y0);
float (*quadColor)[4] = quad->output.color[cbuf];
uint i, j;
for (cbuf = 0; cbuf < llvmpipe->framebuffer.nr_cbufs; cbuf++) {
float source[4][QUAD_SIZE], dest[4][QUAD_SIZE];
struct llvmpipe_cached_tile *tile
- = lp_get_cached_tile(llvmpipe,
- llvmpipe->cbuf_cache[cbuf],
+ = lp_get_cached_tile(llvmpipe->cbuf_cache[cbuf],
quad->input.x0, quad->input.y0);
float (*quadColor)[4] = quad->output.color[cbuf];
uint i, j;
for (cbuf = 0; cbuf < llvmpipe->framebuffer.nr_cbufs; cbuf++) {
float dest[4][QUAD_SIZE];
struct llvmpipe_cached_tile *tile
- = lp_get_cached_tile(llvmpipe,
- llvmpipe->cbuf_cache[cbuf],
+ = lp_get_cached_tile(llvmpipe->cbuf_cache[cbuf],
quad->input.x0, quad->input.y0);
float (*quadColor)[4] = quad->output.color[cbuf];
uint i, j;
unsigned zmask = 0;
unsigned j;
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 */
/* loop over colorbuffer outputs */
for (cbuf = 0; cbuf < llvmpipe->framebuffer.nr_cbufs; cbuf++) {
struct llvmpipe_cached_tile *tile
- = lp_get_cached_tile(llvmpipe,
- llvmpipe->cbuf_cache[cbuf],
+ = lp_get_cached_tile(llvmpipe->cbuf_cache[cbuf],
quad->input.x0, quad->input.y0);
float (*quadColor)[4] = quad->output.color[cbuf];
int i, j;
ubyte ref, wrtMask, valMask;
ubyte stencilVals[QUAD_SIZE];
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 face = quad->input.facing;
}
+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
* something like the state tracker mechanism.
*/
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 |
LP_NEW_FS |
LP_NEW_VS))
struct pipe_texture *tex = i < num ? texture[i] : NULL;
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;
/* check if changing cbuf */
if (lp->framebuffer.cbufs[i] != fb->cbufs[i]) {
/* flush old */
- lp_flush_tile_cache(lp, lp->cbuf_cache[i]);
+ lp_flush_tile_cache(lp->cbuf_cache[i]);
/* assign new */
lp->framebuffer.cbufs[i] = fb->cbufs[i];
/* zbuf changing? */
if (lp->framebuffer.zsbuf != fb->zsbuf) {
/* flush old */
- lp_flush_tile_cache(lp, lp->zsbuf_cache);
+ lp_flush_tile_cache(lp->zsbuf_cache);
/* assign new */
lp->framebuffer.zsbuf = fb->zsbuf;
float rgba[NUM_CHANNELS][QUAD_SIZE], unsigned j)
{
const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler);
- struct llvmpipe_context *lp = samp->lp;
- const uint unit = samp->unit;
- const struct pipe_texture *texture = lp->texture[unit];
- const struct pipe_sampler_state *sampler = lp->sampler[unit];
+ const struct pipe_texture *texture = samp->texture;
+ const struct pipe_sampler_state *sampler = samp->sampler;
if (x < 0 || x >= (int) texture->width[level] ||
y < 0 || y >= (int) texture->height[level] ||
const int tx = x % TILE_SIZE;
const int ty = y % TILE_SIZE;
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);
rgba[0][j] = tile->data.color[ty][tx][0];
rgba[1][j] = tile->data.color[ty][tx][1];
const unsigned faces[4])
{
const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler);
- const struct llvmpipe_context *lp = samp->lp;
- const uint unit = samp->unit;
- const struct pipe_texture *texture = lp->texture[unit];
- const struct pipe_sampler_state *sampler = lp->sampler[unit];
+ const struct pipe_texture *texture = samp->texture;
+ const struct pipe_sampler_state *sampler = samp->sampler;
unsigned level0, level1, j, imgFilter;
int width, height;
float levelBlend;
float rgba[NUM_CHANNELS][QUAD_SIZE])
{
const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler);
- const struct llvmpipe_context *lp = samp->lp;
- const uint unit = samp->unit;
- const struct pipe_texture *texture = lp->texture[unit];
- const struct pipe_sampler_state *sampler = lp->sampler[unit];
+ const struct pipe_texture *texture = samp->texture;
+ const struct pipe_sampler_state *sampler = samp->sampler;
/* get/map pipe_surfaces corresponding to 3D tex slices */
unsigned level0, level1, j, imgFilter;
int width, height, depth;
float rgba[NUM_CHANNELS][QUAD_SIZE])
{
const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler);
- const struct llvmpipe_context *lp = samp->lp;
- const uint unit = samp->unit;
- const struct pipe_texture *texture = lp->texture[unit];
- const struct pipe_sampler_state *sampler = lp->sampler[unit];
+ const struct pipe_texture *texture = samp->texture;
+ const struct pipe_sampler_state *sampler = samp->sampler;
const uint face = 0;
unsigned level0, level1, j, imgFilter;
int width, height;
float rgba[NUM_CHANNELS][QUAD_SIZE])
{
const struct lp_shader_sampler *samp = lp_shader_sampler(tgsi_sampler);
- const struct llvmpipe_context *lp = samp->lp;
- const uint unit = samp->unit;
- const struct pipe_texture *texture = lp->texture[unit];
- const struct pipe_sampler_state *sampler = lp->sampler[unit];
+ const struct pipe_texture *texture = samp->texture;
+ const struct pipe_sampler_state *sampler = samp->sampler;
if (!texture)
return;
{
struct tgsi_sampler base; /**< base class */
- uint unit;
- struct llvmpipe_context *lp;
+ const struct pipe_texture *texture;
+ const struct pipe_sampler_state *sampler;
+
struct llvmpipe_tile_cache *cache;
};
* Specify the texture to cache.
*/
void
-lp_tile_cache_set_texture(struct pipe_context *pipe,
- struct llvmpipe_tile_cache *tc,
+lp_tile_cache_set_texture(struct llvmpipe_tile_cache *tc,
struct pipe_texture *texture)
{
uint i;
* Actually clear the tiles which were flagged as being in a clear state.
*/
static void
-lp_tile_cache_flush_clear(struct pipe_context *pipe,
- struct llvmpipe_tile_cache *tc)
+lp_tile_cache_flush_clear(struct llvmpipe_tile_cache *tc)
{
struct pipe_transfer *pt = tc->transfer;
const uint w = tc->transfer->width;
* any tiles "flagged" as cleared will be "really" cleared.
*/
void
-lp_flush_tile_cache(struct llvmpipe_context *llvmpipe,
- struct llvmpipe_tile_cache *tc)
+lp_flush_tile_cache(struct llvmpipe_tile_cache *tc)
{
struct pipe_transfer *pt = tc->transfer;
int inuse = 0, pos;
}
#if TILE_CLEAR_OPTIMIZATION
- lp_tile_cache_flush_clear(&llvmpipe->pipe, tc);
+ lp_tile_cache_flush_clear(tc);
#endif
}
else if (tc->texture) {
* \param x, y position of tile, in pixels
*/
struct llvmpipe_cached_tile *
-lp_get_cached_tile(struct llvmpipe_context *llvmpipe,
- struct llvmpipe_tile_cache *tc, int x, int y)
+lp_get_cached_tile(struct llvmpipe_tile_cache *tc, int x, int y)
{
struct pipe_transfer *pt = tc->transfer;
* Tiles are read-only and indexed with more params.
*/
const struct llvmpipe_cached_tile *
-lp_get_cached_tile_tex(struct llvmpipe_context *lp,
- struct llvmpipe_tile_cache *tc, int x, int y, int z,
+lp_get_cached_tile_tex(struct llvmpipe_tile_cache *tc,
+ int x, int y, int z,
int face, int level)
{
- struct pipe_screen *screen = lp->pipe.screen;
+ struct pipe_screen *screen = tc->screen;
/* tile pos in framebuffer: */
const int tile_x = x & ~(TILE_SIZE - 1);
const int tile_y = y & ~(TILE_SIZE - 1);
lp_tile_cache_unmap_transfers(struct llvmpipe_tile_cache *tc);
extern void
-lp_tile_cache_set_texture(struct pipe_context *pipe,
- struct llvmpipe_tile_cache *tc,
+lp_tile_cache_set_texture(struct llvmpipe_tile_cache *tc,
struct pipe_texture *texture);
extern void
-lp_flush_tile_cache(struct llvmpipe_context *llvmpipe,
- struct llvmpipe_tile_cache *tc);
+lp_flush_tile_cache(struct llvmpipe_tile_cache *tc);
extern void
lp_tile_cache_clear(struct llvmpipe_tile_cache *tc, const float *rgba,
uint clearValue);
extern struct llvmpipe_cached_tile *
-lp_get_cached_tile(struct llvmpipe_context *llvmpipe,
- struct llvmpipe_tile_cache *tc, int x, int y);
+lp_get_cached_tile(struct llvmpipe_tile_cache *tc, int x, int y);
extern const struct llvmpipe_cached_tile *
-lp_get_cached_tile_tex(struct llvmpipe_context *llvmpipe,
- struct llvmpipe_tile_cache *tc, int x, int y, int z,
+lp_get_cached_tile_tex(struct llvmpipe_tile_cache *tc, int x, int y, int z,
int face, int level);