mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-06 06:51:26 +12:00
vk: Minor spec touchups
- Simplify active instance management. While multicontext support will be required in future, this is better done with multiple logical devices rather than multiple instances. - Destroy the WSI surface on exit - Enable depthBoundsTest explicitly. TODO: Properly check for supported features.
This commit is contained in:
parent
aa3eeaa417
commit
7a5c20ef85
3 changed files with 31 additions and 52 deletions
|
@ -338,12 +338,9 @@ u64 VKGSRender::get_cycles()
|
||||||
|
|
||||||
VKGSRender::VKGSRender() : GSRender()
|
VKGSRender::VKGSRender() : GSRender()
|
||||||
{
|
{
|
||||||
u32 instance_handle = m_thread_context.createInstance("RPCS3");
|
if (m_thread_context.createInstance("RPCS3"))
|
||||||
|
|
||||||
if (instance_handle > 0)
|
|
||||||
{
|
{
|
||||||
m_thread_context.makeCurrentInstance(instance_handle);
|
m_thread_context.makeCurrentInstance();
|
||||||
m_thread_context.enable_debugging();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -776,6 +776,7 @@ private:
|
||||||
requested_extensions.push_back(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME);
|
requested_extensions.push_back(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
available_features.depthBounds = VK_TRUE;
|
||||||
available_features.samplerAnisotropy = VK_TRUE;
|
available_features.samplerAnisotropy = VK_TRUE;
|
||||||
available_features.textureCompressionBC = VK_TRUE;
|
available_features.textureCompressionBC = VK_TRUE;
|
||||||
available_features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE;
|
available_features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE;
|
||||||
|
@ -2401,9 +2402,8 @@ public:
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
std::vector<physical_device> gpus;
|
std::vector<physical_device> gpus;
|
||||||
|
VkInstance m_instance = VK_NULL_HANDLE;
|
||||||
std::vector<VkInstance> m_vk_instances;
|
VkSurfaceKHR m_surface = VK_NULL_HANDLE;
|
||||||
VkInstance m_instance;
|
|
||||||
|
|
||||||
PFN_vkDestroyDebugReportCallbackEXT destroyDebugReportCallback = nullptr;
|
PFN_vkDestroyDebugReportCallbackEXT destroyDebugReportCallback = nullptr;
|
||||||
PFN_vkCreateDebugReportCallbackEXT createDebugReportCallback = nullptr;
|
PFN_vkCreateDebugReportCallbackEXT createDebugReportCallback = nullptr;
|
||||||
|
@ -2413,20 +2413,17 @@ public:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
context()
|
context() = default;
|
||||||
{
|
|
||||||
m_instance = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
~context()
|
~context()
|
||||||
{
|
{
|
||||||
if (m_instance || !m_vk_instances.empty())
|
if (m_instance)
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
void close()
|
void close()
|
||||||
{
|
{
|
||||||
if (m_vk_instances.empty()) return;
|
if (!m_instance) return;
|
||||||
|
|
||||||
if (m_debugger)
|
if (m_debugger)
|
||||||
{
|
{
|
||||||
|
@ -2434,13 +2431,14 @@ public:
|
||||||
m_debugger = nullptr;
|
m_debugger = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (VkInstance &inst : m_vk_instances)
|
if (m_surface)
|
||||||
{
|
{
|
||||||
vkDestroyInstance(inst, nullptr);
|
vkDestroySurfaceKHR(m_instance, m_surface, nullptr);
|
||||||
|
m_surface = VK_NULL_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_instance = nullptr;
|
vkDestroyInstance(m_instance, nullptr);
|
||||||
m_vk_instances.clear();
|
m_instance = VK_NULL_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void enable_debugging()
|
void enable_debugging()
|
||||||
|
@ -2460,7 +2458,7 @@ public:
|
||||||
CHECK_RESULT(createDebugReportCallback(m_instance, &dbgCreateInfo, NULL, &m_debugger));
|
CHECK_RESULT(createDebugReportCallback(m_instance, &dbgCreateInfo, NULL, &m_debugger));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t createInstance(const char *app_name, bool fast = false)
|
bool createInstance(const char *app_name, bool fast = false)
|
||||||
{
|
{
|
||||||
//Initialize a vulkan instance
|
//Initialize a vulkan instance
|
||||||
VkApplicationInfo app = {};
|
VkApplicationInfo app = {};
|
||||||
|
@ -2528,33 +2526,29 @@ public:
|
||||||
instance_info.enabledExtensionCount = fast ? 0 : static_cast<uint32_t>(extensions.size());
|
instance_info.enabledExtensionCount = fast ? 0 : static_cast<uint32_t>(extensions.size());
|
||||||
instance_info.ppEnabledExtensionNames = fast ? nullptr : extensions.data();
|
instance_info.ppEnabledExtensionNames = fast ? nullptr : extensions.data();
|
||||||
|
|
||||||
VkInstance instance;
|
if (VkResult result = vkCreateInstance(&instance_info, nullptr, &m_instance); result != VK_SUCCESS)
|
||||||
if (VkResult result = vkCreateInstance(&instance_info, nullptr, &instance); result != VK_SUCCESS)
|
|
||||||
{
|
{
|
||||||
if (result == VK_ERROR_LAYER_NOT_PRESENT)
|
if (result == VK_ERROR_LAYER_NOT_PRESENT)
|
||||||
{
|
{
|
||||||
LOG_FATAL(RSX,"Could not initialize layer VK_LAYER_KHRONOS_validation");
|
LOG_FATAL(RSX,"Could not initialize layer VK_LAYER_KHRONOS_validation");
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_vk_instances.push_back(instance);
|
return true;
|
||||||
return (u32)m_vk_instances.size();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void makeCurrentInstance(uint32_t instance_id)
|
void makeCurrentInstance()
|
||||||
{
|
{
|
||||||
if (!instance_id || instance_id > m_vk_instances.size())
|
// Register some global states
|
||||||
fmt::throw_exception("Invalid instance passed to makeCurrentInstance (%u)" HERE, instance_id);
|
|
||||||
|
|
||||||
if (m_debugger)
|
if (m_debugger)
|
||||||
{
|
{
|
||||||
destroyDebugReportCallback(m_instance, m_debugger, nullptr);
|
destroyDebugReportCallback(m_instance, m_debugger, nullptr);
|
||||||
m_debugger = nullptr;
|
m_debugger = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
instance_id--;
|
enable_debugging();
|
||||||
m_instance = m_vk_instances[instance_id];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VkInstance getCurrentInstance()
|
VkInstance getCurrentInstance()
|
||||||
|
@ -2562,15 +2556,6 @@ public:
|
||||||
return m_instance;
|
return m_instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
VkInstance getInstanceById(uint32_t instance_id)
|
|
||||||
{
|
|
||||||
if (!instance_id || instance_id > m_vk_instances.size())
|
|
||||||
fmt::throw_exception("Invalid instance passed to getInstanceById (%u)" HERE, instance_id);
|
|
||||||
|
|
||||||
instance_id--;
|
|
||||||
return m_vk_instances[instance_id];
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<physical_device>& enumerateDevices()
|
std::vector<physical_device>& enumerateDevices()
|
||||||
{
|
{
|
||||||
uint32_t num_gpus;
|
uint32_t num_gpus;
|
||||||
|
@ -2594,7 +2579,6 @@ public:
|
||||||
|
|
||||||
swapchain_base* createSwapChain(display_handle_t window_handle, vk::physical_device &dev)
|
swapchain_base* createSwapChain(display_handle_t window_handle, vk::physical_device &dev)
|
||||||
{
|
{
|
||||||
VkSurfaceKHR surface;
|
|
||||||
bool force_wm_reporting_off = false;
|
bool force_wm_reporting_off = false;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
using swapchain_NATIVE = swapchain_WIN32;
|
using swapchain_NATIVE = swapchain_WIN32;
|
||||||
|
@ -2605,7 +2589,7 @@ public:
|
||||||
createInfo.hinstance = hInstance;
|
createInfo.hinstance = hInstance;
|
||||||
createInfo.hwnd = window_handle;
|
createInfo.hwnd = window_handle;
|
||||||
|
|
||||||
CHECK_RESULT(vkCreateWin32SurfaceKHR(m_instance, &createInfo, NULL, &surface));
|
CHECK_RESULT(vkCreateWin32SurfaceKHR(m_instance, &createInfo, NULL, &m_surface));
|
||||||
|
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
using swapchain_NATIVE = swapchain_MacOS;
|
using swapchain_NATIVE = swapchain_MacOS;
|
||||||
|
@ -2613,7 +2597,7 @@ public:
|
||||||
createInfo.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
|
createInfo.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
|
||||||
createInfo.pView = window_handle;
|
createInfo.pView = window_handle;
|
||||||
|
|
||||||
CHECK_RESULT(vkCreateMacOSSurfaceMVK(m_instance, &createInfo, NULL, &surface));
|
CHECK_RESULT(vkCreateMacOSSurfaceMVK(m_instance, &createInfo, NULL, &m_surface));
|
||||||
#else
|
#else
|
||||||
using swapchain_NATIVE = swapchain_X11;
|
using swapchain_NATIVE = swapchain_X11;
|
||||||
|
|
||||||
|
@ -2627,7 +2611,7 @@ public:
|
||||||
createInfo.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;
|
createInfo.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;
|
||||||
createInfo.dpy = p.first;
|
createInfo.dpy = p.first;
|
||||||
createInfo.window = p.second;
|
createInfo.window = p.second;
|
||||||
CHECK_RESULT(vkCreateXlibSurfaceKHR(this->m_instance, &createInfo, nullptr, &surface));
|
CHECK_RESULT(vkCreateXlibSurfaceKHR(this->m_instance, &createInfo, nullptr, &m_surface));
|
||||||
}
|
}
|
||||||
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
|
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
|
||||||
else if constexpr (std::is_same_v<T, std::pair<wl_display*, wl_surface*>>)
|
else if constexpr (std::is_same_v<T, std::pair<wl_display*, wl_surface*>>)
|
||||||
|
@ -2636,7 +2620,7 @@ public:
|
||||||
createInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
|
createInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
|
||||||
createInfo.display = p.first;
|
createInfo.display = p.first;
|
||||||
createInfo.surface = p.second;
|
createInfo.surface = p.second;
|
||||||
CHECK_RESULT(vkCreateWaylandSurfaceKHR(this->m_instance, &createInfo, nullptr, &surface));
|
CHECK_RESULT(vkCreateWaylandSurfaceKHR(this->m_instance, &createInfo, nullptr, &m_surface));
|
||||||
force_wm_reporting_off = true;
|
force_wm_reporting_off = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2653,7 +2637,7 @@ public:
|
||||||
|
|
||||||
for (u32 index = 0; index < device_queues; index++)
|
for (u32 index = 0; index < device_queues; index++)
|
||||||
{
|
{
|
||||||
vkGetPhysicalDeviceSurfaceSupportKHR(dev, index, surface, &supportsPresent[index]);
|
vkGetPhysicalDeviceSurfaceSupportKHR(dev, index, m_surface, &supportsPresent[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto &value : supportsPresent)
|
for (const auto &value : supportsPresent)
|
||||||
|
@ -2729,10 +2713,10 @@ public:
|
||||||
|
|
||||||
// Get the list of VkFormat's that are supported:
|
// Get the list of VkFormat's that are supported:
|
||||||
uint32_t formatCount;
|
uint32_t formatCount;
|
||||||
CHECK_RESULT(vkGetPhysicalDeviceSurfaceFormatsKHR(dev, surface, &formatCount, nullptr));
|
CHECK_RESULT(vkGetPhysicalDeviceSurfaceFormatsKHR(dev, m_surface, &formatCount, nullptr));
|
||||||
|
|
||||||
std::vector<VkSurfaceFormatKHR> surfFormats(formatCount);
|
std::vector<VkSurfaceFormatKHR> surfFormats(formatCount);
|
||||||
CHECK_RESULT(vkGetPhysicalDeviceSurfaceFormatsKHR(dev, surface, &formatCount, surfFormats.data()));
|
CHECK_RESULT(vkGetPhysicalDeviceSurfaceFormatsKHR(dev, m_surface, &formatCount, surfFormats.data()));
|
||||||
|
|
||||||
VkFormat format;
|
VkFormat format;
|
||||||
VkColorSpaceKHR color_space;
|
VkColorSpaceKHR color_space;
|
||||||
|
@ -2759,7 +2743,7 @@ public:
|
||||||
|
|
||||||
color_space = surfFormats[0].colorSpace;
|
color_space = surfFormats[0].colorSpace;
|
||||||
|
|
||||||
return new swapchain_WSI(dev, presentQueueNodeIndex, graphicsQueueNodeIndex, format, surface, color_space, force_wm_reporting_off);
|
return new swapchain_WSI(dev, presentQueueNodeIndex, graphicsQueueNodeIndex, format, m_surface, color_space, force_wm_reporting_off);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -137,11 +137,9 @@ emu_settings::Render_Creator::Render_Creator()
|
||||||
thread_ctrl::set_native_priority(-1);
|
thread_ctrl::set_native_priority(-1);
|
||||||
|
|
||||||
vk::context device_enum_context;
|
vk::context device_enum_context;
|
||||||
u32 instance_handle = device_enum_context.createInstance("RPCS3", true);
|
if (device_enum_context.createInstance("RPCS3", true))
|
||||||
|
|
||||||
if (instance_handle > 0)
|
|
||||||
{
|
{
|
||||||
device_enum_context.makeCurrentInstance(instance_handle);
|
device_enum_context.makeCurrentInstance();
|
||||||
std::vector<vk::physical_device> &gpus = device_enum_context.enumerateDevices();
|
std::vector<vk::physical_device> &gpus = device_enum_context.enumerateDevices();
|
||||||
|
|
||||||
if (!gpus.empty())
|
if (!gpus.empty())
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue