Blender V5.0
vk_resource_access_info.cc
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
10#include "vk_backend.hh"
13
15
16VkImageLayout VKImageAccess::to_vk_image_layout(bool supports_local_read) const
17{
18 if (vk_access_flags & (VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT)) {
19 /* TODO: when read only use VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL */
20 return VK_IMAGE_LAYOUT_GENERAL;
21 }
22
23 if (supports_local_read && vk_access_flags & (VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
24 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
25 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT))
26 {
27 return VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR;
28 }
29 else if (vk_access_flags &
30 (VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT))
31 {
32 return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
33 }
34
35 // TODO: Add ATTACHMENT_READ_ONLY_OPTIMAL
36 if (vk_access_flags &
37 (VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT))
38 {
39 if (vk_image_aspect == VK_IMAGE_ASPECT_DEPTH_BIT) {
40 return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
41 }
42 if (vk_image_aspect == VK_IMAGE_ASPECT_STENCIL_BIT) {
43 return VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL;
44 }
45 BLI_assert(vk_image_aspect == (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT));
46 return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
47 }
49 return VK_IMAGE_LAYOUT_UNDEFINED;
50}
51
53static constexpr VkAccessFlags VK_ACCESS_WRITE_MASK =
54 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
55 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
56 VK_ACCESS_HOST_WRITE_BIT;
57
59 VKRenderGraphNodeLinks &node_links) const
60{
61 for (const VKBufferAccess &buffer_access : buffers) {
62 const bool writes_to_resource = bool(buffer_access.vk_access_flags & VK_ACCESS_WRITE_MASK);
63 ResourceWithStamp versioned_resource = writes_to_resource ?
65 buffer_access.vk_buffer) :
66 resources.get_buffer(buffer_access.vk_buffer);
67 if (writes_to_resource) {
68 node_links.outputs.append(
69 {versioned_resource, buffer_access.vk_access_flags, VK_IMAGE_LAYOUT_UNDEFINED});
70 }
71 else {
72 node_links.inputs.append(
73 {versioned_resource, buffer_access.vk_access_flags, VK_IMAGE_LAYOUT_UNDEFINED});
74 }
75 }
76
77 const bool supports_local_read = resources.use_dynamic_rendering_local_read;
78
79 for (const VKImageAccess &image_access : images) {
80 VkImageLayout image_layout = image_access.to_vk_image_layout(supports_local_read);
81 const bool writes_to_resource = bool(image_access.vk_access_flags & VK_ACCESS_WRITE_MASK);
82 ResourceWithStamp versioned_resource = writes_to_resource ?
84 image_access.vk_image) :
85 resources.get_image(image_access.vk_image);
86 if (writes_to_resource) {
87 node_links.outputs.append({versioned_resource,
88 image_access.vk_access_flags,
89 image_layout,
90 image_access.vk_image_aspect,
91 image_access.subimage});
92 }
93 else {
94 node_links.inputs.append({versioned_resource,
95 image_access.vk_access_flags,
96 image_layout,
97 image_access.vk_image_aspect,
98 image_access.subimage});
99 }
100 }
101}
102
104{
105 images.clear();
106 buffers.clear();
107}
108
109} // namespace blender::gpu::render_graph
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define BLI_assert(a)
Definition BLI_assert.h:46
ResourceWithStamp get_image_and_increase_stamp(VkImage vk_image)
ResourceWithStamp get_buffer_and_increase_stamp(VkBuffer vk_buffer)
ResourceWithStamp get_buffer(VkBuffer vk_buffer) const
ResourceWithStamp get_image(VkImage vk_image) const
static constexpr VkAccessFlags VK_ACCESS_WRITE_MASK
VkImageLayout to_vk_image_layout(bool supports_local_read) const
void build_links(VKResourceStateTracker &resources, VKRenderGraphNodeLinks &node_links) const