| // 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 "flutter/testing/test_vulkan_surface.h" | 
 | #include <memory> | 
 | #include "flutter/fml/logging.h" | 
 | #include "flutter/testing/test_vulkan_context.h" | 
 |  | 
 | #include "third_party/skia/include/core/SkColorSpace.h" | 
 | #include "third_party/skia/include/core/SkColorType.h" | 
 | #include "third_party/skia/include/core/SkSurface.h" | 
 | #include "third_party/skia/include/core/SkSurfaceProps.h" | 
 |  | 
 | namespace flutter { | 
 | namespace testing { | 
 |  | 
 | TestVulkanSurface::TestVulkanSurface(TestVulkanImage&& image) | 
 |     : image_(std::move(image)){}; | 
 |  | 
 | std::unique_ptr<TestVulkanSurface> TestVulkanSurface::Create( | 
 |     const TestVulkanContext& context, | 
 |     const SkISize& surface_size) { | 
 |   auto image_result = context.CreateImage(surface_size); | 
 |  | 
 |   if (!image_result.has_value()) { | 
 |     FML_LOG(ERROR) << "Could not create VkImage."; | 
 |     return nullptr; | 
 |   } | 
 |  | 
 |   GrVkImageInfo image_info = { | 
 |       .fImage = image_result.value().GetImage(), | 
 |       .fImageTiling = VK_IMAGE_TILING_OPTIMAL, | 
 |       .fImageLayout = VK_IMAGE_LAYOUT_UNDEFINED, | 
 |       .fFormat = VK_FORMAT_R8G8B8A8_UNORM, | 
 |       .fImageUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | | 
 |                           VK_IMAGE_USAGE_TRANSFER_SRC_BIT | | 
 |                           VK_IMAGE_USAGE_TRANSFER_DST_BIT | | 
 |                           VK_IMAGE_USAGE_SAMPLED_BIT, | 
 |       .fSampleCount = 1, | 
 |       .fLevelCount = 1, | 
 |   }; | 
 |   GrBackendTexture backend_texture(surface_size.width(),   // | 
 |                                    surface_size.height(),  // | 
 |                                    image_info              // | 
 |   ); | 
 |  | 
 |   SkSurfaceProps surface_properties(0, kUnknown_SkPixelGeometry); | 
 |  | 
 |   auto result = std::unique_ptr<TestVulkanSurface>( | 
 |       new TestVulkanSurface(std::move(image_result.value()))); | 
 |   result->surface_ = SkSurface::MakeFromBackendTexture( | 
 |       context.GetGrDirectContext().get(),  // context | 
 |       backend_texture,                     // back-end texture | 
 |       kTopLeft_GrSurfaceOrigin,            // surface origin | 
 |       1,                                   // sample count | 
 |       kRGBA_8888_SkColorType,              // color type | 
 |       SkColorSpace::MakeSRGB(),            // color space | 
 |       &surface_properties,                 // surface properties | 
 |       nullptr,                             // release proc | 
 |       nullptr                              // release context | 
 |   ); | 
 |  | 
 |   if (!result->surface_) { | 
 |     FML_LOG(ERROR) | 
 |         << "Could not wrap VkImage as an SkSurface Vulkan render texture."; | 
 |     return nullptr; | 
 |   } | 
 |  | 
 |   return result; | 
 | } | 
 |  | 
 | bool TestVulkanSurface::IsValid() const { | 
 |   return surface_ != nullptr; | 
 | } | 
 |  | 
 | sk_sp<SkImage> TestVulkanSurface::GetSurfaceSnapshot() const { | 
 |   if (!IsValid()) { | 
 |     return nullptr; | 
 |   } | 
 |  | 
 |   if (!surface_) { | 
 |     FML_LOG(ERROR) << "Aborting snapshot because of on-screen surface " | 
 |                       "acquisition failure."; | 
 |     return nullptr; | 
 |   } | 
 |  | 
 |   auto device_snapshot = surface_->makeImageSnapshot(); | 
 |  | 
 |   if (!device_snapshot) { | 
 |     FML_LOG(ERROR) << "Could not create the device snapshot while attempting " | 
 |                       "to snapshot the Vulkan surface."; | 
 |     return nullptr; | 
 |   } | 
 |  | 
 |   auto host_snapshot = device_snapshot->makeRasterImage(); | 
 |  | 
 |   if (!host_snapshot) { | 
 |     FML_LOG(ERROR) << "Could not create the host snapshot while attempting to " | 
 |                       "snapshot the Vulkan surface."; | 
 |     return nullptr; | 
 |   } | 
 |  | 
 |   return host_snapshot; | 
 | } | 
 |  | 
 | VkImage TestVulkanSurface::GetImage() { | 
 |   return image_.GetImage(); | 
 | } | 
 |  | 
 | }  // namespace testing | 
 | }  // namespace flutter |