#include "gdkglcontextprivate.h"
#include "gdkmonitorprivate.h"
#include "gdkrectangle.h"
+#include "gdkvulkancontext.h"
#ifdef HAVE_EGL
#include <epoxy/egl.h>
return GDK_DISPLAY_GET_CLASS (display)->get_keymap (display);
}
+/*<private>
+ * gdk_display_create_vulkan_context:
+ * @self: a `GdkDisplay`
+ * @error: return location for an error
+ *
+ * Creates a new `GdkVulkanContext` for use with @display.
+ *
+ * The context can not be used to draw to surfaces, it can only be
+ * used for custom rendering or compute.
+ *
+ * If the creation of the `GdkVulkanContext` failed, @error will be set.
+ *
+ * Returns: (transfer full): the newly created `GdkVulkanContext`, or
+ * %NULL on error
+ */
+GdkVulkanContext *
+gdk_display_create_vulkan_context (GdkDisplay *self,
+ GError **error)
+{
+ g_return_val_if_fail (GDK_IS_DISPLAY (self), NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ if (gdk_display_get_debug_flags (self) & GDK_DEBUG_VULKAN_DISABLE)
+ {
+ g_set_error_literal (error, GDK_VULKAN_ERROR, GDK_VULKAN_ERROR_NOT_AVAILABLE,
+ _("Vulkan support disabled via GDK_DEBUG"));
+ return NULL;
+ }
+
+ if (GDK_DISPLAY_GET_CLASS (self)->vk_extension_name == NULL)
+ {
+ g_set_error (error, GDK_VULKAN_ERROR, GDK_VULKAN_ERROR_UNSUPPORTED,
+ "The %s backend has no Vulkan support.", G_OBJECT_TYPE_NAME (self));
+ return FALSE;
+ }
+
+ return g_initable_new (GDK_DISPLAY_GET_CLASS (self)->vk_context_type,
+ NULL,
+ error,
+ "display", self,
+ NULL);
+}
+
static void
gdk_display_init_gl (GdkDisplay *self)
{
void _gdk_display_pause_events (GdkDisplay *display);
void _gdk_display_unpause_events (GdkDisplay *display);
+GdkVulkanContext * gdk_display_create_vulkan_context (GdkDisplay *self,
+ GError **error);
+
GdkGLContext * gdk_display_get_gl_context (GdkDisplay *display);
gboolean gdk_display_init_egl (GdkDisplay *display,
GdkVulkanContext *context = GDK_VULKAN_CONTEXT (initable);
GdkVulkanContextPrivate *priv = gdk_vulkan_context_get_instance_private (context);
GdkDisplay *display = gdk_draw_context_get_display (GDK_DRAW_CONTEXT (context));
+ GdkSurface *surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (context));
VkResult res;
VkBool32 supported;
uint32_t i;
if (!priv->vulkan_ref)
return FALSE;
+ if (surface == NULL)
+ {
+ priv->image_format.format = VK_FORMAT_B8G8R8A8_UNORM;
+ priv->image_format.colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
+ return TRUE;
+ }
+
res = GDK_VULKAN_CONTEXT_GET_CLASS (context)->create_surface (context, &priv->surface);
if (res != VK_SUCCESS)
{
#include "gskvulkanrenderprivate.h"
#include "gskvulkanglyphcacheprivate.h"
+#include "gdk/gdkdisplayprivate.h"
#include "gdk/gdktextureprivate.h"
#include "gdk/gdkprofilerprivate.h"
gsk_vulkan_renderer_update_images_cb (GdkVulkanContext *context,
GskVulkanRenderer *self)
{
- GdkSurface *window;
+ GdkSurface *surface;
double scale;
gsize width, height;
guint i;
+ surface = gsk_renderer_get_surface (GSK_RENDERER (self));
+ if (surface == NULL)
+ return;
+
gsk_vulkan_renderer_free_targets (self);
self->n_targets = gdk_vulkan_context_get_n_images (context);
self->targets = g_new (GskVulkanImage *, self->n_targets);
- window = gsk_renderer_get_surface (GSK_RENDERER (self));
- scale = gdk_surface_get_scale (window);
- width = (int) ceil (gdk_surface_get_width (window) * scale);
- height = (int) ceil (gdk_surface_get_height (window) * scale);
+ scale = gdk_surface_get_scale (surface);
+ width = (int) ceil (gdk_surface_get_width (surface) * scale);
+ height = (int) ceil (gdk_surface_get_height (surface) * scale);
for (i = 0; i < self->n_targets; i++)
{
GskVulkanRenderer *self = GSK_VULKAN_RENDERER (renderer);
if (surface == NULL)
- {
- g_set_error (error, GDK_VULKAN_ERROR, GDK_VULKAN_ERROR_UNSUPPORTED,
- "The Vulkan renderer does not support surfaceless rendering yet.");
- return FALSE;
- }
+ self->vulkan = gdk_display_create_vulkan_context (gdk_display_get_default (), error);
+ else
+ self->vulkan = gdk_surface_create_vulkan_context (surface, error);
- self->vulkan = gdk_surface_create_vulkan_context (surface, error);
if (self->vulkan == NULL)
return FALSE;