[Mesa-dev] [PATCH 3/7] i965/fs: Add support for bit-shift operations.

Kenneth Graunke kenneth at whitecape.org
Wed Sep 28 01:21:50 PDT 2011


On 09/27/2011 03:08 PM, Eric Anholt wrote:
> ---
>  src/mesa/drivers/dri/i965/brw_fs_visitor.cpp |    8 +++++++-
>  1 files changed, 7 insertions(+), 1 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> index df43be0..d8ce47b 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> @@ -445,8 +445,14 @@ fs_visitor::visit(ir_expression *ir)
>        break;
>  
>     case ir_binop_lshift:
> +      inst = emit(BRW_OPCODE_SHL, this->result, op[0], op[1]);
> +      break;
> +
>     case ir_binop_rshift:
> -      assert(!"GLSL 1.30 features unsupported");
> +      if (ir->type->base_type == GLSL_TYPE_INT)
> +	 inst = emit(BRW_OPCODE_ASR, this->result, op[0], op[1]);
> +      else
> +	 inst = emit(BRW_OPCODE_SHR, this->result, op[0], op[1]);
>        break;
>     }
>  }

I'm feeling slightly paranoid about SHR's restrictions:

"This instruction only takes on unsigned sources. When <src0> contains
 unsigned integers, no source modifier is allowed. <src0> is only
 allowed to be signed integer if source modifier (abs) is used. Note:
 for unsigned sources, the behavior of shr and asr are effectively the
 same."

I see nothing guaranteeing that op[1] has register type UD.  I'm not
positive what would happen if you gave it a D (signed) register.
Undefined results are okay according to the GLSL spec.  GPU hang is not.

Smashing it to be type UD would work, but may be unnecessary.


More information about the mesa-dev mailing list