// Copyright 2016 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 "flutter/shell/gpu/gpu_surface_vulkan.h" #include "lib/ftl/logging.h" namespace shell { GPUSurfaceVulkan::GPUSurfaceVulkan( ftl::RefPtr proc_table, std::unique_ptr native_surface) : window_(std::move(proc_table), std::move(native_surface)), weak_factory_(this) {} GPUSurfaceVulkan::~GPUSurfaceVulkan() = default; bool GPUSurfaceVulkan::Setup() { // This backend does not have an explicit setup task post initialization. return window_.IsValid(); } bool GPUSurfaceVulkan::IsValid() { return window_.IsValid(); } std::unique_ptr GPUSurfaceVulkan::AcquireFrame( const SkISize& size) { auto surface = window_.AcquireSurface(); if (surface == nullptr) { return nullptr; } SurfaceFrame::SubmitCallback callback = [weak_this = weak_factory_.GetWeakPtr()]( const SurfaceFrame&, SkCanvas* canvas) ->bool { // Frames are only ever acquired on the GPU thread. This is also the thread // on which the weak pointer factory is collected (as this instance is owned // by the rasterizer). So this use of weak pointers is safe. if (canvas == nullptr || !weak_this) { return false; } return weak_this->window_.SwapBuffers(); }; return std::make_unique(std::move(surface), std::move(callback)); } GrContext* GPUSurfaceVulkan::GetContext() { return window_.GetSkiaGrContext(); } } // namespace shell