Mesa (master): glsl: move uniform resource checks into the common linker code
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Jan 10 01:06:13 UTC 2020
Module: Mesa
Branch: master
Commit: 05c1f7a15447a9cc0f0bdd2d2f109092cb7c9f9e
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=05c1f7a15447a9cc0f0bdd2d2f109092cb7c9f9e
Author: Timothy Arceri <tarceri at itsqueeze.com>
Date: Tue Jan 7 10:27:39 2020 +1100
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 at intel.com>
---
src/compiler/glsl/linker.cpp | 81 +--------------------------------------
src/compiler/glsl/linker_util.cpp | 80 ++++++++++++++++++++++++++++++++++++++
src/compiler/glsl/linker_util.h | 5 +++
3 files changed, 86 insertions(+), 80 deletions(-)
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index 62b308bb708..2c4c0051fc6 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -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);
diff --git a/src/compiler/glsl/linker_util.cpp b/src/compiler/glsl/linker_util.cpp
index 32bc4cb33a5..bd4043df2db 100644
--- a/src/compiler/glsl/linker_util.cpp
+++ b/src/compiler/glsl/linker_util.cpp
@@ -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);
+ }
+ }
+}
diff --git a/src/compiler/glsl/linker_util.h b/src/compiler/glsl/linker_util.h
index 90ee200545a..7d355d10659 100644
--- a/src/compiler/glsl/linker_util.h
+++ b/src/compiler/glsl/linker_util.h
@@ -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
More information about the mesa-commit
mailing list