diff options
Diffstat (limited to 'src/video_core/renderer_opengl/renderer_opengl.cpp')
-rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 88 |
1 files changed, 3 insertions, 85 deletions
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 8fcb86581..9d2acd4d9 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp @@ -27,11 +27,6 @@ #include "video_core/renderer_opengl/gl_shader_manager.h" #include "video_core/renderer_opengl/renderer_opengl.h" #include "video_core/textures/decoders.h" -#include "video_core/vulkan_common/vulkan_debug_callback.h" -#include "video_core/vulkan_common/vulkan_device.h" -#include "video_core/vulkan_common/vulkan_instance.h" -#include "video_core/vulkan_common/vulkan_library.h" -#include "video_core/vulkan_common/vulkan_memory_allocator.h" namespace OpenGL { namespace { @@ -127,93 +122,16 @@ void APIENTRY DebugHandler(GLenum source, GLenum type, GLuint id, GLenum severit break; } } - -Vulkan::vk::PhysicalDevice FindPhysicalDevice(Vulkan::vk::Instance& instance) { - using namespace Vulkan; - using UUID = std::array<GLubyte, GL_UUID_SIZE_EXT>; - - GLint num_device_uuids; - glGetIntegerv(GL_NUM_DEVICE_UUIDS_EXT, &num_device_uuids); - std::vector<UUID> device_uuids(num_device_uuids); - for (GLint index = 0; index < num_device_uuids; ++index) { - glGetUnsignedBytei_vEXT(GL_DEVICE_UUID_EXT, 0, device_uuids[index].data()); - } - UUID driver_uuid; - glGetUnsignedBytevEXT(GL_DRIVER_UUID_EXT, driver_uuid.data()); - - for (const VkPhysicalDevice raw_physical_device : instance.EnumeratePhysicalDevices()) { - VkPhysicalDeviceIDProperties device_id_properties{}; - device_id_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES; - - VkPhysicalDeviceProperties2KHR properties{ - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, - .pNext = &device_id_properties, - .properties{}, - }; - vk::PhysicalDevice physical_device(raw_physical_device, instance.Dispatch()); - physical_device.GetProperties2KHR(properties); - if (!std::ranges::equal(device_id_properties.driverUUID, driver_uuid)) { - continue; - } - const auto it = - std::ranges::find_if(device_uuids, [&device_id_properties, driver_uuid](UUID uuid) { - return std::ranges::equal(device_id_properties.deviceUUID, uuid); - }); - if (it != device_uuids.end()) { - return physical_device; - } - } - throw vk::Exception(VK_ERROR_INCOMPATIBLE_DRIVER); -} } // Anonymous namespace -struct VulkanObjects { - static std::unique_ptr<VulkanObjects> TryCreate() { - if (!GLAD_GL_EXT_memory_object) { - // Interop is not present - return nullptr; - } - const std::string_view vendor{reinterpret_cast<const char*>(glGetString(GL_VENDOR))}; - if (vendor == "ATI Technologies Inc.") { - // Avoid using GL_EXT_memory_object on AMD, as it makes the GL driver crash - return nullptr; - } - if (!Settings::values.use_assembly_shaders.GetValue()) { - // We only need interop when assembly shaders are enabled - return nullptr; - } -#ifdef __linux__ - LOG_WARNING(Render_OpenGL, "Interop doesn't work on Linux at the moment"); - return nullptr; -#endif - try { - return std::make_unique<VulkanObjects>(); - } catch (const Vulkan::vk::Exception& exception) { - LOG_ERROR(Render_OpenGL, "Failed to initialize Vulkan objects with error: {}", - exception.what()); - return nullptr; - } - } - - Common::DynamicLibrary library{Vulkan::OpenLibrary()}; - Vulkan::vk::InstanceDispatch dld; - Vulkan::vk::Instance instance{Vulkan::CreateInstance(library, dld, VK_API_VERSION_1_1)}; - Vulkan::Device device{*instance, FindPhysicalDevice(instance), nullptr, dld}; - Vulkan::MemoryAllocator memory_allocator{device, true}; -}; - RendererOpenGL::RendererOpenGL(Core::TelemetrySession& telemetry_session_, Core::Frontend::EmuWindow& emu_window_, Core::Memory::Memory& cpu_memory_, Tegra::GPU& gpu_, std::unique_ptr<Core::Frontend::GraphicsContext> context_) : RendererBase{emu_window_, std::move(context_)}, telemetry_session{telemetry_session_}, - emu_window{emu_window_}, cpu_memory{cpu_memory_}, gpu{gpu_}, - vulkan_objects{VulkanObjects::TryCreate()}, device{vulkan_objects != nullptr}, - state_tracker{gpu}, program_manager{device}, - rasterizer(emu_window, gpu, cpu_memory, device, - vulkan_objects ? &vulkan_objects->device : nullptr, - vulkan_objects ? &vulkan_objects->memory_allocator : nullptr, screen_info, - program_manager, state_tracker) { + emu_window{emu_window_}, cpu_memory{cpu_memory_}, gpu{gpu_}, state_tracker{gpu}, + program_manager{device}, + rasterizer(emu_window, gpu, cpu_memory, device, screen_info, program_manager, state_tracker) { if (Settings::values.renderer_debug && GLAD_GL_KHR_debug) { glEnable(GL_DEBUG_OUTPUT); glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); |