[mutter] cogl: Add CoglFramebufferDriver base type



commit 5be55292699e15ff9cbcc39750564e636b867b47
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Mon Oct 19 17:43:06 2020 +0200

    cogl: Add CoglFramebufferDriver base type
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1514>

 cogl/cogl/cogl-framebuffer-driver.c               | 123 ++++++++++++++++++++++
 cogl/cogl/cogl-framebuffer-driver.h               |  47 +++++++++
 cogl/cogl/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(-)
---
diff --git a/cogl/cogl/cogl-framebuffer-driver.c b/cogl/cogl/cogl-framebuffer-driver.c
new file mode 100644
index 0000000000..1559de0f63
--- /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 0000000000..1ef6ce058c
--- /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 08acf814b6..10fb7fff9d 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 d57de6203e..9aaca0d2cd 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 2aa0bfbacc..5a361b42d7 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',


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]