gl-renderer: Regroup renderbuffer creation functions

Move gl_renderer_create_renderuffer_dmabuf() along with the other
renderbuffer creation functions, using a common naming pattern.

Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
This commit is contained in:
Loïc Molinari 2024-08-05 13:11:55 +02:00
parent c5e6fa7103
commit 092076f6f5

View file

@ -780,7 +780,7 @@ gl_renderer_discard_renderbuffers(struct gl_output_state *go,
}
static struct gl_renderbuffer *
gl_renderer_create_dummy_renderbuffer(struct weston_output *output)
gl_renderer_create_renderbuffer_dummy(struct weston_output *output)
{
struct gl_renderbuffer *renderbuffer;
@ -853,6 +853,70 @@ gl_renderer_create_fbo(struct weston_output *output,
return (weston_renderbuffer_t) renderbuffer;
}
static EGLImageKHR
import_simple_dmabuf(struct gl_renderer *, const struct dmabuf_attributes *);
static weston_renderbuffer_t
gl_renderer_create_renderbuffer_dmabuf(struct weston_output *output,
struct linux_dmabuf_memory *dmabuf,
weston_renderbuffer_discarded_func discarded_cb,
void *user_data)
{
struct gl_renderer *gr = get_renderer(output->compositor);
struct dmabuf_attributes *attributes = dmabuf->attributes;
struct gl_renderbuffer *renderbuffer;
int fb_status;
GLuint fb;
renderbuffer = xzalloc(sizeof(*renderbuffer));
renderbuffer->dmabuf.image = import_simple_dmabuf(gr, attributes);
if (renderbuffer->dmabuf.image == EGL_NO_IMAGE_KHR) {
weston_log("Failed to import dmabuf renderbuffer\n");
free(renderbuffer);
return NULL;
}
glGenFramebuffers(1, &fb);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glGenRenderbuffers(1, &renderbuffer->dmabuf.rb);
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer->dmabuf.rb);
gr->image_target_renderbuffer_storage(GL_RENDERBUFFER,
renderbuffer->dmabuf.image);
if (glGetError() == GL_INVALID_OPERATION) {
weston_log("Failed to create renderbuffer\n");
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glDeleteRenderbuffers(1, &renderbuffer->dmabuf.rb);
gr->destroy_image(gr->egl_display, renderbuffer->dmabuf.image);
free(renderbuffer);
return NULL;
}
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER, renderbuffer->dmabuf.rb);
fb_status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
if (fb_status != GL_FRAMEBUFFER_COMPLETE) {
weston_log("failed to bind renderbuffer to fbo\n");
glDeleteFramebuffers(1, &fb);
glDeleteRenderbuffers(1, &renderbuffer->dmabuf.rb);
gr->destroy_image(gr->egl_display, renderbuffer->dmabuf.image);
free(renderbuffer);
return NULL;
}
renderbuffer->dmabuf.gr = gr;
renderbuffer->dmabuf.memory = dmabuf;
gl_renderbuffer_init(renderbuffer, RENDERBUFFER_DMABUF,
BORDER_STATUS_CLEAN, fb, discarded_cb, user_data,
output);
return (weston_renderbuffer_t) renderbuffer;
}
static bool
gl_renderer_do_read_pixels(struct gl_renderer *gr,
struct gl_output_state *go,
@ -2228,7 +2292,7 @@ output_get_dummy_renderbuffer(struct weston_output *output)
}
/* or create a new dummy renderbuffer */
return gl_renderer_create_dummy_renderbuffer(output);
return gl_renderer_create_renderbuffer_dummy(output);
}
/**
@ -4254,67 +4318,6 @@ gl_renderer_output_fbo_create(struct weston_output *output,
&options->fb_size, &options->area);
}
static weston_renderbuffer_t
gl_renderer_create_renderbuffer_dmabuf(struct weston_output *output,
struct linux_dmabuf_memory *dmabuf,
weston_renderbuffer_discarded_func discarded_cb,
void *user_data)
{
struct gl_renderer *gr = get_renderer(output->compositor);
struct dmabuf_attributes *attributes = dmabuf->attributes;
struct gl_renderbuffer *renderbuffer;
int fb_status;
GLuint fb;
renderbuffer = xzalloc(sizeof(*renderbuffer));
renderbuffer->dmabuf.image = import_simple_dmabuf(gr, attributes);
if (renderbuffer->dmabuf.image == EGL_NO_IMAGE_KHR) {
weston_log("Failed to import dmabuf renderbuffer\n");
free(renderbuffer);
return NULL;
}
glGenFramebuffers(1, &fb);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glGenRenderbuffers(1, &renderbuffer->dmabuf.rb);
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer->dmabuf.rb);
gr->image_target_renderbuffer_storage(GL_RENDERBUFFER,
renderbuffer->dmabuf.image);
if (glGetError() == GL_INVALID_OPERATION) {
weston_log("Failed to create renderbuffer\n");
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glDeleteRenderbuffers(1, &renderbuffer->dmabuf.rb);
gr->destroy_image(gr->egl_display, renderbuffer->dmabuf.image);
free(renderbuffer);
return NULL;
}
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER, renderbuffer->dmabuf.rb);
fb_status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
if (fb_status != GL_FRAMEBUFFER_COMPLETE) {
weston_log("failed to bind renderbuffer to fbo\n");
glDeleteFramebuffers(1, &fb);
glDeleteRenderbuffers(1, &renderbuffer->dmabuf.rb);
gr->destroy_image(gr->egl_display, renderbuffer->dmabuf.image);
free(renderbuffer);
return NULL;
}
renderbuffer->dmabuf.gr = gr;
renderbuffer->dmabuf.memory = dmabuf;
gl_renderbuffer_init(renderbuffer, RENDERBUFFER_DMABUF,
BORDER_STATUS_CLEAN, fb, discarded_cb, user_data,
output);
return (weston_renderbuffer_t) renderbuffer;
}
#ifdef HAVE_GBM
static void
gl_renderer_dmabuf_destroy(struct linux_dmabuf_memory *dmabuf)