st/mesa/r200/i915/i965: use rzalloc() to create gl_program
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>
This commit is contained in:
@@ -1148,13 +1148,13 @@ i915NewProgram(struct gl_context * ctx, GLenum target, GLuint id)
|
|||||||
{
|
{
|
||||||
switch (target) {
|
switch (target) {
|
||||||
case GL_VERTEX_PROGRAM_ARB: {
|
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);
|
return _mesa_init_gl_program(prog, target, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
case GL_FRAGMENT_PROGRAM_ARB:{
|
case GL_FRAGMENT_PROGRAM_ARB:{
|
||||||
struct i915_fragment_program *prog =
|
struct i915_fragment_program *prog =
|
||||||
CALLOC_STRUCT(i915_fragment_program);
|
rzalloc(NULL, struct i915_fragment_program);
|
||||||
if (prog) {
|
if (prog) {
|
||||||
i915_init_program(I915_CONTEXT(ctx), prog);
|
i915_init_program(I915_CONTEXT(ctx), prog);
|
||||||
|
|
||||||
|
@@ -135,7 +135,7 @@ static struct gl_program *brwNewProgram( struct gl_context *ctx,
|
|||||||
case GL_TESS_EVALUATION_PROGRAM_NV:
|
case GL_TESS_EVALUATION_PROGRAM_NV:
|
||||||
case GL_GEOMETRY_PROGRAM_NV:
|
case GL_GEOMETRY_PROGRAM_NV:
|
||||||
case GL_COMPUTE_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) {
|
if (prog) {
|
||||||
prog->id = get_new_program_id(brw->screen);
|
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;
|
struct brw_program *prog;
|
||||||
if (brw->gen < 6) {
|
if (brw->gen < 6) {
|
||||||
struct gen4_fragment_program *g4_prog =
|
struct gen4_fragment_program *g4_prog =
|
||||||
CALLOC_STRUCT(gen4_fragment_program);
|
rzalloc(NULL, struct gen4_fragment_program);
|
||||||
prog = &g4_prog->base;
|
prog = &g4_prog->base;
|
||||||
} else {
|
} else {
|
||||||
prog = CALLOC_STRUCT(brw_program);
|
prog = CALLOC_STRUCT(brw_program);
|
||||||
|
@@ -1203,11 +1203,12 @@ r200NewProgram(struct gl_context *ctx, GLenum target, GLuint id)
|
|||||||
{
|
{
|
||||||
switch(target){
|
switch(target){
|
||||||
case GL_VERTEX_PROGRAM_ARB: {
|
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);
|
return _mesa_init_gl_program(&vp->mesa_program, target, id);
|
||||||
}
|
}
|
||||||
case GL_FRAGMENT_PROGRAM_ARB: {
|
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);
|
return _mesa_init_gl_program(prog, target, id);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@@ -221,7 +221,7 @@ _mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id)
|
|||||||
case GL_TESS_EVALUATION_PROGRAM_NV:
|
case GL_TESS_EVALUATION_PROGRAM_NV:
|
||||||
case GL_FRAGMENT_PROGRAM_ARB:
|
case GL_FRAGMENT_PROGRAM_ARB:
|
||||||
case GL_COMPUTE_PROGRAM_NV: {
|
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);
|
return _mesa_init_gl_program(prog, target, id);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -262,7 +262,7 @@ _mesa_delete_program(struct gl_context *ctx, struct gl_program *prog)
|
|||||||
}
|
}
|
||||||
|
|
||||||
mtx_destroy(&prog->Mutex);
|
mtx_destroy(&prog->Mutex);
|
||||||
free(prog);
|
ralloc_free(prog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -58,27 +58,33 @@ st_new_program(struct gl_context *ctx, GLenum target, GLuint id)
|
|||||||
{
|
{
|
||||||
switch (target) {
|
switch (target) {
|
||||||
case GL_VERTEX_PROGRAM_ARB: {
|
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);
|
return _mesa_init_gl_program(&prog->Base, target, id);
|
||||||
}
|
}
|
||||||
case GL_FRAGMENT_PROGRAM_ARB: {
|
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);
|
return _mesa_init_gl_program(&prog->Base, target, id);
|
||||||
}
|
}
|
||||||
case GL_GEOMETRY_PROGRAM_NV: {
|
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);
|
return _mesa_init_gl_program(&prog->Base, target, id);
|
||||||
}
|
}
|
||||||
case GL_TESS_CONTROL_PROGRAM_NV: {
|
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);
|
return _mesa_init_gl_program(&prog->Base, target, id);
|
||||||
}
|
}
|
||||||
case GL_TESS_EVALUATION_PROGRAM_NV: {
|
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);
|
return _mesa_init_gl_program(&prog->Base, target, id);
|
||||||
}
|
}
|
||||||
case GL_COMPUTE_PROGRAM_NV: {
|
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);
|
return _mesa_init_gl_program(&prog->Base, target, id);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
Reference in New Issue
Block a user