[Mesa-dev] [PATCH] ir_to_mesa: Handle shadow compare w/projection and LOD bias correctly

Brian Paul brianp at vmware.com
Mon Apr 4 14:05:42 PDT 2011


On 04/04/2011 02:40 PM, Ian Romanick wrote:
> From: Ian Romanick<ian.d.romanick at intel.com>
>
> The code would previously handle the projection, then swizzle the
> shadow comparitor into place.  However, when the projection is done
> "by hand," as in the TXB case, the unprojected shadow comparitor would
> over-write the projected shadow comparitor.
>
> Shadow comparison with projection and LOD is an extremely rare case in
> real application code, so it shouldn't matter that we don't handle
> that case with the greatest efficiency.

Looks good.  Just minor comments...


> Cc: Eric Anholt<eric at anholt.net>
> Cc: Brian Paul<brianp at vmware.com>
> References: https://bugs.freedesktop.org/show_bug.cgi?id=32395
> ---
>   src/mesa/program/ir_to_mesa.cpp |   28 ++++++++++++++++++++++++++--
>   1 files changed, 26 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
> index bf2513d..677d330 100644
> --- a/src/mesa/program/ir_to_mesa.cpp
> +++ b/src/mesa/program/ir_to_mesa.cpp
> @@ -2084,15 +2084,39 @@ ir_to_mesa_visitor::visit(ir_texture *ir)
>   	 coord_dst.writemask = WRITEMASK_W;
>   	 ir_to_mesa_emit_op1(ir, OPCODE_RCP, coord_dst, projector);
>
> +	 /* In the case where we have to project the coorindates "by hand,"

coordinates


> +	  * the shadow comparison value must also be projected.

maybe replace "shadow comparison" with "coordinate distance" to make 
it clear that we're referring to the texcoord/distance value and not 
the sampled value.


> +	  */
> +	 ir_to_mesa_src_reg tmp_src = coord;
> +	 if (ir->shadow_comparitor) {
> +	    /* Slot the shadow value in as the second to last component of the
> +	     * coord.
> +	     */
> +	    ir->shadow_comparitor->accept(this);
> +
> +	    tmp_src = get_temp(glsl_type::vec4_type);
> +	    ir_to_mesa_dst_reg tmp_dst = ir_to_mesa_dst_reg_from_src(tmp_src);
> +
> +	    tmp_dst.writemask = WRITEMASK_Z;
> +	    ir_to_mesa_emit_op1(ir, OPCODE_MOV, tmp_dst, this->result);
> +
> +	    tmp_dst.writemask = WRITEMASK_XY;
> +	    ir_to_mesa_emit_op1(ir, OPCODE_MOV, tmp_dst, coord);
> +	 }
> +
>   	 coord_dst.writemask = WRITEMASK_XYZ;
> -	 ir_to_mesa_emit_op2(ir, OPCODE_MUL, coord_dst, coord, coord_w);
> +	 ir_to_mesa_emit_op2(ir, OPCODE_MUL, coord_dst, tmp_src, coord_w);
>
>   	 coord_dst.writemask = WRITEMASK_XYZW;
>   	 coord.swizzle = SWIZZLE_XYZW;
>         }
>      }
>
> -   if (ir->shadow_comparitor) {
> +   /* If projection is done and the opcode is not OPCODE_TXP, then the shadow
> +    * comparitor was put in the correct place (and projected) by the code,
> +    * above, that handles by-hand projection.
> +    */
> +   if (ir->shadow_comparitor&&  (!ir->projector || opcode == OPCODE_TXP)) {
>         /* Slot the shadow value in as the second to last component of the
>          * coord.
>          */

-Brian


More information about the mesa-dev mailing list