mesa/st: move _mesa_generate_parameters_list_for_uniforms() code to st

The classic drivers that shared the code are now gone and the only user
is the tgsi linker so here we move the code to where it is used.

Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14066>
This commit is contained in:
Timothy Arceri
2021-12-05 13:32:07 +11:00
committed by Marge Bot
parent 4b895dc895
commit 7abe527ab4
3 changed files with 139 additions and 149 deletions
-139
View File
@@ -39,7 +39,6 @@
#include "compiler/glsl/ast.h"
#include "compiler/glsl/ir.h"
#include "compiler/glsl/ir_expression_flattening.h"
#include "compiler/glsl/ir_visitor.h"
#include "compiler/glsl/ir_optimization.h"
#include "compiler/glsl/ir_uniform.h"
#include "compiler/glsl/glsl_parser_extras.h"
@@ -47,7 +46,6 @@
#include "compiler/glsl/linker.h"
#include "compiler/glsl/program.h"
#include "compiler/glsl/shader_cache.h"
#include "compiler/glsl/string_to_uint_map.h"
#include "program/prog_instruction.h"
#include "program/prog_optimize.h"
#include "program/prog_print.h"
@@ -55,143 +53,6 @@
#include "program/prog_parameter.h"
namespace {
class add_uniform_to_shader : public program_resource_visitor {
public:
add_uniform_to_shader(struct gl_context *ctx,
struct gl_shader_program *shader_program,
struct gl_program_parameter_list *params)
: ctx(ctx), shader_program(shader_program), params(params), idx(-1),
var(NULL)
{
/* empty */
}
void process(ir_variable *var)
{
this->idx = -1;
this->var = var;
this->program_resource_visitor::process(var,
ctx->Const.UseSTD430AsDefaultPacking);
var->data.param_index = this->idx;
}
private:
virtual void visit_field(const glsl_type *type, const char *name,
bool row_major, const glsl_type *record_type,
const enum glsl_interface_packing packing,
bool last_field);
struct gl_context *ctx;
struct gl_shader_program *shader_program;
struct gl_program_parameter_list *params;
int idx;
ir_variable *var;
};
} /* anonymous namespace */
void
add_uniform_to_shader::visit_field(const glsl_type *type, const char *name,
bool /* row_major */,
const glsl_type * /* record_type */,
const enum glsl_interface_packing,
bool /* last_field */)
{
/* opaque types don't use storage in the param list unless they are
* bindless samplers or images.
*/
if (type->contains_opaque() && !var->data.bindless)
return;
/* Add the uniform to the param list */
assert(_mesa_lookup_parameter_index(params, name) < 0);
int index = _mesa_lookup_parameter_index(params, name);
unsigned num_params = type->arrays_of_arrays_size();
num_params = MAX2(num_params, 1);
num_params *= type->without_array()->matrix_columns;
bool is_dual_slot = type->without_array()->is_dual_slot();
if (is_dual_slot)
num_params *= 2;
_mesa_reserve_parameter_storage(params, num_params, num_params);
index = params->NumParameters;
if (ctx->Const.PackedDriverUniformStorage) {
for (unsigned i = 0; i < num_params; i++) {
unsigned dmul = type->without_array()->is_64bit() ? 2 : 1;
unsigned comps = type->without_array()->vector_elements * dmul;
if (is_dual_slot) {
if (i & 0x1)
comps -= 4;
else
comps = 4;
}
_mesa_add_parameter(params, PROGRAM_UNIFORM, name, comps,
type->gl_type, NULL, NULL, false);
}
} else {
for (unsigned i = 0; i < num_params; i++) {
_mesa_add_parameter(params, PROGRAM_UNIFORM, name, 4,
type->gl_type, NULL, NULL, true);
}
}
/* The first part of the uniform that's processed determines the base
* location of the whole uniform (for structures).
*/
if (this->idx < 0)
this->idx = index;
/* Each Parameter will hold the index to the backing uniform storage.
* This avoids relying on names to match parameters and uniform
* storages later when associating uniform storage.
*/
unsigned location = -1;
ASSERTED const bool found =
shader_program->UniformHash->get(location, params->Parameters[index].Name);
assert(found);
for (unsigned i = 0; i < num_params; i++) {
struct gl_program_parameter *param = &params->Parameters[index + i];
param->UniformStorageIndex = location;
param->MainUniformStorageIndex = params->Parameters[this->idx].UniformStorageIndex;
}
}
/**
* Generate the program parameters list for the user uniforms in a shader
*
* \param shader_program Linked shader program. This is only used to
* emit possible link errors to the info log.
* \param sh Shader whose uniforms are to be processed.
* \param params Parameter list to be filled in.
*/
void
_mesa_generate_parameters_list_for_uniforms(struct gl_context *ctx,
struct gl_shader_program
*shader_program,
struct gl_linked_shader *sh,
struct gl_program_parameter_list
*params)
{
add_uniform_to_shader add(ctx, shader_program, params);
foreach_in_list(ir_instruction, node, sh->ir) {
ir_variable *var = node->as_variable();
if ((var == NULL) || (var->data.mode != ir_var_uniform)
|| var->is_in_buffer_block() || (strncmp(var->name, "gl_", 3) == 0))
continue;
add.process(var);
}
}
static void
associate_uniform_storage(struct gl_context *ctx,
struct gl_shader_program *shader_program,
-8
View File
@@ -39,14 +39,6 @@ struct gl_program_parameter_list;
void _mesa_glsl_link_shader(struct gl_context *ctx, struct gl_shader_program *prog);
void
_mesa_generate_parameters_list_for_uniforms(struct gl_context *ctx,
struct gl_shader_program
*shader_program,
struct gl_linked_shader *sh,
struct gl_program_parameter_list
*params);
void
_mesa_ensure_and_associate_uniform_storage(struct gl_context *ctx,
struct gl_shader_program *shader_program,
+139 -2
View File
@@ -34,7 +34,9 @@
#include "compiler/glsl/glsl_parser_extras.h"
#include "compiler/glsl/ir_optimization.h"
#include "compiler/glsl/linker.h"
#include "compiler/glsl/program.h"
#include "compiler/glsl/string_to_uint_map.h"
#include "main/errors.h"
#include "main/shaderobj.h"
@@ -105,6 +107,141 @@ static inline bool print_stats_enabled ()
#endif
namespace {
class add_uniform_to_shader : public program_resource_visitor {
public:
add_uniform_to_shader(struct gl_context *ctx,
struct gl_shader_program *shader_program,
struct gl_program_parameter_list *params)
: ctx(ctx), shader_program(shader_program), params(params), idx(-1),
var(NULL)
{
/* empty */
}
void process(ir_variable *var)
{
this->idx = -1;
this->var = var;
this->program_resource_visitor::process(var,
ctx->Const.UseSTD430AsDefaultPacking);
var->data.param_index = this->idx;
}
private:
virtual void visit_field(const glsl_type *type, const char *name,
bool row_major, const glsl_type *record_type,
const enum glsl_interface_packing packing,
bool last_field);
struct gl_context *ctx;
struct gl_shader_program *shader_program;
struct gl_program_parameter_list *params;
int idx;
ir_variable *var;
};
} /* anonymous namespace */
void
add_uniform_to_shader::visit_field(const glsl_type *type, const char *name,
bool /* row_major */,
const glsl_type * /* record_type */,
const enum glsl_interface_packing,
bool /* last_field */)
{
/* opaque types don't use storage in the param list unless they are
* bindless samplers or images.
*/
if (type->contains_opaque() && !var->data.bindless)
return;
/* Add the uniform to the param list */
assert(_mesa_lookup_parameter_index(params, name) < 0);
int index = _mesa_lookup_parameter_index(params, name);
unsigned num_params = type->arrays_of_arrays_size();
num_params = MAX2(num_params, 1);
num_params *= type->without_array()->matrix_columns;
bool is_dual_slot = type->without_array()->is_dual_slot();
if (is_dual_slot)
num_params *= 2;
_mesa_reserve_parameter_storage(params, num_params, num_params);
index = params->NumParameters;
if (ctx->Const.PackedDriverUniformStorage) {
for (unsigned i = 0; i < num_params; i++) {
unsigned dmul = type->without_array()->is_64bit() ? 2 : 1;
unsigned comps = type->without_array()->vector_elements * dmul;
if (is_dual_slot) {
if (i & 0x1)
comps -= 4;
else
comps = 4;
}
_mesa_add_parameter(params, PROGRAM_UNIFORM, name, comps,
type->gl_type, NULL, NULL, false);
}
} else {
for (unsigned i = 0; i < num_params; i++) {
_mesa_add_parameter(params, PROGRAM_UNIFORM, name, 4,
type->gl_type, NULL, NULL, true);
}
}
/* The first part of the uniform that's processed determines the base
* location of the whole uniform (for structures).
*/
if (this->idx < 0)
this->idx = index;
/* Each Parameter will hold the index to the backing uniform storage.
* This avoids relying on names to match parameters and uniform
* storages later when associating uniform storage.
*/
unsigned location = -1;
ASSERTED const bool found =
shader_program->UniformHash->get(location, params->Parameters[index].Name);
assert(found);
for (unsigned i = 0; i < num_params; i++) {
struct gl_program_parameter *param = &params->Parameters[index + i];
param->UniformStorageIndex = location;
param->MainUniformStorageIndex = params->Parameters[this->idx].UniformStorageIndex;
}
}
/**
* Generate the program parameters list for the user uniforms in a shader
*
* \param shader_program Linked shader program. This is only used to
* emit possible link errors to the info log.
* \param sh Shader whose uniforms are to be processed.
* \param params Parameter list to be filled in.
*/
static void
generate_parameters_list_for_uniforms(struct gl_context *ctx,
struct gl_shader_program *shader_program,
struct gl_linked_shader *sh,
struct gl_program_parameter_list *params)
{
add_uniform_to_shader add(ctx, shader_program, params);
foreach_in_list(ir_instruction, node, sh->ir) {
ir_variable *var = node->as_variable();
if ((var == NULL) || (var->data.mode != ir_var_uniform)
|| var->is_in_buffer_block() || (strncmp(var->name, "gl_", 3) == 0))
continue;
add.process(var);
}
}
static unsigned is_precise(const ir_variable *ir)
{
if (!ir)
@@ -7137,8 +7274,8 @@ get_mesa_program_tgsi(struct gl_context *ctx,
pscreen->get_shader_param(pscreen, ptarget,
PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS);
_mesa_generate_parameters_list_for_uniforms(ctx, shader_program, shader,
prog->Parameters);
generate_parameters_list_for_uniforms(ctx, shader_program, shader,
prog->Parameters);
/* Remove reads from output registers. */
if (!pscreen->get_param(pscreen, PIPE_CAP_TGSI_CAN_READ_OUTPUTS))