[Mesa-dev] [PATCH 1/3] st/mesa/r200/i915/i965: use rzalloc() to create gl_program
Tapani Pälli
tapani.palli at intel.com
Thu Nov 3 07:16:44 UTC 2016
On 11/03/2016 12:18 AM, Timothy Arceri wrote:
> This will 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.
FYI for me this change is breaking a lot of tests and apps. Most of
backtraces seem to relate to releasing of shared state
(free_shared_state) but then also to shader cache
(_mesa_delete_shader_cache).
> Cc: Eric Anholt <eric at anholt.net>
> ---
> src/mesa/drivers/dri/i915/i915_fragprog.c | 4 ++--
> src/mesa/drivers/dri/i965/brw_program.c | 4 ++--
> src/mesa/drivers/dri/r200/r200_vertprog.c | 5 +++--
> src/mesa/program/program.c | 4 ++--
> src/mesa/state_tracker/st_cb_program.c | 18 ++++++++++++------
> 5 files changed, 21 insertions(+), 14 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i915/i915_fragprog.c b/src/mesa/drivers/dri/i915/i915_fragprog.c
> index a571254..2ad9eb2 100644
> --- a/src/mesa/drivers/dri/i915/i915_fragprog.c
> +++ b/src/mesa/drivers/dri/i915/i915_fragprog.c
> @@ -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);
>
> diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c
> index 8f01502..647f138 100644
> --- a/src/mesa/drivers/dri/i965/brw_program.c
> +++ b/src/mesa/drivers/dri/i965/brw_program.c
> @@ -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);
> diff --git a/src/mesa/drivers/dri/r200/r200_vertprog.c b/src/mesa/drivers/dri/r200/r200_vertprog.c
> index 3f1d53e..5965c6e 100644
> --- a/src/mesa/drivers/dri/r200/r200_vertprog.c
> +++ b/src/mesa/drivers/dri/r200/r200_vertprog.c
> @@ -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:
> diff --git a/src/mesa/program/program.c b/src/mesa/program/program.c
> index 3b7745b..f4b36f4 100644
> --- a/src/mesa/program/program.c
> +++ b/src/mesa/program/program.c
> @@ -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);
> }
>
>
> diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c
> index 48720a3..77b7a26 100644
> --- a/src/mesa/state_tracker/st_cb_program.c
> +++ b/src/mesa/state_tracker/st_cb_program.c
> @@ -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:
>
More information about the mesa-dev
mailing list