| // 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/commands_vk.h" |
| |
| namespace impeller { |
| |
| TransitionImageLayoutCommandVK::TransitionImageLayoutCommandVK( |
| vk::Image image, |
| vk::ImageLayout old_layout, |
| vk::ImageLayout new_layout) |
| : image_(image), old_layout_(old_layout), new_layout_(new_layout) {} |
| |
| TransitionImageLayoutCommandVK::~TransitionImageLayoutCommandVK() = default; |
| |
| bool TransitionImageLayoutCommandVK::Submit( |
| FencedCommandBufferVK* command_buffer) { |
| if (!command_buffer) { |
| return false; |
| } |
| |
| vk::ImageMemoryBarrier barrier = |
| vk::ImageMemoryBarrier() |
| .setSrcAccessMask(vk::AccessFlagBits::eColorAttachmentWrite | |
| vk::AccessFlagBits::eTransferWrite) |
| .setDstAccessMask(vk::AccessFlagBits::eColorAttachmentRead | |
| vk::AccessFlagBits::eShaderRead) |
| .setOldLayout(old_layout_) |
| .setNewLayout(new_layout_) |
| .setSrcQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED) |
| .setDstQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED) |
| .setImage(image_) |
| .setSubresourceRange( |
| vk::ImageSubresourceRange() |
| .setAspectMask(vk::ImageAspectFlagBits::eColor) |
| .setBaseMipLevel(0) |
| .setLevelCount(1) |
| .setBaseArrayLayer(0) |
| .setLayerCount(1)); |
| |
| vk::PipelineStageFlags src_stage = vk::PipelineStageFlagBits::eAllGraphics; |
| vk::PipelineStageFlags dst_stage = vk::PipelineStageFlagBits::eAllGraphics; |
| |
| auto transition_cmd = command_buffer->GetSingleUseChild(); |
| |
| vk::CommandBufferBeginInfo begin_info; |
| begin_info.setFlags(vk::CommandBufferUsageFlagBits::eOneTimeSubmit); |
| auto res = transition_cmd.begin(begin_info); |
| |
| if (res != vk::Result::eSuccess) { |
| FML_LOG(ERROR) << "Failed to begin command buffer: " << vk::to_string(res); |
| return false; |
| } |
| |
| transition_cmd.pipelineBarrier(src_stage, dst_stage, {}, nullptr, nullptr, |
| barrier); |
| res = transition_cmd.end(); |
| if (res != vk::Result::eSuccess) { |
| FML_LOG(ERROR) << "Failed to end command buffer: " << vk::to_string(res); |
| return false; |
| } |
| |
| return true; |
| } |
| |
| } // namespace impeller |