summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Scheidegger <[email protected]>2013-03-05 17:24:32 +0100
committerRoland Scheidegger <[email protected]>2013-03-05 20:10:37 +0100
commitb9eb573600ff6d654bbc27d1fc5e935e5a74b071 (patch)
treef367f73a61354076ca5617cd938fb2d2d790f08c
parentbe6d18ba5e90422fc794ef644eb235e138604d12 (diff)
tgsi: handle projection modifier for array textures.
This partly reverts 6ace2e41da7dded630d932d03bacb7e14a93d47a. Apparently with GL_MESA_texture_array fixed-function texturing with texture arrays is possible, and hence we have to handle TXP. (Though noone seems to know the semantics, softpipe now does what it did before, which is to NOT project the array coord, llvmpipe for instance however indeed does project the array coord. Unlike before it will project the comparison coord for shadow1d array, as that clearly was an error.) This fixes https://bugs.freedesktop.org/show_bug.cgi?id=61828. Reviewed-by: Brian Paul <[email protected]>
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_exec.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
index da5594b6259..6a74ef30adb 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
@@ -1908,7 +1908,9 @@ exec_tex(struct tgsi_exec_machine *mach,
FETCH(&r[0], 0, TGSI_CHAN_X);
FETCH(&r[1], 0, TGSI_CHAN_Y);
- assert(modifier != TEX_MODIFIER_PROJECTED);
+ if (modifier == TEX_MODIFIER_PROJECTED) {
+ micro_div(&r[0], &r[0], &r[3]);
+ }
fetch_texel(mach->Sampler, unit, unit,
&r[0], &r[1], &ZeroVec, &ZeroVec, lod, /* S, T, P, C, LOD */
@@ -1920,7 +1922,10 @@ exec_tex(struct tgsi_exec_machine *mach,
FETCH(&r[1], 0, TGSI_CHAN_Y);
FETCH(&r[2], 0, TGSI_CHAN_Z);
- assert(modifier != TEX_MODIFIER_PROJECTED);
+ if (modifier == TEX_MODIFIER_PROJECTED) {
+ micro_div(&r[0], &r[0], &r[3]);
+ micro_div(&r[2], &r[2], &r[3]);
+ }
fetch_texel(mach->Sampler, unit, unit,
&r[0], &r[1], &r[2], &ZeroVec, lod, /* S, T, P, C, LOD */
@@ -1933,7 +1938,10 @@ exec_tex(struct tgsi_exec_machine *mach,
FETCH(&r[1], 0, TGSI_CHAN_Y);
FETCH(&r[2], 0, TGSI_CHAN_Z);
- assert(modifier != TEX_MODIFIER_PROJECTED);
+ if (modifier == TEX_MODIFIER_PROJECTED) {
+ micro_div(&r[0], &r[0], &r[3]);
+ micro_div(&r[1], &r[1], &r[3]);
+ }
fetch_texel(mach->Sampler, unit, unit,
&r[0], &r[1], &r[2], &ZeroVec, lod, /* S, T, P, C, LOD */