diff options
-rw-r--r-- | src/mesa/pipe/softpipe/sp_tex_sample.c | 26 | ||||
-rw-r--r-- | src/mesa/pipe/tgsi/core/tgsi_exec.h | 5 |
2 files changed, 29 insertions, 2 deletions
diff --git a/src/mesa/pipe/softpipe/sp_tex_sample.c b/src/mesa/pipe/softpipe/sp_tex_sample.c index 1d274d50384..7f8bf0d99c6 100644 --- a/src/mesa/pipe/softpipe/sp_tex_sample.c +++ b/src/mesa/pipe/softpipe/sp_tex_sample.c @@ -471,12 +471,34 @@ sp_get_sample_2d(struct tgsi_sampler *sampler, switch (sampler->state->min_filter) { case PIPE_TEX_FILTER_NEAREST: { - GLint x, y; + GLint x, y, cx, cy; + const GLfloat *src; x = nearest_texcoord(sampler->state->wrap_s, strq[0], sampler->texture->width0); y = nearest_texcoord(sampler->state->wrap_t, strq[1], sampler->texture->height0); - ps->get_tile(ps, x, y, 1, 1, rgba); + + cx = x / SAMPLER_CACHE_SIZE; + cy = y / SAMPLER_CACHE_SIZE; + if (cx != sampler->cache_x || cy != sampler->cache_y) { + /* cache miss, replace cache with new tile */ + sampler->cache_x = cx; + sampler->cache_y = cy; + ps->get_tile(ps, + cx * SAMPLER_CACHE_SIZE, + cy * SAMPLER_CACHE_SIZE, + SAMPLER_CACHE_SIZE, SAMPLER_CACHE_SIZE, + (GLfloat *) sampler->cache); + /*printf("cache miss (%d, %d)\n", x, y);*/ + } + else { + /*printf("cache hit (%d, %d)\n", x, y);*/ + } + + cx = x % SAMPLER_CACHE_SIZE; + cy = y % SAMPLER_CACHE_SIZE; + src = sampler->cache[cy][cx]; + COPY_4V(rgba, src); } break; case PIPE_TEX_FILTER_LINEAR: diff --git a/src/mesa/pipe/tgsi/core/tgsi_exec.h b/src/mesa/pipe/tgsi/core/tgsi_exec.h index 2ad4b965bd3..fb11eec7776 100644 --- a/src/mesa/pipe/tgsi/core/tgsi_exec.h +++ b/src/mesa/pipe/tgsi/core/tgsi_exec.h @@ -21,6 +21,8 @@ struct tgsi_exec_vector union tgsi_exec_channel xyzw[4]; }; +#define SAMPLER_CACHE_SIZE 8 + struct tgsi_sampler { const struct pipe_sampler_state *state; @@ -28,6 +30,9 @@ struct tgsi_sampler void (*get_sample)(struct tgsi_sampler *sampler, const GLfloat strq[4], GLfloat lambda, GLfloat rgba[4]); void *pipe; /*XXX temporary*/ + + GLint cache_x, cache_y; + GLfloat cache[SAMPLER_CACHE_SIZE][SAMPLER_CACHE_SIZE][4]; }; struct tgsi_exec_labels |