mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 00:00:11 +01:00
glsl: move calculate_subroutine_compat() to shared linker code
We will make use of this in the nir linker in the following patch. Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
This commit is contained in:
parent
c60d0bd92f
commit
726e8f24c6
3 changed files with 41 additions and 37 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue