Commit e9f57562 authored by Peng Huang's avatar Peng Huang Committed by Commit Bot

vulkan_tests: Support Windows.

Tested with swiftshader on Windows 10.

Bug: 1065499,963988
Change-Id: Ibce9fbca12332aec8fbc98ed838dfcc9d457ac21
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2125302Reviewed-by: default avatarVasiliy Telezhnikov <vasilyt@chromium.org>
Commit-Queue: Peng Huang <penghuang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#754464}
parent 44ef5f8d
...@@ -126,11 +126,14 @@ if (enable_vulkan) { ...@@ -126,11 +126,14 @@ if (enable_vulkan) {
deps += [ "//ui/gfx/x" ] deps += [ "//ui/gfx/x" ]
configs += [ "//build/config/linux:x11" ] configs += [ "//build/config/linux:x11" ]
} }
if (is_win) {
sources += [ "tests/native_window_win.cc" ]
}
} }
# TODO(penghuang): support more platforms # TODO(penghuang): support more platforms
# https://crbug.com/1065499 # https://crbug.com/1065499
if (is_android || use_x11) { if (is_android || use_x11 || is_win) {
test("vulkan_tests") { test("vulkan_tests") {
sources = [ sources = [
"tests/basic_vulkan_test.cc", "tests/basic_vulkan_test.cc",
......
...@@ -66,6 +66,14 @@ VULKAN_INSTANCE_FUNCTIONS = [ ...@@ -66,6 +66,14 @@ VULKAN_INSTANCE_FUNCTIONS = [
'vkGetPhysicalDeviceXlibPresentationSupportKHR', 'vkGetPhysicalDeviceXlibPresentationSupportKHR',
] ]
}, },
{
'ifdef': 'defined(OS_WIN)',
'extension': 'VK_KHR_WIN32_SURFACE_EXTENSION_NAME',
'functions': [
'vkCreateWin32SurfaceKHR',
'vkGetPhysicalDeviceWin32PresentationSupportKHR',
]
},
{ {
'ifdef': 'defined(OS_ANDROID)', 'ifdef': 'defined(OS_ANDROID)',
'extension': 'VK_KHR_ANDROID_SURFACE_EXTENSION_NAME', 'extension': 'VK_KHR_ANDROID_SURFACE_EXTENSION_NAME',
...@@ -329,6 +337,10 @@ def GenerateHeaderFile(file): ...@@ -329,6 +337,10 @@ def GenerateHeaderFile(file):
#include <vulkan/vulkan_xlib.h> #include <vulkan/vulkan_xlib.h>
#endif #endif
#if defined(OS_WIN)
#include <vulkan/vulkan_win32.h>
#endif
namespace gpu { namespace gpu {
struct VulkanFunctionPointers; struct VulkanFunctionPointers;
......
...@@ -30,7 +30,7 @@ std::unique_ptr<VulkanImplementation> CreateVulkanImplementation( ...@@ -30,7 +30,7 @@ std::unique_ptr<VulkanImplementation> CreateVulkanImplementation(
bool use_swiftshader, bool use_swiftshader,
bool allow_protected_memory, bool allow_protected_memory,
bool enforce_protected_memory) { bool enforce_protected_memory) {
#if !defined(USE_X11) #if !defined(USE_X11) && !defined(OS_WIN)
// TODO(samans): Support Swiftshader on more platforms. // TODO(samans): Support Swiftshader on more platforms.
// https://crbug.com/963988 // https://crbug.com/963988
DCHECK(!use_swiftshader) DCHECK(!use_swiftshader)
...@@ -50,7 +50,7 @@ std::unique_ptr<VulkanImplementation> CreateVulkanImplementation( ...@@ -50,7 +50,7 @@ std::unique_ptr<VulkanImplementation> CreateVulkanImplementation(
->CreateVulkanImplementation(allow_protected_memory, ->CreateVulkanImplementation(allow_protected_memory,
enforce_protected_memory); enforce_protected_memory);
#elif defined(OS_WIN) #elif defined(OS_WIN)
return std::make_unique<VulkanImplementationWin32>(); return std::make_unique<VulkanImplementationWin32>(use_swiftshader);
#else #else
#error Unsupported Vulkan Platform. #error Unsupported Vulkan Platform.
#endif #endif
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "gpu/vulkan/tests/basic_vulkan_test.h" #include "gpu/vulkan/tests/basic_vulkan_test.h"
#include "base/command_line.h"
#include "gpu/vulkan/init/vulkan_factory.h" #include "gpu/vulkan/init/vulkan_factory.h"
#include "gpu/vulkan/tests/native_window.h" #include "gpu/vulkan/tests/native_window.h"
#include "gpu/vulkan/vulkan_surface.h" #include "gpu/vulkan/vulkan_surface.h"
...@@ -22,17 +23,21 @@ BasicVulkanTest::~BasicVulkanTest() {} ...@@ -22,17 +23,21 @@ BasicVulkanTest::~BasicVulkanTest() {}
void BasicVulkanTest::SetUp() { void BasicVulkanTest::SetUp() {
platform_event_source_ = ui::PlatformEventSource::CreateDefault(); platform_event_source_ = ui::PlatformEventSource::CreateDefault();
#if defined(USE_X11) #if defined(USE_X11) || defined(OS_WIN)
bool use_swiftshader =
base::CommandLine::ForCurrentProcess()->HasSwitch("use-swiftshader");
const gfx::Rect kDefaultBounds(10, 10, 100, 100); const gfx::Rect kDefaultBounds(10, 10, 100, 100);
window_ = CreateNativeWindow(kDefaultBounds); window_ = CreateNativeWindow(kDefaultBounds);
#elif defined(OS_ANDROID) #elif defined(OS_ANDROID)
// Vulkan swiftshader is not supported on Android.
bool use_swiftshader = false;
// TODO(penghuang): Not depend on gl. // TODO(penghuang): Not depend on gl.
uint texture = 0; uint texture = 0;
surface_texture_ = gl::SurfaceTexture::Create(texture); surface_texture_ = gl::SurfaceTexture::Create(texture);
window_ = surface_texture_->CreateSurface(); window_ = surface_texture_->CreateSurface();
ASSERT_TRUE(window_ != gfx::kNullAcceleratedWidget); ASSERT_TRUE(window_ != gfx::kNullAcceleratedWidget);
#endif #endif
vulkan_implementation_ = CreateVulkanImplementation(); vulkan_implementation_ = CreateVulkanImplementation(use_swiftshader);
ASSERT_TRUE(vulkan_implementation_); ASSERT_TRUE(vulkan_implementation_);
ASSERT_TRUE(vulkan_implementation_->InitializeVulkanInstance()); ASSERT_TRUE(vulkan_implementation_->InitializeVulkanInstance());
device_queue_ = gpu::CreateVulkanDeviceQueue( device_queue_ = gpu::CreateVulkanDeviceQueue(
...@@ -43,7 +48,7 @@ void BasicVulkanTest::SetUp() { ...@@ -43,7 +48,7 @@ void BasicVulkanTest::SetUp() {
} }
void BasicVulkanTest::TearDown() { void BasicVulkanTest::TearDown() {
#if defined(USE_X11) #if defined(USE_X11) || defined(OS_WIN)
DestroyNativeWindow(window_); DestroyNativeWindow(window_);
#elif defined(OS_ANDROID) #elif defined(OS_ANDROID)
ANativeWindow_release(window_); ANativeWindow_release(window_);
......
// Copyright 2020 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.
#include "gpu/vulkan/tests/native_window.h"
#include <windows.h>
#include <memory>
#include "base/containers/flat_map.h"
#include "ui/gfx/win/window_impl.h"
namespace gpu {
class Window;
base::flat_map<gfx::AcceleratedWidget, std::unique_ptr<Window>> g_windows_;
class Window : public gfx::WindowImpl {
public:
Window() { set_window_style(WS_VISIBLE | WS_POPUP); }
~Window() override = default;
private:
// Overridden from gfx::WindowImpl:
BOOL ProcessWindowMessage(HWND window,
UINT message,
WPARAM w_param,
LPARAM l_param,
LRESULT& result,
DWORD msg_map_id) override {
return false; // Results in DefWindowProc().
}
};
gfx::AcceleratedWidget CreateNativeWindow(const gfx::Rect& bounds) {
auto window = std::make_unique<Window>();
window->Init(/*parent=*/nullptr, bounds);
gfx::AcceleratedWidget widget = window->hwnd();
g_windows_[widget] = std::move(window);
return widget;
}
void DestroyNativeWindow(gfx::AcceleratedWidget window) {
auto it = g_windows_.find(window);
DCHECK(it != g_windows_.end());
it->second.reset();
g_windows_.erase(it);
}
} // namespace gpu
...@@ -28,7 +28,7 @@ class VULKAN_EXPORT VulkanFenceHelper { ...@@ -28,7 +28,7 @@ class VULKAN_EXPORT VulkanFenceHelper {
// Class representing a fence registered with this system. Should be treated // Class representing a fence registered with this system. Should be treated
// as an opaque handle. // as an opaque handle.
class FenceHandle { class VULKAN_EXPORT FenceHandle {
public: public:
FenceHandle(); FenceHandle();
FenceHandle(const FenceHandle& other); FenceHandle(const FenceHandle& other);
......
...@@ -261,6 +261,29 @@ bool VulkanFunctionPointers::BindInstanceFunctionPointers( ...@@ -261,6 +261,29 @@ bool VulkanFunctionPointers::BindInstanceFunctionPointers(
} }
#endif // defined(USE_VULKAN_XLIB) #endif // defined(USE_VULKAN_XLIB)
#if defined(OS_WIN)
if (gfx::HasExtension(enabled_extensions,
VK_KHR_WIN32_SURFACE_EXTENSION_NAME)) {
vkCreateWin32SurfaceKHRFn = reinterpret_cast<PFN_vkCreateWin32SurfaceKHR>(
vkGetInstanceProcAddr(vk_instance, "vkCreateWin32SurfaceKHR"));
if (!vkCreateWin32SurfaceKHRFn) {
DLOG(WARNING) << "Failed to bind vulkan entrypoint: "
<< "vkCreateWin32SurfaceKHR";
return false;
}
vkGetPhysicalDeviceWin32PresentationSupportKHRFn =
reinterpret_cast<PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR>(
vkGetInstanceProcAddr(
vk_instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR"));
if (!vkGetPhysicalDeviceWin32PresentationSupportKHRFn) {
DLOG(WARNING) << "Failed to bind vulkan entrypoint: "
<< "vkGetPhysicalDeviceWin32PresentationSupportKHR";
return false;
}
}
#endif // defined(OS_WIN)
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
if (gfx::HasExtension(enabled_extensions, if (gfx::HasExtension(enabled_extensions,
VK_KHR_ANDROID_SURFACE_EXTENSION_NAME)) { VK_KHR_ANDROID_SURFACE_EXTENSION_NAME)) {
......
...@@ -36,6 +36,10 @@ ...@@ -36,6 +36,10 @@
#include <vulkan/vulkan_xlib.h> #include <vulkan/vulkan_xlib.h>
#endif #endif
#if defined(OS_WIN)
#include <vulkan/vulkan_win32.h>
#endif
namespace gpu { namespace gpu {
struct VulkanFunctionPointers; struct VulkanFunctionPointers;
...@@ -134,6 +138,12 @@ struct VulkanFunctionPointers { ...@@ -134,6 +138,12 @@ struct VulkanFunctionPointers {
vkGetPhysicalDeviceXlibPresentationSupportKHRFn; vkGetPhysicalDeviceXlibPresentationSupportKHRFn;
#endif // defined(USE_VULKAN_XLIB) #endif // defined(USE_VULKAN_XLIB)
#if defined(OS_WIN)
VulkanFunction<PFN_vkCreateWin32SurfaceKHR> vkCreateWin32SurfaceKHRFn;
VulkanFunction<PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR>
vkGetPhysicalDeviceWin32PresentationSupportKHRFn;
#endif // defined(OS_WIN)
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
VulkanFunction<PFN_vkCreateAndroidSurfaceKHR> vkCreateAndroidSurfaceKHRFn; VulkanFunction<PFN_vkCreateAndroidSurfaceKHR> vkCreateAndroidSurfaceKHRFn;
#endif // defined(OS_ANDROID) #endif // defined(OS_ANDROID)
...@@ -317,6 +327,14 @@ struct VulkanFunctionPointers { ...@@ -317,6 +327,14 @@ struct VulkanFunctionPointers {
->vkGetPhysicalDeviceXlibPresentationSupportKHRFn ->vkGetPhysicalDeviceXlibPresentationSupportKHRFn
#endif // defined(USE_VULKAN_XLIB) #endif // defined(USE_VULKAN_XLIB)
#if defined(OS_WIN)
#define vkCreateWin32SurfaceKHR \
gpu::GetVulkanFunctionPointers()->vkCreateWin32SurfaceKHRFn
#define vkGetPhysicalDeviceWin32PresentationSupportKHR \
gpu::GetVulkanFunctionPointers() \
->vkGetPhysicalDeviceWin32PresentationSupportKHRFn
#endif // defined(OS_WIN)
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
#define vkCreateAndroidSurfaceKHR \ #define vkCreateAndroidSurfaceKHR \
gpu::GetVulkanFunctionPointers()->vkCreateAndroidSurfaceKHRFn gpu::GetVulkanFunctionPointers()->vkCreateAndroidSurfaceKHRFn
......
...@@ -17,44 +17,32 @@ ...@@ -17,44 +17,32 @@
namespace gpu { namespace gpu {
VulkanImplementationWin32::VulkanImplementationWin32(bool use_swiftshader)
: VulkanImplementation(use_swiftshader) {}
VulkanImplementationWin32::~VulkanImplementationWin32() = default; VulkanImplementationWin32::~VulkanImplementationWin32() = default;
bool VulkanImplementationWin32::InitializeVulkanInstance(bool using_surface) { bool VulkanImplementationWin32::InitializeVulkanInstance(bool using_surface) {
DCHECK(using_surface); DCHECK(using_surface);
std::vector<const char*> required_extensions = { std::vector<const char*> required_extensions = {
VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_WIN32_SURFACE_EXTENSION_NAME}; VK_KHR_SURFACE_EXTENSION_NAME,
VK_KHR_WIN32_SURFACE_EXTENSION_NAME,
};
VulkanFunctionPointers* vulkan_function_pointers = VulkanFunctionPointers* vulkan_function_pointers =
gpu::GetVulkanFunctionPointers(); gpu::GetVulkanFunctionPointers();
base::FilePath path(use_swiftshader() ? L"vk_swiftshader.dll"
: L"vulkan-1.dll");
base::NativeLibraryLoadError native_library_load_error; base::NativeLibraryLoadError native_library_load_error;
vulkan_function_pointers->vulkan_loader_library = base::LoadNativeLibrary( vulkan_function_pointers->vulkan_loader_library =
base::FilePath(L"vulkan-1.dll"), &native_library_load_error); base::LoadNativeLibrary(path, &native_library_load_error);
if (!vulkan_function_pointers->vulkan_loader_library) if (!vulkan_function_pointers->vulkan_loader_library)
return false; return false;
if (!vulkan_instance_.Initialize(required_extensions, {})) if (!vulkan_instance_.Initialize(required_extensions, {}))
return false; return false;
// Initialize platform function pointers
vkGetPhysicalDeviceWin32PresentationSupportKHR_ =
reinterpret_cast<PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR>(
vkGetInstanceProcAddr(
vulkan_instance_.vk_instance(),
"vkGetPhysicalDeviceWin32PresentationSupportKHR"));
if (!vkGetPhysicalDeviceWin32PresentationSupportKHR_) {
LOG(ERROR) << "vkGetPhysicalDeviceWin32PresentationSupportKHR not found";
return false;
}
vkCreateWin32SurfaceKHR_ =
reinterpret_cast<PFN_vkCreateWin32SurfaceKHR>(vkGetInstanceProcAddr(
vulkan_instance_.vk_instance(), "vkCreateWin32SurfaceKHR"));
if (!vkCreateWin32SurfaceKHR_) {
LOG(ERROR) << "vkCreateWin32SurfaceKHR not found";
return false;
}
return true; return true;
} }
...@@ -70,7 +58,7 @@ std::unique_ptr<VulkanSurface> VulkanImplementationWin32::CreateViewSurface( ...@@ -70,7 +58,7 @@ std::unique_ptr<VulkanSurface> VulkanImplementationWin32::CreateViewSurface(
surface_create_info.hinstance = surface_create_info.hinstance =
reinterpret_cast<HINSTANCE>(GetWindowLongPtr(window, GWLP_HINSTANCE)); reinterpret_cast<HINSTANCE>(GetWindowLongPtr(window, GWLP_HINSTANCE));
surface_create_info.hwnd = window; surface_create_info.hwnd = window;
VkResult result = vkCreateWin32SurfaceKHR_( VkResult result = vkCreateWin32SurfaceKHR(
vulkan_instance_.vk_instance(), &surface_create_info, nullptr, &surface); vulkan_instance_.vk_instance(), &surface_create_info, nullptr, &surface);
if (VK_SUCCESS != result) { if (VK_SUCCESS != result) {
DLOG(ERROR) << "vkCreatWin32SurfaceKHR() failed: " << result; DLOG(ERROR) << "vkCreatWin32SurfaceKHR() failed: " << result;
...@@ -86,13 +74,15 @@ bool VulkanImplementationWin32::GetPhysicalDevicePresentationSupport( ...@@ -86,13 +74,15 @@ bool VulkanImplementationWin32::GetPhysicalDevicePresentationSupport(
VkPhysicalDevice device, VkPhysicalDevice device,
const std::vector<VkQueueFamilyProperties>& queue_family_properties, const std::vector<VkQueueFamilyProperties>& queue_family_properties,
uint32_t queue_family_index) { uint32_t queue_family_index) {
return vkGetPhysicalDeviceWin32PresentationSupportKHR_(device, return vkGetPhysicalDeviceWin32PresentationSupportKHR(device,
queue_family_index); queue_family_index);
} }
std::vector<const char*> std::vector<const char*>
VulkanImplementationWin32::GetRequiredDeviceExtensions() { VulkanImplementationWin32::GetRequiredDeviceExtensions() {
return {VK_KHR_SWAPCHAIN_EXTENSION_NAME}; return {
VK_KHR_SWAPCHAIN_EXTENSION_NAME,
};
} }
std::vector<const char*> std::vector<const char*>
......
...@@ -5,8 +5,6 @@ ...@@ -5,8 +5,6 @@
#ifndef GPU_VULKAN_WIN32_VULKAN_IMPLEMENTATION_WIN32_H_ #ifndef GPU_VULKAN_WIN32_VULKAN_IMPLEMENTATION_WIN32_H_
#define GPU_VULKAN_WIN32_VULKAN_IMPLEMENTATION_WIN32_H_ #define GPU_VULKAN_WIN32_VULKAN_IMPLEMENTATION_WIN32_H_
#include <memory>
#include "base/component_export.h" #include "base/component_export.h"
#include "gpu/vulkan/vulkan_implementation.h" #include "gpu/vulkan/vulkan_implementation.h"
#include "gpu/vulkan/vulkan_instance.h" #include "gpu/vulkan/vulkan_instance.h"
...@@ -16,7 +14,7 @@ namespace gpu { ...@@ -16,7 +14,7 @@ namespace gpu {
class COMPONENT_EXPORT(VULKAN_WIN32) VulkanImplementationWin32 class COMPONENT_EXPORT(VULKAN_WIN32) VulkanImplementationWin32
: public VulkanImplementation { : public VulkanImplementation {
public: public:
VulkanImplementationWin32() = default; explicit VulkanImplementationWin32(bool use_swiftshader);
~VulkanImplementationWin32() override; ~VulkanImplementationWin32() override;
// VulkanImplementation: // VulkanImplementation:
...@@ -51,10 +49,6 @@ class COMPONENT_EXPORT(VULKAN_WIN32) VulkanImplementationWin32 ...@@ -51,10 +49,6 @@ class COMPONENT_EXPORT(VULKAN_WIN32) VulkanImplementationWin32
private: private:
VulkanInstance vulkan_instance_; VulkanInstance vulkan_instance_;
PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR
vkGetPhysicalDeviceWin32PresentationSupportKHR_ = nullptr;
PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(VulkanImplementationWin32); DISALLOW_COPY_AND_ASSIGN(VulkanImplementationWin32);
}; };
......
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