Commit 3172eba8 authored by Peng Huang's avatar Peng Huang Committed by Commit Bot

Switch from VK_KHR_xlib_surface to VK_KHR_xcb_surface

Chrome is switching to use xcb, so we would like to use
VK_KHR_xcb_surface for vulkan as well.

Bug: 843346,1143750
Change-Id: I9e2e61ca774d04a05d89cd3425ca1bfa8c190fe5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2510437
Commit-Queue: Vasiliy Telezhnikov <vasilyt@chromium.org>
Auto-Submit: Peng Huang <penghuang@chromium.org>
Reviewed-by: default avatarVasiliy Telezhnikov <vasilyt@chromium.org>
Cr-Commit-Position: refs/heads/master@{#822973}
parent f6fa85d4
...@@ -16,11 +16,11 @@ buildflag_header("buildflags") { ...@@ -16,11 +16,11 @@ buildflag_header("buildflags") {
} }
if (enable_vulkan) { if (enable_vulkan) {
use_vulkan_xlib = use_x11 || ozone_platform_x11 use_vulkan_xcb = use_x11 || ozone_platform_x11
config("vulkan_config") { config("vulkan_config") {
defines = [ "VK_NO_PROTOTYPES" ] defines = [ "VK_NO_PROTOTYPES" ]
if (use_vulkan_xlib) { if (use_vulkan_xcb) {
defines += [ "USE_VULKAN_XLIB" ] defines += [ "USE_VULKAN_XCB" ]
} }
} }
......
...@@ -72,11 +72,11 @@ VULKAN_INSTANCE_FUNCTIONS = [ ...@@ -72,11 +72,11 @@ VULKAN_INSTANCE_FUNCTIONS = [
] ]
}, },
{ {
'ifdef': 'defined(USE_VULKAN_XLIB)', 'ifdef': 'defined(USE_VULKAN_XCB)',
'extension': 'VK_KHR_XLIB_SURFACE_EXTENSION_NAME', 'extension': 'VK_KHR_XCB_SURFACE_EXTENSION_NAME',
'functions': [ 'functions': [
'vkCreateXlibSurfaceKHR', 'vkCreateXcbSurfaceKHR',
'vkGetPhysicalDeviceXlibPresentationSupportKHR', 'vkGetPhysicalDeviceXcbPresentationSupportKHR',
] ]
}, },
{ {
...@@ -381,11 +381,10 @@ def GenerateHeaderFile(out_file): ...@@ -381,11 +381,10 @@ def GenerateHeaderFile(out_file):
#include "gpu/vulkan/fuchsia/vulkan_fuchsia_ext.h" #include "gpu/vulkan/fuchsia/vulkan_fuchsia_ext.h"
#endif #endif
#if defined(USE_VULKAN_XLIB) #if defined(USE_VULKAN_XCB)
typedef struct _XDisplay Display; #include <xcb/xcb.h>
typedef unsigned long Window; // <vulkan/vulkan_xcb.h> must be included after <xcb/xcb.h>
typedef unsigned long VisualID; #include <vulkan/vulkan_xcb.h>
#include <vulkan/vulkan_xlib.h>
#endif #endif
#if defined(OS_WIN) #if defined(OS_WIN)
......
...@@ -260,28 +260,28 @@ bool VulkanFunctionPointers::BindInstanceFunctionPointers( ...@@ -260,28 +260,28 @@ bool VulkanFunctionPointers::BindInstanceFunctionPointers(
} }
} }
#if defined(USE_VULKAN_XLIB) #if defined(USE_VULKAN_XCB)
if (gfx::HasExtension(enabled_extensions, if (gfx::HasExtension(enabled_extensions,
VK_KHR_XLIB_SURFACE_EXTENSION_NAME)) { VK_KHR_XCB_SURFACE_EXTENSION_NAME)) {
vkCreateXlibSurfaceKHR = reinterpret_cast<PFN_vkCreateXlibSurfaceKHR>( vkCreateXcbSurfaceKHR = reinterpret_cast<PFN_vkCreateXcbSurfaceKHR>(
vkGetInstanceProcAddr(vk_instance, "vkCreateXlibSurfaceKHR")); vkGetInstanceProcAddr(vk_instance, "vkCreateXcbSurfaceKHR"));
if (!vkCreateXlibSurfaceKHR) { if (!vkCreateXcbSurfaceKHR) {
DLOG(WARNING) << "Failed to bind vulkan entrypoint: " DLOG(WARNING) << "Failed to bind vulkan entrypoint: "
<< "vkCreateXlibSurfaceKHR"; << "vkCreateXcbSurfaceKHR";
return false; return false;
} }
vkGetPhysicalDeviceXlibPresentationSupportKHR = vkGetPhysicalDeviceXcbPresentationSupportKHR =
reinterpret_cast<PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR>( reinterpret_cast<PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR>(
vkGetInstanceProcAddr( vkGetInstanceProcAddr(
vk_instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR")); vk_instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR"));
if (!vkGetPhysicalDeviceXlibPresentationSupportKHR) { if (!vkGetPhysicalDeviceXcbPresentationSupportKHR) {
DLOG(WARNING) << "Failed to bind vulkan entrypoint: " DLOG(WARNING) << "Failed to bind vulkan entrypoint: "
<< "vkGetPhysicalDeviceXlibPresentationSupportKHR"; << "vkGetPhysicalDeviceXcbPresentationSupportKHR";
return false; return false;
} }
} }
#endif // defined(USE_VULKAN_XLIB) #endif // defined(USE_VULKAN_XCB)
#if defined(OS_WIN) #if defined(OS_WIN)
if (gfx::HasExtension(enabled_extensions, if (gfx::HasExtension(enabled_extensions,
......
...@@ -31,11 +31,10 @@ ...@@ -31,11 +31,10 @@
#include "gpu/vulkan/fuchsia/vulkan_fuchsia_ext.h" #include "gpu/vulkan/fuchsia/vulkan_fuchsia_ext.h"
#endif #endif
#if defined(USE_VULKAN_XLIB) #if defined(USE_VULKAN_XCB)
typedef struct _XDisplay Display; #include <xcb/xcb.h>
typedef unsigned long Window; // <vulkan/vulkan_xcb.h> must be included after <xcb/xcb.h>
typedef unsigned long VisualID; #include <vulkan/vulkan_xcb.h>
#include <vulkan/vulkan_xlib.h>
#endif #endif
#if defined(OS_WIN) #if defined(OS_WIN)
...@@ -142,11 +141,11 @@ struct COMPONENT_EXPORT(VULKAN) VulkanFunctionPointers { ...@@ -142,11 +141,11 @@ struct COMPONENT_EXPORT(VULKAN) VulkanFunctionPointers {
VulkanFunction<PFN_vkGetPhysicalDeviceSurfaceSupportKHR> VulkanFunction<PFN_vkGetPhysicalDeviceSurfaceSupportKHR>
vkGetPhysicalDeviceSurfaceSupportKHR; vkGetPhysicalDeviceSurfaceSupportKHR;
#if defined(USE_VULKAN_XLIB) #if defined(USE_VULKAN_XCB)
VulkanFunction<PFN_vkCreateXlibSurfaceKHR> vkCreateXlibSurfaceKHR; VulkanFunction<PFN_vkCreateXcbSurfaceKHR> vkCreateXcbSurfaceKHR;
VulkanFunction<PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR> VulkanFunction<PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR>
vkGetPhysicalDeviceXlibPresentationSupportKHR; vkGetPhysicalDeviceXcbPresentationSupportKHR;
#endif // defined(USE_VULKAN_XLIB) #endif // defined(USE_VULKAN_XCB)
#if defined(OS_WIN) #if defined(OS_WIN)
VulkanFunction<PFN_vkCreateWin32SurfaceKHR> vkCreateWin32SurfaceKHR; VulkanFunction<PFN_vkCreateWin32SurfaceKHR> vkCreateWin32SurfaceKHR;
...@@ -459,25 +458,25 @@ vkGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, ...@@ -459,25 +458,25 @@ vkGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
physicalDevice, queueFamilyIndex, surface, pSupported); physicalDevice, queueFamilyIndex, surface, pSupported);
} }
#if defined(USE_VULKAN_XLIB) #if defined(USE_VULKAN_XCB)
ALWAYS_INLINE VkResult ALWAYS_INLINE VkResult
vkCreateXlibSurfaceKHR(VkInstance instance, vkCreateXcbSurfaceKHR(VkInstance instance,
const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator, const VkAllocationCallbacks* pAllocator,
VkSurfaceKHR* pSurface) { VkSurfaceKHR* pSurface) {
return gpu::GetVulkanFunctionPointers()->vkCreateXlibSurfaceKHR( return gpu::GetVulkanFunctionPointers()->vkCreateXcbSurfaceKHR(
instance, pCreateInfo, pAllocator, pSurface); instance, pCreateInfo, pAllocator, pSurface);
} }
ALWAYS_INLINE VkBool32 ALWAYS_INLINE VkBool32
vkGetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice, vkGetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex, uint32_t queueFamilyIndex,
Display* dpy, xcb_connection_t* connection,
VisualID visualID) { xcb_visualid_t visual_id) {
return gpu::GetVulkanFunctionPointers() return gpu::GetVulkanFunctionPointers()
->vkGetPhysicalDeviceXlibPresentationSupportKHR( ->vkGetPhysicalDeviceXcbPresentationSupportKHR(
physicalDevice, queueFamilyIndex, dpy, visualID); physicalDevice, queueFamilyIndex, connection, visual_id);
} }
#endif // defined(USE_VULKAN_XLIB) #endif // defined(USE_VULKAN_XCB)
#if defined(OS_WIN) #if defined(OS_WIN)
ALWAYS_INLINE VkResult ALWAYS_INLINE VkResult
......
...@@ -177,31 +177,6 @@ bool VulkanInstance::Initialize( ...@@ -177,31 +177,6 @@ bool VulkanInstance::Initialize(
return false; return false;
} }
gfx::ExtensionSet enabled_extensions(
std::begin(vulkan_info_.enabled_instance_extensions),
std::end(vulkan_info_.enabled_instance_extensions));
#if DCHECK_IS_ON()
// TODO(crbug.com/843346): Make validation work in combination with
// VK_KHR_xlib_surface or switch to VK_KHR_xcb_surface.
bool require_xlib_surface_extension =
gfx::HasExtension(enabled_extensions, "VK_KHR_xlib_surface");
// VK_LAYER_KHRONOS_validation 1.1.106 is required to support
// VK_KHR_xlib_surface.
constexpr base::StringPiece standard_validation(
"VK_LAYER_KHRONOS_validation");
for (const VkLayerProperties& layer_property : vulkan_info_.instance_layers) {
if (standard_validation != layer_property.layerName)
continue;
if (!require_xlib_surface_extension ||
layer_property.specVersion >= VK_MAKE_VERSION(1, 1, 106)) {
enabled_layer_names.push_back(standard_validation.data());
}
break;
}
#endif // DCHECK_IS_ON()
VkInstanceCreateInfo instance_create_info = { VkInstanceCreateInfo instance_create_info = {
VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType
nullptr, // pNext nullptr, // pNext
...@@ -220,6 +195,10 @@ bool VulkanInstance::Initialize( ...@@ -220,6 +195,10 @@ bool VulkanInstance::Initialize(
return false; return false;
} }
gfx::ExtensionSet enabled_extensions(
std::begin(vulkan_info_.enabled_instance_extensions),
std::end(vulkan_info_.enabled_instance_extensions));
if (!vulkan_function_pointers->BindInstanceFunctionPointers( if (!vulkan_function_pointers->BindInstanceFunctionPointers(
vk_instance_, vulkan_info_.used_api_version, enabled_extensions)) { vk_instance_, vulkan_info_.used_api_version, enabled_extensions)) {
return false; return false;
......
...@@ -58,7 +58,7 @@ bool VulkanImplementationX11::InitializeVulkanInstance(bool using_surface) { ...@@ -58,7 +58,7 @@ bool VulkanImplementationX11::InitializeVulkanInstance(bool using_surface) {
VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME}; VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME};
if (using_surface_) { if (using_surface_) {
required_extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); required_extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
required_extensions.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); required_extensions.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
} }
VulkanFunctionPointers* vulkan_function_pointers = VulkanFunctionPointers* vulkan_function_pointers =
...@@ -103,9 +103,9 @@ bool VulkanImplementationX11::GetPhysicalDevicePresentationSupport( ...@@ -103,9 +103,9 @@ bool VulkanImplementationX11::GetPhysicalDevicePresentationSupport(
if (use_swiftshader()) if (use_swiftshader())
return true; return true;
auto* connection = x11::Connection::Get(); auto* connection = x11::Connection::Get();
return vkGetPhysicalDeviceXlibPresentationSupportKHR( return vkGetPhysicalDeviceXcbPresentationSupportKHR(
device, queue_family_index, connection->GetXlibDisplay(), device, queue_family_index, connection->XcbConnection(),
static_cast<VisualID>(connection->default_root_visual().visual_id)); static_cast<xcb_visualid_t>(connection->default_root_visual().visual_id));
} }
std::vector<const char*> std::vector<const char*>
......
...@@ -69,16 +69,20 @@ std::unique_ptr<VulkanSurfaceX11> VulkanSurfaceX11::Create( ...@@ -69,16 +69,20 @@ std::unique_ptr<VulkanSurfaceX11> VulkanSurfaceX11::Create(
LOG(ERROR) << "Failed to create or map window."; LOG(ERROR) << "Failed to create or map window.";
return nullptr; return nullptr;
} }
// Flush the connection, otherwise other Vulkan WSI calls may fail with some
// drivers.
connection->Flush();
VkSurfaceKHR vk_surface; VkSurfaceKHR vk_surface;
VkXlibSurfaceCreateInfoKHR surface_create_info = { const VkXcbSurfaceCreateInfoKHR surface_create_info = {
VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR}; .sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR,
surface_create_info.dpy = connection->GetXlibDisplay(); .connection = connection->XcbConnection(),
surface_create_info.window = static_cast<uint32_t>(window); .window = static_cast<xcb_window_t>(window),
VkResult result = vkCreateXlibSurfaceKHR(vk_instance, &surface_create_info, };
nullptr, &vk_surface); VkResult result = vkCreateXcbSurfaceKHR(vk_instance, &surface_create_info,
nullptr, &vk_surface);
if (VK_SUCCESS != result) { if (VK_SUCCESS != result) {
DLOG(ERROR) << "vkCreateXlibSurfaceKHR() failed: " << result; DLOG(ERROR) << "vkCreateXcbSurfaceKHR() failed: " << result;
return nullptr; return nullptr;
} }
return std::make_unique<VulkanSurfaceX11>(vk_instance, vk_surface, return std::make_unique<VulkanSurfaceX11>(vk_instance, vk_surface,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment