On 10/10/2013 12:21 AM, Chris Forbes wrote: > ARB_gpu_shader5's textureGather*() functions which take shadow samplers > have a separate `refz` parameter rather than adding it to the > coordinate. > > Signed-off-by: Chris Forbes <chr...@ijw.co.nz> > --- > src/glsl/builtin_functions.cpp | 20 +++++++++++++++----- > 1 file changed, 15 insertions(+), 5 deletions(-) > > diff --git a/src/glsl/builtin_functions.cpp b/src/glsl/builtin_functions.cpp > index db6a0a9..ef8b7bb 100644 > --- a/src/glsl/builtin_functions.cpp > +++ b/src/glsl/builtin_functions.cpp > @@ -3383,11 +3383,21 @@ builtin_builder::_texture(ir_texture_opcode opcode, > if (flags & TEX_PROJECT) > tex->projector = swizzle(P, coord_type->vector_elements - 1, 1); > > - /* The shadow comparitor is normally in the Z component, but a few types > - * have sufficiently large coordinates that it's in W. > - */ > - if (sampler_type->sampler_shadow) > - tex->shadow_comparitor = swizzle(P, MAX2(coord_size, SWIZZLE_Z), 1); > + if (sampler_type->sampler_shadow) { > + if (opcode == ir_tg4) { > + /* gather has refz as a separate parameter, immediately after the > + * coordinate > + */
Interesting. texture(samplerCubeArrayShadow) is just like this - a vec4 coordinate and an extra float comparitor. I handled that in a separate function, since it was a unique case, but that's not true anymore. It probably makes sense to handle Gather here, since you need all the offset stuff as well. As a follow-on, maybe fold _textureCubeArrayShadow() into this function now that it has support for a separate comparitor parameter? Patches 1-3 are: Reviewed-by: Kenneth Graunke <kenn...@whitecape.org> > + ir_variable *refz = in_var(glsl_type::float_type, "refz"); > + sig->parameters.push_tail(refz); > + tex->shadow_comparitor = var_ref(refz); > + } else { > + /* The shadow comparitor is normally in the Z component, but a few > types > + * have sufficiently large coordinates that it's in W. > + */ > + tex->shadow_comparitor = swizzle(P, MAX2(coord_size, SWIZZLE_Z), 1); > + } > + } > > if (opcode == ir_txl) { > ir_variable *lod = in_var(glsl_type::float_type, "lod"); > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev