st/mesa/r200/i915/i965: use rzalloc() to create gl_program
authorTimothy Arceri <timothy.arceri@collabora.com>
Wed, 2 Nov 2016 22:18:17 +0000 (09:18 +1100)
committerTimothy Arceri <timothy.arceri@collabora.com>
Wed, 2 Nov 2016 23:39:13 +0000 (10:39 +1100)
This allows us to use ralloc_parent() to see which data structure owns
shader_info which allows us to fix a regression in nir_sweep().

This will also allow us to move some fields from gl_linked_shader to
gl_program, which will allow us to do some clean-ups like storing
gl_program directly in the CurrentProgram array in gl_pipeline_object
enabling some small validation optimisations at draw time.

Also it is error prone to depend on the gl_linked_shader for
programs in current use because a failed linking attempt will free
infomation about the current program. In i965 we could be trying
to recompile a shader variant but may have lost some required fields.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i915/i915_fragprog.c
src/mesa/drivers/dri/i965/brw_program.c
src/mesa/drivers/dri/r200/r200_vertprog.c
src/mesa/program/program.c
src/mesa/state_tracker/st_cb_program.c

index a57125412eacb2d70b18d5d8c26604003fc5cbd6..2ad9eb23e75ed13970d35d7b3bd4a2275c4de414 100644 (file)
@@ -1148,13 +1148,13 @@ i915NewProgram(struct gl_context * ctx, GLenum target, GLuint id)
 {
    switch (target) {
    case GL_VERTEX_PROGRAM_ARB: {
-      struct gl_program *prog = CALLOC_STRUCT(gl_program);
+      struct gl_program *prog = rzalloc(NULL, struct gl_program);
       return _mesa_init_gl_program(prog, target, id);
    }
 
    case GL_FRAGMENT_PROGRAM_ARB:{
          struct i915_fragment_program *prog =
-            CALLOC_STRUCT(i915_fragment_program);
+            rzalloc(NULL, struct i915_fragment_program);
          if (prog) {
             i915_init_program(I915_CONTEXT(ctx), prog);
 
index 8f01502642121025b1e4cde0ed010e3dac49ff1b..647f138f0a39245ba2fd0540243cb9d7abfa002b 100644 (file)
@@ -135,7 +135,7 @@ static struct gl_program *brwNewProgram( struct gl_context *ctx,
    case GL_TESS_EVALUATION_PROGRAM_NV:
    case GL_GEOMETRY_PROGRAM_NV:
    case GL_COMPUTE_PROGRAM_NV: {
-      struct brw_program *prog = CALLOC_STRUCT(brw_program);
+      struct brw_program *prog = rzalloc(NULL, struct brw_program);
       if (prog) {
         prog->id = get_new_program_id(brw->screen);
 
@@ -149,7 +149,7 @@ static struct gl_program *brwNewProgram( struct gl_context *ctx,
       struct brw_program *prog;
       if (brw->gen < 6) {
          struct gen4_fragment_program *g4_prog =
-            CALLOC_STRUCT(gen4_fragment_program);
+            rzalloc(NULL, struct gen4_fragment_program);
          prog = &g4_prog->base;
       } else {
          prog = CALLOC_STRUCT(brw_program);
index 3f1d53e7270457289c940d5c1af93984f10d625d..5965c6e8048c6379e6a75f3807756a791ca224c9 100644 (file)
@@ -1203,11 +1203,12 @@ r200NewProgram(struct gl_context *ctx, GLenum target, GLuint id)
 {
    switch(target){
    case GL_VERTEX_PROGRAM_ARB: {
-      struct r200_vertex_program *vp = CALLOC_STRUCT(r200_vertex_program);
+      struct r200_vertex_program *vp = rzalloc(NULL,
+                                               struct r200_vertex_program);
       return _mesa_init_gl_program(&vp->mesa_program, target, id);
    }
    case GL_FRAGMENT_PROGRAM_ARB: {
-      struct gl_program *prog = CALLOC_STRUCT(gl_program);
+      struct gl_program *prog = rzalloc(NULL, struct gl_program);
       return _mesa_init_gl_program(prog, target, id);
    }
    default:
index 3b7745b905ac980ee9435f874520040fe727fd46..f4b36f4cbf27312c188a16ac73c745a495784dc4 100644 (file)
@@ -221,7 +221,7 @@ _mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id)
    case GL_TESS_EVALUATION_PROGRAM_NV:
    case GL_FRAGMENT_PROGRAM_ARB:
    case GL_COMPUTE_PROGRAM_NV: {
-      struct gl_program *prog = CALLOC_STRUCT(gl_program);
+      struct gl_program *prog = rzalloc(NULL, struct gl_program);
       return _mesa_init_gl_program(prog, target, id);
    }
    default:
@@ -262,7 +262,7 @@ _mesa_delete_program(struct gl_context *ctx, struct gl_program *prog)
    }
 
    mtx_destroy(&prog->Mutex);
-   free(prog);
+   ralloc_free(prog);
 }
 
 
index 48720a3656ef3044ab9eab9ff3a0f38fe96fb379..77b7a26379615c35755482a663d04066198fc1c3 100644 (file)
@@ -58,27 +58,33 @@ st_new_program(struct gl_context *ctx, GLenum target, GLuint id)
 {
    switch (target) {
    case GL_VERTEX_PROGRAM_ARB: {
-      struct st_vertex_program *prog = ST_CALLOC_STRUCT(st_vertex_program);
+      struct st_vertex_program *prog = rzalloc(NULL,
+                                               struct st_vertex_program);
       return _mesa_init_gl_program(&prog->Base, target, id);
    }
    case GL_FRAGMENT_PROGRAM_ARB: {
-      struct st_fragment_program *prog = ST_CALLOC_STRUCT(st_fragment_program);
+      struct st_fragment_program *prog = rzalloc(NULL,
+                                                 struct st_fragment_program);
       return _mesa_init_gl_program(&prog->Base, target, id);
    }
    case GL_GEOMETRY_PROGRAM_NV: {
-      struct st_geometry_program *prog = ST_CALLOC_STRUCT(st_geometry_program);
+      struct st_geometry_program *prog = rzalloc(NULL,
+                                                 struct st_geometry_program);
       return _mesa_init_gl_program(&prog->Base, target, id);
    }
    case GL_TESS_CONTROL_PROGRAM_NV: {
-      struct st_tessctrl_program *prog = ST_CALLOC_STRUCT(st_tessctrl_program);
+      struct st_tessctrl_program *prog = rzalloc(NULL,
+                                                 struct st_tessctrl_program);
       return _mesa_init_gl_program(&prog->Base, target, id);
    }
    case GL_TESS_EVALUATION_PROGRAM_NV: {
-      struct st_tesseval_program *prog = ST_CALLOC_STRUCT(st_tesseval_program);
+      struct st_tesseval_program *prog = rzalloc(NULL,
+                                                 struct st_tesseval_program);
       return _mesa_init_gl_program(&prog->Base, target, id);
    }
    case GL_COMPUTE_PROGRAM_NV: {
-      struct st_compute_program *prog = ST_CALLOC_STRUCT(st_compute_program);
+      struct st_compute_program *prog = rzalloc(NULL,
+                                                struct st_compute_program);
       return _mesa_init_gl_program(&prog->Base, target, id);
    }
    default: