[Mesa-dev] [PATCH 06/13] glsl_to_tgsi: fix shadow2DArray comparison
Marek Olšák
maraeo at gmail.com
Mon Sep 5 14:44:08 PDT 2011
---
src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 15 ++++++++++++---
1 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 9394bea..9457eb2 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -2558,6 +2558,8 @@ glsl_to_tgsi_visitor::visit(ir_texture *ir)
break;
}
+ const glsl_type *sampler_type = ir->sampler->type;
+
if (ir->projector) {
if (opcode == TGSI_OPCODE_TEX) {
/* Slot the projector in as the last component of the coord. */
@@ -2589,6 +2591,10 @@ glsl_to_tgsi_visitor::visit(ir_texture *ir)
tmp_src = get_temp(glsl_type::vec4_type);
st_dst_reg tmp_dst = st_dst_reg(tmp_src);
+ /* Projective division not allowed for shadow2DArray. */
+ assert(sampler_type->sampler_dimensionality != GLSL_SAMPLER_DIM_2D ||
+ !sampler_type->sampler_array);
+
tmp_dst.writemask = WRITEMASK_Z;
emit(ir, TGSI_OPCODE_MOV, tmp_dst, this->result);
@@ -2613,7 +2619,12 @@ glsl_to_tgsi_visitor::visit(ir_texture *ir)
* coord.
*/
ir->shadow_comparitor->accept(this);
- coord_dst.writemask = WRITEMASK_Z;
+ if (sampler_type->sampler_dimensionality == GLSL_SAMPLER_DIM_2D &&
+ sampler_type->sampler_array) {
+ coord_dst.writemask = WRITEMASK_W;
+ } else {
+ coord_dst.writemask = WRITEMASK_Z;
+ }
emit(ir, TGSI_OPCODE_MOV, coord_dst, this->result);
coord_dst.writemask = WRITEMASK_XYZW;
}
@@ -2651,8 +2662,6 @@ glsl_to_tgsi_visitor::visit(ir_texture *ir)
inst->tex_offsets[0].SwizzleZ = GET_SWZ(offset.swizzle, 2);
}
- const glsl_type *sampler_type = ir->sampler->type;
-
switch (sampler_type->sampler_dimensionality) {
case GLSL_SAMPLER_DIM_1D:
inst->tex_target = (sampler_type->sampler_array)
--
1.7.4.1
More information about the mesa-dev
mailing list