Commit a6aedc66 authored by Timothy Arceri's avatar Timothy Arceri
Browse files

st/glsl_to_nir: use nir based program resource list builder



Here we use the NIR based builder to add everything to the resource
list execpt for SSO packed varyings. Since the details of those
varyings get lost during packing we leave the special handing to
the GLSL IR pass for now. In order to do this we add some bools
to the build resource list functions.

Using the NIR based resource list builder gets us a step closer to
using a native NIR based linker. It should also be faster than the
GLSL IR builder, one because the NIR optimisations should mean we
add less entries due to better optimisations, and two because nir
gives us better lists to work with and we don't need to walk the
entire IR to find the resources.
Ack-by: Alejandro Piñeiro's avatarAlejandro Piñeiro <apinheiro@igalia.com>
parent 144f54e4
......@@ -397,10 +397,11 @@ add_interface_variables(const struct gl_context *ctx,
*/
void
nir_build_program_resource_list(struct gl_context *ctx,
struct gl_shader_program *prog)
struct gl_shader_program *prog,
bool rebuild_resourse_list)
{
/* Rebuild resource list. */
if (prog->data->ProgramResourceList) {
if (prog->data->ProgramResourceList && rebuild_resourse_list) {
ralloc_free(prog->data->ProgramResourceList);
prog->data->ProgramResourceList = NULL;
prog->data->NumProgramResourceList = 0;
......
......@@ -47,7 +47,8 @@ void gl_nir_set_uniform_initializers(struct gl_context *ctx,
struct gl_shader_program *prog);
void nir_build_program_resource_list(struct gl_context *ctx,
struct gl_shader_program *prog);
struct gl_shader_program *prog,
bool rebuild_resourse_list);
void gl_nir_link_assign_atomic_counter_resources(struct gl_context *ctx,
struct gl_shader_program *prog);
......
......@@ -4124,7 +4124,8 @@ add_fragdata_arrays(const struct gl_context *ctx,
*/
void
build_program_resource_list(struct gl_context *ctx,
struct gl_shader_program *shProg)
struct gl_shader_program *shProg,
bool add_packed_varyings_only)
{
/* Rebuild resource list. */
if (shProg->data->ProgramResourceList) {
......@@ -4164,6 +4165,9 @@ build_program_resource_list(struct gl_context *ctx,
return;
}
if (add_packed_varyings_only)
return;
if (!add_fragdata_arrays(ctx, shProg, resource_set))
return;
......
......@@ -46,7 +46,8 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog);
extern void
build_program_resource_list(struct gl_context *ctx,
struct gl_shader_program *shProg);
struct gl_shader_program *shProg,
bool add_packed_varyings_only);
extern long
parse_program_resource_name(const GLchar *name,
......
......@@ -384,9 +384,9 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
/* SPIR-V programs build its resource list from linked NIR shaders. */
if (!shProg->data->spirv)
build_program_resource_list(ctx, shProg);
build_program_resource_list(ctx, shProg, false);
else
nir_build_program_resource_list(ctx, shProg);
nir_build_program_resource_list(ctx, shProg, true);
for (stage = 0; stage < ARRAY_SIZE(shProg->_LinkedShaders); stage++) {
struct gl_linked_shader *shader = shProg->_LinkedShaders[stage];
......
......@@ -3127,7 +3127,7 @@ _mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
}
}
build_program_resource_list(ctx, prog);
build_program_resource_list(ctx, prog, false);
return prog->data->LinkStatus;
}
......
......@@ -167,7 +167,7 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
validate_ir_tree(ir);
}
build_program_resource_list(ctx, prog);
build_program_resource_list(ctx, prog, use_nir);
if (use_nir)
return st_link_nir(ctx, prog);
......
......@@ -699,7 +699,7 @@ st_link_nir(struct gl_context *ctx,
if (!gl_nir_link(ctx, shader_program, &opts))
return GL_FALSE;
nir_build_program_resource_list(ctx, shader_program);
nir_build_program_resource_list(ctx, shader_program, true);
for (unsigned i = 0; i < num_shaders; i++) {
struct gl_linked_shader *shader = linked_shader[i];
......@@ -721,6 +721,9 @@ st_link_nir(struct gl_context *ctx,
linked_shader[i + 1]->Program->nir);
}
if (!shader_program->data->spirv)
nir_build_program_resource_list(ctx, shader_program, false);
for (unsigned i = 0; i < num_shaders; i++) {
struct gl_linked_shader *shader = linked_shader[i];
nir_shader *nir = shader->Program->nir;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment