From 209b78afd8834bd5c9e91a778bfc31bef6f33d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Mon, 12 Oct 2020 23:29:11 +0200 Subject: [PATCH] cogl/framebuffer/gl: Move OpenGL driver fields to private struct It's driver specific, so it shouldn't be kept in the generic data structure. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1496 --- cogl/cogl/cogl-framebuffer-private.h | 15 ++++-- cogl/cogl/cogl-framebuffer.c | 24 ++++++++- cogl/cogl/driver/gl/cogl-framebuffer-gl.c | 65 ++++++++++++++++------- 3 files changed, 80 insertions(+), 24 deletions(-) diff --git a/cogl/cogl/cogl-framebuffer-private.h b/cogl/cogl/cogl-framebuffer-private.h index 49df3055a..4250897a6 100644 --- a/cogl/cogl/cogl-framebuffer-private.h +++ b/cogl/cogl/cogl-framebuffer-private.h @@ -173,16 +173,15 @@ struct _CoglFramebuffer int clear_clip_y1; gboolean clear_clip_dirty; - /* driver specific */ - gboolean dirty_bitmasks; - CoglFramebufferBits bits; - int samples_per_pixel; /* Whether the depth buffer was enabled for this framebuffer, * usually means it needs to be cleared before being reused next. */ gboolean depth_buffer_clear_needed; + + gpointer driver_private; + GDestroyNotify driver_private_destroy; }; typedef enum @@ -398,4 +397,12 @@ _cogl_framebuffer_read_pixels_into_bitmap (CoglFramebuffer *framebuffer, COGL_EXPORT int _cogl_framebuffer_get_stencil_bits (CoglFramebuffer *framebuffer); +gpointer +cogl_framebuffer_get_driver_private (CoglFramebuffer *framebuffer); + +void +cogl_framebuffer_set_driver_private (CoglFramebuffer *framebuffer, + gpointer driver_private, + GDestroyNotify desrtoy_notify); + #endif /* __COGL_FRAMEBUFFER_PRIVATE_H */ diff --git a/cogl/cogl/cogl-framebuffer.c b/cogl/cogl/cogl-framebuffer.c index 8a984972b..32b0240cd 100644 --- a/cogl/cogl/cogl-framebuffer.c +++ b/cogl/cogl/cogl-framebuffer.c @@ -118,8 +118,6 @@ _cogl_framebuffer_init (CoglFramebuffer *framebuffer, framebuffer->modelview_stack = cogl_matrix_stack_new (ctx); framebuffer->projection_stack = cogl_matrix_stack_new (ctx); - framebuffer->dirty_bitmasks = TRUE; - framebuffer->samples_per_pixel = 0; framebuffer->clip_stack = NULL; @@ -192,6 +190,11 @@ _cogl_framebuffer_free (CoglFramebuffer *framebuffer) ctx->current_draw_buffer = NULL; if (ctx->current_read_buffer == framebuffer) ctx->current_read_buffer = NULL; + + if (framebuffer->driver_private_destroy) + framebuffer->driver_private_destroy (framebuffer->driver_private); + framebuffer->driver_private_destroy = NULL; + framebuffer->driver_private = NULL; } const CoglWinsysVtable * @@ -2280,3 +2283,20 @@ cogl_framebuffer_draw_textured_rectangles (CoglFramebuffer *framebuffer, rects, n_rectangles); } + +gpointer +cogl_framebuffer_get_driver_private (CoglFramebuffer *framebuffer) +{ + return framebuffer->driver_private; +} + +void +cogl_framebuffer_set_driver_private (CoglFramebuffer *framebuffer, + gpointer driver_private, + GDestroyNotify destroy_notify) +{ + g_warn_if_fail (!framebuffer->driver_private); + + framebuffer->driver_private = driver_private; + framebuffer->driver_private_destroy = destroy_notify; +} diff --git a/cogl/cogl/driver/gl/cogl-framebuffer-gl.c b/cogl/cogl/driver/gl/cogl-framebuffer-gl.c index 520beaf17..82a6af4cf 100644 --- a/cogl/cogl/driver/gl/cogl-framebuffer-gl.c +++ b/cogl/cogl/driver/gl/cogl-framebuffer-gl.c @@ -126,6 +126,11 @@ #define GL_STENCIL 0x1802 #endif +typedef struct _CoglFramebufferGl +{ + gboolean dirty_bitmasks; + CoglFramebufferBits bits; +} CoglFramebufferGl; static void _cogl_framebuffer_gl_flush_viewport_state (CoglFramebuffer *framebuffer) @@ -921,12 +926,33 @@ _cogl_framebuffer_gl_clear (CoglFramebuffer *framebuffer, GE (ctx, glClear (gl_buffers)); } +static CoglFramebufferGl * +ensure_framebuffer_gl (CoglFramebuffer *framebuffer) +{ + CoglFramebufferGl *framebuffer_gl; + + framebuffer_gl = cogl_framebuffer_get_driver_private (framebuffer); + if (!framebuffer_gl) + { + framebuffer_gl = g_new0 (CoglFramebufferGl, 1); + cogl_framebuffer_set_driver_private (framebuffer, + framebuffer_gl, + g_free); + framebuffer_gl->dirty_bitmasks = TRUE; + } + + return framebuffer_gl; +} + static inline void _cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer) { CoglContext *ctx = framebuffer->context; + CoglFramebufferGl *framebuffer_gl; - if (G_LIKELY (!framebuffer->dirty_bitmasks)) + framebuffer_gl = ensure_framebuffer_gl (framebuffer); + + if (!framebuffer_gl->dirty_bitmasks) return; cogl_framebuffer_allocate (framebuffer, NULL); @@ -970,7 +996,7 @@ _cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer) for (i = 0; i < G_N_ELEMENTS (params); i++) { int *value = - (int *) ((uint8_t *) &framebuffer->bits + params[i].offset); + (int *) ((uint8_t *) &framebuffer_gl->bits + params[i].offset); GE( ctx, glGetFramebufferAttachmentParameteriv (GL_FRAMEBUFFER, params[i].attachment, params[i].pname, @@ -980,12 +1006,12 @@ _cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer) else #endif /* HAVE_COGL_GL */ { - GE( ctx, glGetIntegerv (GL_RED_BITS, &framebuffer->bits.red) ); - GE( ctx, glGetIntegerv (GL_GREEN_BITS, &framebuffer->bits.green) ); - GE( ctx, glGetIntegerv (GL_BLUE_BITS, &framebuffer->bits.blue) ); - GE( ctx, glGetIntegerv (GL_ALPHA_BITS, &framebuffer->bits.alpha) ); - GE( ctx, glGetIntegerv (GL_DEPTH_BITS, &framebuffer->bits.depth) ); - GE( ctx, glGetIntegerv (GL_STENCIL_BITS, &framebuffer->bits.stencil) ); + GE( ctx, glGetIntegerv (GL_RED_BITS, &framebuffer_gl->bits.red) ); + GE( ctx, glGetIntegerv (GL_GREEN_BITS, &framebuffer_gl->bits.green) ); + GE( ctx, glGetIntegerv (GL_BLUE_BITS, &framebuffer_gl->bits.blue) ); + GE( ctx, glGetIntegerv (GL_ALPHA_BITS, &framebuffer_gl->bits.alpha) ); + GE( ctx, glGetIntegerv (GL_DEPTH_BITS, &framebuffer_gl->bits.depth) ); + GE( ctx, glGetIntegerv (GL_STENCIL_BITS, &framebuffer_gl->bits.stencil) ); } /* If we don't have alpha textures then the alpha bits are actually @@ -994,8 +1020,8 @@ _cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer) framebuffer->type == COGL_FRAMEBUFFER_TYPE_OFFSCREEN && framebuffer->internal_format == COGL_PIXEL_FORMAT_A_8) { - framebuffer->bits.alpha = framebuffer->bits.red; - framebuffer->bits.red = 0; + framebuffer_gl->bits.alpha = framebuffer_gl->bits.red; + framebuffer_gl->bits.red = 0; } COGL_NOTE (OFFSCREEN, @@ -1004,25 +1030,28 @@ _cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer) framebuffer->type == COGL_FRAMEBUFFER_TYPE_OFFSCREEN ? "offscreen" : "onscreen", - framebuffer->bits.red, - framebuffer->bits.blue, - framebuffer->bits.green, - framebuffer->bits.alpha, - framebuffer->bits.depth, - framebuffer->bits.stencil); + framebuffer_gl->bits.red, + framebuffer_gl->bits.blue, + framebuffer_gl->bits.green, + framebuffer_gl->bits.alpha, + framebuffer_gl->bits.depth, + framebuffer_gl->bits.stencil); - framebuffer->dirty_bitmasks = FALSE; + framebuffer_gl->dirty_bitmasks = FALSE; } void _cogl_framebuffer_gl_query_bits (CoglFramebuffer *framebuffer, CoglFramebufferBits *bits) { + CoglFramebufferGl *framebuffer_gl; + _cogl_framebuffer_init_bits (framebuffer); /* TODO: cache these in some driver specific location not * directly as part of CoglFramebuffer. */ - *bits = framebuffer->bits; + framebuffer_gl = ensure_framebuffer_gl (framebuffer); + *bits = framebuffer_gl->bits; } void