| // Copyright 2018 The Amber Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef SRC_VULKAN_TRANSFER_IMAGE_H_ |
| #define SRC_VULKAN_TRANSFER_IMAGE_H_ |
| |
| #include "amber/result.h" |
| #include "amber/vulkan_header.h" |
| #include "src/format.h" |
| #include "src/vulkan/resource.h" |
| |
| namespace amber { |
| namespace vulkan { |
| |
| class CommandBuffer; |
| class Device; |
| |
| /// Wrapper around a Vulkan VkImage. |
| class TransferImage : public Resource { |
| public: |
| TransferImage(Device* device, |
| const Format& format, |
| VkImageAspectFlags aspect, |
| VkImageType image_type, |
| VkImageUsageFlags image_usage_flags, |
| uint32_t x, |
| uint32_t y, |
| uint32_t z, |
| uint32_t mip_levels, |
| uint32_t base_mip_level, |
| uint32_t used_mip_levels, |
| uint32_t samples); |
| ~TransferImage() override; |
| |
| TransferImage* AsTransferImage() override { return this; } |
| Result Initialize() override; |
| VkImageView GetVkImageView() const { return view_; } |
| |
| void ImageBarrier(CommandBuffer* command_buffer, |
| VkImageLayout to_layout, |
| VkPipelineStageFlags to_stage); |
| |
| /// Records a command on |command_buffer| to copy the buffer contents from the |
| /// host to the device. |
| void CopyToDevice(CommandBuffer* command_buffer) override; |
| /// Records a command on |command_buffer| to copy the buffer contents from the |
| /// device to the host. |
| void CopyToHost(CommandBuffer* command_buffer) override; |
| |
| private: |
| Result CreateVkImageView(VkImageAspectFlags aspect); |
| Result AllocateAndBindMemoryToVkImage(VkImage image, |
| VkDeviceMemory* memory, |
| VkMemoryPropertyFlags flags, |
| bool force_flags, |
| uint32_t* memory_type_index); |
| VkBufferImageCopy CreateBufferImageCopy(VkImageAspectFlags aspect, |
| uint32_t mip_level); |
| |
| VkImageViewType GetImageViewType() const; |
| |
| /// An extra `VkBuffer` is used to facilitate the transfer of data from the |
| /// host into the `VkImage` on the device. |
| VkBuffer host_accessible_buffer_ = VK_NULL_HANDLE; |
| VkDeviceMemory host_accessible_memory_ = VK_NULL_HANDLE; |
| |
| VkImageCreateInfo image_info_; |
| VkImageAspectFlags aspect_; |
| |
| VkImage image_ = VK_NULL_HANDLE; |
| VkImageView view_ = VK_NULL_HANDLE; |
| VkDeviceMemory memory_ = VK_NULL_HANDLE; |
| |
| VkImageLayout layout_ = VK_IMAGE_LAYOUT_UNDEFINED; |
| VkPipelineStageFlags stage_ = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; |
| |
| uint32_t mip_levels_; |
| uint32_t base_mip_level_; |
| uint32_t used_mip_levels_; |
| uint32_t samples_; |
| }; |
| |
| } // namespace vulkan |
| } // namespace amber |
| |
| #endif // SRC_VULKAN_TRANSFER_IMAGE_H_ |