[Mesa-dev] [PATCH 4/5] i965: Add a lowering pass to convert TXD to TXL by computing the LOD.

Eric Anholt eric at anholt.net
Wed Jul 11 09:12:38 PDT 2012


Kenneth Graunke <kenneth at whitecape.org> writes:

> Intel hardware doesn't natively support textureGrad with shadow
> comparisons.  So we need to generate code to handle it somehow.
>
> Based on the equations of page 205 of the OpenGL 3.0 specification,
> it's possible to compute the LOD value that would be selected given the
> gradient values.  Then, we can simply convert the TXD to a TXL.
>
> Currently, this passes 38/46 of oglconform's shadow-grad subtests,
> and selects the wrong level for the other 6 (but doesn't crash).
>
> While we should investigate the remaining failures, this new method at
> least works better than the old one.  Texturing with explicit gradients,
> shadow sampling, and either projection or texel offsets is pretty
> obscure anyway.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/mesa/drivers/dri/i965/Makefile.sources         |    1 +
>  src/mesa/drivers/dri/i965/brw_context.h            |    1 +
>  .../dri/i965/brw_lower_texture_gradients.cpp       |  153 ++++++++++++++++++++
>  src/mesa/drivers/dri/i965/brw_shader.cpp           |    1 +
>  4 files changed, 156 insertions(+)
>  create mode 100644 src/mesa/drivers/dri/i965/brw_lower_texture_gradients.cpp
>
> diff --git a/src/mesa/drivers/dri/i965/Makefile.sources b/src/mesa/drivers/dri/i965/Makefile.sources
> index 82143ac..334bfd9 100644
> --- a/src/mesa/drivers/dri/i965/Makefile.sources
> +++ b/src/mesa/drivers/dri/i965/Makefile.sources
> @@ -125,6 +125,7 @@ i965_CXX_FILES = \
>  	brw_fs_reg_allocate.cpp \
>  	brw_fs_schedule_instructions.cpp \
>  	brw_fs_vector_splitting.cpp \
> +	brw_lower_texture_gradients.cpp \
>  	brw_shader.cpp \
>  	brw_vec4.cpp \
>  	brw_vec4_emit.cpp \
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index c1f2314..b4868fe 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1276,6 +1276,7 @@ brw_program_reloc(struct brw_context *brw, uint32_t state_offset,
>  }
>  
>  bool brw_do_cubemap_normalize(struct exec_list *instructions);
> +bool brw_lower_texture_gradients(struct exec_list *instructions);
>  
>  #ifdef __cplusplus
>  }
> diff --git a/src/mesa/drivers/dri/i965/brw_lower_texture_gradients.cpp b/src/mesa/drivers/dri/i965/brw_lower_texture_gradients.cpp
> new file mode 100644
> index 0000000..2d4f2ab
> --- /dev/null
> +++ b/src/mesa/drivers/dri/i965/brw_lower_texture_gradients.cpp

> +   /* Calculate rho from equation 3.20 of the GL 3.0 specification. */
> +   ir_rvalue *rho;
> +   if (dPdx->type->is_scalar()) {
> +      rho = expr(ir_binop_max, dPdx, dPdy);
> +   } else {
> +      rho = expr(ir_binop_max, expr(ir_unop_sqrt, dot(dPdx, dPdx)),
> +			       expr(ir_unop_sqrt, dot(dPdy, dPdy)));
> +   }

Does the is_scalar() case need an abs() on the two args?  I was thinking
"huh, it would be cool if we recognized how to make the second
expression better automatically", and realized that it doesn't quite
reduce to the is_scalar() case.

Other than that, this series is

Reviewed-by: Eric Anholt <eric at anholt.net>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20120711/51b3f89c/attachment.pgp>


More information about the mesa-dev mailing list