Blender V5.0
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
12
17{
18 VkHandle<VkBuffer> buffer(1u);
19
20 resources.add_buffer(buffer);
21 VKFillBufferNode::CreateInfo fill_buffer = {buffer, 1024, 42};
22 render_graph->add_node(fill_buffer);
23 submit(render_graph, command_buffer);
24
25 EXPECT_EQ(1, log.size());
26 EXPECT_EQ("fill_buffer(dst_buffer=0x1, dst_offset=0, size=1024, data=42)", log[0]);
27}
28
32TEST_F(VKRenderGraphTestTransfer, fill_transfer_and_read_back)
33{
34 VkHandle<VkBuffer> buffer(1u);
35 VkHandle<VkBuffer> staging_buffer(2u);
36
37 resources.add_buffer(buffer);
38 VKFillBufferNode::CreateInfo fill_buffer = {buffer, 1024, 42};
39 render_graph->add_node(fill_buffer);
40 resources.add_buffer(staging_buffer);
41
42 VKCopyBufferNode::CreateInfo copy_buffer = {};
43 copy_buffer.src_buffer = buffer;
44 copy_buffer.dst_buffer = staging_buffer;
45 copy_buffer.region.srcOffset = 0;
46 copy_buffer.region.dstOffset = 0;
47 copy_buffer.region.size = 1024;
48 render_graph->add_node(copy_buffer);
49
50 submit(render_graph, command_buffer);
51
52 EXPECT_EQ(3, log.size());
53 EXPECT_EQ("fill_buffer(dst_buffer=0x1, dst_offset=0, size=1024, data=42)", log[0]);
55 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT, "
56 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
57 endl() +
58 " - buffer_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
59 "dst_access_mask=VK_ACCESS_TRANSFER_READ_BIT, buffer=0x1, offset=0, "
60 "size=18446744073709551615)" +
61 endl() + ")",
62 log[1]);
63 EXPECT_EQ("copy_buffer(src_buffer=0x1, dst_buffer=0x2" + endl() +
64 " - region(src_offset=0, dst_offset=0, size=1024)" + endl() + ")",
65 log[2]);
66}
67
73TEST_F(VKRenderGraphTestTransfer, fill_fill_read_back)
74{
75 VkHandle<VkBuffer> buffer(1u);
76
77 resources.add_buffer(buffer);
78 VKFillBufferNode::CreateInfo fill_buffer_1 = {buffer, 1024, 0};
79 render_graph->add_node(fill_buffer_1);
80 VKFillBufferNode::CreateInfo fill_buffer_2 = {buffer, 1024, 42};
81 render_graph->add_node(fill_buffer_2);
82 submit(render_graph, command_buffer);
83
84 EXPECT_EQ(3, log.size());
85 EXPECT_EQ("fill_buffer(dst_buffer=0x1, dst_offset=0, size=1024, data=0)", log[0]);
87 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT, "
88 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
89 endl() +
90 " - buffer_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
91 "dst_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, buffer=0x1, offset=0, "
92 "size=18446744073709551615)" +
93 endl() + ")",
94 log[1]);
95 EXPECT_EQ("fill_buffer(dst_buffer=0x1, dst_offset=0, size=1024, data=42)", log[2]);
96}
97
101TEST_F(VKRenderGraphTestTransfer, clear_clear_copy_and_read_back)
102{
103 VkHandle<VkImage> src_image(1u);
104 VkHandle<VkImage> dst_image(2u);
105 VkHandle<VkBuffer> staging_buffer(3u);
106
107 resources.add_image(src_image, false);
108 resources.add_image(dst_image, false);
109 resources.add_buffer(staging_buffer);
110 VkClearColorValue color_white = {};
111 color_white.float32[0] = 1.0f;
112 color_white.float32[1] = 1.0f;
113 color_white.float32[2] = 1.0f;
114 color_white.float32[3] = 1.0f;
115 VkClearColorValue color_black = {};
116 color_black.float32[0] = 0.0f;
117 color_black.float32[1] = 0.0f;
118 color_black.float32[2] = 0.0f;
119 color_black.float32[3] = 1.0f;
120
121 VKClearColorImageNode::CreateInfo clear_color_image_src = {};
122 clear_color_image_src.vk_image = src_image;
123 clear_color_image_src.vk_clear_color_value = color_white;
124 VKClearColorImageNode::CreateInfo clear_color_image_dst = {};
125 clear_color_image_dst.vk_image = dst_image;
126 clear_color_image_dst.vk_clear_color_value = color_black;
127
128 VKCopyImageNode::CreateInfo copy_image = {};
129 copy_image.node_data.src_image = src_image;
130 copy_image.node_data.dst_image = dst_image;
131 copy_image.node_data.region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
132 copy_image.node_data.region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
133 copy_image.vk_image_aspect = VK_IMAGE_ASPECT_COLOR_BIT;
134 VKCopyImageToBufferNode::CreateInfo copy_dst_image_to_buffer = {};
135 copy_dst_image_to_buffer.node_data.src_image = dst_image;
136 copy_dst_image_to_buffer.node_data.dst_buffer = staging_buffer;
137 copy_dst_image_to_buffer.node_data.region.imageSubresource.aspectMask =
138 VK_IMAGE_ASPECT_COLOR_BIT;
139 copy_dst_image_to_buffer.vk_image_aspects = VK_IMAGE_ASPECT_COLOR_BIT;
140
141 render_graph->add_node(clear_color_image_src);
142 render_graph->add_node(clear_color_image_dst);
143 render_graph->add_node(copy_image);
144 render_graph->add_node(copy_dst_image_to_buffer);
145 submit(render_graph, command_buffer);
146
147 EXPECT_EQ(8, log.size());
148 EXPECT_EQ(
149 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
150 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
151 endl() +
152 " - image_barrier(src_access_mask=, dst_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
153 "old_layout=VK_IMAGE_LAYOUT_UNDEFINED, new_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
154 "image=0x1, subresource_range=" +
155 endl() +
156 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
157 "base_array_layer=0, layer_count=4294967295 )" +
158 endl() + ")",
159 log[0]);
160 EXPECT_EQ("clear_color_image(image=0x1, image_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)",
161 log[1]);
162
163 EXPECT_EQ(
164 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
165 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
166 endl() +
167 " - image_barrier(src_access_mask=, dst_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
168 "old_layout=VK_IMAGE_LAYOUT_UNDEFINED, new_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
169 "image=0x2, subresource_range=" +
170 endl() +
171 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
172 "base_array_layer=0, layer_count=4294967295 )" +
173 endl() + ")",
174 log[2]);
175 EXPECT_EQ("clear_color_image(image=0x2, image_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)",
176 log[3]);
177
178 EXPECT_EQ(
179 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT, "
180 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
181 endl() +
182 " - image_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
183 "dst_access_mask=VK_ACCESS_TRANSFER_READ_BIT, "
184 "old_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
185 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image=0x1, subresource_range=" +
186 endl() +
187 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
188 "base_array_layer=0, layer_count=4294967295 )" +
189 endl() +
190 " - image_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
191 "dst_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
192 "old_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
193 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, image=0x2, 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 log[4]);
199 EXPECT_EQ(
200 "copy_image(src_image=0x1, src_image_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "
201 "dst_image=0x2, dst_image_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL" +
202 endl() + " - region(src_subresource=" + endl() +
203 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, mip_level=0, base_array_layer=0, "
204 "layer_count=0 , src_offset=" +
205 endl() + " x=0, y=0, z=0 , dst_subresource=" + endl() +
206 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, mip_level=0, base_array_layer=0, "
207 "layer_count=0 , dst_offset=" +
208 endl() + " x=0, y=0, z=0 , extent=" + endl() + " width=0, height=0, depth=0 )" +
209 endl() + ")",
210 log[5]);
211
212 EXPECT_EQ(
213 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT, "
214 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
215 endl() +
216 " - image_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
217 "dst_access_mask=VK_ACCESS_TRANSFER_READ_BIT, "
218 "old_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
219 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image=0x2, subresource_range=" +
220 endl() +
221 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
222 "base_array_layer=0, layer_count=4294967295 )" +
223 endl() + ")",
224 log[6]);
225 EXPECT_EQ(
226 "copy_image_to_buffer(src_image=0x2, src_image_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "
227 "dst_buffer=0x3" +
228 endl() +
229 " - region(buffer_offset=0, buffer_row_length=0, buffer_image_height=0, "
230 "image_subresource=" +
231 endl() +
232 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, mip_level=0, base_array_layer=0, "
233 "layer_count=0 , image_offset=" +
234 endl() + " x=0, y=0, z=0 , image_extent=\n width=0, height=0, depth=0 )" +
235 endl() + ")",
236 log[7]);
237}
238
242TEST_F(VKRenderGraphTestTransfer, clear_blit_copy_and_read_back)
243{
244 VkHandle<VkImage> src_image(1u);
245 VkHandle<VkImage> dst_image(2u);
246 VkHandle<VkBuffer> staging_buffer(3u);
247
248 resources.add_image(src_image, false);
249 resources.add_image(dst_image, false);
250 resources.add_buffer(staging_buffer);
251 VkClearColorValue color_black = {};
252 color_black.float32[0] = 0.0f;
253 color_black.float32[1] = 0.0f;
254 color_black.float32[2] = 0.0f;
255 color_black.float32[3] = 1.0f;
256 VkImageBlit vk_image_blit = {};
257 VKClearColorImageNode::CreateInfo clear_color_image_src = {};
258 clear_color_image_src.vk_image = src_image;
259 clear_color_image_src.vk_clear_color_value = color_black;
260 VKCopyImageToBufferNode::CreateInfo copy_dst_image_to_buffer = {};
261 copy_dst_image_to_buffer.node_data.src_image = dst_image;
262 copy_dst_image_to_buffer.node_data.dst_buffer = staging_buffer;
263 copy_dst_image_to_buffer.node_data.region.imageSubresource.aspectMask =
264 VK_IMAGE_ASPECT_COLOR_BIT;
265 copy_dst_image_to_buffer.vk_image_aspects = VK_IMAGE_ASPECT_COLOR_BIT;
266
267 render_graph->add_node(clear_color_image_src);
268 VKBlitImageNode::CreateInfo blit_image = {src_image, dst_image, vk_image_blit, VK_FILTER_LINEAR};
269 render_graph->add_node(blit_image);
270 render_graph->add_node(copy_dst_image_to_buffer);
271 submit(render_graph, command_buffer);
272
273 EXPECT_EQ(6, log.size());
274 EXPECT_EQ(
275 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
276 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
277 endl() +
278 " - image_barrier(src_access_mask=, dst_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
279 "old_layout=VK_IMAGE_LAYOUT_UNDEFINED, "
280 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, image=0x1, subresource_range=" +
281 endl() +
282 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
283 "base_array_layer=0, layer_count=4294967295 )" +
284 endl() + ")",
285 log[0]);
286 EXPECT_EQ("clear_color_image(image=0x1, image_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)",
287 log[1]);
288 EXPECT_EQ(
289 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT, "
290 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
291 endl() +
292 " - image_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
293 "dst_access_mask=VK_ACCESS_TRANSFER_READ_BIT, "
294 "old_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
295 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image=0x1, subresource_range=" +
296 endl() +
297 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
298 "base_array_layer=0, layer_count=4294967295 )" +
299 endl() +
300 " - image_barrier(src_access_mask=, dst_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
301 "old_layout=VK_IMAGE_LAYOUT_UNDEFINED, new_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
302 "image=0x2, subresource_range=" +
303 endl() +
304 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
305 "base_array_layer=0, layer_count=4294967295 )" +
306 endl() + ")",
307 log[2]);
308 EXPECT_EQ(
309 "blit_image(src_image=0x1, src_image_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "
310 "dst_image=0x2, dst_image_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
311 "filter=VK_FILTER_LINEAR" +
312 endl() + " - region(src_subresource=" + endl() +
313 " aspect_mask=, mip_level=0, base_array_layer=0, layer_count=0 , dst_subresource=" +
314 endl() + " aspect_mask=, mip_level=0, base_array_layer=0, layer_count=0 )" + endl() +
315 ")",
316 log[3]);
317 EXPECT_EQ(
318 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT, "
319 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
320 endl() +
321 " - image_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
322 "dst_access_mask=VK_ACCESS_TRANSFER_READ_BIT, "
323 "old_layout=VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "
324 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image=0x2, subresource_range=" +
325 endl() +
326 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
327 "base_array_layer=0, layer_count=4294967295 )" +
328 endl() + ")",
329 log[4]);
330 EXPECT_EQ(
331 "copy_image_to_buffer(src_image=0x2, src_image_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "
332 "dst_buffer=0x3" +
333 endl() +
334 " - region(buffer_offset=0, buffer_row_length=0, buffer_image_height=0, "
335 "image_subresource=" +
336 endl() +
337 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, mip_level=0, base_array_layer=0, "
338 "layer_count=0 , image_offset=" +
339 endl() + " x=0, y=0, z=0 , image_extent=" + endl() +
340 " width=0, height=0, depth=0 )" + endl() + ")",
341 log[5]);
342}
343
347TEST_F(VKRenderGraphTestTransfer, copy_buffer_modify_data)
348{
349 VkHandle<VkBuffer> buffer_src(1u);
350 VkHandle<VkBuffer> buffer_dst(2u);
351
352 resources.add_buffer(buffer_src);
353 resources.add_buffer(buffer_dst);
354 VKCopyBufferNode::CreateInfo copy_buffer = {buffer_src, buffer_dst, {0, 0, 32}};
355 NodeHandle copy_buffer_handle = render_graph->add_node(copy_buffer);
356 VKCopyBufferNode::Data &copy_buffer_data = render_graph->get_node_data(copy_buffer_handle);
357 copy_buffer_data.region.size = 64;
358 submit(render_graph, command_buffer);
359
360 EXPECT_EQ(2, log.size());
361 EXPECT_EQ(
362 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
363 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
364 endl() +
365 " - buffer_barrier(src_access_mask=, dst_access_mask=VK_ACCESS_TRANSFER_READ_BIT, "
366 "buffer=0x1, offset=0, size=18446744073709551615)" +
367 endl() + ")",
368 log[0]);
369 EXPECT_EQ("copy_buffer(src_buffer=0x1, dst_buffer=0x2" + endl() +
370 " - region(src_offset=0, dst_offset=0, size=64)" + endl() + ")",
371 log[1]);
372}
373
374} // namespace blender::gpu::render_graph
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
#define log
static void submit(std::unique_ptr< VKRenderGraph > &render_graph, std::unique_ptr< CommandBufferLog > &command_buffer)
TEST_F(VKRenderGraphTestCompute, dispatch_read_back)