mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
st: do proper refcounting for framebuffer surfaces
This commit is contained in:
parent
f5cf181c65
commit
f104e4d666
2 changed files with 17 additions and 6 deletions
|
|
@ -98,8 +98,6 @@ update_framebuffer_state( struct st_context *st )
|
|||
struct st_renderbuffer *strb;
|
||||
GLuint i;
|
||||
|
||||
memset(framebuffer, 0, sizeof(*framebuffer));
|
||||
|
||||
framebuffer->width = fb->Width;
|
||||
framebuffer->height = fb->Height;
|
||||
|
||||
|
|
@ -120,12 +118,19 @@ update_framebuffer_state( struct st_context *st )
|
|||
}
|
||||
|
||||
if (strb->surface) {
|
||||
framebuffer->cbufs[framebuffer->nr_cbufs] = strb->surface;
|
||||
pipe_surface_reference(&framebuffer->cbufs[framebuffer->nr_cbufs],
|
||||
strb->surface);
|
||||
framebuffer->nr_cbufs++;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (i = framebuffer->nr_cbufs; i < PIPE_MAX_COLOR_BUFS; i++) {
|
||||
pipe_surface_reference(&framebuffer->cbufs[i], NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Depth/Stencil renderbuffer/surface.
|
||||
*/
|
||||
strb = st_renderbuffer(fb->Attachment[BUFFER_DEPTH].Renderbuffer);
|
||||
if (strb) {
|
||||
strb = st_renderbuffer(strb->Base.Wrapped);
|
||||
|
|
@ -133,15 +138,14 @@ update_framebuffer_state( struct st_context *st )
|
|||
/* rendering to a GL texture, may have to update surface */
|
||||
update_renderbuffer_surface(st, strb);
|
||||
}
|
||||
|
||||
framebuffer->zsbuf = strb->surface;
|
||||
pipe_surface_reference(&framebuffer->zsbuf, strb->surface);
|
||||
}
|
||||
else {
|
||||
strb = st_renderbuffer(fb->Attachment[BUFFER_STENCIL].Renderbuffer);
|
||||
if (strb) {
|
||||
strb = st_renderbuffer(strb->Base.Wrapped);
|
||||
assert(strb->surface);
|
||||
framebuffer->zsbuf = strb->surface;
|
||||
pipe_surface_reference(&framebuffer->zsbuf, strb->surface);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -233,6 +233,7 @@ void st_destroy_context( struct st_context *st )
|
|||
struct pipe_context *pipe = st->pipe;
|
||||
struct cso_context *cso = st->cso_context;
|
||||
GLcontext *ctx = st->ctx;
|
||||
GLuint i;
|
||||
|
||||
/* need to unbind and destroy CSO objects before anything else */
|
||||
cso_release_all(st->cso_context);
|
||||
|
|
@ -240,6 +241,12 @@ void st_destroy_context( struct st_context *st )
|
|||
st_reference_fragprog(st, &st->fp, NULL);
|
||||
st_reference_vertprog(st, &st->vp, NULL);
|
||||
|
||||
/* release framebuffer surfaces */
|
||||
for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
|
||||
pipe_surface_reference(&st->state.framebuffer.cbufs[i], NULL);
|
||||
}
|
||||
pipe_surface_reference(&st->state.framebuffer.zsbuf, NULL);
|
||||
|
||||
_mesa_delete_program_cache(st->ctx, st->pixel_xfer.cache);
|
||||
|
||||
_vbo_DestroyContext(st->ctx);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue