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:
Timothy Arceri 2020-01-07 10:27:39 +11:00
parent b85985dd51
commit 05c1f7a154
3 changed files with 86 additions and 80 deletions

View file

@ -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);

View file

@ -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);
}
}
}

View file

@ -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