[Mesa-dev] [PATCH] i965: Lower textureGrad() with samplerCubeShadow on pre-Haswell.

Anuj Phogat anuj.phogat at gmail.com
Thu Jan 17 08:27:42 PST 2013


On Thu, Jan 17, 2013 at 12:56 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> Fixes regressions since commit 899017fc54c40c969b5239b33f3a17b311878b0d
> Author: Kenneth Graunke <kenneth at whitecape.org>
> Date:   Fri Jan 4 07:53:09 2013 -0800
>
>     i965: Use Haswell's sample_d_c for textureGrad with shadow samplers.
>
> That patch assumed that all instances were lowered.  However, we weren't
> lowering textureGrad() with samplerCubeShadow because I couldn't figure
> out the LOD calculations.  It turns out they're easy: you just have to
> use 1 for the depth.  This causes it to pass oglconform's four tests.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> Cc: Anuj Phogat <anuj.phogat at gmail.com>
> Cc: Ian Romanick <idr at freedesktop.org>
> ---
>  src/mesa/drivers/dri/i965/brw_lower_texture_gradients.cpp | 15 +++++++++------
>  1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_lower_texture_gradients.cpp b/src/mesa/drivers/dri/i965/brw_lower_texture_gradients.cpp
> index dfbb983..9e661a1 100644
> --- a/src/mesa/drivers/dri/i965/brw_lower_texture_gradients.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_lower_texture_gradients.cpp
> @@ -27,6 +27,7 @@
>
>  #include "glsl/ir.h"
>  #include "glsl/ir_builder.h"
> +#include "program/prog_instruction.h"
>
>  using namespace ir_builder;
>
> @@ -89,10 +90,6 @@ lower_texture_grad_visitor::visit_leave(ir_texture *ir)
>     if (ir->op != ir_txd || !ir->shadow_comparitor)
>        return visit_continue;
>
> -   /* Cubes are broken.  Avoid assertion failures when swizzling. */
> -   if (ir->sampler->type->sampler_dimensionality == GLSL_SAMPLER_DIM_CUBE)
> -      return visit_continue;
> -
>     void *mem_ctx = ralloc_parent(ir);
>
>     const glsl_type *grad_type = ir->lod_info.grad.dPdx->type;
> @@ -106,8 +103,14 @@ lower_texture_grad_visitor::visit_leave(ir_texture *ir)
>     txs->lod_info.lod = new(mem_ctx) ir_constant(0);
>     ir_variable *size =
>        new(mem_ctx) ir_variable(grad_type, "size", ir_var_temporary);
> -   emit(size, expr(ir_unop_i2f,
> -                  swizzle_for_size(txs, grad_type->vector_elements)));
> +   if (ir->sampler->type->sampler_dimensionality == GLSL_SAMPLER_DIM_CUBE) {
> +      base_ir->insert_before(size);
> +      base_ir->insert_before(assign(size, expr(ir_unop_i2f, txs), WRITEMASK_XY));
> +      base_ir->insert_before(assign(size, new(mem_ctx) ir_constant(1.0f), WRITEMASK_Z));
> +   } else {
> +      emit(size, expr(ir_unop_i2f,
> +                      swizzle_for_size(txs, grad_type->vector_elements)));
> +   }
>
>     /* Scale the gradients by width and height.  Effectively, the incoming
>      * gradients are s'(x,y), t'(x,y), and r'(x,y) from equation 3.19 in the
> --
> 1.8.1
>
Tested-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the mesa-dev mailing list