mesa/st: move some renderbuffer code into mesa

Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14675>
This commit is contained in:
Dave Airlie 2021-12-20 16:42:47 +10:00
parent 527b6ca412
commit 21d4dd8c39
4 changed files with 35 additions and 46 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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() */

View File

@ -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);