Blender V5.0
vk_copy_image_to_buffer_node.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
14#include "vk_common.hh"
15#include "vk_node_info.hh"
16
22 VkImage src_image;
23 VkBuffer dst_buffer;
24 VkBufferImageCopy region;
25};
26
31
32class VKCopyImageToBufferNode : public VKNodeInfo<VKNodeType::COPY_IMAGE_TO_BUFFER,
33 VKCopyImageToBufferCreateInfo,
34 VKCopyImageToBufferData,
35 VK_PIPELINE_STAGE_TRANSFER_BIT,
36 VKResourceType::IMAGE | VKResourceType::BUFFER> {
37 public:
45 template<typename Node, typename Storage>
46 static void set_node_data(Node &node, Storage &storage, const CreateInfo &create_info)
47 {
48 node.storage_index = storage.copy_image_to_buffer.append_and_get_index(create_info.node_data);
49 }
50
55 VKRenderGraphNodeLinks &node_links,
56 const CreateInfo &create_info) override
57 {
58 ResourceWithStamp src_resource = resources.get_image(create_info.node_data.src_image);
59 ResourceWithStamp dst_resource = resources.get_buffer_and_increase_stamp(
60 create_info.node_data.dst_buffer);
61 node_links.inputs.append({src_resource,
62 VK_ACCESS_TRANSFER_READ_BIT,
63 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
64 create_info.vk_image_aspects});
65 node_links.outputs.append(
66 {dst_resource, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED});
67 }
68
73 Data &data,
74 VKBoundPipelines & /*r_bound_pipelines*/) override
75 {
76 command_buffer.copy_image_to_buffer(
77 data.src_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, data.dst_buffer, 1, &data.region);
78 }
79};
80} // namespace blender::gpu::render_graph
BMesh const char void * data
virtual void copy_image_to_buffer(VkImage src_image, VkImageLayout src_image_layout, VkBuffer dst_buffer, uint32_t region_count, const VkBufferImageCopy *p_regions)=0
void build_links(VKResourceStateTracker &resources, VKRenderGraphNodeLinks &node_links, const CreateInfo &create_info) override
void build_commands(VKCommandBufferInterface &command_buffer, Data &data, VKBoundPipelines &) override
static void set_node_data(Node &node, Storage &storage, const CreateInfo &create_info)
ResourceWithStamp get_buffer_and_increase_stamp(VkBuffer vk_buffer)
ResourceWithStamp get_image(VkImage vk_image) const