On Thu, Dec 22, 2011 at 02:33:03PM -0800, Kenneth Graunke wrote:
> On 12/21/2011 01:33 AM, Yuanhan Liu wrote:
> > 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'.
> > 
> > Signed-off-by: Yuanhan Liu <yuanhan....@linux.intel.com>
> > ---
> >  src/mesa/drivers/dri/i965/brw_eu.c      |    7 +++++++
> >  src/mesa/drivers/dri/i965/brw_eu.h      |    7 ++++---
> >  src/mesa/drivers/dri/i965/brw_eu_emit.c |   12 +++++++++++-
> >  3 files changed, 22 insertions(+), 4 deletions(-)
> > 
> > diff --git a/src/mesa/drivers/dri/i965/brw_eu.c 
> > b/src/mesa/drivers/dri/i965/brw_eu.c
> > index 9b4dde8..7d206f3 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 it meet the BRW_EU_MAX_INSN
> > +    */
> > +   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 9d3d7de..52567c2 100644
> > --- a/src/mesa/drivers/dri/i965/brw_eu.h
> > +++ b/src/mesa/drivers/dri/i965/brw_eu.h
> > @@ -100,11 +100,12 @@ struct brw_glsl_call;
> >  
> >  
> >  
> > -#define BRW_EU_MAX_INSN_STACK 5
> > -#define BRW_EU_MAX_INSN 10000
> > +#define BRW_EU_MAX_INSN_STACK   5
> > +#define BRW_EU_MAX_INSN         (1024 * 1024)
> 
> I'm actually surprised to see BRW_EU_MAX_INSN at all.  As far as I know,
> there isn't an actual hardware limit on the number of instructions,

Glad to know that. Thanks.

> so
> I'm not sure why we should cap it at all.  Especially not to some
> arbitrary number.  (I'm assuming that 1024 * 1024 is just something you
> came up with arbitrarily...)

Aha, yes, you are right, I made it. :)



Here is the fixed patch, please help to review it:

>From 66c30acdeae88cdba07ed85443b04d4bc6c56792 Mon Sep 17 00:00:00 2001
From: Yuanhan Liu <yuanhan....@linux.intel.com>
Date: Wed, 21 Dec 2011 15:38:44 +0800
Subject: [PATCH] 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 <yuanhan....@linux.intel.com>
---
 src/mesa/drivers/dri/i965/brw_eu.c      |    7 +++++++
 src/mesa/drivers/dri/i965/brw_eu.h      |    4 ++--
 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 9b4dde8..2b0593a 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 cc2f618..a41e988 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 829d92c..9288f9b 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));
-- 
1.7.4.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to