Mesa (master): glsl: loop unroll adjustments
Brian Paul
brianp at kemper.freedesktop.org
Wed Jan 7 00:37:50 UTC 2009
Module: Mesa
Branch: master
Commit: 0b0d0dcdef2b914dceb30a8e9a80f403b0311efc
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0b0d0dcdef2b914dceb30a8e9a80f403b0311efc
Author: Brian Paul <brianp at vmware.com>
Date: Tue Jan 6 17:36:20 2009 -0700
glsl: loop unroll adjustments
Add a "max complexity" heuristic to allow unrolling long loops with small
bodies and short loops with large bodies.
The loop unroll limits may need further tweaking...
---
src/mesa/shader/slang/slang_codegen.c | 21 ++++++++++++++++++++-
1 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c
index 0d9674f..64d72b5 100644
--- a/src/mesa/shader/slang/slang_codegen.c
+++ b/src/mesa/shader/slang/slang_codegen.c
@@ -58,11 +58,18 @@
/** Max iterations to unroll */
-const GLuint MAX_FOR_LOOP_UNROLL_ITERATIONS = 4;
+const GLuint MAX_FOR_LOOP_UNROLL_ITERATIONS = 20;
/** Max for-loop body size (in slang operations) to unroll */
const GLuint MAX_FOR_LOOP_UNROLL_BODY_SIZE = 50;
+/** Max for-loop body complexity to unroll.
+ * We'll compute complexity as the product of the number of iterations
+ * and the size of the body. So long-ish loops with very simple bodies
+ * can be unrolled, as well as short loops with larger bodies.
+ */
+const GLuint MAX_FOR_LOOP_UNROLL_COMPLEXITY = 200;
+
static slang_ir_node *
@@ -2533,6 +2540,10 @@ _slang_can_unroll_for_loop(slang_assemble_ctx * A, const slang_operation *oper)
/* get/check loop iteration limits */
start = (GLint) oper->children[0].children[0].children[1].literal[0];
end = (GLint) oper->children[1].children[0].children[1].literal[0];
+
+ if (start >= end)
+ return GL_FALSE; /* degenerate case */
+
if (end - start > MAX_FOR_LOOP_UNROLL_ITERATIONS) {
slang_info_log_print(A->log,
"Note: 'for (%s=%d; %s<%d; ++%s)' is too"
@@ -2541,6 +2552,14 @@ _slang_can_unroll_for_loop(slang_assemble_ctx * A, const slang_operation *oper)
return GL_FALSE;
}
+ if ((end - start) * bodySize > MAX_FOR_LOOP_UNROLL_COMPLEXITY) {
+ slang_info_log_print(A->log,
+ "Note: 'for (%s=%d; %s<%d; ++%s)' will generate"
+ " too much code to unroll",
+ varName, start, varName, end, varName);
+ return GL_FALSE;
+ }
+
return GL_TRUE; /* we can unroll the loop */
}
More information about the mesa-commit
mailing list