Index: gpu/vulkan/vulkan_surface.cc |
diff --git a/gpu/vulkan/vulkan_surface.cc b/gpu/vulkan/vulkan_surface.cc |
index 344045af90cdd14152e79ae1c74fc13587031306..8d1bbab9c46fa6fd5245e7a6e9ca1234a7a4d98a 100644 |
--- a/gpu/vulkan/vulkan_surface.cc |
+++ b/gpu/vulkan/vulkan_surface.cc |
@@ -8,6 +8,7 @@ |
#include "base/macros.h" |
#include "gpu/vulkan/vulkan_command_buffer.h" |
+#include "gpu/vulkan/vulkan_device_queue.h" |
#include "gpu/vulkan/vulkan_implementation.h" |
#include "gpu/vulkan/vulkan_platform.h" |
#include "gpu/vulkan/vulkan_swap_chain.h" |
@@ -36,23 +37,36 @@ class VulkanWSISurface : public VulkanSurface { |
DCHECK_EQ(static_cast<VkSurfaceKHR>(VK_NULL_HANDLE), surface_); |
} |
- bool Initialize(VulkanSurface::Format format) override { |
+ bool Initialize(VulkanDeviceQueue* device_queue, |
+ VulkanSurface::Format format) override { |
DCHECK(format >= 0 && format < NUM_SURFACE_FORMATS); |
+ DCHECK_EQ(static_cast<VkSurfaceKHR>(VK_NULL_HANDLE), surface_); |
+ VkResult result = VK_SUCCESS; |
+ |
#if defined(VK_USE_PLATFORM_XLIB_KHR) |
VkXlibSurfaceCreateInfoKHR surface_create_info = {}; |
surface_create_info.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; |
surface_create_info.dpy = gfx::GetXDisplay(); |
surface_create_info.window = window_; |
- vkCreateXlibSurfaceKHR(GetVulkanInstance(), &surface_create_info, nullptr, |
- &surface_); |
+ result = vkCreateXlibSurfaceKHR(GetVulkanInstance(), &surface_create_info, |
+ nullptr, &surface_); |
+ if (VK_SUCCESS != result) { |
+ DLOG(ERROR) << "vkCreateXlibSurfaceKHR() failed: " << result; |
+ return false; |
+ } |
#else |
#error Unsupported Vulkan Platform. |
#endif |
+ DCHECK_NE(static_cast<VkSurfaceKHR>(VK_NULL_HANDLE), surface_); |
+ DCHECK(device_queue); |
+ device_queue_ = device_queue; |
+ |
// Get list of supported formats. |
uint32_t format_count = 0; |
- VkResult result = vkGetPhysicalDeviceSurfaceFormatsKHR( |
- GetVulkanPhysicalDevice(), surface_, &format_count, nullptr); |
+ result = vkGetPhysicalDeviceSurfaceFormatsKHR( |
+ device_queue_->GetVulkanPhysicalDevice(), surface_, &format_count, |
+ nullptr); |
if (VK_SUCCESS != result) { |
DLOG(ERROR) << "vkGetPhysicalDeviceSurfaceFormatsKHR() failed: " |
<< result; |
@@ -61,7 +75,8 @@ class VulkanWSISurface : public VulkanSurface { |
std::vector<VkSurfaceFormatKHR> formats(format_count); |
result = vkGetPhysicalDeviceSurfaceFormatsKHR( |
- GetVulkanPhysicalDevice(), surface_, &format_count, formats.data()); |
+ device_queue_->GetVulkanPhysicalDevice(), surface_, &format_count, |
+ formats.data()); |
if (VK_SUCCESS != result) { |
DLOG(ERROR) << "vkGetPhysicalDeviceSurfaceFormatsKHR() failed: " |
<< result; |
@@ -91,7 +106,7 @@ class VulkanWSISurface : public VulkanSurface { |
// Get Surface Information. |
VkSurfaceCapabilitiesKHR surface_caps; |
result = vkGetPhysicalDeviceSurfaceCapabilitiesKHR( |
- GetVulkanPhysicalDevice(), surface_, &surface_caps); |
+ device_queue_->GetVulkanPhysicalDevice(), surface_, &surface_caps); |
if (VK_SUCCESS != result) { |
DLOG(ERROR) << "vkGetPhysicalDeviceSurfaceCapabilitiesKHR() failed: " |
<< result; |
@@ -105,8 +120,10 @@ class VulkanWSISurface : public VulkanSurface { |
surface_caps.currentExtent.height); |
// Create Swapchain. |
- if (!swap_chain_.Initialize(surface_, surface_caps, surface_format_)) |
+ if (!swap_chain_.Initialize(device_queue_, surface_, surface_caps, |
+ surface_format_)) { |
return false; |
+ } |
return true; |
} |
@@ -119,13 +136,14 @@ class VulkanWSISurface : public VulkanSurface { |
gfx::SwapResult SwapBuffers() override { return swap_chain_.SwapBuffers(); } |
VulkanSwapChain* GetSwapChain() override { return &swap_chain_; } |
- void Finish() override { vkQueueWaitIdle(GetVulkanQueue()); } |
+ void Finish() override { vkQueueWaitIdle(device_queue_->GetVulkanQueue()); } |
protected: |
gfx::AcceleratedWidget window_; |
gfx::Size size_; |
VkSurfaceKHR surface_ = VK_NULL_HANDLE; |
VkSurfaceFormatKHR surface_format_ = {}; |
+ VulkanDeviceQueue* device_queue_ = nullptr; |
VulkanSwapChain swap_chain_; |
}; |