[dxvk] Move getInstanceExtensions platform logic to wsi

This commit is contained in:
Ethan Lee 2023-12-06 23:19:47 -05:00
parent 1b31aa5dbc
commit 7641260500
8 changed files with 55 additions and 118 deletions

View File

@ -1,17 +1,21 @@
#include "../dxvk_platform_exts.h"
#include "dxvk_platform_exts.h"
#include "../wsi/wsi_platform.h"
namespace dxvk {
DxvkPlatformExts DxvkPlatformExts::s_instance;
std::string_view DxvkPlatformExts::getName() {
return "Win32 WSI";
return "Platform WSI";
}
DxvkNameSet DxvkPlatformExts::getInstanceExtensions() {
std::vector<const char *> extensionNames = wsi::getInstanceExtensions();
DxvkNameSet names;
names.add(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
for (const char* name : extensionNames)
names.add(name);
return names;
}
@ -33,4 +37,4 @@ namespace dxvk {
}
}
}

View File

@ -92,6 +92,7 @@ dxvk_src = [
'dxvk_options.cpp',
'dxvk_pipelayout.cpp',
'dxvk_pipemanager.cpp',
'dxvk_platform_exts.cpp',
'dxvk_presenter.cpp',
'dxvk_queue.cpp',
'dxvk_resource.cpp',
@ -120,20 +121,6 @@ if platform == 'windows'
]
endif
if dxvk_wsi == 'win32'
dxvk_src += [
'platform/dxvk_win32_exts.cpp'
]
elif dxvk_wsi == 'sdl2'
dxvk_src += [
'platform/dxvk_sdl2_exts.cpp'
]
elif dxvk_wsi == 'glfw'
dxvk_src += [
'platform/dxvk_glfw_exts.cpp'
]
endif
dxvk_extra_deps = [ dependency('threads') ]
if platform == 'linux'
dxvk_extra_deps += [ cpp.find_library('dl', required: false) ]

View File

@ -1,49 +0,0 @@
#include "../dxvk_platform_exts.h"
#include "../../vulkan/vulkan_loader.h"
#include <GLFW/glfw3.h>
namespace dxvk {
DxvkPlatformExts DxvkPlatformExts::s_instance;
std::string_view DxvkPlatformExts::getName() {
return "GLFW WSI";
}
DxvkNameSet DxvkPlatformExts::getInstanceExtensions() {
if (!glfwVulkanSupported())
throw DxvkError(str::format("GLFW WSI: Vulkan is not supported in any capacity!"));
uint32_t extensionCount = 0;
const char** extensionArray = glfwGetRequiredInstanceExtensions(&extensionCount);
if (extensionCount == 0)
throw DxvkError(str::format("GLFW WSI: Failed to get required instance extensions"));
DxvkNameSet names;
for (uint32_t i = 0; i < extensionCount; ++i) {
names.add(extensionArray[i]);
}
return names;
}
DxvkNameSet DxvkPlatformExts::getDeviceExtensions(
uint32_t adapterId) {
return DxvkNameSet();
}
void DxvkPlatformExts::initInstanceExtensions() {
//Nothing needs to be done here on GLFW
}
void DxvkPlatformExts::initDeviceExtensions(
const DxvkInstance* instance) {
//Nothing needs to be done here on GLFW
}
}

View File

@ -1,50 +0,0 @@
#include "../dxvk_platform_exts.h"
#include <SDL2/SDL.h>
#include <SDL2/SDL_vulkan.h>
namespace dxvk {
DxvkPlatformExts DxvkPlatformExts::s_instance;
std::string_view DxvkPlatformExts::getName() {
return "SDL2 WSI";
}
DxvkNameSet DxvkPlatformExts::getInstanceExtensions() {
SDL_Vulkan_LoadLibrary(nullptr);
uint32_t extensionCount = 0;
if (!SDL_Vulkan_GetInstanceExtensions(nullptr, &extensionCount, nullptr))
throw DxvkError(str::format("SDL2 WSI: Failed to get instance extension count. ", SDL_GetError()));
auto extensionNames = std::vector<const char *>(extensionCount);
if (!SDL_Vulkan_GetInstanceExtensions(nullptr, &extensionCount, extensionNames.data()))
throw DxvkError(str::format("SDL2 WSI: Failed to get instance extensions. ", SDL_GetError()));
DxvkNameSet names;
for (const char* name : extensionNames)
names.add(name);
return names;
}
DxvkNameSet DxvkPlatformExts::getDeviceExtensions(
uint32_t adapterId) {
return DxvkNameSet();
}
void DxvkPlatformExts::initInstanceExtensions() {
}
void DxvkPlatformExts::initDeviceExtensions(
const DxvkInstance* instance) {
}
}

View File

@ -141,4 +141,23 @@ namespace dxvk::wsi {
return glfwCreateWindowSurface(instance, window, nullptr, pSurface);
}
}
std::vector<const char *> getInstanceExtensions() {
if (!glfwVulkanSupported())
throw DxvkError(str::format("GLFW WSI: Vulkan is not supported in any capacity!"));
uint32_t extensionCount = 0;
const char** extensionArray = glfwGetRequiredInstanceExtensions(&extensionCount);
if (extensionCount == 0)
throw DxvkError(str::format("GLFW WSI: Failed to get required instance extensions"));
std::vector<const char *> names(extensionCount);
for (uint32_t i = 0; i < extensionCount; ++i) {
names.push_back(extensionArray[i]);
}
return names;
}
}

View File

@ -154,4 +154,19 @@ namespace dxvk::wsi {
: VK_ERROR_OUT_OF_HOST_MEMORY;
}
std::vector<const char *> getInstanceExtensions() {
SDL_Vulkan_LoadLibrary(nullptr);
uint32_t extensionCount = 0;
if (!SDL_Vulkan_GetInstanceExtensions(nullptr, &extensionCount, nullptr))
throw DxvkError(str::format("SDL2 WSI: Failed to get instance extension count. ", SDL_GetError()));
auto extensionNames = std::vector<const char *>(extensionCount);
if (!SDL_Vulkan_GetInstanceExtensions(nullptr, &extensionCount, extensionNames.data()))
throw DxvkError(str::format("SDL2 WSI: Failed to get instance extensions. ", SDL_GetError()));
return extensionNames;
}
}

View File

@ -295,4 +295,9 @@ namespace dxvk::wsi {
return (*pfnVkCreateWin32SurfaceKHR)(instance, &info, nullptr, pSurface);
}
std::vector<const char *> getInstanceExtensions() {
return { VK_KHR_WIN32_SURFACE_EXTENSION_NAME };
}
}

View File

@ -7,3 +7,9 @@
#elif defined(DXVK_WSI_GLFW)
#include "glfw/wsi_platform_glfw.h"
#endif
namespace dxvk::wsi {
std::vector<const char *> getInstanceExtensions();
}