| // 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 "impeller/renderer/backend/vulkan/surface_vk.h" |
| |
| #include "impeller/renderer/backend/vulkan/texture_vk.h" |
| #include "impeller/renderer/surface.h" |
| |
| namespace impeller { |
| std::unique_ptr<SurfaceVK> SurfaceVK::WrapSwapchainImage( |
| uint32_t frame_num, |
| SwapchainImageVK* swapchain_image, |
| ContextVK* context, |
| SwapCallback swap_callback) { |
| if (!swapchain_image) { |
| return nullptr; |
| } |
| |
| TextureDescriptor color0_tex; |
| color0_tex.type = TextureType::kTexture2D; |
| color0_tex.format = swapchain_image->GetPixelFormat(); |
| color0_tex.size = swapchain_image->GetSize(); |
| color0_tex.usage = static_cast<TextureUsageMask>(TextureUsage::kRenderTarget); |
| color0_tex.sample_count = SampleCount::kCount1; |
| color0_tex.storage_mode = StorageMode::kDevicePrivate; |
| |
| ColorAttachment color0; |
| auto color_texture_info = std::make_unique<TextureInfoVK>(TextureInfoVK{ |
| .backing_type = TextureBackingTypeVK::kWrappedTexture, |
| .wrapped_texture = |
| { |
| .swapchain_image = swapchain_image, |
| .frame_num = frame_num, |
| }, |
| }); |
| color0.texture = std::make_shared<TextureVK>(color0_tex, context, |
| std::move(color_texture_info)); |
| color0.clear_color = Color::DarkSlateGray(); |
| color0.load_action = LoadAction::kClear; |
| color0.store_action = StoreAction::kDontCare; |
| |
| TextureDescriptor stencil0_tex; |
| stencil0_tex.type = TextureType::kTexture2D; |
| stencil0_tex.format = swapchain_image->GetPixelFormat(); |
| stencil0_tex.size = swapchain_image->GetSize(); |
| stencil0_tex.usage = |
| static_cast<TextureUsageMask>(TextureUsage::kRenderTarget); |
| stencil0_tex.sample_count = SampleCount::kCount1; |
| |
| StencilAttachment stencil0; |
| stencil0.clear_stencil = 0; |
| auto stencil_texture_info = std::make_unique<TextureInfoVK>(TextureInfoVK{ |
| .backing_type = TextureBackingTypeVK::kWrappedTexture, |
| .wrapped_texture = |
| { |
| .swapchain_image = swapchain_image, |
| .frame_num = frame_num, |
| }, |
| }); |
| stencil0.texture = std::make_shared<TextureVK>( |
| stencil0_tex, context, std::move(stencil_texture_info)); |
| stencil0.load_action = LoadAction::kClear; |
| stencil0.store_action = StoreAction::kDontCare; |
| |
| RenderTarget render_target_desc; |
| render_target_desc.SetColorAttachment(color0, 0u); |
| |
| return std::unique_ptr<SurfaceVK>(new SurfaceVK( |
| render_target_desc, swapchain_image, std::move(swap_callback))); |
| } |
| |
| SurfaceVK::SurfaceVK(const RenderTarget& target, |
| SwapchainImageVK* swapchain_image, |
| SwapCallback swap_callback) |
| : Surface(target) { |
| swap_callback_ = std::move(swap_callback); |
| } |
| |
| SurfaceVK::~SurfaceVK() = default; |
| |
| bool SurfaceVK::Present() const { |
| return swap_callback_ ? swap_callback_() : false; |
| } |
| |
| } // namespace impeller |