From 21d4dd8c39d89745b18ab6f365ecb6666685dd4f Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Mon, 20 Dec 2021 16:42:47 +1000 Subject: [PATCH] mesa/st: move some renderbuffer code into mesa Reviewed-by: Kristian H. Kristensen Part-of: --- src/mesa/main/fbobject.c | 19 +++++++++++-- src/mesa/main/renderbuffer.c | 12 +++++++- src/mesa/state_tracker/st_cb_fbo.c | 44 ++---------------------------- src/mesa/state_tracker/st_cb_fbo.h | 6 +++- 4 files changed, 35 insertions(+), 46 deletions(-) diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index c09c0cae952..96ca680393a 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -52,6 +52,7 @@ #include "texobj.h" #include "api_exec_decl.h" +#include "util/u_memory.h" #include "state_tracker/st_cb_fbo.h" #include "state_tracker/st_cb_eglimage.h" #include "state_tracker/st_context.h" @@ -465,6 +466,20 @@ driver_RenderTexture_is_safe(const struct gl_renderbuffer_attachment *att) return true; } +static struct gl_renderbuffer * +new_renderbuffer(struct gl_context *ctx, GLuint name) +{ + struct gl_renderbuffer *rb = CALLOC_STRUCT(gl_renderbuffer); + if (rb) { + assert(name != 0); + _mesa_init_renderbuffer(rb, name); + rb->Delete = _mesa_delete_renderbuffer; + rb->AllocStorage = st_renderbuffer_alloc_storage; + return rb; + } + return NULL; +} + /** * Create a renderbuffer which will be set up by the driver to wrap the * texture image slice. @@ -489,7 +504,7 @@ _mesa_update_texture_renderbuffer(struct gl_context *ctx, rb = att->Renderbuffer; if (!rb) { - rb = st_new_renderbuffer(ctx, ~0); + rb = new_renderbuffer(ctx, ~0); if (!rb) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glFramebufferTexture()"); return; @@ -1558,7 +1573,7 @@ allocate_renderbuffer_locked(struct gl_context *ctx, GLuint renderbuffer, struct gl_renderbuffer *newRb; /* create new renderbuffer object */ - newRb = st_new_renderbuffer(ctx, renderbuffer); + newRb = new_renderbuffer(ctx, renderbuffer); if (!newRb) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", func); return NULL; diff --git a/src/mesa/main/renderbuffer.c b/src/mesa/main/renderbuffer.c index cfa0f66a1f1..97c7a95cda8 100644 --- a/src/mesa/main/renderbuffer.c +++ b/src/mesa/main/renderbuffer.c @@ -31,7 +31,7 @@ #include "mtypes.h" #include "renderbuffer.h" #include "util/u_memory.h" - +#include "util/u_inlines.h" /** * Initialize the fields of a gl_renderbuffer to default values. @@ -84,6 +84,16 @@ _mesa_init_renderbuffer(struct gl_renderbuffer *rb, GLuint name) void _mesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb) { + if (ctx) { + pipe_surface_release(ctx->pipe, &rb->surface_srgb); + pipe_surface_release(ctx->pipe, &rb->surface_linear); + } else { + pipe_surface_release_no_context(&rb->surface_srgb); + pipe_surface_release_no_context(&rb->surface_linear); + } + rb->surface = NULL; + pipe_resource_reference(&rb->texture, NULL); + free(rb->data); free(rb->Label); FREE(rb); } diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c index 46e0bc8a4e3..c9e72d3b7b4 100644 --- a/src/mesa/state_tracker/st_cb_fbo.c +++ b/src/mesa/state_tracker/st_cb_fbo.c @@ -106,7 +106,7 @@ st_renderbuffer_alloc_sw_storage(struct gl_context * ctx, * This is called to allocate the original drawing surface, and * during window resize. */ -static GLboolean +GLboolean st_renderbuffer_alloc_storage(struct gl_context * ctx, struct gl_renderbuffer *rb, GLenum internalFormat, @@ -272,46 +272,6 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx, return rb->surface != NULL; } - -/** - * gl_renderbuffer::Delete() - */ -static void -st_renderbuffer_delete(struct gl_context *ctx, struct gl_renderbuffer *rb) -{ - if (ctx) { - struct st_context *st = st_context(ctx); - pipe_surface_release(st->pipe, &rb->surface_srgb); - pipe_surface_release(st->pipe, &rb->surface_linear); - } else { - pipe_surface_release_no_context(&rb->surface_srgb); - pipe_surface_release_no_context(&rb->surface_linear); - } - rb->surface = NULL; - pipe_resource_reference(&rb->texture, NULL); - free(rb->data); - _mesa_delete_renderbuffer(ctx, rb); -} - - -/** - * Called via ctx->Driver.NewRenderbuffer() - */ -struct gl_renderbuffer * -st_new_renderbuffer(struct gl_context *ctx, GLuint name) -{ - struct gl_renderbuffer *rb = CALLOC_STRUCT(gl_renderbuffer); - if (rb) { - assert(name != 0); - _mesa_init_renderbuffer(rb, name); - rb->Delete = st_renderbuffer_delete; - rb->AllocStorage = st_renderbuffer_alloc_storage; - return rb; - } - return NULL; -} - - /** * Allocate a renderbuffer for an on-screen window (not a user-created * renderbuffer). The window system code determines the format. @@ -435,7 +395,7 @@ st_new_renderbuffer_fb(enum pipe_format format, unsigned samples, boolean sw) } /* st-specific methods */ - rb->Delete = st_renderbuffer_delete; + rb->Delete = _mesa_delete_renderbuffer; rb->AllocStorage = st_renderbuffer_alloc_storage; /* surface is allocated in st_renderbuffer_alloc_storage() */ diff --git a/src/mesa/state_tracker/st_cb_fbo.h b/src/mesa/state_tracker/st_cb_fbo.h index 6a043032671..7415243605d 100644 --- a/src/mesa/state_tracker/st_cb_fbo.h +++ b/src/mesa/state_tracker/st_cb_fbo.h @@ -73,7 +73,11 @@ extern void st_regen_renderbuffer_surface(struct st_context *st, struct gl_renderbuffer *strb); -struct gl_renderbuffer *st_new_renderbuffer(struct gl_context *ctx, GLuint name); +GLboolean +st_renderbuffer_alloc_storage(struct gl_context * ctx, + struct gl_renderbuffer *rb, + GLenum internalFormat, + GLuint width, GLuint height); void st_render_texture(struct gl_context *ctx, struct gl_framebuffer *fb, struct gl_renderbuffer_attachment *att);