From 5be55292699e15ff9cbcc39750564e636b867b47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Mon, 19 Oct 2020 17:43:06 +0200 Subject: [PATCH] cogl: Add CoglFramebufferDriver base type Part-of: --- cogl/cogl/cogl-framebuffer-driver.c | 123 ++++++++++++++++++ cogl/cogl/cogl-framebuffer-driver.h | 47 +++++++ .../driver/gl/cogl-framebuffer-gl-private.h | 7 +- cogl/cogl/driver/gl/cogl-framebuffer-gl.c | 8 +- cogl/cogl/meson.build | 2 + 5 files changed, 183 insertions(+), 4 deletions(-) create mode 100644 cogl/cogl/cogl-framebuffer-driver.c create mode 100644 cogl/cogl/cogl-framebuffer-driver.h diff --git a/cogl/cogl/cogl-framebuffer-driver.c b/cogl/cogl/cogl-framebuffer-driver.c new file mode 100644 index 000000000..1559de0f6 --- /dev/null +++ b/cogl/cogl/cogl-framebuffer-driver.c @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2007,2008,2009,2012 Intel Corporation. + * Copyright (C) 2019 DisplayLink (UK) Ltd. + * Copyright (C) 2020 Red Hat + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +#include "cogl-config.h" + +#include "cogl-framebuffer-driver.h" + +enum +{ + PROP_0, + + PROP_FRAMEBUFFER, + + N_PROPS +}; + +static GParamSpec *obj_props[N_PROPS]; + +typedef struct _CoglFramebufferDriverPrivate +{ + CoglFramebuffer *framebuffer; +} CoglFramebufferDriverPrivate; + +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (CoglFramebufferDriver, + cogl_framebuffer_driver, + G_TYPE_OBJECT) + +CoglFramebuffer * +cogl_framebuffer_driver_get_framebuffer (CoglFramebufferDriver *driver) +{ + CoglFramebufferDriverPrivate *priv = + cogl_framebuffer_driver_get_instance_private (driver); + + return priv->framebuffer; +} + +static void +cogl_framebuffer_driver_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + CoglFramebufferDriver *driver = COGL_FRAMEBUFFER_DRIVER (object); + CoglFramebufferDriverPrivate *priv = + cogl_framebuffer_driver_get_instance_private (driver); + + switch (prop_id) + { + case PROP_FRAMEBUFFER: + g_value_set_object (value, priv->framebuffer); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +cogl_framebuffer_driver_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + CoglFramebufferDriver *driver = COGL_FRAMEBUFFER_DRIVER (object); + CoglFramebufferDriverPrivate *priv = + cogl_framebuffer_driver_get_instance_private (driver); + + switch (prop_id) + { + case PROP_FRAMEBUFFER: + priv->framebuffer = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +cogl_framebuffer_driver_init (CoglFramebufferDriver *driver) +{ +} + +static void +cogl_framebuffer_driver_class_init (CoglFramebufferDriverClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = cogl_framebuffer_driver_get_property; + object_class->set_property = cogl_framebuffer_driver_set_property; + + obj_props[PROP_FRAMEBUFFER] = + g_param_spec_object ("framebuffer", + "framebuffer", + "CoglFramebuffer", + COGL_TYPE_FRAMEBUFFER, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, N_PROPS, obj_props); +} diff --git a/cogl/cogl/cogl-framebuffer-driver.h b/cogl/cogl/cogl-framebuffer-driver.h new file mode 100644 index 000000000..1ef6ce058 --- /dev/null +++ b/cogl/cogl/cogl-framebuffer-driver.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2007,2008,2009,2012 Intel Corporation. + * Copyright (C) 2019 DisplayLink (UK) Ltd. + * Copyright (C) 2020 Red Hat + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +#ifndef COGL_FRAMEBUFFER_DRIVER_H +#define COGL_FRAMEBUFFER_DRIVER_H + +#include "cogl-framebuffer.h" + +#define COGL_TYPE_FRAMEBUFFER_DRIVER (cogl_framebuffer_driver_get_type ()) +G_DECLARE_DERIVABLE_TYPE (CoglFramebufferDriver, + cogl_framebuffer_driver, + COGL, FRAMEBUFFER_DRIVER, + GObject) + +struct _CoglFramebufferDriverClass +{ + GObjectClass parent_cleass; +}; + +CoglFramebuffer * +cogl_framebuffer_driver_get_framebuffer (CoglFramebufferDriver *driver); + +#endif /* COGL_FRAMEBUFFER_DRIVER_H */ diff --git a/cogl/cogl/driver/gl/cogl-framebuffer-gl-private.h b/cogl/cogl/driver/gl/cogl-framebuffer-gl-private.h index 08acf814b..10fb7fff9 100644 --- a/cogl/cogl/driver/gl/cogl-framebuffer-gl-private.h +++ b/cogl/cogl/driver/gl/cogl-framebuffer-gl-private.h @@ -34,10 +34,15 @@ #ifndef __COGL_FRAMEBUFFER_GL_PRIVATE_H__ #define __COGL_FRAMEBUFFER_GL_PRIVATE_H__ +#include "cogl-framebuffer-driver.h" + #define COGL_TYPE_GL_FRAMEBUFFER (cogl_gl_framebuffer_get_type ()) G_DECLARE_FINAL_TYPE (CoglGlFramebuffer, cogl_gl_framebuffer, COGL, GL_FRAMEBUFFER, - GObject) + CoglFramebufferDriver) + +CoglGlFramebuffer * +cogl_gl_framebuffer_from_framebuffer (CoglFramebuffer *framebuffer); gboolean _cogl_offscreen_gl_allocate (CoglOffscreen *offscreen, diff --git a/cogl/cogl/driver/gl/cogl-framebuffer-gl.c b/cogl/cogl/driver/gl/cogl-framebuffer-gl.c index d57de6203..9aaca0d2c 100644 --- a/cogl/cogl/driver/gl/cogl-framebuffer-gl.c +++ b/cogl/cogl/driver/gl/cogl-framebuffer-gl.c @@ -137,7 +137,7 @@ typedef struct _CoglGlFbo struct _CoglGlFramebuffer { - GObject parent; + CoglFramebufferDriver parent; CoglGlFbo gl_fbo; @@ -146,7 +146,7 @@ struct _CoglGlFramebuffer }; G_DEFINE_TYPE (CoglGlFramebuffer, cogl_gl_framebuffer, - G_TYPE_OBJECT) + COGL_TYPE_FRAMEBUFFER_DRIVER) static CoglGlFramebuffer * ensure_gl_framebuffer (CoglFramebuffer *framebuffer); @@ -910,7 +910,9 @@ ensure_gl_framebuffer (CoglFramebuffer *framebuffer) gl_framebuffer = cogl_framebuffer_get_driver_private (framebuffer); if (!gl_framebuffer) { - gl_framebuffer = g_object_new (COGL_TYPE_GL_FRAMEBUFFER, NULL); + gl_framebuffer = g_object_new (COGL_TYPE_GL_FRAMEBUFFER, + "framebuffer", framebuffer, + NULL); cogl_framebuffer_set_driver_private (framebuffer, gl_framebuffer, g_object_unref); diff --git a/cogl/cogl/meson.build b/cogl/cogl/meson.build index 2aa0bfbac..5a361b42d 100644 --- a/cogl/cogl/meson.build +++ b/cogl/cogl/meson.build @@ -312,6 +312,8 @@ cogl_sources = [ 'cogl-offscreen.c', 'cogl-frame-info-private.h', 'cogl-frame-info.c', + 'cogl-framebuffer-driver.c', + 'cogl-framebuffer-driver.h', 'cogl-framebuffer-private.h', 'cogl-framebuffer.c', 'cogl-onscreen-private.h',