X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Frenderbuffer.c;h=5046f9d5f4227bf2da64e4db1f604b1d0d44584f;hb=eb1497e968bd4a0edc1606e8a6f708fab3248828;hp=e9d129a1dbb501a8a23f8fc2f6c558c0d9c7ce43;hpb=bfcdb843830bba0190e00e35e3c5c18c4bdb5de1;p=mesa.git diff --git a/src/mesa/main/renderbuffer.c b/src/mesa/main/renderbuffer.c index e9d129a1dbb..5046f9d5f42 100644 --- a/src/mesa/main/renderbuffer.c +++ b/src/mesa/main/renderbuffer.c @@ -44,7 +44,7 @@ _mesa_init_renderbuffer(struct gl_renderbuffer *rb, GLuint name) rb->ClassID = 0; rb->Name = name; - rb->RefCount = 0; + rb->RefCount = 1; rb->Delete = _mesa_delete_renderbuffer; /* The rest of these should be set later by the caller of this function or @@ -106,14 +106,10 @@ _mesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb) free(rb); } - -/** - * Attach a renderbuffer to a framebuffer. - * \param bufferName one of the BUFFER_x tokens - */ -void -_mesa_add_renderbuffer(struct gl_framebuffer *fb, - gl_buffer_index bufferName, struct gl_renderbuffer *rb) +static void +validate_and_init_renderbuffer_attachment(struct gl_framebuffer *fb, + gl_buffer_index bufferName, + struct gl_renderbuffer *rb) { assert(fb); assert(rb); @@ -137,6 +133,40 @@ _mesa_add_renderbuffer(struct gl_framebuffer *fb, fb->Attachment[bufferName].Type = GL_RENDERBUFFER_EXT; fb->Attachment[bufferName].Complete = GL_TRUE; +} + + +/** + * Attach a renderbuffer to a framebuffer. + * \param bufferName one of the BUFFER_x tokens + * + * This function avoids adding a reference and is therefore intended to be + * used with a freshly created renderbuffer. + */ +void +_mesa_attach_and_own_rb(struct gl_framebuffer *fb, + gl_buffer_index bufferName, + struct gl_renderbuffer *rb) +{ + assert(rb->RefCount == 1); + + validate_and_init_renderbuffer_attachment(fb, bufferName, rb); + + _mesa_reference_renderbuffer(&fb->Attachment[bufferName].Renderbuffer, + NULL); + fb->Attachment[bufferName].Renderbuffer = rb; +} + +/** + * Attach a renderbuffer to a framebuffer. + * \param bufferName one of the BUFFER_x tokens + */ +void +_mesa_attach_and_reference_rb(struct gl_framebuffer *fb, + gl_buffer_index bufferName, + struct gl_renderbuffer *rb) +{ + validate_and_init_renderbuffer_attachment(fb, bufferName, rb); _mesa_reference_renderbuffer(&fb->Attachment[bufferName].Renderbuffer, rb); } @@ -174,7 +204,6 @@ _mesa_reference_renderbuffer_(struct gl_renderbuffer **ptr, mtx_lock(&oldRb->Mutex); assert(oldRb->RefCount > 0); oldRb->RefCount--; - /*printf("RB DECR %p (%d) to %d\n", (void*) oldRb, oldRb->Name, oldRb->RefCount);*/ deleteFlag = (oldRb->RefCount == 0); mtx_unlock(&oldRb->Mutex); @@ -191,7 +220,6 @@ _mesa_reference_renderbuffer_(struct gl_renderbuffer **ptr, /* reference new renderbuffer */ mtx_lock(&rb->Mutex); rb->RefCount++; - /*printf("RB INCR %p (%d) to %d\n", (void*) rb, rb->Name, rb->RefCount);*/ mtx_unlock(&rb->Mutex); *ptr = rb; }