gtk2/gdk/wayland/gdkvulkancontext-wayland.c
Jonas Ådahl 7e102f8879 wayland/vulkancontext: Sync surface state before vkQueuePresentKHR
A side effect of vkQueuePresentKHR is the Vulkan implementation calling
wl_surface_commit() on the corresponding Wayland surface. Thus, before
this, we must synchronize the surface state (e.g. opaque region, window
geometry, etc) that changed since last time. Prior to this commit this
was done after calling vkQueuePresentKHR(), causing the surface state to
always correspond to the previous buffer state. As of this commit this
is now done before calling vkQueuePresentKHR(), thus before
wl_surface_commit().
2018-03-21 14:14:32 +08:00

91 lines
3.4 KiB
C

/* gdkvulkancontext-wayland.c
*
* gdkvulkancontext-wayland.c: Wayland specific Vulkan wrappers
*
* Copyright (C) 2017 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
*
* This file is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This file is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include "gdkconfig.h"
#ifdef GDK_RENDERING_VULKAN
#include "gdkvulkancontext-wayland.h"
#include "gdkinternals.h"
#include "gdkwaylanddisplay.h"
#include "gdkwaylandsurface.h"
#include "gdkprivate-wayland.h"
G_DEFINE_TYPE (GdkWaylandVulkanContext, gdk_wayland_vulkan_context, GDK_TYPE_VULKAN_CONTEXT)
static VkResult
gdk_wayland_vulkan_context_create_surface (GdkVulkanContext *context,
VkSurfaceKHR *vr_surface)
{
GdkSurface *surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (context));
GdkDisplay *display = gdk_draw_context_get_display (GDK_DRAW_CONTEXT (context));
/* This is necessary so that Vulkan sees the Surface.
* Usually, vkCreateXlibSurfaceKHR() will not cause a problem to happen as
* it just creates resources, but futher calls with the resulting surface
* do cause issues.
*/
gdk_display_sync (display);
return GDK_VK_CHECK (vkCreateWaylandSurfaceKHR, gdk_vulkan_context_get_instance (context),
&(VkWaylandSurfaceCreateInfoKHR) {
VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR,
NULL,
0,
gdk_wayland_display_get_wl_display (display),
gdk_wayland_surface_get_wl_surface (surface)
},
NULL,
vr_surface);
}
static void
gdk_vulkan_context_wayland_end_frame (GdkDrawContext *context,
cairo_region_t *painted,
cairo_region_t *damage)
{
GdkSurface *surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (context));
gdk_wayland_surface_sync (surface);
GDK_DRAW_CONTEXT_CLASS (gdk_wayland_vulkan_context_parent_class)->end_frame (context, painted, damage);
}
static void
gdk_wayland_vulkan_context_class_init (GdkWaylandVulkanContextClass *klass)
{
GdkVulkanContextClass *vulkan_context_class = GDK_VULKAN_CONTEXT_CLASS (klass);
GdkDrawContextClass *draw_context_class = GDK_DRAW_CONTEXT_CLASS (klass);
vulkan_context_class->create_surface = gdk_wayland_vulkan_context_create_surface;
draw_context_class->end_frame = gdk_vulkan_context_wayland_end_frame;
}
static void
gdk_wayland_vulkan_context_init (GdkWaylandVulkanContext *self)
{
}
#endif /* GDK_RENDERING_VULKAN */