|  | // Copyright 2013 The Flutter 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 "vulkan_surface.h" | 
|  |  | 
|  | #include "vulkan_application.h" | 
|  | #include "vulkan_native_surface.h" | 
|  |  | 
|  | namespace vulkan { | 
|  |  | 
|  | VulkanSurface::VulkanSurface( | 
|  | VulkanProcTable& p_vk,           // NOLINT | 
|  | VulkanApplication& application,  // NOLINT | 
|  | std::unique_ptr<VulkanNativeSurface> native_surface) | 
|  | : vk(p_vk), | 
|  | application_(application), | 
|  | native_surface_(std::move(native_surface)), | 
|  | valid_(false) { | 
|  | if (native_surface_ == nullptr || !native_surface_->IsValid()) { | 
|  | FML_DLOG(INFO) << "Native surface was invalid."; | 
|  | return; | 
|  | } | 
|  |  | 
|  | VkSurfaceKHR surface = | 
|  | native_surface_->CreateSurfaceHandle(vk, application.GetInstance()); | 
|  |  | 
|  | if (surface == VK_NULL_HANDLE) { | 
|  | FML_DLOG(INFO) << "Could not create the surface handle."; | 
|  | return; | 
|  | } | 
|  |  | 
|  | surface_ = {surface, [this](VkSurfaceKHR surface) { | 
|  | vk.DestroySurfaceKHR(application_.GetInstance(), surface, | 
|  | nullptr); | 
|  | }}; | 
|  |  | 
|  | valid_ = true; | 
|  | } | 
|  |  | 
|  | VulkanSurface::~VulkanSurface() = default; | 
|  |  | 
|  | bool VulkanSurface::IsValid() const { | 
|  | return valid_; | 
|  | } | 
|  |  | 
|  | const VulkanHandle<VkSurfaceKHR>& VulkanSurface::Handle() const { | 
|  | return surface_; | 
|  | } | 
|  |  | 
|  | const VulkanNativeSurface& VulkanSurface::GetNativeSurface() const { | 
|  | return *native_surface_; | 
|  | } | 
|  |  | 
|  | SkISize VulkanSurface::GetSize() const { | 
|  | return valid_ ? native_surface_->GetSize() : SkISize::Make(0, 0); | 
|  | } | 
|  |  | 
|  | }  // namespace vulkan |