Reviewed-by: Roland Scheidegger <srol...@vmware.com> Am 01.06.2016 um 17:32 schrieb Nicolai Hähnle: > From: Nicolai Hähnle <nicolai.haeh...@amd.com> > > v2: > - TG4 does not calculate derivatives (Ilia) > - also handle SAMPLE* instructions (Roland) > > Cc: 12.0 <mesa-sta...@lists.freedesktop.org> > Reviewed-by: Marek Olšák <marek.ol...@amd.com> (v1) > Reviewed-by: Brian Paul <bri...@vmware.com> (v1) > -- > This looks increasingly like something that might better live in the opcode > info table. Maybe in a separate cleanup so as not to churn stable too much. > --- > src/gallium/auxiliary/tgsi/tgsi_scan.c | 30 ++++++++++++++++++++++++++++++ > src/gallium/auxiliary/tgsi/tgsi_scan.h | 1 + > 2 files changed, 31 insertions(+) > > diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c > b/src/gallium/auxiliary/tgsi/tgsi_scan.c > index 1baf031..98d86fc 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c > +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c > @@ -68,6 +68,33 @@ is_texture_inst(unsigned opcode) > tgsi_get_opcode_info(opcode)->is_tex); > } > > + > +/** > + * Is the opcode an instruction which computes a derivative explicitly or > + * implicitly? > + */ > +static bool > +computes_derivative(unsigned opcode) > +{ > + if (tgsi_get_opcode_info(opcode)->is_tex) { > + return opcode != TGSI_OPCODE_TG4 && > + opcode != TGSI_OPCODE_TXD && > + opcode != TGSI_OPCODE_TXF && > + opcode != TGSI_OPCODE_TXL && > + opcode != TGSI_OPCODE_TXL2 && > + opcode != TGSI_OPCODE_TXQ && > + opcode != TGSI_OPCODE_TXQ_LZ && > + opcode != TGSI_OPCODE_TXQS; > + } > + > + return opcode == TGSI_OPCODE_DDX || opcode == TGSI_OPCODE_DDX_FINE || > + opcode == TGSI_OPCODE_DDY || opcode == TGSI_OPCODE_DDY_FINE || > + opcode == TGSI_OPCODE_SAMPLE || > + opcode == TGSI_OPCODE_SAMPLE_B || > + opcode == TGSI_OPCODE_SAMPLE_C; > +} > + > + > static void > scan_instruction(struct tgsi_shader_info *info, > const struct tgsi_full_instruction *fullinst, > @@ -263,6 +290,9 @@ scan_instruction(struct tgsi_shader_info *info, > if (is_mem_inst) > info->num_memory_instructions++; > > + if (computes_derivative(fullinst->Instruction.Opcode)) > + info->uses_derivatives = true; > + > info->num_instructions++; > } > > diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h > b/src/gallium/auxiliary/tgsi/tgsi_scan.h > index 31adce7..f7eefa4 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_scan.h > +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h > @@ -115,6 +115,7 @@ struct tgsi_shader_info > boolean writes_memory; /**< contains stores or atomics to buffers or > images */ > boolean is_msaa_sampler[PIPE_MAX_SAMPLERS]; > boolean uses_doubles; /**< uses any of the double instructions */ > + boolean uses_derivatives; > unsigned clipdist_writemask; > unsigned culldist_writemask; > unsigned num_written_culldistance; >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev