[Mesa-dev] [PATCH] gallium: remove support for predicates from TGSI

Roland Scheidegger sroland at vmware.com
Wed Mar 29 18:02:06 UTC 2017


[resend with snipped bits as it's too big]

A couple comments inline.

[snip]

> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> @@ -746,39 +746,30 @@ static void lp_exec_default(struct lp_exec_mask *mask,
>  }
>  
>  
>  /* stores val into an address pointed to by dst_ptr.
>   * mask->exec_mask is used to figure out which bits of val
>   * should be stored into the address
>   * (0 means don't store this bit, 1 means do store).
>   */
>  static void lp_exec_mask_store(struct lp_exec_mask *mask,
>                                 struct lp_build_context *bld_store,
> -                               LLVMValueRef pred,
>                                 LLVMValueRef val,
>                                 LLVMValueRef dst_ptr)
>  {
>     LLVMBuilderRef builder = mask->bld->gallivm->builder;
> +   LLVMValueRef pred = mask->has_mask ? mask->exec_mask : NULL;
Calling this "pred" now seems to be somewhat of a misnomer (wasn't all
that great before because it then included exec_mask but it's worse now).



>  
>     assert(lp_check_value(bld_store->type, val));
>     assert(LLVMGetTypeKind(LLVMTypeOf(dst_ptr)) == LLVMPointerTypeKind);
>     assert(LLVMGetElementType(LLVMTypeOf(dst_ptr)) == LLVMTypeOf(val));
>  
> -   /* Mix the predicate and execution mask */
> -   if (mask->has_mask) {
> -      if (pred) {
> -         pred = LLVMBuildAnd(builder, pred, mask->exec_mask, "");
> -      } else {
> -         pred = mask->exec_mask;
> -      }
> -   }
> -
>     if (pred) {
>        LLVMValueRef res, dst;
>  
>        dst = LLVMBuildLoad(builder, dst_ptr, "");
>        res = lp_build_select(bld_store, pred, val, dst);
>        LLVMBuildStore(builder, res, dst_ptr);
>     } else
>        LLVMBuildStore(builder, val, dst_ptr);
>  }
>  
> @@ -1029,36 +1020,26 @@ build_gather(struct lp_build_tgsi_context *bld_base,
>  
>  
>  /**
>   * Scatter/store vector.
>   */
>  static void
>  emit_mask_scatter(struct lp_build_tgsi_soa_context *bld,
>                    LLVMValueRef base_ptr,
>                    LLVMValueRef indexes,
>                    LLVMValueRef values,
> -                  struct lp_exec_mask *mask,
> -                  LLVMValueRef pred)
> +                  struct lp_exec_mask *mask)
>  {
>     struct gallivm_state *gallivm = bld->bld_base.base.gallivm;
>     LLVMBuilderRef builder = gallivm->builder;
>     unsigned i;
> -
> -   /* Mix the predicate and execution mask */
> -   if (mask->has_mask) {
> -      if (pred) {
> -         pred = LLVMBuildAnd(builder, pred, mask->exec_mask, "");
> -      }
> -      else {
> -         pred = mask->exec_mask;
> -      }
> -   }
> +   LLVMValueRef pred = mask->has_mask ? mask->exec_mask : NULL;
same here.


> diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
> index 6a3fb98..87d2d92 100644
> --- a/src/gallium/include/pipe/p_shader_tokens.h
> +++ b/src/gallium/include/pipe/p_shader_tokens.h
> @@ -62,21 +62,20 @@ struct tgsi_token
>  
>  enum tgsi_file_type {
>     TGSI_FILE_NULL,
>     TGSI_FILE_CONSTANT,
>     TGSI_FILE_INPUT,
>     TGSI_FILE_OUTPUT,
>     TGSI_FILE_TEMPORARY,
>     TGSI_FILE_SAMPLER,
>     TGSI_FILE_ADDRESS,
>     TGSI_FILE_IMMEDIATE,
> -   TGSI_FILE_PREDICATE,
>     TGSI_FILE_SYSTEM_VALUE,
>     TGSI_FILE_IMAGE,
>     TGSI_FILE_SAMPLER_VIEW,
>     TGSI_FILE_BUFFER,
>     TGSI_FILE_MEMORY,
>     TGSI_FILE_COUNT,      /**< how many TGSI_FILE_ types */
>  };
>  
>  
>  #define TGSI_WRITEMASK_NONE     0x00
> @@ -609,34 +608,31 @@ struct tgsi_property_data {
>  
>  /**
>   * Opcode is the operation code to execute. A given operation defines the
>   * semantics how the source registers (if any) are interpreted and what is
>   * written to the destination registers (if any) as a result of execution.
>   *
>   * NumDstRegs and NumSrcRegs is the number of destination and source registers,
>   * respectively. For a given operation code, those numbers are fixed and are
>   * present here only for convenience.
>   *
> - * If Predicate is TRUE, tgsi_instruction_predicate token immediately follows.
> - *
>   * Saturate controls how are final results in destination registers modified.
>   */
>  
>  struct tgsi_instruction
>  {
>     unsigned Type       : 4;  /* TGSI_TOKEN_TYPE_INSTRUCTION */
>     unsigned NrTokens   : 8;  /* UINT */
>     unsigned Opcode     : 8;  /* TGSI_OPCODE_ */
>     unsigned Saturate   : 1;  /* BOOL */
>     unsigned NumDstRegs : 2;  /* UINT */
>     unsigned NumSrcRegs : 4;  /* UINT */
> -   unsigned Predicate  : 1;  /* BOOL */
>     unsigned Label      : 1;
>     unsigned Texture    : 1;
>     unsigned Memory     : 1;
>     unsigned Padding    : 1;
The Padding doesn't match.



So, we still have code which uses this - however this code is only used
for some testing, otherwise we translate this d3d9 stuff away like
everybody else.
Maybe it's time to ditch this stuff then - clearly no other drivers are
ever going to support it and apis have moved away from it.

Jose, any opinion on that?

Roland



More information about the mesa-dev mailing list