diff options
author | Brian Paul <brianp@vmware.com> | 2009-01-06 17:36:20 -0700 |
---|---|---|
committer | Alan Hourihane <alanh@vmware.com> | 2009-01-09 11:16:36 +0000 |
commit | ac8a33671a7aaa0527490a1615495fac73081bc0 (patch) | |
tree | dfd9fe1b7d258a70c54cff275d462a61b783c37a | |
parent | 12fe642f96a2a9439f9ac8751151ae6e7fa20049 (diff) |
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...
-rw-r--r-- | 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 5affdf988a..c2ef9c0dba 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 */ } |