[retro-gtk] Introduce RetroRenderer



commit dcfb1ca3dca059c88dbb1f93c0c257c1bd407916
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Thu Jan 30 18:52:00 2020 +0500

    Introduce RetroRenderer
    
    Make renderer generic, so that we can have separate GL and Vulkan
    implementations in the future.
    
    The interface consists of RetroHWRenderCallback callbacks, and a way for
    us to snapshot the scene so that it can be dealt with the same way as for
    software rendering.

 retro-runner/meson.build              |  1 +
 retro-runner/retro-renderer-private.h | 55 ++++++++++++++++++++++++++
 retro-runner/retro-renderer.c         | 74 +++++++++++++++++++++++++++++++++++
 3 files changed, 130 insertions(+)
---
diff --git a/retro-runner/meson.build b/retro-runner/meson.build
index 3285986..a826c4c 100644
--- a/retro-runner/meson.build
+++ b/retro-runner/meson.build
@@ -11,6 +11,7 @@ retro_runner_sources = [
   'retro-main-loop-source.c',
   'retro-module.c',
   'retro-pa-player.c',
+  'retro-renderer.c',
 
   ipc_runner_src,
 ]
diff --git a/retro-runner/retro-renderer-private.h b/retro-runner/retro-renderer-private.h
new file mode 100644
index 0000000..e7d47b2
--- /dev/null
+++ b/retro-runner/retro-renderer-private.h
@@ -0,0 +1,55 @@
+// This file is part of retro-gtk. License: GPL-3.0+.
+
+#pragma once
+
+#if !defined(__RETRO_GTK_INSIDE__) && !defined(RETRO_GTK_COMPILATION)
+# error "Only <retro-gtk.h> can be included directly."
+#endif
+
+#include <glib-object.h>
+
+#include "retro-framebuffer-private.h"
+#include "retro-hw-render-callback-private.h"
+#include "retro-pixel-format-private.h"
+
+G_BEGIN_DECLS
+
+#define RETRO_TYPE_RENDERER (retro_renderer_get_type())
+
+G_DECLARE_INTERFACE (RetroRenderer, retro_renderer, RETRO, RENDERER, GObject)
+
+struct _RetroRendererInterface
+{
+  GTypeInterface parent_iface;
+
+  void (*realize) (RetroRenderer *self,
+                   guint          width,
+                   guint          height);
+  RetroProcAddress (*get_proc_address) (RetroRenderer *self,
+                                        const gchar   *sym);
+  guintptr (*get_current_framebuffer) (RetroRenderer *self);
+  void (*snapshot) (RetroRenderer    *self,
+                    RetroPixelFormat  pixel_format,
+                    guint             width,
+                    guint             height,
+                    gsize             rowstride,
+                    guint8           *data);
+};
+
+void retro_renderer_realize (RetroRenderer *self,
+                             guint          width,
+                             guint          height);
+
+RetroProcAddress retro_renderer_get_proc_address (RetroRenderer *self,
+                                                  const gchar   *sym);
+
+guintptr retro_renderer_get_current_framebuffer (RetroRenderer *self);
+
+void retro_renderer_snapshot (RetroRenderer    *self,
+                              RetroPixelFormat  pixel_format,
+                              guint             width,
+                              guint             height,
+                              gsize             rowstride,
+                              guint8           *data);
+
+G_END_DECLS
diff --git a/retro-runner/retro-renderer.c b/retro-runner/retro-renderer.c
new file mode 100644
index 0000000..f0903c3
--- /dev/null
+++ b/retro-runner/retro-renderer.c
@@ -0,0 +1,74 @@
+// This file is part of retro-gtk. License: GPL-3.0+.
+
+#include "retro-renderer-private.h"
+
+G_DEFINE_INTERFACE (RetroRenderer, retro_renderer, G_TYPE_OBJECT);
+
+static void
+retro_renderer_default_init (RetroRendererInterface *iface)
+{
+}
+
+void
+retro_renderer_realize (RetroRenderer *self,
+                        guint          width,
+                        guint          height)
+{
+  RetroRendererInterface *iface;
+
+  g_return_if_fail (RETRO_IS_RENDERER (self));
+
+  iface = RETRO_RENDERER_GET_IFACE (self);
+
+  g_return_if_fail (iface->realize != NULL);
+
+  iface->realize (self, width, height);
+}
+
+RetroProcAddress
+retro_renderer_get_proc_address (RetroRenderer *self,
+                                 const gchar   *sym)
+{
+  RetroRendererInterface *iface;
+
+  g_return_val_if_fail (RETRO_IS_RENDERER (self), NULL);
+
+  iface = RETRO_RENDERER_GET_IFACE (self);
+
+  g_return_val_if_fail (iface->get_proc_address != NULL, NULL);
+
+  return iface->get_proc_address (self, sym);
+}
+
+guintptr
+retro_renderer_get_current_framebuffer (RetroRenderer *self)
+{
+  RetroRendererInterface *iface;
+
+  g_return_val_if_fail (RETRO_IS_RENDERER (self), 0);
+
+  iface = RETRO_RENDERER_GET_IFACE (self);
+
+  g_return_val_if_fail (iface->get_current_framebuffer != NULL, 0);
+
+  return iface->get_current_framebuffer (self);
+}
+
+void
+retro_renderer_snapshot (RetroRenderer    *self,
+                         RetroPixelFormat  pixel_format,
+                         guint             width,
+                         guint             height,
+                         gsize             rowstride,
+                         guint8           *data)
+{
+  RetroRendererInterface *iface;
+
+  g_return_if_fail (RETRO_IS_RENDERER (self));
+
+  iface = RETRO_RENDERER_GET_IFACE (self);
+
+  g_return_if_fail (iface->snapshot != NULL);
+
+  iface->snapshot (self, pixel_format, width, height, rowstride, data);
+}


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