[Mesa-dev] [PATCH] st/glsl_to_tgsi: sort input and output decls by TGSI index
Marek Olšák
maraeo at gmail.com
Tue Oct 18 18:30:00 UTC 2016
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Tue, Oct 18, 2016 at 6:06 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> Fixes a regression introduced by commit 777dcf81b.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98307
> --
> Using std::sort here is quite a bit C++-ier than most parts of Mesa.
> I used it because the standard C library is being its usual lame self.
> If people think using qsort_r is fine from a portability point of view
> (it's a glibc-ism), I'd be happy to use that instead.
> ---
> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 28 ++++++++++++++++++++++++++++
> 1 file changed, 28 insertions(+)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index f49a873..406f4d5 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -48,20 +48,21 @@
> #include "tgsi/tgsi_ureg.h"
> #include "tgsi/tgsi_info.h"
> #include "util/u_math.h"
> #include "util/u_memory.h"
> #include "st_program.h"
> #include "st_mesa_to_tgsi.h"
> #include "st_format.h"
> #include "st_glsl_types.h"
> #include "st_nir.h"
>
> +#include <algorithm>
>
> #define PROGRAM_ANY_CONST ((1 << PROGRAM_STATE_VAR) | \
> (1 << PROGRAM_CONSTANT) | \
> (1 << PROGRAM_UNIFORM))
>
> #define MAX_GLSL_TEXTURE_OFFSET 4
>
> class st_src_reg;
> class st_dst_reg;
>
> @@ -6092,20 +6093,43 @@ emit_compute_block_size(const struct gl_program *program,
> (const struct gl_compute_program *)program;
>
> ureg_property(ureg, TGSI_PROPERTY_CS_FIXED_BLOCK_WIDTH,
> cp->LocalSize[0]);
> ureg_property(ureg, TGSI_PROPERTY_CS_FIXED_BLOCK_HEIGHT,
> cp->LocalSize[1]);
> ureg_property(ureg, TGSI_PROPERTY_CS_FIXED_BLOCK_DEPTH,
> cp->LocalSize[2]);
> }
>
> +struct sort_inout_decls {
> + bool operator()(const struct inout_decl &a, const struct inout_decl &b) const {
> + return mapping[a.mesa_index] < mapping[b.mesa_index];
> + }
> +
> + const GLuint *mapping;
> +};
> +
> +/* Sort the given array of decls by the corresponding slot (TGSI file index).
> + *
> + * This is for the benefit of older drivers which are broken when the
> + * declarations aren't sorted in this way.
> + */
> +static void
> +sort_inout_decls_by_slot(struct inout_decl *decls,
> + unsigned count,
> + const GLuint mapping[])
> +{
> + sort_inout_decls sorter;
> + sorter.mapping = mapping;
> + std::sort(decls, decls + count, sorter);
> +}
> +
> /**
> * Translate intermediate IR (glsl_to_tgsi_instruction) to TGSI format.
> * \param program the program to translate
> * \param numInputs number of input registers used
> * \param inputMapping maps Mesa fragment program inputs to TGSI generic
> * input indexes
> * \param inputSemanticName the TGSI_SEMANTIC flag for each input
> * \param inputSemanticIndex the semantic index (ex: which texcoord) for
> * each input
> * \param interpMode the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input
> @@ -6164,20 +6188,22 @@ st_translate_program(
> calloc(t->num_temp_arrays, sizeof(t->arrays[0]));
>
> /*
> * Declare input attributes.
> */
> switch (procType) {
> case PIPE_SHADER_FRAGMENT:
> case PIPE_SHADER_GEOMETRY:
> case PIPE_SHADER_TESS_EVAL:
> case PIPE_SHADER_TESS_CTRL:
> + sort_inout_decls_by_slot(program->inputs, program->num_inputs, inputMapping);
> +
> for (i = 0; i < program->num_inputs; ++i) {
> struct inout_decl *decl = &program->inputs[i];
> unsigned slot = inputMapping[decl->mesa_index];
> struct ureg_src src;
> ubyte tgsi_usage_mask = decl->usage_mask;
>
> if (glsl_base_type_is_64bit(decl->base_type)) {
> if (tgsi_usage_mask == 1)
> tgsi_usage_mask = TGSI_WRITEMASK_XY;
> else if (tgsi_usage_mask == 2)
> @@ -6216,20 +6242,22 @@ st_translate_program(
> * Declare output attributes.
> */
> switch (procType) {
> case PIPE_SHADER_FRAGMENT:
> case PIPE_SHADER_COMPUTE:
> break;
> case PIPE_SHADER_GEOMETRY:
> case PIPE_SHADER_TESS_EVAL:
> case PIPE_SHADER_TESS_CTRL:
> case PIPE_SHADER_VERTEX:
> + sort_inout_decls_by_slot(program->outputs, program->num_outputs, outputMapping);
> +
> for (i = 0; i < program->num_outputs; ++i) {
> struct inout_decl *decl = &program->outputs[i];
> unsigned slot = outputMapping[decl->mesa_index];
> struct ureg_dst dst;
> ubyte tgsi_usage_mask = decl->usage_mask;
>
> if (glsl_base_type_is_64bit(decl->base_type)) {
> if (tgsi_usage_mask == 1)
> tgsi_usage_mask = TGSI_WRITEMASK_XY;
> else if (tgsi_usage_mask == 2)
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list