Blender V4.3
vk_render_graph_test_transfer.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "testing/testing.h"
6
8
10
14TEST(vk_render_graph, fill_and_read_back)
15{
16 VkHandle<VkBuffer> buffer(1u);
17
19 VKResourceStateTracker resources;
20 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
21 resources.add_buffer(buffer);
22 VKFillBufferNode::CreateInfo fill_buffer = {buffer, 1024, 42};
23 render_graph.add_node(fill_buffer);
24 render_graph.submit_buffer_for_read(buffer);
25
26 EXPECT_EQ(1, log.size());
27 EXPECT_EQ("fill_buffer(dst_buffer=0x1, dst_offset=0, size=1024, data=42)", log[0]);
28}
29
33TEST(vk_render_graph, fill_transfer_and_read_back)
34{
35 VkHandle<VkBuffer> buffer(1u);
36 VkHandle<VkBuffer> staging_buffer(2u);
37
39 VKResourceStateTracker resources;
40 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
41 resources.add_buffer(buffer);
42 VKFillBufferNode::CreateInfo fill_buffer = {buffer, 1024, 42};
43 render_graph.add_node(fill_buffer);
44 resources.add_buffer(staging_buffer);
45
46 VKCopyBufferNode::CreateInfo copy_buffer = {};
47 copy_buffer.src_buffer = buffer;
48 copy_buffer.dst_buffer = staging_buffer;
49 copy_buffer.region.srcOffset = 0;
50 copy_buffer.region.dstOffset = 0;
51 copy_buffer.region.size = 1024;
52 render_graph.add_node(copy_buffer);
53
54 render_graph.submit_buffer_for_read(staging_buffer);
55
56 EXPECT_EQ(3, log.size());
57 EXPECT_EQ("fill_buffer(dst_buffer=0x1, dst_offset=0, size=1024, data=42)", log[0]);
59 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT, "
60 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
61 endl() +
62 " - buffer_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
63 "dst_access_mask=VK_ACCESS_TRANSFER_READ_BIT, buffer=0x1, offset=0, "
64 "size=18446744073709551615)" +
65 endl() + ")",
66 log[1]);
67 EXPECT_EQ("copy_buffer(src_buffer=0x1, dst_buffer=0x2" + endl() +
68 " - region(src_offset=0, dst_offset=0, size=1024)" + endl() + ")",
69 log[2]);
70}
71
77TEST(vk_render_graph, fill_fill_read_back)
78{
79 VkHandle<VkBuffer> buffer(1u);
80
82 VKResourceStateTracker resources;
83 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
84 resources.add_buffer(buffer);
85 VKFillBufferNode::CreateInfo fill_buffer_1 = {buffer, 1024, 0};
86 render_graph.add_node(fill_buffer_1);
87 VKFillBufferNode::CreateInfo fill_buffer_2 = {buffer, 1024, 42};
88 render_graph.add_node(fill_buffer_2);
89 render_graph.submit_buffer_for_read(buffer);
90
91 EXPECT_EQ(3, log.size());
92 EXPECT_EQ("fill_buffer(dst_buffer=0x1, dst_offset=0, size=1024, data=0)", log[0]);
94 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT, "
95 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
96 endl() +
97 " - buffer_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
98 "dst_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, buffer=0x1, offset=0, "
99 "size=18446744073709551615)" +
100 endl() + ")",
101 log[1]);
102 EXPECT_EQ("fill_buffer(dst_buffer=0x1, dst_offset=0, size=1024, data=42)", log[2]);
103}
104
108TEST(vk_render_graph, clear_clear_copy_and_read_back)
109{
110 VkHandle<VkImage> src_image(1u);
111 VkHandle<VkImage> dst_image(2u);
112 VkHandle<VkBuffer> staging_buffer(3u);
113
115 VKResourceStateTracker resources;
116 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
117 resources.add_image(src_image, 1, VK_IMAGE_LAYOUT_UNDEFINED, ResourceOwner::APPLICATION);
118 resources.add_image(dst_image, 1, VK_IMAGE_LAYOUT_UNDEFINED, ResourceOwner::APPLICATION);
119 resources.add_buffer(staging_buffer);
120 VkClearColorValue color_white = {};
121 color_white.float32[0] = 1.0f;
122 color_white.float32[1] = 1.0f;
123 color_white.float32[2] = 1.0f;
124 color_white.float32[3] = 1.0f;
125 VkClearColorValue color_black = {};
126 color_black.float32[0] = 0.0f;
127 color_black.float32[1] = 0.0f;
128 color_black.float32[2] = 0.0f;
129 color_black.float32[3] = 1.0f;
130
131 VKClearColorImageNode::CreateInfo clear_color_image_src = {};
132 clear_color_image_src.vk_image = src_image;
133 clear_color_image_src.vk_clear_color_value = color_white;
134 VKClearColorImageNode::CreateInfo clear_color_image_dst = {};
135 clear_color_image_dst.vk_image = dst_image;
136 clear_color_image_dst.vk_clear_color_value = color_black;
137
138 VKCopyImageNode::CreateInfo copy_image = {};
139 copy_image.node_data.src_image = src_image;
140 copy_image.node_data.dst_image = dst_image;
141 copy_image.node_data.region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
142 copy_image.node_data.region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
143 copy_image.vk_image_aspect = VK_IMAGE_ASPECT_COLOR_BIT;
144 VKCopyImageToBufferNode::CreateInfo copy_dst_image_to_buffer = {};
145 copy_dst_image_to_buffer.src_image = dst_image;
146 copy_dst_image_to_buffer.dst_buffer = staging_buffer;
147 copy_dst_image_to_buffer.region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
148
149 render_graph.add_node(clear_color_image_src);
150 render_graph.add_node(clear_color_image_dst);
151 render_graph.add_node(copy_image);
152 render_graph.add_node(copy_dst_image_to_buffer);
153 render_graph.submit_buffer_for_read(staging_buffer);
154
155 EXPECT_EQ(8, log.size());
156 EXPECT_EQ(
157 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
158 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
159 endl() +
160 " - image_barrier(src_access_mask=, dst_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
161 "old_layout=VK_IMAGE_LAYOUT_UNDEFINED, new_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
162 "image=0x1, subresource_range=" +
163 endl() +
164 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
165 "base_array_layer=0, layer_count=4294967295 )" +
166 endl() + ")",
167 log[0]);
168 EXPECT_EQ("clear_color_image(image=0x1, image_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)",
169 log[1]);
170
171 EXPECT_EQ(
172 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
173 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
174 endl() +
175 " - image_barrier(src_access_mask=, dst_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
176 "old_layout=VK_IMAGE_LAYOUT_UNDEFINED, new_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
177 "image=0x2, subresource_range=" +
178 endl() +
179 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
180 "base_array_layer=0, layer_count=4294967295 )" +
181 endl() + ")",
182 log[2]);
183 EXPECT_EQ("clear_color_image(image=0x2, image_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)",
184 log[3]);
185
186 EXPECT_EQ(
187 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT, "
188 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
189 endl() +
190 " - image_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
191 "dst_access_mask=VK_ACCESS_TRANSFER_READ_BIT, "
192 "old_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
193 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image=0x1, subresource_range=" +
194 endl() +
195 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
196 "base_array_layer=0, layer_count=4294967295 )" +
197 endl() +
198 " - image_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
199 "dst_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
200 "old_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
201 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, image=0x2, subresource_range=" +
202 endl() +
203 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
204 "base_array_layer=0, layer_count=4294967295 )" +
205 endl() + ")",
206 log[4]);
207 EXPECT_EQ(
208 "copy_image(src_image=0x1, src_image_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "
209 "dst_image=0x2, dst_image_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL" +
210 endl() + " - region(src_subresource=" + endl() +
211 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, mip_level=0, base_array_layer=0, "
212 "layer_count=0 , src_offset=" +
213 endl() + " x=0, y=0, z=0 , dst_subresource=" + endl() +
214 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, mip_level=0, base_array_layer=0, "
215 "layer_count=0 , dst_offset=" +
216 endl() + " x=0, y=0, z=0 , extent=" + endl() + " width=0, height=0, depth=0 )" +
217 endl() + ")",
218 log[5]);
219
220 EXPECT_EQ(
221 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT, "
222 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
223 endl() +
224 " - image_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
225 "dst_access_mask=VK_ACCESS_TRANSFER_READ_BIT, "
226 "old_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
227 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image=0x2, subresource_range=" +
228 endl() +
229 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
230 "base_array_layer=0, layer_count=4294967295 )" +
231 endl() + ")",
232 log[6]);
233 EXPECT_EQ(
234 "copy_image_to_buffer(src_image=0x2, src_image_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "
235 "dst_buffer=0x3" +
236 endl() +
237 " - region(buffer_offset=0, buffer_row_length=0, buffer_image_height=0, "
238 "image_subresource=" +
239 endl() +
240 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, mip_level=0, base_array_layer=0, "
241 "layer_count=0 , image_offset=" +
242 endl() + " x=0, y=0, z=0 , image_extent=\n width=0, height=0, depth=0 )" +
243 endl() + ")",
244 log[7]);
245}
246
250TEST(vk_render_graph, clear_blit_copy_and_read_back)
251{
252 VkHandle<VkImage> src_image(1u);
253 VkHandle<VkImage> dst_image(2u);
254 VkHandle<VkBuffer> staging_buffer(3u);
255
257 VKResourceStateTracker resources;
258 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
259 resources.add_image(src_image, 1, VK_IMAGE_LAYOUT_UNDEFINED, ResourceOwner::APPLICATION);
260 resources.add_image(dst_image, 1, VK_IMAGE_LAYOUT_UNDEFINED, ResourceOwner::APPLICATION);
261 resources.add_buffer(staging_buffer);
262 VkClearColorValue color_black = {};
263 color_black.float32[0] = 0.0f;
264 color_black.float32[1] = 0.0f;
265 color_black.float32[2] = 0.0f;
266 color_black.float32[3] = 1.0f;
267 VkImageBlit vk_image_blit = {};
268 VKClearColorImageNode::CreateInfo clear_color_image_src = {};
269 clear_color_image_src.vk_image = src_image;
270 clear_color_image_src.vk_clear_color_value = color_black;
271 VKCopyImageToBufferNode::CreateInfo copy_dst_image_to_buffer = {};
272 copy_dst_image_to_buffer.src_image = dst_image;
273 copy_dst_image_to_buffer.dst_buffer = staging_buffer;
274 copy_dst_image_to_buffer.region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
275
276 render_graph.add_node(clear_color_image_src);
277 VKBlitImageNode::CreateInfo blit_image = {src_image, dst_image, vk_image_blit, VK_FILTER_LINEAR};
278 render_graph.add_node(blit_image);
279 render_graph.add_node(copy_dst_image_to_buffer);
280 render_graph.submit_buffer_for_read(staging_buffer);
281
282 EXPECT_EQ(6, log.size());
283 EXPECT_EQ(
284 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
285 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
286 endl() +
287 " - image_barrier(src_access_mask=, dst_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
288 "old_layout=VK_IMAGE_LAYOUT_UNDEFINED, "
289 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, image=0x1, subresource_range=" +
290 endl() +
291 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
292 "base_array_layer=0, layer_count=4294967295 )" +
293 endl() + ")",
294 log[0]);
295 EXPECT_EQ("clear_color_image(image=0x1, image_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)",
296 log[1]);
297 EXPECT_EQ(
298 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT, "
299 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
300 endl() +
301 " - image_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
302 "dst_access_mask=VK_ACCESS_TRANSFER_READ_BIT, "
303 "old_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
304 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image=0x1, subresource_range=" +
305 endl() +
306 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
307 "base_array_layer=0, layer_count=4294967295 )" +
308 endl() +
309 " - image_barrier(src_access_mask=, dst_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
310 "old_layout=VK_IMAGE_LAYOUT_UNDEFINED, new_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
311 "image=0x2, subresource_range=" +
312 endl() +
313 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
314 "base_array_layer=0, layer_count=4294967295 )" +
315 endl() + ")",
316 log[2]);
317 EXPECT_EQ(
318 "blit_image(src_image=0x1, src_image_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "
319 "dst_image=0x2, dst_image_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
320 "filter=VK_FILTER_LINEAR" +
321 endl() + " - region(src_subresource=" + endl() +
322 " aspect_mask=, mip_level=0, base_array_layer=0, layer_count=0 , dst_subresource=" +
323 endl() + " aspect_mask=, mip_level=0, base_array_layer=0, layer_count=0 )" + endl() +
324 ")",
325 log[3]);
326 EXPECT_EQ(
327 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT, "
328 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
329 endl() +
330 " - image_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
331 "dst_access_mask=VK_ACCESS_TRANSFER_READ_BIT, "
332 "old_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
333 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image=0x2, subresource_range=" +
334 endl() +
335 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
336 "base_array_layer=0, layer_count=4294967295 )" +
337 endl() + ")",
338 log[4]);
339 EXPECT_EQ(
340 "copy_image_to_buffer(src_image=0x2, src_image_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "
341 "dst_buffer=0x3" +
342 endl() +
343 " - region(buffer_offset=0, buffer_row_length=0, buffer_image_height=0, "
344 "image_subresource=" +
345 endl() +
346 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, mip_level=0, base_array_layer=0, "
347 "layer_count=0 , image_offset=" +
348 endl() + " x=0, y=0, z=0 , image_extent=" + endl() +
349 " width=0, height=0, depth=0 )" + endl() + ")",
350 log[5]);
351}
352} // namespace blender::gpu::render_graph
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void submit_buffer_for_read(VkBuffer vk_buffer)
void add_image(VkImage vk_image, uint32_t layer_count, VkImageLayout vk_image_layout, ResourceOwner owner, const char *name=nullptr)
void add_buffer(VkBuffer vk_buffer, const char *name=nullptr)
ccl_device_inline float3 log(float3 v)
TEST(vk_render_graph, dispatch_read_back)