summaryrefslogtreecommitdiffstats
path: root/src/glsl/linker.cpp
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2011-07-11 10:46:01 -0700
committerIan Romanick <[email protected]>2011-07-20 18:20:59 -0700
commit02c5ae1b3fef75d5c0a715313a69e6b95ebd5b95 (patch)
tree25b08fc7dd9d6dd68b32d0847f95d18ad4b19d0d /src/glsl/linker.cpp
parent1ad3ba4ad954b86751bd5b6ad0a431920bff9958 (diff)
glsl: Reject shaders that contain static recursion
The GLSL 1.20 and later specs say: "Recursion is not allowed, not even statically. Static recursion is present if the static function call graph of the program contains cycles." Recursion is detected and rejected both a compile-time and at link-time. The complie-time check happens to detect some cases that may be removed by various optimization passes. The spec doesn't seem to allow this, but other vendors (e.g., NVIDIA) appear to only check at link-time after all optimizations. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=33885 Reviewed-by: Paul Berry <[email protected]> Reviewed-by: Eric Anholt <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/glsl/linker.cpp')
-rw-r--r--src/glsl/linker.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 5ec08446d16..fe570b6cc45 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -1702,6 +1702,10 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
if (prog->_LinkedShaders[i] == NULL)
continue;
+ detect_recursion_linked(prog, prog->_LinkedShaders[i]->ir);
+ if (!prog->LinkStatus)
+ goto done;
+
while (do_common_optimization(prog->_LinkedShaders[i]->ir, true, 32))
;
}