aboutsummaryrefslogtreecommitdiffstats
path: root/src/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/glsl/linker.cpp38
-rw-r--r--src/compiler/glsl/linker_util.cpp37
-rw-r--r--src/compiler/glsl/linker_util.h3
3 files changed, 41 insertions, 37 deletions
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index ce0ab7ac322..ef77389add4 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -3321,42 +3321,6 @@ store_fragdepth_layout(struct gl_shader_program *prog)
}
}
-static void
-link_calculate_subroutine_compat(struct gl_shader_program *prog)
-{
- unsigned mask = prog->data->linked_stages;
- while (mask) {
- const int i = u_bit_scan(&mask);
- struct gl_program *p = prog->_LinkedShaders[i]->Program;
-
- for (unsigned j = 0; j < p->sh.NumSubroutineUniformRemapTable; j++) {
- if (p->sh.SubroutineUniformRemapTable[j] == INACTIVE_UNIFORM_EXPLICIT_LOCATION)
- continue;
-
- struct gl_uniform_storage *uni = p->sh.SubroutineUniformRemapTable[j];
-
- if (!uni)
- continue;
-
- int count = 0;
- if (p->sh.NumSubroutineFunctions == 0) {
- linker_error(prog, "subroutine uniform %s defined but no valid functions found\n", uni->type->name);
- continue;
- }
- for (unsigned f = 0; f < p->sh.NumSubroutineFunctions; f++) {
- struct gl_subroutine_function *fn = &p->sh.SubroutineFunctions[f];
- for (int k = 0; k < fn->num_compat_types; k++) {
- if (fn->types[k] == uni->type) {
- count++;
- break;
- }
- }
- }
- uni->num_compatible_subroutines = count;
- }
- }
-}
-
/**
* Validate shader image resources.
*/
@@ -4440,7 +4404,7 @@ link_and_validate_uniforms(struct gl_context *ctx,
if (prog->data->LinkStatus == LINKING_FAILURE)
return;
- link_calculate_subroutine_compat(prog);
+ link_util_calculate_subroutine_compat(prog);
if (!ctx->Const.UseNIRGLSLLinker) {
link_util_check_uniform_resources(ctx, prog);
diff --git a/src/compiler/glsl/linker_util.cpp b/src/compiler/glsl/linker_util.cpp
index bd4043df2db..80c9f2872f9 100644
--- a/src/compiler/glsl/linker_util.cpp
+++ b/src/compiler/glsl/linker_util.cpp
@@ -22,6 +22,7 @@
*
*/
#include "main/mtypes.h"
+#include "glsl_types.h"
#include "linker_util.h"
#include "util/bitscan.h"
#include "util/set.h"
@@ -250,3 +251,39 @@ link_util_check_uniform_resources(struct gl_context *ctx,
}
}
}
+
+void
+link_util_calculate_subroutine_compat(struct gl_shader_program *prog)
+{
+ unsigned mask = prog->data->linked_stages;
+ while (mask) {
+ const int i = u_bit_scan(&mask);
+ struct gl_program *p = prog->_LinkedShaders[i]->Program;
+
+ for (unsigned j = 0; j < p->sh.NumSubroutineUniformRemapTable; j++) {
+ if (p->sh.SubroutineUniformRemapTable[j] == INACTIVE_UNIFORM_EXPLICIT_LOCATION)
+ continue;
+
+ struct gl_uniform_storage *uni = p->sh.SubroutineUniformRemapTable[j];
+
+ if (!uni)
+ continue;
+
+ int count = 0;
+ if (p->sh.NumSubroutineFunctions == 0) {
+ linker_error(prog, "subroutine uniform %s defined but no valid functions found\n", uni->type->name);
+ continue;
+ }
+ for (unsigned f = 0; f < p->sh.NumSubroutineFunctions; f++) {
+ struct gl_subroutine_function *fn = &p->sh.SubroutineFunctions[f];
+ for (int k = 0; k < fn->num_compat_types; k++) {
+ if (fn->types[k] == uni->type) {
+ count++;
+ break;
+ }
+ }
+ }
+ uni->num_compatible_subroutines = count;
+ }
+ }
+}
diff --git a/src/compiler/glsl/linker_util.h b/src/compiler/glsl/linker_util.h
index 7d355d10659..53e0ca315a5 100644
--- a/src/compiler/glsl/linker_util.h
+++ b/src/compiler/glsl/linker_util.h
@@ -78,6 +78,9 @@ void
link_util_check_uniform_resources(struct gl_context *ctx,
struct gl_shader_program *prog);
+void
+link_util_calculate_subroutine_compat(struct gl_shader_program *prog);
+
#ifdef __cplusplus
}
#endif