diff options
author | Yuanhan Liu <[email protected]> | 2011-12-21 15:38:44 +0800 |
---|---|---|
committer | Yuanhan Liu <[email protected]> | 2011-12-26 11:24:42 +0800 |
commit | 3aa3c3f75894ca0eb08087c0ec3dd114eeae4bb7 (patch) | |
tree | 908db8c33bd7a990073eea8876ef6133c5b47e96 | |
parent | 8d1b378939768c4054b35b5da592af102345ebed (diff) |
i965: increase the brw eu instruction store size dynamically
Here is the final patch to enable dynamic eu instruction store size:
increase the brw eu instruction store size dynamically instead of just
allocating it statically with a constant limit. This would fix something
that 'GL_MAX_PROGRAM_INSTRUCTIONS_ARB was 16384 while the driver would
limit it to 10000'.
v2: comments from ken, do not hardcode the eu limit to (1024 * 1024)
Signed-off-by: Yuanhan Liu <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_eu.c | 7 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_eu.h | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_eu_emit.c | 10 |
3 files changed, 18 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_eu.c b/src/mesa/drivers/dri/i965/brw_eu.c index 9b4dde8c09b..2b0593ae221 100644 --- a/src/mesa/drivers/dri/i965/brw_eu.c +++ b/src/mesa/drivers/dri/i965/brw_eu.c @@ -174,6 +174,13 @@ void brw_init_compile(struct brw_context *brw, struct brw_compile *p, void *mem_ctx) { p->brw = brw; + /* + * Set the initial instruction store array size to 1024, if found that + * isn't enough, then it will double the store size at brw_next_insn() + * until out of memory. + */ + p->store_size = 1024; + p->store = rzalloc_array(mem_ctx, struct brw_instruction, p->store_size); p->nr_insn = 0; p->current = p->stack; p->compressed = false; diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h index 75642a524c4..d967d934305 100644 --- a/src/mesa/drivers/dri/i965/brw_eu.h +++ b/src/mesa/drivers/dri/i965/brw_eu.h @@ -101,10 +101,10 @@ struct brw_glsl_call; #define BRW_EU_MAX_INSN_STACK 5 -#define BRW_EU_MAX_INSN 10000 struct brw_compile { - struct brw_instruction store[BRW_EU_MAX_INSN]; + struct brw_instruction *store; + int store_size; GLuint nr_insn; void *mem_ctx; diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c index ac91820693c..c22b4083c71 100644 --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c @@ -691,7 +691,15 @@ brw_next_insn(struct brw_compile *p, GLuint opcode) { struct brw_instruction *insn; - assert(p->nr_insn + 1 < BRW_EU_MAX_INSN); + if (p->nr_insn + 1 > p->store_size) { + if (0) + printf("incresing the store size to %d\n", p->store_size << 1); + p->store_size <<= 1; + p->store = reralloc(p->mem_ctx, p->store, + struct brw_instruction, p->store_size); + if (!p->store) + assert(!"realloc eu store memeory failed"); + } insn = &p->store[p->nr_insn++]; memcpy(insn, p->current, sizeof(*insn)); |