st/glsl_to_tgsi: sort input and output decls by TGSI index

Fixes a regression introduced by commit 777dcf81b.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98307
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Cc: 13.0 <mesa-stable@lists.freedesktop.org>
(cherry picked from commit 3d9b57e493)
This commit is contained in:
Nicolai Hähnle 2016-10-18 17:35:45 +02:00 committed by Emil Velikov
parent 8f807e914f
commit 13f685cf11

View file

@ -55,6 +55,7 @@
#include "st_glsl_types.h"
#include "st_nir.h"
#include <algorithm>
#define PROGRAM_ANY_CONST ((1 << PROGRAM_STATE_VAR) | \
(1 << PROGRAM_CONSTANT) | \
@ -5873,6 +5874,29 @@ emit_compute_block_size(const struct gl_program *program,
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
@ -5945,6 +5969,8 @@ st_translate_program(
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];
@ -5997,6 +6023,8 @@ st_translate_program(
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];