[retro-gtk] Introduce RetroRenderer
- From: Adrien Plazas <aplazas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [retro-gtk] Introduce RetroRenderer
- Date: Mon, 23 Mar 2020 13:54:47 +0000 (UTC)
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]