summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/cell/spu/spu_command.c50
-rw-r--r--src/gallium/drivers/cell/spu/spu_main.h2
-rw-r--r--src/gallium/drivers/cell/spu/spu_texture.c22
3 files changed, 53 insertions, 21 deletions
diff --git a/src/gallium/drivers/cell/spu/spu_command.c b/src/gallium/drivers/cell/spu/spu_command.c
index 4e98eea3389..fa78377c663 100644
--- a/src/gallium/drivers/cell/spu/spu_command.c
+++ b/src/gallium/drivers/cell/spu/spu_command.c
@@ -298,22 +298,48 @@ cmd_state_framebuffer(const struct cell_command_framebuffer *cmd)
static void
cmd_state_sampler(const struct cell_command_sampler *sampler)
{
- DEBUG_PRINTF("SAMPLER [%u]\n", sampler->unit);
+ uint unit = sampler->unit;
- spu.sampler[sampler->unit] = sampler->state;
+ DEBUG_PRINTF("SAMPLER [%u]\n", unit);
- if (spu.sampler[sampler->unit].min_mip_filter != PIPE_TEX_MIPFILTER_NONE) {
- /* use lambda/lod to determine min vs. mag filter */
- spu.sample_texture4[sampler->unit] = sample_texture4_lod;
+ spu.sampler[unit] = sampler->state;
+
+ switch (spu.sampler[unit].min_img_filter) {
+ case PIPE_TEX_FILTER_LINEAR:
+ spu.min_sample_texture4[unit] = sample_texture4_bilinear;
+ break;
+ case PIPE_TEX_FILTER_ANISO:
+ /* fall-through, for now */
+ case PIPE_TEX_FILTER_NEAREST:
+ spu.min_sample_texture4[unit] = sample_texture4_nearest;
+ break;
+ default:
+ ASSERT(0);
}
- else if (spu.sampler[sampler->unit].min_img_filter
- == PIPE_TEX_FILTER_LINEAR) {
- /* min = mag = bilinear */
- spu.sample_texture4[sampler->unit] = sample_texture4_bilinear;
+
+ switch (spu.sampler[sampler->unit].mag_img_filter) {
+ case PIPE_TEX_FILTER_LINEAR:
+ spu.mag_sample_texture4[unit] = sample_texture4_bilinear;
+ break;
+ case PIPE_TEX_FILTER_ANISO:
+ /* fall-through, for now */
+ case PIPE_TEX_FILTER_NEAREST:
+ spu.mag_sample_texture4[unit] = sample_texture4_nearest;
+ break;
+ default:
+ ASSERT(0);
}
- else {
- /* min = mag = inearest */
- spu.sample_texture4[sampler->unit] = sample_texture4_nearest;
+
+ switch (spu.sampler[sampler->unit].min_mip_filter) {
+ case PIPE_TEX_MIPFILTER_NEAREST:
+ case PIPE_TEX_MIPFILTER_LINEAR:
+ spu.sample_texture4[unit] = sample_texture4_lod;
+ break;
+ case PIPE_TEX_MIPFILTER_NONE:
+ spu.sample_texture4[unit] = spu.mag_sample_texture4[unit];
+ break;
+ default:
+ ASSERT(0);
}
}
diff --git a/src/gallium/drivers/cell/spu/spu_main.h b/src/gallium/drivers/cell/spu/spu_main.h
index cfb645add02..56aac655e90 100644
--- a/src/gallium/drivers/cell/spu/spu_main.h
+++ b/src/gallium/drivers/cell/spu/spu_main.h
@@ -170,6 +170,8 @@ struct spu_global
/** Current texture sampler function */
spu_sample_texture4_func sample_texture4[CELL_MAX_SAMPLERS];
+ spu_sample_texture4_func min_sample_texture4[CELL_MAX_SAMPLERS];
+ spu_sample_texture4_func mag_sample_texture4[CELL_MAX_SAMPLERS];
/** Fragment program constants */
vector float constants[4 * CELL_MAX_CONSTANTS];
diff --git a/src/gallium/drivers/cell/spu/spu_texture.c b/src/gallium/drivers/cell/spu/spu_texture.c
index 10036330c6c..267f2302f60 100644
--- a/src/gallium/drivers/cell/spu/spu_texture.c
+++ b/src/gallium/drivers/cell/spu/spu_texture.c
@@ -400,7 +400,7 @@ compute_lambda(uint unit, vector float s, vector float t)
void
sample_texture4_lod(vector float s, vector float t,
vector float r, vector float q,
- uint unit, uint level, vector float colors[4])
+ uint unit, uint level_ignored, vector float colors[4])
{
/*
* Note that we're computing a lambda/lod here that's used for all
@@ -417,13 +417,17 @@ sample_texture4_lod(vector float s, vector float t,
else if (lambda > spu.sampler[unit].max_lod)
lambda = spu.sampler[unit].max_lod;
- /* convert to int level */
- level = (int) (lambda + 0.5f);
- ASSERT(level >= 0);
-
- if (level > spu.texture[unit].max_level)
- level = spu.texture[unit].max_level;
-
- sample_texture4_bilinear_2(s, t, r, q, unit, level, colors);
+ if (lambda <= 0.0f) {
+ /* magnify */
+ spu.mag_sample_texture4[unit](s, t, r, q, unit, 0, colors);
+ }
+ else {
+ /* minify */
+ int level = (int) (lambda + 0.5f);
+ if (level > (int) spu.texture[unit].max_level)
+ level = spu.texture[unit].max_level;
+ spu.min_sample_texture4[unit](s, t, r, q, unit, level, colors);
+ /* XXX to do: mipmap level interpolation */
+ }
}