Blender V4.5
GHOST_ContextVK.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2022-2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#ifndef WITH_VULKAN_BACKEND
12# error "ContextVK requires WITH_VULKAN_BACKEND"
13#endif
14
15#include "GHOST_Context.hh"
16
17#ifdef _WIN32
18# include "GHOST_SystemWin32.hh"
19#elif defined(__APPLE__)
20# include "GHOST_SystemCocoa.hh"
21#else
22# ifdef WITH_GHOST_X11
23# include "GHOST_SystemX11.hh"
24# else
25# define Display void
26# define Window void *
27# endif
28# ifdef WITH_GHOST_WAYLAND
29# include "GHOST_SystemWayland.hh"
30# else
31# define wl_surface void
32# define wl_display void
33# endif
34#endif
35
36#include <vector>
37
38#ifndef GHOST_OPENGL_VK_CONTEXT_FLAGS
39/* leave as convenience define for the future */
40# define GHOST_OPENGL_VK_CONTEXT_FLAGS 0
41#endif
42
43#ifndef GHOST_OPENGL_VK_RESET_NOTIFICATION_STRATEGY
44# define GHOST_OPENGL_VK_RESET_NOTIFICATION_STRATEGY 0
45#endif
46
49#ifdef WITH_GHOST_X11
50 GHOST_kVulkanPlatformX11 = 1,
51#endif
52#ifdef WITH_GHOST_WAYLAND
53 GHOST_kVulkanPlatformWayland = 2,
54#endif
55};
56
58 int size[2];
59};
60
62 std::vector<VkSwapchainKHR> swapchains;
63 std::vector<VkSemaphore> semaphores;
64
65 void destroy(VkDevice vk_device);
66};
67
70 VkImage vk_image = VK_NULL_HANDLE;
71
75 VkSemaphore present_semaphore = VK_NULL_HANDLE;
76
77 void destroy(VkDevice vk_device);
78};
79
85 VkFence submission_fence = VK_NULL_HANDLE;
87 VkSemaphore acquire_semaphore = VK_NULL_HANDLE;
88
90
91 void destroy(VkDevice vk_device);
92};
93
101constexpr static uint32_t GHOST_FRAMES_IN_FLIGHT = 5;
102
106
107 public:
111 GHOST_ContextVK(bool stereoVisual,
112#ifdef _WIN32
113 HWND hwnd,
114#elif defined(__APPLE__)
115 /* FIXME CAMetalLayer but have issue with linking. */
116 void *metal_layer,
117#else
119 /* X11 */
120 Window window,
121 Display *display,
122 /* Wayland */
123 wl_surface *wayland_surface,
124 wl_display *wayland_display,
125 const GHOST_ContextVK_WindowInfo *wayland_window_info,
126#endif
127 int contextMajorVersion,
128 int contextMinorVersion,
129 int debug,
130 const GHOST_GPUDevice &preferred_device);
131
135 ~GHOST_ContextVK() override;
136
141 GHOST_TSuccess swapBuffers() override;
142
148
154
160
167
172 GHOST_TSuccess getVulkanHandles(GHOST_VulkanHandles &r_handles) override;
173
174 GHOST_TSuccess getVulkanSwapChainFormat(GHOST_VulkanSwapChainData *r_swap_chain_data) override;
175
177 std::function<void(const GHOST_VulkanSwapChainData *)> swap_buffers_pre_callback,
178 std::function<void(void)> swap_buffers_post_callback,
179 std::function<void(GHOST_VulkanOpenXRData *)> openxr_acquire_framebuffer_image_callback,
180 std::function<void(GHOST_VulkanOpenXRData *)> openxr_release_framebuffer_image_callback)
181 override;
182
188 GHOST_TSuccess setSwapInterval(int /*interval*/) override
189 {
190 return GHOST_kFailure;
191 }
192
198 GHOST_TSuccess getSwapInterval(int & /*intervalOut*/) override
199 {
200 return GHOST_kFailure;
201 };
202
208 bool isUpsideDown() const override
209 {
210 return true;
211 }
212
213 private:
214#ifdef _WIN32
215 HWND m_hwnd;
216#elif defined(__APPLE__)
217 CAMetalLayer *m_metal_layer;
218#else /* Linux */
219 GHOST_TVulkanPlatformType m_platform;
220 /* X11 */
221 Display *m_display;
222 Window m_window;
223 /* Wayland */
224 wl_surface *m_wayland_surface;
225 wl_display *m_wayland_display;
226 const GHOST_ContextVK_WindowInfo *m_wayland_window_info;
227#endif
228
229 const int m_context_major_version;
230 const int m_context_minor_version;
231 const int m_debug;
232 const GHOST_GPUDevice m_preferred_device;
233
234 VkQueue m_graphic_queue;
235 VkQueue m_present_queue;
236
237 /* For display only. */
238 VkSurfaceKHR m_surface;
239 VkSwapchainKHR m_swapchain;
240 std::vector<GHOST_SwapchainImage> m_swapchain_images;
241 std::vector<GHOST_Frame> m_frame_data;
242 uint64_t m_render_frame;
243 uint64_t m_image_count;
244
245 VkExtent2D m_render_extent;
246 VkExtent2D m_render_extent_min;
247 VkSurfaceFormatKHR m_surface_format;
248
249 std::function<void(const GHOST_VulkanSwapChainData *)> swap_buffers_pre_callback_;
250 std::function<void(void)> swap_buffers_post_callback_;
251 std::function<void(GHOST_VulkanOpenXRData *)> openxr_acquire_framebuffer_image_callback_;
252 std::function<void(GHOST_VulkanOpenXRData *)> openxr_release_framebuffer_image_callback_;
253
254 const char *getPlatformSpecificSurfaceExtension() const;
255 GHOST_TSuccess recreateSwapchain();
256 GHOST_TSuccess initializeFrameData();
257 GHOST_TSuccess destroySwapchain();
258};
static constexpr uint32_t GHOST_FRAMES_IN_FLIGHT
#define Window
GHOST_TVulkanPlatformType
@ GHOST_kVulkanPlatformHeadless
#define wl_display
#define Display
#define wl_surface
GHOST_TSuccess
Definition GHOST_Types.h:80
@ GHOST_kFailure
Definition GHOST_Types.h:80
unsigned long long int uint64_t
GHOST_TSuccess activateDrawingContext() override
GHOST_TSuccess swapBuffers() override
GHOST_TSuccess setVulkanSwapBuffersCallbacks(std::function< void(const GHOST_VulkanSwapChainData *)> swap_buffers_pre_callback, std::function< void(void)> swap_buffers_post_callback, std::function< void(GHOST_VulkanOpenXRData *)> openxr_acquire_framebuffer_image_callback, std::function< void(GHOST_VulkanOpenXRData *)> openxr_release_framebuffer_image_callback) override
GHOST_TSuccess getVulkanSwapChainFormat(GHOST_VulkanSwapChainData *r_swap_chain_data) override
GHOST_TSuccess getSwapInterval(int &) override
GHOST_TSuccess setSwapInterval(int) override
GHOST_TSuccess initializeDrawingContext() override
friend class GHOST_XrGraphicsBindingVulkanD3D
friend class GHOST_XrGraphicsBindingVulkan
GHOST_TSuccess getVulkanHandles(GHOST_VulkanHandles &r_handles) override
GHOST_TSuccess releaseDrawingContext() override
GHOST_TSuccess releaseNativeHandles() override
bool isUpsideDown() const override
~GHOST_ContextVK() override
GHOST_ContextVK(bool stereoVisual, GHOST_TVulkanPlatformType platform, Window window, Display *display, wl_surface *wayland_surface, wl_display *wayland_display, const GHOST_ContextVK_WindowInfo *wayland_window_info, int contextMajorVersion, int contextMinorVersion, int debug, const GHOST_GPUDevice &preferred_device)
GHOST_Context(bool stereoVisual)
std::vector< VkSwapchainKHR > swapchains
void destroy(VkDevice vk_device)
std::vector< VkSemaphore > semaphores
VkFence submission_fence
VkSemaphore acquire_semaphore
GHOST_FrameDiscard discard_pile
void destroy(VkDevice vk_device)
void destroy(VkDevice vk_device)
VkSemaphore present_semaphore