mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-23 23:31:08 +01:00
Backends: Vulkan: Added convenience support for Volk via IMGUI_IMPL_VULKAN_USE_VOLK define. (#6582, #4854)
This commit is contained in:
parent
07e8ff9a8d
commit
b720c0f541
@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
// CHANGELOG
|
// CHANGELOG
|
||||||
// (minor and older changes stripped away, please see git history for details)
|
// (minor and older changes stripped away, please see git history for details)
|
||||||
|
// 2024-04-19: Vulkan: Added convenience support for Volk via IMGUI_IMPL_VULKAN_USE_VOLK define (you can also use IMGUI_IMPL_VULKAN_NO_PROTOTYPES + wrap Volk via ImGui_ImplVulkan_LoadFunctions().)
|
||||||
// 2024-02-14: *BREAKING CHANGE*: Moved RenderPass parameter from ImGui_ImplVulkan_Init() function to ImGui_ImplVulkan_InitInfo structure. Not required when using dynamic rendering.
|
// 2024-02-14: *BREAKING CHANGE*: Moved RenderPass parameter from ImGui_ImplVulkan_Init() function to ImGui_ImplVulkan_InitInfo structure. Not required when using dynamic rendering.
|
||||||
// 2024-02-12: *BREAKING CHANGE*: Dynamic rendering now require filling PipelineRenderingCreateInfo structure.
|
// 2024-02-12: *BREAKING CHANGE*: Dynamic rendering now require filling PipelineRenderingCreateInfo structure.
|
||||||
// 2024-01-19: Vulkan: Fixed vkAcquireNextImageKHR() validation errors in VulkanSDK 1.3.275 by allocating one extra semaphore than in-flight frames. (#7236)
|
// 2024-01-19: Vulkan: Fixed vkAcquireNextImageKHR() validation errors in VulkanSDK 1.3.275 by allocating one extra semaphore than in-flight frames. (#7236)
|
||||||
@ -108,12 +109,13 @@ void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkPhysicalDevice physical_devi
|
|||||||
|
|
||||||
// Vulkan prototypes for use with custom loaders
|
// Vulkan prototypes for use with custom loaders
|
||||||
// (see description of IMGUI_IMPL_VULKAN_NO_PROTOTYPES in imgui_impl_vulkan.h
|
// (see description of IMGUI_IMPL_VULKAN_NO_PROTOTYPES in imgui_impl_vulkan.h
|
||||||
#ifdef VK_NO_PROTOTYPES
|
#if defined(VK_NO_PROTOTYPES) && !defined(VOLK_H_)
|
||||||
|
#define IMGUI_IMPL_VULKAN_USE_LOADER
|
||||||
static bool g_FunctionsLoaded = false;
|
static bool g_FunctionsLoaded = false;
|
||||||
#else
|
#else
|
||||||
static bool g_FunctionsLoaded = true;
|
static bool g_FunctionsLoaded = true;
|
||||||
#endif
|
#endif
|
||||||
#ifdef VK_NO_PROTOTYPES
|
#ifdef IMGUI_IMPL_VULKAN_USE_LOADER
|
||||||
#define IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_MAP_MACRO) \
|
#define IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_MAP_MACRO) \
|
||||||
IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateCommandBuffers) \
|
IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateCommandBuffers) \
|
||||||
IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateDescriptorSets) \
|
IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateDescriptorSets) \
|
||||||
@ -184,7 +186,7 @@ static bool g_FunctionsLoaded = true;
|
|||||||
#define IMGUI_VULKAN_FUNC_DEF(func) static PFN_##func func;
|
#define IMGUI_VULKAN_FUNC_DEF(func) static PFN_##func func;
|
||||||
IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_DEF)
|
IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_DEF)
|
||||||
#undef IMGUI_VULKAN_FUNC_DEF
|
#undef IMGUI_VULKAN_FUNC_DEF
|
||||||
#endif // VK_NO_PROTOTYPES
|
#endif // IMGUI_IMPL_VULKAN_USE_LOADER
|
||||||
|
|
||||||
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
||||||
static PFN_vkCmdBeginRenderingKHR ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR;
|
static PFN_vkCmdBeginRenderingKHR ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR;
|
||||||
@ -1048,8 +1050,8 @@ bool ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const ch
|
|||||||
// Load function pointers
|
// Load function pointers
|
||||||
// You can use the default Vulkan loader using:
|
// You can use the default Vulkan loader using:
|
||||||
// ImGui_ImplVulkan_LoadFunctions([](const char* function_name, void*) { return vkGetInstanceProcAddr(your_vk_isntance, function_name); });
|
// ImGui_ImplVulkan_LoadFunctions([](const char* function_name, void*) { return vkGetInstanceProcAddr(your_vk_isntance, function_name); });
|
||||||
// But this would be equivalent to not setting VK_NO_PROTOTYPES.
|
// But this would be roughly equivalent to not setting VK_NO_PROTOTYPES.
|
||||||
#ifdef VK_NO_PROTOTYPES
|
#ifdef IMGUI_IMPL_VULKAN_USE_LOADER
|
||||||
#define IMGUI_VULKAN_FUNC_LOAD(func) \
|
#define IMGUI_VULKAN_FUNC_LOAD(func) \
|
||||||
func = reinterpret_cast<decltype(func)>(loader_func(#func, user_data)); \
|
func = reinterpret_cast<decltype(func)>(loader_func(#func, user_data)); \
|
||||||
if (func == nullptr) \
|
if (func == nullptr) \
|
||||||
@ -1078,7 +1080,7 @@ bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info)
|
|||||||
if (info->UseDynamicRendering)
|
if (info->UseDynamicRendering)
|
||||||
{
|
{
|
||||||
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
||||||
#ifndef VK_NO_PROTOTYPES
|
#ifndef IMGUI_IMPL_VULKAN_USE_LOADER
|
||||||
ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR = reinterpret_cast<PFN_vkCmdBeginRenderingKHR>(vkGetInstanceProcAddr(info->Instance, "vkCmdBeginRenderingKHR"));
|
ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR = reinterpret_cast<PFN_vkCmdBeginRenderingKHR>(vkGetInstanceProcAddr(info->Instance, "vkCmdBeginRenderingKHR"));
|
||||||
ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR = reinterpret_cast<PFN_vkCmdEndRenderingKHR>(vkGetInstanceProcAddr(info->Instance, "vkCmdEndRenderingKHR"));
|
ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR = reinterpret_cast<PFN_vkCmdEndRenderingKHR>(vkGetInstanceProcAddr(info->Instance, "vkCmdEndRenderingKHR"));
|
||||||
#endif
|
#endif
|
||||||
|
@ -42,13 +42,20 @@
|
|||||||
// If you have no idea what this is, leave it alone!
|
// If you have no idea what this is, leave it alone!
|
||||||
//#define IMGUI_IMPL_VULKAN_NO_PROTOTYPES
|
//#define IMGUI_IMPL_VULKAN_NO_PROTOTYPES
|
||||||
|
|
||||||
// Vulkan includes
|
// Convenience support for Volk
|
||||||
|
// (you can also technically use IMGUI_IMPL_VULKAN_NO_PROTOTYPES + wrap Volk via ImGui_ImplVulkan_LoadFunctions().)
|
||||||
|
//#define IMGUI_IMPL_VULKAN_USE_VOLK
|
||||||
|
|
||||||
#if defined(IMGUI_IMPL_VULKAN_NO_PROTOTYPES) && !defined(VK_NO_PROTOTYPES)
|
#if defined(IMGUI_IMPL_VULKAN_NO_PROTOTYPES) && !defined(VK_NO_PROTOTYPES)
|
||||||
#define VK_NO_PROTOTYPES
|
#define VK_NO_PROTOTYPES
|
||||||
#endif
|
#endif
|
||||||
#if defined(VK_USE_PLATFORM_WIN32_KHR) && !defined(NOMINMAX)
|
#if defined(VK_USE_PLATFORM_WIN32_KHR) && !defined(NOMINMAX)
|
||||||
#define NOMINMAX
|
#define NOMINMAX
|
||||||
#include <vulkan/vulkan.h>
|
#endif
|
||||||
|
|
||||||
|
// Vulkan includes
|
||||||
|
#ifdef IMGUI_IMPL_VULKAN_USE_VOLK
|
||||||
|
#include <Volk/volk.h>
|
||||||
#else
|
#else
|
||||||
#include <vulkan/vulkan.h>
|
#include <vulkan/vulkan.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -66,8 +66,12 @@ Other changes:
|
|||||||
mitigitate issues with reading vertex indexing limits with 16-bit indices. (#7496, #5720)
|
mitigitate issues with reading vertex indexing limits with 16-bit indices. (#7496, #5720)
|
||||||
- Backends: OpenGL: Detect ES3 contexts on desktop based on version string,
|
- Backends: OpenGL: Detect ES3 contexts on desktop based on version string,
|
||||||
to e.g. avoid calling glPolygonMode() on them. (#7447) [@afraidofdark, @ocornut]
|
to e.g. avoid calling glPolygonMode() on them. (#7447) [@afraidofdark, @ocornut]
|
||||||
|
- Backends: Vulkan: Added convenience support for Volk via IMGUI_IMPL_VULKAN_USE_VOLK define.
|
||||||
|
(you could always use IMGUI_IMPL_VULKAN_NO_PROTOTYPES + ImGui_ImplVulkan_LoadFunctions() as well).
|
||||||
|
(#6582, #4854) [@adalsteinnh, @kennyalive, @ocornut]
|
||||||
- Backends: SDL3: Fixed text inputs. Re-enable calling SDL_StartTextInput()/SDL_StopTextInput()
|
- Backends: SDL3: Fixed text inputs. Re-enable calling SDL_StartTextInput()/SDL_StopTextInput()
|
||||||
as SDL3 no longer enables it by default. (#7452, #6306, #6071, #1953) [@Green-Sky]
|
as SDL3 no longer enables it by default. (#7452, #6306, #6071, #1953) [@Green-Sky]
|
||||||
|
- Examples: GLFW+Vulkan, SDL+Vulkan: Added optional support for Volk. (#6582, #4854)
|
||||||
- Examples: GLFW+WebGPU: Added support for WebGPU-native/Dawn (#7435, #7132) [@eliasdaler, @Zelif]
|
- Examples: GLFW+WebGPU: Added support for WebGPU-native/Dawn (#7435, #7132) [@eliasdaler, @Zelif]
|
||||||
- Examples: GLFW+WebGPU: Renamed example_emscripten_wgpu/ to example_glfw_wgpu/. (#7435, #7132)
|
- Examples: GLFW+WebGPU: Renamed example_emscripten_wgpu/ to example_glfw_wgpu/. (#7435, #7132)
|
||||||
|
|
||||||
|
@ -21,8 +21,12 @@
|
|||||||
#define GLFW_INCLUDE_NONE
|
#define GLFW_INCLUDE_NONE
|
||||||
#define GLFW_INCLUDE_VULKAN
|
#define GLFW_INCLUDE_VULKAN
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
#include <vulkan/vulkan.h>
|
|
||||||
//#include <vulkan/vulkan_beta.h>
|
// Volk headers
|
||||||
|
#ifdef IMGUI_IMPL_VULKAN_USE_VOLK
|
||||||
|
#define VOLK_IMPLEMENTATION
|
||||||
|
#include <Volk/volk.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
// [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers.
|
// [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers.
|
||||||
// To link with VS2010-era libraries, VS2015+ requires linking with legacy_stdio_definitions.lib, which we do using this pragma.
|
// To link with VS2010-era libraries, VS2015+ requires linking with legacy_stdio_definitions.lib, which we do using this pragma.
|
||||||
@ -113,6 +117,9 @@ static VkPhysicalDevice SetupVulkan_SelectPhysicalDevice()
|
|||||||
static void SetupVulkan(ImVector<const char*> instance_extensions)
|
static void SetupVulkan(ImVector<const char*> instance_extensions)
|
||||||
{
|
{
|
||||||
VkResult err;
|
VkResult err;
|
||||||
|
#ifdef IMGUI_IMPL_VULKAN_USE_VOLK
|
||||||
|
volkInitialize();
|
||||||
|
#endif
|
||||||
|
|
||||||
// Create Vulkan Instance
|
// Create Vulkan Instance
|
||||||
{
|
{
|
||||||
@ -151,17 +158,20 @@ static void SetupVulkan(ImVector<const char*> instance_extensions)
|
|||||||
create_info.ppEnabledExtensionNames = instance_extensions.Data;
|
create_info.ppEnabledExtensionNames = instance_extensions.Data;
|
||||||
err = vkCreateInstance(&create_info, g_Allocator, &g_Instance);
|
err = vkCreateInstance(&create_info, g_Allocator, &g_Instance);
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
|
#ifdef IMGUI_IMPL_VULKAN_USE_VOLK
|
||||||
|
volkLoadInstance(g_Instance);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Setup the debug report callback
|
// Setup the debug report callback
|
||||||
#ifdef APP_USE_VULKAN_DEBUG_REPORT
|
#ifdef APP_USE_VULKAN_DEBUG_REPORT
|
||||||
auto vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkCreateDebugReportCallbackEXT");
|
auto f_vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkCreateDebugReportCallbackEXT");
|
||||||
IM_ASSERT(vkCreateDebugReportCallbackEXT != nullptr);
|
IM_ASSERT(f_vkCreateDebugReportCallbackEXT != nullptr);
|
||||||
VkDebugReportCallbackCreateInfoEXT debug_report_ci = {};
|
VkDebugReportCallbackCreateInfoEXT debug_report_ci = {};
|
||||||
debug_report_ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
|
debug_report_ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
|
||||||
debug_report_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
|
debug_report_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
|
||||||
debug_report_ci.pfnCallback = debug_report;
|
debug_report_ci.pfnCallback = debug_report;
|
||||||
debug_report_ci.pUserData = nullptr;
|
debug_report_ci.pUserData = nullptr;
|
||||||
err = vkCreateDebugReportCallbackEXT(g_Instance, &debug_report_ci, g_Allocator, &g_DebugReport);
|
err = f_vkCreateDebugReportCallbackEXT(g_Instance, &debug_report_ci, g_Allocator, &g_DebugReport);
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -277,8 +287,8 @@ static void CleanupVulkan()
|
|||||||
|
|
||||||
#ifdef APP_USE_VULKAN_DEBUG_REPORT
|
#ifdef APP_USE_VULKAN_DEBUG_REPORT
|
||||||
// Remove the debug report callback
|
// Remove the debug report callback
|
||||||
auto vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkDestroyDebugReportCallbackEXT");
|
auto f_vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkDestroyDebugReportCallbackEXT");
|
||||||
vkDestroyDebugReportCallbackEXT(g_Instance, g_DebugReport, g_Allocator);
|
f_vkDestroyDebugReportCallbackEXT(g_Instance, g_DebugReport, g_Allocator);
|
||||||
#endif // APP_USE_VULKAN_DEBUG_REPORT
|
#endif // APP_USE_VULKAN_DEBUG_REPORT
|
||||||
|
|
||||||
vkDestroyDevice(g_Device, g_Allocator);
|
vkDestroyDevice(g_Device, g_Allocator);
|
||||||
|
@ -20,8 +20,12 @@
|
|||||||
#include <stdlib.h> // abort
|
#include <stdlib.h> // abort
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include <SDL_vulkan.h>
|
#include <SDL_vulkan.h>
|
||||||
#include <vulkan/vulkan.h>
|
|
||||||
//#include <vulkan/vulkan_beta.h>
|
// Volk headers
|
||||||
|
#ifdef IMGUI_IMPL_VULKAN_USE_VOLK
|
||||||
|
#define VOLK_IMPLEMENTATION
|
||||||
|
#include <Volk/volk.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
//#define APP_USE_UNLIMITED_FRAME_RATE
|
//#define APP_USE_UNLIMITED_FRAME_RATE
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
@ -101,6 +105,9 @@ static VkPhysicalDevice SetupVulkan_SelectPhysicalDevice()
|
|||||||
static void SetupVulkan(ImVector<const char*> instance_extensions)
|
static void SetupVulkan(ImVector<const char*> instance_extensions)
|
||||||
{
|
{
|
||||||
VkResult err;
|
VkResult err;
|
||||||
|
#ifdef IMGUI_IMPL_VULKAN_USE_VOLK
|
||||||
|
volkInitialize();
|
||||||
|
#endif
|
||||||
|
|
||||||
// Create Vulkan Instance
|
// Create Vulkan Instance
|
||||||
{
|
{
|
||||||
@ -139,17 +146,20 @@ static void SetupVulkan(ImVector<const char*> instance_extensions)
|
|||||||
create_info.ppEnabledExtensionNames = instance_extensions.Data;
|
create_info.ppEnabledExtensionNames = instance_extensions.Data;
|
||||||
err = vkCreateInstance(&create_info, g_Allocator, &g_Instance);
|
err = vkCreateInstance(&create_info, g_Allocator, &g_Instance);
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
|
#ifdef IMGUI_IMPL_VULKAN_USE_VOLK
|
||||||
|
volkLoadInstance(g_Instance);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Setup the debug report callback
|
// Setup the debug report callback
|
||||||
#ifdef APP_USE_VULKAN_DEBUG_REPORT
|
#ifdef APP_USE_VULKAN_DEBUG_REPORT
|
||||||
auto vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkCreateDebugReportCallbackEXT");
|
auto f_vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkCreateDebugReportCallbackEXT");
|
||||||
IM_ASSERT(vkCreateDebugReportCallbackEXT != nullptr);
|
IM_ASSERT(f_vkCreateDebugReportCallbackEXT != nullptr);
|
||||||
VkDebugReportCallbackCreateInfoEXT debug_report_ci = {};
|
VkDebugReportCallbackCreateInfoEXT debug_report_ci = {};
|
||||||
debug_report_ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
|
debug_report_ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
|
||||||
debug_report_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
|
debug_report_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
|
||||||
debug_report_ci.pfnCallback = debug_report;
|
debug_report_ci.pfnCallback = debug_report;
|
||||||
debug_report_ci.pUserData = nullptr;
|
debug_report_ci.pUserData = nullptr;
|
||||||
err = vkCreateDebugReportCallbackEXT(g_Instance, &debug_report_ci, g_Allocator, &g_DebugReport);
|
err = f_vkCreateDebugReportCallbackEXT(g_Instance, &debug_report_ci, g_Allocator, &g_DebugReport);
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -265,8 +275,8 @@ static void CleanupVulkan()
|
|||||||
|
|
||||||
#ifdef APP_USE_VULKAN_DEBUG_REPORT
|
#ifdef APP_USE_VULKAN_DEBUG_REPORT
|
||||||
// Remove the debug report callback
|
// Remove the debug report callback
|
||||||
auto vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkDestroyDebugReportCallbackEXT");
|
auto f_vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkDestroyDebugReportCallbackEXT");
|
||||||
vkDestroyDebugReportCallbackEXT(g_Instance, g_DebugReport, g_Allocator);
|
f_vkDestroyDebugReportCallbackEXT(g_Instance, g_DebugReport, g_Allocator);
|
||||||
#endif // APP_USE_VULKAN_DEBUG_REPORT
|
#endif // APP_USE_VULKAN_DEBUG_REPORT
|
||||||
|
|
||||||
vkDestroyDevice(g_Device, g_Allocator);
|
vkDestroyDevice(g_Device, g_Allocator);
|
||||||
|
Loading…
Reference in New Issue
Block a user