[Mesa-dev] [PATCH 5/7] tgsi/exec: implement restartable machine.

Brian Paul brianp at vmware.com
Tue Apr 26 15:19:33 UTC 2016


On 04/25/2016 10:42 PM, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> This lets us restart the machine at a PC value, and exits
> the machine when we hit a barrier.
>
> Compute shaders will then execute all the threads up to the
> barrier, then restart the machines after the barrier once
> all are done.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>   src/gallium/auxiliary/tgsi/tgsi_exec.c | 44 +++++++++++++++++++++-------------
>   src/gallium/auxiliary/tgsi/tgsi_exec.h |  2 ++
>   2 files changed, 29 insertions(+), 17 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> index 7ec30fb..d914ef5 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> @@ -4781,7 +4781,7 @@ micro_umsb(union tgsi_exec_channel *dst,
>      dst->i[3] = util_last_bit(src->u[3]) - 1;
>   }
>
> -static void
> +static bool

Now that this function returns a bool, let's put a comment on the 
function to explain what the return value means.


>   exec_instruction(
>      struct tgsi_exec_machine *mach,
>      const struct tgsi_full_instruction *inst,
> @@ -5100,7 +5100,7 @@ exec_instruction(
>               mach->CondStackTop = 0;
>               mach->LoopStackTop = 0;
>               *pc = -1;
> -            return;
> +            return true;
>            }
>
>            assert(mach->CallStackTop > 0);
> @@ -5749,10 +5749,12 @@ exec_instruction(
>         break;
>      case TGSI_OPCODE_BARRIER:
>      case TGSI_OPCODE_MEMBAR:
> +      return false;
>         break;
>      default:
>         assert( 0 );
>      }
> +   return true;
>   }
>
>   static void
> @@ -5796,13 +5798,16 @@ uint
>   tgsi_exec_machine_run( struct tgsi_exec_machine *mach, int start_pc )
>   {
>      uint i;
> -   int pc = 0;
>
> -   tgsi_exec_machine_setup_masks(mach);
> +   mach->pc = start_pc;
> +
> +   if (!start_pc) {
> +      tgsi_exec_machine_setup_masks(mach);
>
> -   /* execute declarations (interpolants) */
> -   for (i = 0; i < mach->NumDeclarations; i++) {
> -      exec_declaration( mach, mach->Declarations+i );
> +      /* execute declarations (interpolants) */
> +      for (i = 0; i < mach->NumDeclarations; i++) {
> +         exec_declaration( mach, mach->Declarations+i );
> +      }
>      }
>
>      {
> @@ -5811,24 +5816,29 @@ tgsi_exec_machine_run( struct tgsi_exec_machine *mach, int start_pc )
>         struct tgsi_exec_vector outputs[PIPE_MAX_ATTRIBS];
>         uint inst = 1;
>
> -      memset(mach->Temps, 0, sizeof(temps));
> -      if (mach->Outputs)
> -         memset(mach->Outputs, 0, sizeof(outputs));
> -      memset(temps, 0, sizeof(temps));
> -      memset(outputs, 0, sizeof(outputs));
> +      if (!start_pc) {
> +         memset(mach->Temps, 0, sizeof(temps));
> +         if (mach->Outputs)
> +            memset(mach->Outputs, 0, sizeof(outputs));
> +         memset(temps, 0, sizeof(temps));
> +         memset(outputs, 0, sizeof(outputs));
> +      }
>   #endif
>
>         /* execute instructions, until pc is set to -1 */
> -      while (pc != -1) {
> -
> +      while (mach->pc != -1) {
> +         bool barrier_hit;
>   #if DEBUG_EXECUTION
>            uint i;
>
> -         tgsi_dump_instruction(&mach->Instructions[pc], inst++);
> +         tgsi_dump_instruction(&mach->Instructions[mach->pc], inst++);
>   #endif
>
> -         assert(pc < (int) mach->NumInstructions);
> -         exec_instruction(mach, mach->Instructions + pc, &pc);
> +         assert(mach->pc < (int) mach->NumInstructions);
> +         barrier_hit = !exec_instruction(mach, mach->Instructions + mach->pc, &mach->pc);
> +
> +         if (barrier_hit && mach->ShaderType == PIPE_SHADER_COMPUTE)
> +            return 0;
>
>   #if DEBUG_EXECUTION
>            for (i = 0; i < TGSI_EXEC_NUM_TEMPS + TGSI_EXEC_NUM_TEMP_EXTRAS; i++) {
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> index 564b3d5..9343d78 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> @@ -445,6 +445,8 @@ struct tgsi_exec_machine
>         SamplerViews[PIPE_MAX_SHADER_SAMPLER_VIEWS];
>
>      boolean UsedGeometryShader;
> +
> +   int pc;
>   };
>
>   struct tgsi_exec_machine *
>

The new code is light on comments, but looks OK otherwise.

Acked-by: Brian Paul <brianp at vmware.com>



More information about the mesa-dev mailing list