[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