Commit 39ec4f7b authored by Michael Spang's avatar Michael Spang Committed by Commit Bot

gpu: vulkan: Make gpu::VulkanFunctionPointers independent of VK_USE_PLATFORM_*

Since b9adeda8 ("Use function pointers in Vulkan") vulkan_tests
crashes on my system.

The reason is that gpu::VulkanFunctionPointers has a different definition
in different compilation units due different VK_USE_PLATFORM_* defines.

We could export those defines, but since portable code has no business
calling these extension functions, this moves the extension functions out
of the public bindings instead.

Keeping platform extensions internal also means that most code won't get
the namespace pollution that Xlib inflicts just by including
<vulkan/vulkan.h> (global macros defined by X11.h actually break later
inclusion of gtest.h, for example).

In order to make encapsulation of the X bits work, this also fixes a typo
where we include vulkan_factory.cc instead of vulkan_factory.h.

Bug: 851997
Test: vulkan_tests on X11

Change-Id: I4ebde71c68528595a3eb21be72c50d65c357a7af
Reviewed-on: https://chromium-review.googlesource.com/1108504Reviewed-by: default avatarAntoine Labour <piman@chromium.org>
Reviewed-by: default avatarChris Blume <cblume@chromium.org>
Commit-Queue: Michael Spang <spang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#569072}
parent cb44e65a
......@@ -116,7 +116,7 @@
#if BUILDFLAG(ENABLE_VULKAN)
#include "components/viz/common/gpu/vulkan_in_process_context_provider.h"
#include "content/browser/compositor/vulkan_browser_compositor_output_surface.h"
#include "gpu/vulkan/init/vulkan_factory.cc"
#include "gpu/vulkan/init/vulkan_factory.h"
#endif
using viz::ContextProvider;
......
......@@ -55,10 +55,6 @@ if (enable_vulkan) {
defines = [ "VULKAN_IMPLEMENTATION" ]
if (use_x11) {
defines += [ "VK_USE_PLATFORM_XLIB_KHR" ]
}
all_dependent_configs = [ "//third_party/vulkan:vulkan_config" ]
deps = [
......
#!/usr/bin/env_python
#!/usr/bin/env python
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
......@@ -123,12 +123,6 @@ struct VulkanFunctionPointers {
PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices = nullptr;
PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR = nullptr;
PFN_vkDestroyInstance vkDestroyInstance = nullptr;
#if defined(VK_USE_PLATFORM_XLIB_KHR)
PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR = nullptr;
#endif // defined(VK_USE_PLATFORM_XLIB_KHR)
#if defined(VK_USE_PLATFORM_ANDROID_KHR)
PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR = nullptr;
#endif // defined(VK_USE_PLATFORM_ANDROID_KHR)
// Physical Device functions
PFN_vkGetPhysicalDeviceQueueFamilyProperties
......@@ -142,10 +136,6 @@ struct VulkanFunctionPointers {
vkGetPhysicalDeviceSurfaceFormatsKHR = nullptr;
PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR
vkGetPhysicalDeviceSurfaceCapabilitiesKHR = nullptr;
#if defined(VK_USE_PLATFORM_XLIB_KHR)
PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR
vkGetPhysicalDeviceXlibPresentationSupportKHR = nullptr;
#endif // defined(VK_USE_PLATFORM_XLIB_KHR)
// Device functions
""")
......
......@@ -22,10 +22,11 @@ component("init") {
"//gpu/vulkan",
]
deps = []
if (use_x11) {
public_deps += [ "//gpu/vulkan/x" ]
deps += [ "//gpu/vulkan/x" ]
}
if (use_ozone) {
public_deps += [ "//ui/ozone" ]
deps += [ "//ui/ozone" ]
}
}
......@@ -8,11 +8,10 @@
#include <memory>
#include "base/component_export.h"
#include "gpu/vulkan/vulkan_implementation.h"
namespace gpu {
class VulkanImplementation;
COMPONENT_EXPORT(VULKAN_INIT)
std::unique_ptr<VulkanImplementation> CreateVulkanImplementation();
......
......@@ -44,12 +44,6 @@ struct VulkanFunctionPointers {
PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices = nullptr;
PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR = nullptr;
PFN_vkDestroyInstance vkDestroyInstance = nullptr;
#if defined(VK_USE_PLATFORM_XLIB_KHR)
PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR = nullptr;
#endif // defined(VK_USE_PLATFORM_XLIB_KHR)
#if defined(VK_USE_PLATFORM_ANDROID_KHR)
PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR = nullptr;
#endif // defined(VK_USE_PLATFORM_ANDROID_KHR)
// Physical Device functions
PFN_vkGetPhysicalDeviceQueueFamilyProperties
......@@ -63,10 +57,6 @@ struct VulkanFunctionPointers {
vkGetPhysicalDeviceSurfaceFormatsKHR = nullptr;
PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR
vkGetPhysicalDeviceSurfaceCapabilitiesKHR = nullptr;
#if defined(VK_USE_PLATFORM_XLIB_KHR)
PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR
vkGetPhysicalDeviceXlibPresentationSupportKHR = nullptr;
#endif // defined(VK_USE_PLATFORM_XLIB_KHR)
// Device functions
PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR = nullptr;
......
......@@ -34,11 +34,10 @@ bool VulkanImplementationAndroid::InitializeVulkanInstance() {
}
// Initialize platform function pointers
vulkan_function_pointers->vkCreateAndroidSurfaceKHR =
reinterpret_cast<PFN_vkCreateAndroidSurfaceKHR>(
vulkan_function_pointers->vkGetInstanceProcAddr(
vulkan_instance_.vk_instance(), "vkCreateAndroidSurfaceKHR"));
if (!vulkan_function_pointers->vkCreateAndroidSurfaceKHR) {
vkCreateAndroidSurfaceKHR_ = reinterpret_cast<PFN_vkCreateAndroidSurfaceKHR>(
vulkan_function_pointers->vkGetInstanceProcAddr(
vulkan_instance_.vk_instance(), "vkCreateAndroidSurfaceKHR"));
if (!vkCreateAndroidSurfaceKHR_) {
vulkan_instance_.Destroy();
return false;
}
......
......@@ -32,6 +32,8 @@ class VULKAN_EXPORT VulkanImplementationAndroid : public VulkanImplementation {
private:
VulkanInstance vulkan_instance_;
PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(VulkanImplementationAndroid);
};
......
......@@ -8,6 +8,10 @@ import("//gpu/vulkan/features.gni")
assert(enable_vulkan)
assert(use_x11 || use_ozone)
config("vulkan_x11") {
defines = [ "VK_USE_PLATFORM_XLIB_KHR" ]
}
component("x") {
output_name = "vulkan_x11"
......@@ -16,11 +20,9 @@ component("x") {
"vulkan_implementation_x11.h",
]
defines = [
"IS_VULKAN_X11_IMPL",
"VK_USE_PLATFORM_XLIB_KHR",
]
defines = [ "IS_VULKAN_X11_IMPL" ]
public_configs = [ ":vulkan_x11" ]
configs += [ "//build/config/linux:x11" ]
deps = [
......
......@@ -39,22 +39,20 @@ bool VulkanImplementationX11::InitializeVulkanInstance() {
}
// Initialize platform function pointers
vulkan_function_pointers->vkGetPhysicalDeviceXlibPresentationSupportKHR =
vkGetPhysicalDeviceXlibPresentationSupportKHR_ =
reinterpret_cast<PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR>(
vulkan_function_pointers->vkGetInstanceProcAddr(
vulkan_instance_.vk_instance(),
"vkGetPhysicalDeviceXlibPresentationSupportKHR"));
if (!vulkan_function_pointers
->vkGetPhysicalDeviceXlibPresentationSupportKHR) {
if (!vkGetPhysicalDeviceXlibPresentationSupportKHR_) {
vulkan_instance_.Destroy();
return false;
}
vulkan_function_pointers->vkCreateXlibSurfaceKHR =
reinterpret_cast<PFN_vkCreateXlibSurfaceKHR>(
vulkan_function_pointers->vkGetInstanceProcAddr(
vulkan_instance_.vk_instance(), "vkCreateXlibSurfaceKHR"));
if (!vulkan_function_pointers->vkCreateXlibSurfaceKHR) {
vkCreateXlibSurfaceKHR_ = reinterpret_cast<PFN_vkCreateXlibSurfaceKHR>(
vulkan_function_pointers->vkGetInstanceProcAddr(
vulkan_instance_.vk_instance(), "vkCreateXlibSurfaceKHR"));
if (!vkCreateXlibSurfaceKHR_) {
vulkan_instance_.Destroy();
return false;
}
......@@ -68,15 +66,12 @@ VkInstance VulkanImplementationX11::GetVulkanInstance() {
std::unique_ptr<VulkanSurface> VulkanImplementationX11::CreateViewSurface(
gfx::AcceleratedWidget window) {
VulkanFunctionPointers* vulkan_function_pointers =
gpu::GetVulkanFunctionPointers();
VkSurfaceKHR surface;
VkXlibSurfaceCreateInfoKHR surface_create_info = {};
surface_create_info.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;
surface_create_info.dpy = x_display_;
surface_create_info.window = window;
VkResult result = vulkan_function_pointers->vkCreateXlibSurfaceKHR(
VkResult result = vkCreateXlibSurfaceKHR_(
GetVulkanInstance(), &surface_create_info, nullptr, &surface);
if (VK_SUCCESS != result) {
DLOG(ERROR) << "vkCreateXlibSurfaceKHR() failed: " << result;
......@@ -90,14 +85,10 @@ bool VulkanImplementationX11::GetPhysicalDevicePresentationSupport(
VkPhysicalDevice device,
const std::vector<VkQueueFamilyProperties>& queue_family_properties,
uint32_t queue_family_index) {
VulkanFunctionPointers* vulkan_function_pointers =
gpu::GetVulkanFunctionPointers();
return vulkan_function_pointers
->vkGetPhysicalDeviceXlibPresentationSupportKHR(
device, queue_family_index, x_display_,
XVisualIDFromVisual(
DefaultVisual(x_display_, DefaultScreen(x_display_))));
return vkGetPhysicalDeviceXlibPresentationSupportKHR_(
device, queue_family_index, x_display_,
XVisualIDFromVisual(
DefaultVisual(x_display_, DefaultScreen(x_display_))));
}
} // namespace gpu
......@@ -35,6 +35,10 @@ class COMPONENT_EXPORT(VULKAN_X11) VulkanImplementationX11
XDisplay* const x_display_;
VulkanInstance vulkan_instance_;
PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR
vkGetPhysicalDeviceXlibPresentationSupportKHR_ = nullptr;
PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(VulkanImplementationX11);
};
......
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