mesa: Branch 'master'

Eric Anholt anholt at kemper.freedesktop.org
Sat Dec 9 22:36:40 PST 2006


 src/mesa/drivers/dri/i965/brw_context.h |    1 
 src/mesa/drivers/dri/i965/brw_wm.c      |   49 +++++++++++++++++++-------------
 2 files changed, 31 insertions(+), 19 deletions(-)

New commits:
diff-tree d7b24fec245f90db4b8c66f4f7c167b8f20a9b9e (from f79360858d4c94629ef543a35e4e44a13419ac0e)
Author: Eric Anholt <eric at anholt.net>
Date:   Sat Dec 9 22:35:07 2006 -0800

    i965: Fix a crash with wine by not allocating >1MB on the stack.

diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index a57c794..cac4d86 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -599,6 +599,7 @@ struct brw_context 
 
    struct {
       struct brw_wm_prog_data *prog_data;
+      struct brw_wm_compile *compile_data;
 
       /* Input sizes, calculated from active vertex program:
        */
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index 3e2f2d0..0f842d2 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -138,64 +138,75 @@ static void do_wm_prog( struct brw_conte
 			struct brw_fragment_program *fp, 
 			struct brw_wm_prog_key *key)
 {
-   struct brw_wm_compile c;
+   struct brw_wm_compile *c;
    const GLuint *program;
    GLuint program_size;
 
-   memset(&c, 0, sizeof(c));
-   memcpy(&c.key, key, sizeof(*key));
+   c = brw->wm.compile_data;
+   if (c == NULL) {
+     brw->wm.compile_data = calloc(1, sizeof(*brw->wm.compile_data));
+     c = brw->wm.compile_data;
+   } else {
+     memset(c, 0, sizeof(*brw->wm.compile_data));
+   }
+   memcpy(&c->key, key, sizeof(*key));
 
-   c.fp = fp;
-   c.env_param = brw->intel.ctx.FragmentProgram.Parameters;
+   c->fp = fp;
+   c->env_param = brw->intel.ctx.FragmentProgram.Parameters;
 
 
    /* Augment fragment program.  Add instructions for pre- and
     * post-fragment-program tasks such as interpolation and fogging.
     */
-   brw_wm_pass_fp(&c);
+   brw_wm_pass_fp(c);
    
    /* Translate to intermediate representation.  Build register usage
     * chains.
     */
-   brw_wm_pass0(&c);
+   brw_wm_pass0(c);
 
    /* Dead code removal.
     */
-   brw_wm_pass1(&c);
+   brw_wm_pass1(c);
 
    /* Hal optimization
     */
-   brw_wm_pass_hal (&c);
+   brw_wm_pass_hal (c);
    
    /* Register allocation.
     */
-   c.grf_limit = BRW_WM_MAX_GRF/2;
+   c->grf_limit = BRW_WM_MAX_GRF/2;
 
    /* This is where we start emitting gen4 code:
     */
-   brw_init_compile(&c.func);    
+   brw_init_compile(&c->func);    
 
-   brw_wm_pass2(&c);
+   brw_wm_pass2(c);
 
-   c.prog_data.total_grf = c.max_wm_grf;
-   c.prog_data.total_scratch = c.last_scratch ? c.last_scratch + 0x40 : 0;
+   c->prog_data.total_grf = c->max_wm_grf;
+   if (c->last_scratch) {
+      c->prog_data.total_scratch =
+	 c->last_scratch + 0x40;
+   } else {
+      c->prog_data.total_scratch = 0;
+   }
 
    /* Emit GEN4 code.
     */
-   brw_wm_emit(&c);
+   brw_wm_emit(c);
 
    /* get the program
     */
-   program = brw_get_program(&c.func, &program_size);
+   program = brw_get_program(&c->func, &program_size);
 
    /*
     */
    brw->wm.prog_gs_offset = brw_upload_cache( &brw->cache[BRW_WM_PROG],
-					      &c.key,
-					      sizeof(c.key),
+					      &c->key,
+					      sizeof(c->key),
 					      program,
 					      program_size,
-					      &c.prog_data,
+					      &c->prog_data,
 					      &brw->wm.prog_data );
 }
 


More information about the mesa-commit mailing list