diff --git a/Common/GPU/OpenGL/GLFeatures.h b/Common/GPU/OpenGL/GLFeatures.h index f2aa338056..e8849f681d 100644 --- a/Common/GPU/OpenGL/GLFeatures.h +++ b/Common/GPU/OpenGL/GLFeatures.h @@ -18,6 +18,7 @@ enum { GPU_VENDOR_BROADCOM = 7, // Raspberry PI etc GPU_VENDOR_VIVANTE = 8, GPU_VENDOR_APPLE = 9, + GPU_VENDOR_MESA = 10, GPU_VENDOR_UNKNOWN = 0, }; diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index efa48acdf5..66c408f953 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -463,6 +463,7 @@ public: case GPUVendor::VENDOR_BROADCOM: return "VENDOR_BROADCOM"; case GPUVendor::VENDOR_VIVANTE: return "VENDOR_VIVANTE"; case GPUVendor::VENDOR_APPLE: return "VENDOR_APPLE"; + case GPUVendor::VENDOR_MESA: return "VENDOR_MESA"; case GPUVendor::VENDOR_UNKNOWN: default: return "VENDOR_UNKNOWN"; @@ -615,6 +616,7 @@ OpenGLContext::OpenGLContext(bool canChangeSwapInterval) : renderManager_(frameT case GPU_VENDOR_IMGTEC: caps_.vendor = GPUVendor::VENDOR_IMGTEC; break; case GPU_VENDOR_VIVANTE: caps_.vendor = GPUVendor::VENDOR_VIVANTE; break; case GPU_VENDOR_APPLE: caps_.vendor = GPUVendor::VENDOR_APPLE; break; + case GPU_VENDOR_MESA: caps_.vendor = GPUVendor::VENDOR_MESA; break; case GPU_VENDOR_UNKNOWN: default: caps_.vendor = GPUVendor::VENDOR_UNKNOWN; diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index d11010d3c4..14278be236 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -57,6 +57,7 @@ std::string VulkanVendorString(uint32_t vendorId) { case VULKAN_VENDOR_QUALCOMM: return "Qualcomm"; case VULKAN_VENDOR_IMGTEC: return "Imagination"; case VULKAN_VENDOR_APPLE: return "Apple"; + case VULKAN_VENDOR_MESA: return "Mesa"; default: return StringFromFormat("%08x", vendorId); } diff --git a/Common/GPU/Vulkan/VulkanContext.h b/Common/GPU/Vulkan/VulkanContext.h index 83c05e461e..4dea4ed380 100644 --- a/Common/GPU/Vulkan/VulkanContext.h +++ b/Common/GPU/Vulkan/VulkanContext.h @@ -36,6 +36,7 @@ enum { VULKAN_VENDOR_QUALCOMM = 0x00005143, VULKAN_VENDOR_IMGTEC = 0x00001010, // PowerVR VULKAN_VENDOR_APPLE = 0x0000106b, // Apple through MoltenVK + VULKAN_VENDOR_MESA = 0x00010005, // lavapipe }; VK_DEFINE_HANDLE(VmaAllocator); diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index 2c2d5a109e..7d7a3ea760 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -920,6 +920,7 @@ VKContext::VKContext(VulkanContext *vulkan, bool useRenderThread) case VULKAN_VENDOR_QUALCOMM: caps_.vendor = GPUVendor::VENDOR_QUALCOMM; break; case VULKAN_VENDOR_INTEL: caps_.vendor = GPUVendor::VENDOR_INTEL; break; case VULKAN_VENDOR_APPLE: caps_.vendor = GPUVendor::VENDOR_APPLE; break; + case VULKAN_VENDOR_MESA: caps_.vendor = GPUVendor::VENDOR_MESA; break; default: WARN_LOG(G3D, "Unknown vendor ID %08x", deviceProps.vendorID); caps_.vendor = GPUVendor::VENDOR_UNKNOWN; diff --git a/Common/GPU/thin3d.h b/Common/GPU/thin3d.h index 551964b396..e40918cd92 100644 --- a/Common/GPU/thin3d.h +++ b/Common/GPU/thin3d.h @@ -231,6 +231,7 @@ enum class GPUVendor { VENDOR_BROADCOM, // Raspberry VENDOR_VIVANTE, VENDOR_APPLE, + VENDOR_MESA, }; enum class NativeObject { diff --git a/GPU/Common/PostShader.cpp b/GPU/Common/PostShader.cpp index c8321e9315..37066703e5 100644 --- a/GPU/Common/PostShader.cpp +++ b/GPU/Common/PostShader.cpp @@ -126,6 +126,8 @@ void LoadPostShaderInfo(Draw::DrawContext *draw, const std::vector &direct blacklistedVendor = Draw::GPUVendor::VENDOR_APPLE; } else if (item == "Intel") { blacklistedVendor = Draw::GPUVendor::VENDOR_INTEL; + } else if (item == "Mesa") { + blacklistedVendor = Draw::GPUVendor::VENDOR_MESA; } if (blacklistedVendor == gpuVendor && blacklistedVendor != Draw::GPUVendor::VENDOR_UNKNOWN) { skipped = true; diff --git a/SDL/SDLVulkanGraphicsContext.cpp b/SDL/SDLVulkanGraphicsContext.cpp index f58ae422dd..11d7495265 100644 --- a/SDL/SDLVulkanGraphicsContext.cpp +++ b/SDL/SDLVulkanGraphicsContext.cpp @@ -69,7 +69,15 @@ bool SDLVulkanGraphicsContext::Init(SDL_Window *&window, int x, int y, int w, in vulkan_ = nullptr; return false; } - vulkan_->ChooseDevice(vulkan_->GetBestPhysicalDevice()); + + int deviceNum = vulkan_->GetPhysicalDeviceByName(g_Config.sVulkanDevice); + if (deviceNum < 0) { + deviceNum = vulkan_->GetBestPhysicalDevice(); + if (!g_Config.sVulkanDevice.empty()) + g_Config.sVulkanDevice = vulkan_->GetPhysicalDeviceProperties(deviceNum).properties.deviceName; + } + + vulkan_->ChooseDevice(deviceNum); if (vulkan_->CreateDevice() != VK_SUCCESS) { *error_message = vulkan_->InitError(); delete vulkan_;