Mesa (master): glsl: Fail linkage when UBO exceeds GL_MAX_UNIFORM_BLOCK_SIZE.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Fri Jun 19 06:21:26 UTC 2015


Module: Mesa
Branch: master
Commit: f734d2556013e9239e91f43b563b5b1d8f03ada4
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f734d2556013e9239e91f43b563b5b1d8f03ada4

Author: Jose Fonseca <jfonseca at vmware.com>
Date:   Mon Jun 15 18:29:02 2015 +0100

glsl: Fail linkage when UBO exceeds GL_MAX_UNIFORM_BLOCK_SIZE.

It's not totally clear whether other Mesa drivers can safely cope with
over-sized UBOs, but at least for llvmpipe receiving a UBO larger than
its limit causes problems, as it won't fit into its internal display
lists.

This fixes piglit "arb_uniform_buffer_object-maxuniformblocksize
fsexceed" without regressions for llvmpipe.

NVIDIA driver also fails to link the shader from
"arb_uniform_buffer_object-maxuniformblocksize fsexceed".

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=65525

PS: I don't recommend cherry-picking this for Mesa stable, as some app
might inadvertently been relying on UBOs larger than
GL_MAX_UNIFORM_BLOCK_SIZE to work on other drivers, so even if this
commit is universally accepted it's probably best to let it mature in
master for a while.

Reviewed-by: Roland Scheidegger <sroland at vmware.com>

---

 src/glsl/linker.cpp |    7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 9978380..4a726d4 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -2355,6 +2355,13 @@ check_resources(struct gl_context *ctx, struct gl_shader_program *prog)
    unsigned total_uniform_blocks = 0;
 
    for (unsigned i = 0; i < prog->NumUniformBlocks; i++) {
+      if (prog->UniformBlocks[i].UniformBufferSize > ctx->Const.MaxUniformBlockSize) {
+         linker_error(prog, "Uniform block %s too big (%d/%d)\n",
+                      prog->UniformBlocks[i].Name,
+                      prog->UniformBlocks[i].UniformBufferSize,
+                      ctx->Const.MaxUniformBlockSize);
+      }
+
       for (unsigned j = 0; j < MESA_SHADER_STAGES; j++) {
 	 if (prog->UniformBlockStageIndex[j][i] != -1) {
 	    blocks[j]++;




More information about the mesa-commit mailing list