mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 17:20:10 +01:00
glsl: move uniform resource checks into the common linker code
We will call this from the nir linker in the following patch. Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
This commit is contained in:
parent
b85985dd51
commit
05c1f7a154
3 changed files with 86 additions and 80 deletions
|
|
@ -3321,85 +3321,6 @@ store_fragdepth_layout(struct gl_shader_program *prog)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the resources used by a program versus the implementation limits
|
||||
*/
|
||||
static void
|
||||
check_resources(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||
{
|
||||
unsigned total_uniform_blocks = 0;
|
||||
unsigned total_shader_storage_blocks = 0;
|
||||
|
||||
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
|
||||
struct gl_linked_shader *sh = prog->_LinkedShaders[i];
|
||||
|
||||
if (sh == NULL)
|
||||
continue;
|
||||
|
||||
if (sh->num_uniform_components >
|
||||
ctx->Const.Program[i].MaxUniformComponents) {
|
||||
if (ctx->Const.GLSLSkipStrictMaxUniformLimitCheck) {
|
||||
linker_warning(prog, "Too many %s shader default uniform block "
|
||||
"components, but the driver will try to optimize "
|
||||
"them out; this is non-portable out-of-spec "
|
||||
"behavior\n",
|
||||
_mesa_shader_stage_to_string(i));
|
||||
} else {
|
||||
linker_error(prog, "Too many %s shader default uniform block "
|
||||
"components\n",
|
||||
_mesa_shader_stage_to_string(i));
|
||||
}
|
||||
}
|
||||
|
||||
if (sh->num_combined_uniform_components >
|
||||
ctx->Const.Program[i].MaxCombinedUniformComponents) {
|
||||
if (ctx->Const.GLSLSkipStrictMaxUniformLimitCheck) {
|
||||
linker_warning(prog, "Too many %s shader uniform components, "
|
||||
"but the driver will try to optimize them out; "
|
||||
"this is non-portable out-of-spec behavior\n",
|
||||
_mesa_shader_stage_to_string(i));
|
||||
} else {
|
||||
linker_error(prog, "Too many %s shader uniform components\n",
|
||||
_mesa_shader_stage_to_string(i));
|
||||
}
|
||||
}
|
||||
|
||||
total_shader_storage_blocks += sh->Program->info.num_ssbos;
|
||||
total_uniform_blocks += sh->Program->info.num_ubos;
|
||||
}
|
||||
|
||||
if (total_uniform_blocks > ctx->Const.MaxCombinedUniformBlocks) {
|
||||
linker_error(prog, "Too many combined uniform blocks (%d/%d)\n",
|
||||
total_uniform_blocks, ctx->Const.MaxCombinedUniformBlocks);
|
||||
}
|
||||
|
||||
if (total_shader_storage_blocks > ctx->Const.MaxCombinedShaderStorageBlocks) {
|
||||
linker_error(prog, "Too many combined shader storage blocks (%d/%d)\n",
|
||||
total_shader_storage_blocks,
|
||||
ctx->Const.MaxCombinedShaderStorageBlocks);
|
||||
}
|
||||
|
||||
for (unsigned i = 0; i < prog->data->NumUniformBlocks; i++) {
|
||||
if (prog->data->UniformBlocks[i].UniformBufferSize >
|
||||
ctx->Const.MaxUniformBlockSize) {
|
||||
linker_error(prog, "Uniform block %s too big (%d/%d)\n",
|
||||
prog->data->UniformBlocks[i].Name,
|
||||
prog->data->UniformBlocks[i].UniformBufferSize,
|
||||
ctx->Const.MaxUniformBlockSize);
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned i = 0; i < prog->data->NumShaderStorageBlocks; i++) {
|
||||
if (prog->data->ShaderStorageBlocks[i].UniformBufferSize >
|
||||
ctx->Const.MaxShaderStorageBlockSize) {
|
||||
linker_error(prog, "Shader storage block %s too big (%d/%d)\n",
|
||||
prog->data->ShaderStorageBlocks[i].Name,
|
||||
prog->data->ShaderStorageBlocks[i].UniformBufferSize,
|
||||
ctx->Const.MaxShaderStorageBlockSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
link_calculate_subroutine_compat(struct gl_shader_program *prog)
|
||||
{
|
||||
|
|
@ -4520,7 +4441,7 @@ link_and_validate_uniforms(struct gl_context *ctx,
|
|||
return;
|
||||
|
||||
link_calculate_subroutine_compat(prog);
|
||||
check_resources(ctx, prog);
|
||||
link_util_check_uniform_resources(ctx, prog);
|
||||
|
||||
if (!ctx->Const.UseNIRGLSLLinker) {
|
||||
link_util_check_subroutine_resources(prog);
|
||||
|
|
|
|||
|
|
@ -170,3 +170,83 @@ link_util_check_subroutine_resources(struct gl_shader_program *prog)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate uniform resources used by a program versus the implementation limits
|
||||
*/
|
||||
void
|
||||
link_util_check_uniform_resources(struct gl_context *ctx,
|
||||
struct gl_shader_program *prog)
|
||||
{
|
||||
unsigned total_uniform_blocks = 0;
|
||||
unsigned total_shader_storage_blocks = 0;
|
||||
|
||||
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
|
||||
struct gl_linked_shader *sh = prog->_LinkedShaders[i];
|
||||
|
||||
if (sh == NULL)
|
||||
continue;
|
||||
|
||||
if (sh->num_uniform_components >
|
||||
ctx->Const.Program[i].MaxUniformComponents) {
|
||||
if (ctx->Const.GLSLSkipStrictMaxUniformLimitCheck) {
|
||||
linker_warning(prog, "Too many %s shader default uniform block "
|
||||
"components, but the driver will try to optimize "
|
||||
"them out; this is non-portable out-of-spec "
|
||||
"behavior\n",
|
||||
_mesa_shader_stage_to_string(i));
|
||||
} else {
|
||||
linker_error(prog, "Too many %s shader default uniform block "
|
||||
"components\n",
|
||||
_mesa_shader_stage_to_string(i));
|
||||
}
|
||||
}
|
||||
|
||||
if (sh->num_combined_uniform_components >
|
||||
ctx->Const.Program[i].MaxCombinedUniformComponents) {
|
||||
if (ctx->Const.GLSLSkipStrictMaxUniformLimitCheck) {
|
||||
linker_warning(prog, "Too many %s shader uniform components, "
|
||||
"but the driver will try to optimize them out; "
|
||||
"this is non-portable out-of-spec behavior\n",
|
||||
_mesa_shader_stage_to_string(i));
|
||||
} else {
|
||||
linker_error(prog, "Too many %s shader uniform components\n",
|
||||
_mesa_shader_stage_to_string(i));
|
||||
}
|
||||
}
|
||||
|
||||
total_shader_storage_blocks += sh->Program->info.num_ssbos;
|
||||
total_uniform_blocks += sh->Program->info.num_ubos;
|
||||
}
|
||||
|
||||
if (total_uniform_blocks > ctx->Const.MaxCombinedUniformBlocks) {
|
||||
linker_error(prog, "Too many combined uniform blocks (%d/%d)\n",
|
||||
total_uniform_blocks, ctx->Const.MaxCombinedUniformBlocks);
|
||||
}
|
||||
|
||||
if (total_shader_storage_blocks > ctx->Const.MaxCombinedShaderStorageBlocks) {
|
||||
linker_error(prog, "Too many combined shader storage blocks (%d/%d)\n",
|
||||
total_shader_storage_blocks,
|
||||
ctx->Const.MaxCombinedShaderStorageBlocks);
|
||||
}
|
||||
|
||||
for (unsigned i = 0; i < prog->data->NumUniformBlocks; i++) {
|
||||
if (prog->data->UniformBlocks[i].UniformBufferSize >
|
||||
ctx->Const.MaxUniformBlockSize) {
|
||||
linker_error(prog, "Uniform block %s too big (%d/%d)\n",
|
||||
prog->data->UniformBlocks[i].Name,
|
||||
prog->data->UniformBlocks[i].UniformBufferSize,
|
||||
ctx->Const.MaxUniformBlockSize);
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned i = 0; i < prog->data->NumShaderStorageBlocks; i++) {
|
||||
if (prog->data->ShaderStorageBlocks[i].UniformBufferSize >
|
||||
ctx->Const.MaxShaderStorageBlockSize) {
|
||||
linker_error(prog, "Shader storage block %s too big (%d/%d)\n",
|
||||
prog->data->ShaderStorageBlocks[i].Name,
|
||||
prog->data->ShaderStorageBlocks[i].UniformBufferSize,
|
||||
ctx->Const.MaxShaderStorageBlockSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
#ifndef GLSL_LINKER_UTIL_H
|
||||
#define GLSL_LINKER_UTIL_H
|
||||
|
||||
struct gl_context;
|
||||
struct gl_shader_program;
|
||||
struct gl_uniform_storage;
|
||||
|
||||
|
|
@ -73,6 +74,10 @@ link_util_update_empty_uniform_locations(struct gl_shader_program *prog);
|
|||
void
|
||||
link_util_check_subroutine_resources(struct gl_shader_program *prog);
|
||||
|
||||
void
|
||||
link_util_check_uniform_resources(struct gl_context *ctx,
|
||||
struct gl_shader_program *prog);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue