compiler/glsl: Remove the dead parts of build_program_resource_list().

These have all moved to NIR linking.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8044>
This commit is contained in:
Emma Anholt
2022-04-08 17:54:24 -07:00
committed by Marge Bot
parent 74056f6358
commit c03cc83ef1
3 changed files with 3 additions and 248 deletions

View File

@@ -3829,68 +3829,6 @@ inout_has_same_location(const ir_variable *var, unsigned stage)
return false;
}
static bool
add_interface_variables(struct gl_shader_program *shProg,
struct set *resource_set,
unsigned stage, GLenum programInterface)
{
exec_list *ir = shProg->_LinkedShaders[stage]->ir;
foreach_in_list(ir_instruction, node, ir) {
ir_variable *var = node->as_variable();
if (!var || var->data.how_declared == ir_var_hidden)
continue;
int loc_bias;
switch (var->data.mode) {
case ir_var_system_value:
case ir_var_shader_in:
if (programInterface != GL_PROGRAM_INPUT)
continue;
loc_bias = (stage == MESA_SHADER_VERTEX) ? int(VERT_ATTRIB_GENERIC0)
: int(VARYING_SLOT_VAR0);
break;
case ir_var_shader_out:
if (programInterface != GL_PROGRAM_OUTPUT)
continue;
loc_bias = (stage == MESA_SHADER_FRAGMENT) ? int(FRAG_RESULT_DATA0)
: int(VARYING_SLOT_VAR0);
break;
default:
continue;
};
if (var->data.patch)
loc_bias = int(VARYING_SLOT_PATCH0);
/* Skip packed varyings, packed varyings are handled separately
* by add_packed_varyings.
*/
if (strncmp(var->name, "packed:", 7) == 0)
continue;
/* Skip fragdata arrays, these are handled separately
* by add_fragdata_arrays.
*/
if (strncmp(var->name, "gl_out_FragData", 15) == 0)
continue;
const bool vs_input_or_fs_output =
(stage == MESA_SHADER_VERTEX && var->data.mode == ir_var_shader_in) ||
(stage == MESA_SHADER_FRAGMENT && var->data.mode == ir_var_shader_out);
if (!add_shader_variable(shProg, resource_set,
1 << stage, programInterface,
var, var->name, var->type, vs_input_or_fs_output,
var->data.location - loc_bias,
inout_has_same_location(var, stage)))
return false;
}
return true;
}
static bool
add_packed_varyings(struct gl_shader_program *shProg,
struct set *resource_set,
@@ -3931,39 +3869,13 @@ add_packed_varyings(struct gl_shader_program *shProg,
return true;
}
static bool
add_fragdata_arrays(struct gl_shader_program *shProg,
struct set *resource_set)
{
struct gl_linked_shader *sh = shProg->_LinkedShaders[MESA_SHADER_FRAGMENT];
if (!sh || !sh->fragdata_arrays)
return true;
foreach_in_list(ir_instruction, node, sh->fragdata_arrays) {
ir_variable *var = node->as_variable();
if (var) {
assert(var->data.mode == ir_var_shader_out);
if (!add_shader_variable(shProg, resource_set,
1 << MESA_SHADER_FRAGMENT,
GL_PROGRAM_OUTPUT, var, var->name, var->type,
true, var->data.location - FRAG_RESULT_DATA0,
false))
return false;
}
}
return true;
}
/**
* Builds up a list of program resources that point to existing
* resource data.
*/
void
build_program_resource_list(const struct gl_constants *consts,
struct gl_shader_program *shProg,
bool add_packed_varyings_only)
struct gl_shader_program *shProg)
{
/* Rebuild resource list. */
if (shProg->data->ProgramResourceList) {
@@ -4003,162 +3915,6 @@ build_program_resource_list(const struct gl_constants *consts,
return;
}
if (add_packed_varyings_only) {
_mesa_set_destroy(resource_set, NULL);
return;
}
if (!add_fragdata_arrays(shProg, resource_set))
return;
/* Add inputs and outputs to the resource list. */
if (!add_interface_variables(shProg, resource_set,
input_stage, GL_PROGRAM_INPUT))
return;
if (!add_interface_variables(shProg, resource_set,
output_stage, GL_PROGRAM_OUTPUT))
return;
if (shProg->last_vert_prog) {
struct gl_transform_feedback_info *linked_xfb =
shProg->last_vert_prog->sh.LinkedTransformFeedback;
/* Add transform feedback varyings. */
if (linked_xfb->NumVarying > 0) {
for (int i = 0; i < linked_xfb->NumVarying; i++) {
if (!link_util_add_program_resource(shProg, resource_set,
GL_TRANSFORM_FEEDBACK_VARYING,
&linked_xfb->Varyings[i], 0))
return;
}
}
/* Add transform feedback buffers. */
for (unsigned i = 0; i < consts->MaxTransformFeedbackBuffers; i++) {
if ((linked_xfb->ActiveBuffers >> i) & 1) {
linked_xfb->Buffers[i].Binding = i;
if (!link_util_add_program_resource(shProg, resource_set,
GL_TRANSFORM_FEEDBACK_BUFFER,
&linked_xfb->Buffers[i], 0))
return;
}
}
}
int top_level_array_base_offset = -1;
int top_level_array_size_in_bytes = -1;
int second_element_offset = -1;
int buffer_block_index = -1;
/* Add uniforms from uniform storage. */
for (unsigned i = 0; i < shProg->data->NumUniformStorage; i++) {
/* Do not add uniforms internally used by Mesa. */
if (shProg->data->UniformStorage[i].hidden)
continue;
bool is_shader_storage =
shProg->data->UniformStorage[i].is_shader_storage;
GLenum type = is_shader_storage ? GL_BUFFER_VARIABLE : GL_UNIFORM;
if (!link_util_should_add_buffer_variable(shProg,
&shProg->data->UniformStorage[i],
top_level_array_base_offset,
top_level_array_size_in_bytes,
second_element_offset,
buffer_block_index))
continue;
if (is_shader_storage) {
/* From the OpenGL 4.6 specification, 7.3.1.1 Naming Active Resources:
*
* "For an active shader storage block member declared as an array
* of an aggregate type, an entry will be generated only for the
* first array element, regardless of its type. Such block members
* are referred to as top-level arrays. If the block member is an
* aggregate type, the enumeration rules are then applied
* recursively."
*
* Below we update our tracking values used by
* link_util_should_add_buffer_variable(). We only want to reset the
* offsets once we have moved past the first element.
*/
if (shProg->data->UniformStorage[i].offset >= second_element_offset) {
top_level_array_base_offset =
shProg->data->UniformStorage[i].offset;
top_level_array_size_in_bytes =
shProg->data->UniformStorage[i].top_level_array_size *
shProg->data->UniformStorage[i].top_level_array_stride;
/* Set or reset the second element offset. For non arrays this
* will be set to -1.
*/
second_element_offset = top_level_array_size_in_bytes ?
top_level_array_base_offset +
shProg->data->UniformStorage[i].top_level_array_stride : -1;
}
buffer_block_index = shProg->data->UniformStorage[i].block_index;
}
uint8_t stageref = shProg->data->UniformStorage[i].active_shader_mask;
if (!link_util_add_program_resource(shProg, resource_set, type,
&shProg->data->UniformStorage[i], stageref))
return;
}
/* Add program uniform blocks. */
for (unsigned i = 0; i < shProg->data->NumUniformBlocks; i++) {
if (!link_util_add_program_resource(shProg, resource_set, GL_UNIFORM_BLOCK,
&shProg->data->UniformBlocks[i], 0))
return;
}
/* Add program shader storage blocks. */
for (unsigned i = 0; i < shProg->data->NumShaderStorageBlocks; i++) {
if (!link_util_add_program_resource(shProg, resource_set, GL_SHADER_STORAGE_BLOCK,
&shProg->data->ShaderStorageBlocks[i], 0))
return;
}
/* Add atomic counter buffers. */
for (unsigned i = 0; i < shProg->data->NumAtomicBuffers; i++) {
if (!link_util_add_program_resource(shProg, resource_set, GL_ATOMIC_COUNTER_BUFFER,
&shProg->data->AtomicBuffers[i], 0))
return;
}
for (unsigned i = 0; i < shProg->data->NumUniformStorage; i++) {
GLenum type;
if (!shProg->data->UniformStorage[i].hidden)
continue;
for (int j = MESA_SHADER_VERTEX; j < MESA_SHADER_STAGES; j++) {
if (!shProg->data->UniformStorage[i].opaque[j].active ||
!shProg->data->UniformStorage[i].type->is_subroutine())
continue;
type = _mesa_shader_stage_to_subroutine_uniform((gl_shader_stage)j);
/* add shader subroutines */
if (!link_util_add_program_resource(shProg, resource_set,
type, &shProg->data->UniformStorage[i], 0))
return;
}
}
unsigned mask = shProg->data->linked_stages;
while (mask) {
const int i = u_bit_scan(&mask);
struct gl_program *p = shProg->_LinkedShaders[i]->Program;
GLuint type = _mesa_shader_stage_to_subroutine((gl_shader_stage)i);
for (unsigned j = 0; j < p->sh.NumSubroutineFunctions; j++) {
if (!link_util_add_program_resource(shProg, resource_set,
type, &p->sh.SubroutineFunctions[j], 0))
return;
}
}
_mesa_set_destroy(resource_set, NULL);
}

View File

@@ -46,8 +46,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog);
extern void
build_program_resource_list(const struct gl_constants *consts,
struct gl_shader_program *shProg,
bool add_packed_varyings_only);
struct gl_shader_program *shProg);
extern long
parse_program_resource_name(const GLchar *name, const size_t len,