Blender V4.3
vk_render_graph_test_compute.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
11TEST(vk_render_graph, dispatch_read_back)
12{
13 VkHandle<VkBuffer> buffer(1u);
14 VkHandle<VkPipeline> pipeline(2u);
15 VkHandle<VkPipelineLayout> pipeline_layout(3u);
16 VkHandle<VkDescriptorSet> descriptor_set(4u);
17
19 VKResourceStateTracker resources;
20 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
21 resources.add_buffer(buffer);
22 VKResourceAccessInfo access_info = {};
23 access_info.buffers.append({buffer, VK_ACCESS_SHADER_WRITE_BIT});
24 VKDispatchNode::CreateInfo dispatch_info(access_info);
25 dispatch_info.dispatch_node.pipeline_data.vk_pipeline = pipeline;
26 dispatch_info.dispatch_node.pipeline_data.vk_pipeline_layout = pipeline_layout;
27 dispatch_info.dispatch_node.pipeline_data.vk_descriptor_set = descriptor_set;
28 dispatch_info.dispatch_node.group_count_x = 1;
29 dispatch_info.dispatch_node.group_count_y = 1;
30 dispatch_info.dispatch_node.group_count_z = 1;
31 render_graph.add_node(dispatch_info);
32 render_graph.submit_buffer_for_read(buffer);
33 EXPECT_EQ(3, log.size());
34 EXPECT_EQ("bind_pipeline(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, pipeline=0x2)",
35 log[0]);
37 "bind_descriptor_sets(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, layout=0x3, "
38 "p_descriptor_sets=0x4)",
39 log[1]);
40 EXPECT_EQ("dispatch(group_count_x=1, group_count_y=1, group_count_z=1)", log[2]);
41}
42
46TEST(vk_render_graph, dispatch_dispatch_read_back)
47{
48 VkHandle<VkBuffer> buffer(1u);
49 VkHandle<VkPipeline> pipeline(2u);
50 VkHandle<VkPipelineLayout> pipeline_layout(3u);
51 VkHandle<VkDescriptorSet> descriptor_set(4u);
52
54 VKResourceStateTracker resources;
55 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
56 resources.add_buffer(buffer);
57
58 {
59 VKResourceAccessInfo access_info = {};
60 access_info.buffers.append({buffer, VK_ACCESS_SHADER_WRITE_BIT});
61 VKDispatchNode::CreateInfo dispatch_info(access_info);
62 dispatch_info.dispatch_node.pipeline_data.vk_pipeline = pipeline;
63 dispatch_info.dispatch_node.pipeline_data.vk_pipeline_layout = pipeline_layout;
64 dispatch_info.dispatch_node.pipeline_data.vk_descriptor_set = descriptor_set;
65 dispatch_info.dispatch_node.group_count_x = 1;
66 dispatch_info.dispatch_node.group_count_y = 1;
67 dispatch_info.dispatch_node.group_count_z = 1;
68 render_graph.add_node(dispatch_info);
69 }
70 {
71 VKResourceAccessInfo access_info = {};
72 access_info.buffers.append({buffer, VK_ACCESS_SHADER_WRITE_BIT});
73 VKDispatchNode::CreateInfo dispatch_info(access_info);
74 dispatch_info.dispatch_node.pipeline_data.vk_pipeline = pipeline;
75 dispatch_info.dispatch_node.pipeline_data.vk_pipeline_layout = pipeline_layout;
76 dispatch_info.dispatch_node.pipeline_data.vk_descriptor_set = descriptor_set;
77 dispatch_info.dispatch_node.group_count_x = 2;
78 dispatch_info.dispatch_node.group_count_y = 2;
79 dispatch_info.dispatch_node.group_count_z = 2;
80 render_graph.add_node(dispatch_info);
81 }
82 render_graph.submit_buffer_for_read(buffer);
83 EXPECT_EQ(5, log.size());
84 EXPECT_EQ("bind_pipeline(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, pipeline=0x2)",
85 log[0]);
87 "bind_descriptor_sets(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, layout=0x3, "
88 "p_descriptor_sets=0x4)",
89 log[1]);
90 EXPECT_EQ("dispatch(group_count_x=1, group_count_y=1, group_count_z=1)", log[2]);
92 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, "
93 "dst_stage_mask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT" +
94 endl() +
95 " - buffer_barrier(src_access_mask=VK_ACCESS_SHADER_WRITE_BIT, "
96 "dst_access_mask=VK_ACCESS_SHADER_WRITE_BIT, buffer=0x1, offset=0, "
97 "size=18446744073709551615)" +
98 endl() + ")",
99 log[3]);
100 EXPECT_EQ("dispatch(group_count_x=2, group_count_y=2, group_count_z=2)", log[4]);
101}
102
107TEST(vk_render_graph, dispatch_dispatch_read_back_with_changing_descriptor_sets)
108{
109 VkHandle<VkBuffer> buffer(1u);
110 VkHandle<VkPipeline> pipeline(2u);
111 VkHandle<VkPipelineLayout> pipeline_layout(3u);
112 VkHandle<VkDescriptorSet> descriptor_set_a(4u);
113 VkHandle<VkDescriptorSet> descriptor_set_b(5u);
114
116 VKResourceStateTracker resources;
117 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
118 resources.add_buffer(buffer);
119
120 {
121 VKResourceAccessInfo access_info = {};
122 access_info.buffers.append({buffer, VK_ACCESS_SHADER_WRITE_BIT});
123 VKDispatchNode::CreateInfo dispatch_info(access_info);
124 dispatch_info.dispatch_node.pipeline_data.vk_pipeline = pipeline;
125 dispatch_info.dispatch_node.pipeline_data.vk_pipeline_layout = pipeline_layout;
126 dispatch_info.dispatch_node.pipeline_data.vk_descriptor_set = descriptor_set_a;
127 dispatch_info.dispatch_node.group_count_x = 1;
128 dispatch_info.dispatch_node.group_count_y = 1;
129 dispatch_info.dispatch_node.group_count_z = 1;
130 render_graph.add_node(dispatch_info);
131 }
132 {
133 VKResourceAccessInfo access_info = {};
134 access_info.buffers.append({buffer, VK_ACCESS_SHADER_WRITE_BIT});
135 VKDispatchNode::CreateInfo dispatch_info(access_info);
136 dispatch_info.dispatch_node.pipeline_data.vk_pipeline = pipeline;
137 dispatch_info.dispatch_node.pipeline_data.vk_pipeline_layout = pipeline_layout;
138 dispatch_info.dispatch_node.pipeline_data.vk_descriptor_set = descriptor_set_b;
139 dispatch_info.dispatch_node.group_count_x = 2;
140 dispatch_info.dispatch_node.group_count_y = 2;
141 dispatch_info.dispatch_node.group_count_z = 2;
142 render_graph.add_node(dispatch_info);
143 }
144 render_graph.submit_buffer_for_read(buffer);
145 EXPECT_EQ(6, log.size());
146 EXPECT_EQ("bind_pipeline(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, pipeline=0x2)",
147 log[0]);
148 EXPECT_EQ(
149 "bind_descriptor_sets(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, layout=0x3, "
150 "p_descriptor_sets=0x4)",
151 log[1]);
152 EXPECT_EQ("dispatch(group_count_x=1, group_count_y=1, group_count_z=1)", log[2]);
153 EXPECT_EQ(
154 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, "
155 "dst_stage_mask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT" +
156 endl() +
157 " - buffer_barrier(src_access_mask=VK_ACCESS_SHADER_WRITE_BIT, "
158 "dst_access_mask=VK_ACCESS_SHADER_WRITE_BIT, buffer=0x1, offset=0, "
159 "size=18446744073709551615)" +
160 endl() + ")",
161 log[3]);
162 EXPECT_EQ(
163 "bind_descriptor_sets(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, layout=0x3, "
164 "p_descriptor_sets=0x5)",
165 log[4]);
166 EXPECT_EQ("dispatch(group_count_x=2, group_count_y=2, group_count_z=2)", log[5]);
167}
168
172TEST(vk_render_graph, dispatch_dispatch_read_back_with_changing_pipelines)
173{
174 VkHandle<VkBuffer> buffer(1u);
175 VkHandle<VkPipeline> pipeline_a(2u);
176 VkHandle<VkPipeline> pipeline_b(3u);
177 VkHandle<VkPipelineLayout> pipeline_layout(4u);
178 VkHandle<VkDescriptorSet> descriptor_set(5u);
179
181 VKResourceStateTracker resources;
182 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
183 resources.add_buffer(buffer);
184
185 {
186 VKResourceAccessInfo access_info = {};
187 access_info.buffers.append({buffer, VK_ACCESS_SHADER_WRITE_BIT});
188 VKDispatchNode::CreateInfo dispatch_info(access_info);
189 dispatch_info.dispatch_node.pipeline_data.vk_pipeline = pipeline_a;
190 dispatch_info.dispatch_node.pipeline_data.vk_pipeline_layout = pipeline_layout;
191 dispatch_info.dispatch_node.pipeline_data.vk_descriptor_set = descriptor_set;
192 dispatch_info.dispatch_node.group_count_x = 1;
193 dispatch_info.dispatch_node.group_count_y = 1;
194 dispatch_info.dispatch_node.group_count_z = 1;
195 render_graph.add_node(dispatch_info);
196 }
197 {
198 VKResourceAccessInfo access_info = {};
199 access_info.buffers.append({buffer, VK_ACCESS_SHADER_WRITE_BIT});
200 VKDispatchNode::CreateInfo dispatch_info(access_info);
201 dispatch_info.dispatch_node.pipeline_data.vk_pipeline = pipeline_b;
202 dispatch_info.dispatch_node.pipeline_data.vk_pipeline_layout = pipeline_layout;
203 dispatch_info.dispatch_node.pipeline_data.vk_descriptor_set = descriptor_set;
204 dispatch_info.dispatch_node.group_count_x = 2;
205 dispatch_info.dispatch_node.group_count_y = 2;
206 dispatch_info.dispatch_node.group_count_z = 2;
207 render_graph.add_node(dispatch_info);
208 }
209 render_graph.submit_buffer_for_read(buffer);
210 EXPECT_EQ(6, log.size());
211 EXPECT_EQ("bind_pipeline(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, pipeline=0x2)",
212 log[0]);
213 EXPECT_EQ(
214 "bind_descriptor_sets(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, layout=0x4, "
215 "p_descriptor_sets=0x5)",
216 log[1]);
217 EXPECT_EQ("dispatch(group_count_x=1, group_count_y=1, group_count_z=1)", log[2]);
218 EXPECT_EQ(
219 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, "
220 "dst_stage_mask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT" +
221 endl() +
222 " - buffer_barrier(src_access_mask=VK_ACCESS_SHADER_WRITE_BIT, "
223 "dst_access_mask=VK_ACCESS_SHADER_WRITE_BIT, buffer=0x1, offset=0, "
224 "size=18446744073709551615)" +
225 endl() + ")",
226 log[3]);
227 EXPECT_EQ("bind_pipeline(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, pipeline=0x3)",
228 log[4]);
229 EXPECT_EQ("dispatch(group_count_x=2, group_count_y=2, group_count_z=2)", log[5]);
230}
231
236TEST(vk_render_graph, dispatch_dispatch_read_back_with_changing_pipelines_descriptor_sets)
237{
238 VkHandle<VkBuffer> buffer(1u);
239 VkHandle<VkPipeline> pipeline_a(2u);
240 VkHandle<VkPipeline> pipeline_b(3u);
241 VkHandle<VkPipelineLayout> pipeline_layout(4u);
242 VkHandle<VkDescriptorSet> descriptor_set_a(5u);
243 VkHandle<VkDescriptorSet> descriptor_set_b(6u);
244
246 VKResourceStateTracker resources;
247 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
248 resources.add_buffer(buffer);
249
250 {
251 VKResourceAccessInfo access_info = {};
252 access_info.buffers.append({buffer, VK_ACCESS_SHADER_WRITE_BIT});
253 VKDispatchNode::CreateInfo dispatch_info(access_info);
254 dispatch_info.dispatch_node.pipeline_data.vk_pipeline = pipeline_a;
255 dispatch_info.dispatch_node.pipeline_data.vk_pipeline_layout = pipeline_layout;
256 dispatch_info.dispatch_node.pipeline_data.vk_descriptor_set = descriptor_set_a;
257 dispatch_info.dispatch_node.group_count_x = 1;
258 dispatch_info.dispatch_node.group_count_y = 1;
259 dispatch_info.dispatch_node.group_count_z = 1;
260 render_graph.add_node(dispatch_info);
261 }
262 {
263 VKResourceAccessInfo access_info = {};
264 access_info.buffers.append({buffer, VK_ACCESS_SHADER_WRITE_BIT});
265 VKDispatchNode::CreateInfo dispatch_info(access_info);
266 dispatch_info.dispatch_node.pipeline_data.vk_pipeline = pipeline_b;
267 dispatch_info.dispatch_node.pipeline_data.vk_pipeline_layout = pipeline_layout;
268 dispatch_info.dispatch_node.pipeline_data.vk_descriptor_set = descriptor_set_b;
269 dispatch_info.dispatch_node.group_count_x = 2;
270 dispatch_info.dispatch_node.group_count_y = 2;
271 dispatch_info.dispatch_node.group_count_z = 2;
272 render_graph.add_node(dispatch_info);
273 }
274 render_graph.submit_buffer_for_read(buffer);
275 EXPECT_EQ(7, log.size());
276 EXPECT_EQ("bind_pipeline(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, pipeline=0x2)",
277 log[0]);
278 EXPECT_EQ(
279 "bind_descriptor_sets(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, layout=0x4, "
280 "p_descriptor_sets=0x5)",
281 log[1]);
282 EXPECT_EQ("dispatch(group_count_x=1, group_count_y=1, group_count_z=1)", log[2]);
283 EXPECT_EQ(
284 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, "
285 "dst_stage_mask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT" +
286 endl() +
287 " - buffer_barrier(src_access_mask=VK_ACCESS_SHADER_WRITE_BIT, "
288 "dst_access_mask=VK_ACCESS_SHADER_WRITE_BIT, buffer=0x1, offset=0, "
289 "size=18446744073709551615)" +
290 endl() + ")",
291 log[3]);
292 EXPECT_EQ("bind_pipeline(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, pipeline=0x3)",
293 log[4]);
294 EXPECT_EQ(
295 "bind_descriptor_sets(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, layout=0x4, "
296 "p_descriptor_sets=0x6)",
297 log[5]);
298 EXPECT_EQ("dispatch(group_count_x=2, group_count_y=2, group_count_z=2)", log[6]);
299}
300
304TEST(vk_render_graph, dispatch_indirect_read_back)
305{
306 VkHandle<VkBuffer> buffer(1u);
307 VkHandle<VkBuffer> command_buffer(2u);
308 VkHandle<VkPipeline> pipeline(3u);
309 VkHandle<VkPipelineLayout> pipeline_layout(4u);
310 VkHandle<VkDescriptorSet> descriptor_set(5u);
311
313 VKResourceStateTracker resources;
314 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
315 resources.add_buffer(buffer);
316 resources.add_buffer(command_buffer);
317
318 VKResourceAccessInfo access_info = {};
319 access_info.buffers.append({buffer, VK_ACCESS_SHADER_WRITE_BIT});
320 VKDispatchIndirectNode::CreateInfo dispatch_indirect_info(access_info);
321 dispatch_indirect_info.dispatch_indirect_node.pipeline_data.vk_pipeline = pipeline;
322 dispatch_indirect_info.dispatch_indirect_node.pipeline_data.vk_pipeline_layout = pipeline_layout;
323 dispatch_indirect_info.dispatch_indirect_node.pipeline_data.vk_descriptor_set = descriptor_set;
324 dispatch_indirect_info.dispatch_indirect_node.buffer = command_buffer;
325 dispatch_indirect_info.dispatch_indirect_node.offset = 0;
326 render_graph.add_node(dispatch_indirect_info);
327 render_graph.submit_buffer_for_read(buffer);
328 EXPECT_EQ(4, log.size());
329 EXPECT_EQ(
330 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
331 "dst_stage_mask=VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT" +
332 endl() +
333 " - buffer_barrier(src_access_mask=, "
334 "dst_access_mask=VK_ACCESS_INDIRECT_COMMAND_READ_BIT, buffer=0x2, offset=0, "
335 "size=18446744073709551615)" +
336 endl() + ")",
337 log[0]);
338 EXPECT_EQ("bind_pipeline(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, pipeline=0x3)",
339 log[1]);
340 EXPECT_EQ(
341 "bind_descriptor_sets(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, layout=0x4, "
342 "p_descriptor_sets=0x5)",
343 log[2]);
344 EXPECT_EQ("dispatch_indirect(buffer=0x2, offset=0)", log[3]);
345}
346
347TEST(vk_render_graph, dispatch_indirect_dispatch_indirect_read_back)
348{
349 VkHandle<VkBuffer> buffer(1u);
350 VkHandle<VkBuffer> command_buffer(2u);
351 VkHandle<VkPipeline> pipeline(3u);
352 VkHandle<VkPipelineLayout> pipeline_layout(4u);
353 VkHandle<VkDescriptorSet> descriptor_set(5u);
354
356 VKResourceStateTracker resources;
357 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
358 resources.add_buffer(buffer);
359 resources.add_buffer(command_buffer);
360
361 {
362 VKResourceAccessInfo access_info = {};
363 access_info.buffers.append({buffer, VK_ACCESS_SHADER_WRITE_BIT});
364 VKDispatchIndirectNode::CreateInfo dispatch_indirect_info(access_info);
365 dispatch_indirect_info.dispatch_indirect_node.pipeline_data.vk_pipeline = pipeline;
367 pipeline_layout;
368 dispatch_indirect_info.dispatch_indirect_node.pipeline_data.vk_descriptor_set = descriptor_set;
369 dispatch_indirect_info.dispatch_indirect_node.buffer = command_buffer;
370 dispatch_indirect_info.dispatch_indirect_node.offset = 0;
371 render_graph.add_node(dispatch_indirect_info);
372 }
373 {
374 VKResourceAccessInfo access_info = {};
375 access_info.buffers.append({buffer, VK_ACCESS_SHADER_WRITE_BIT});
376 VKDispatchIndirectNode::CreateInfo dispatch_indirect_info(access_info);
377 dispatch_indirect_info.dispatch_indirect_node.pipeline_data.vk_pipeline = pipeline;
379 pipeline_layout;
380 dispatch_indirect_info.dispatch_indirect_node.pipeline_data.vk_descriptor_set = descriptor_set;
381 dispatch_indirect_info.dispatch_indirect_node.buffer = command_buffer;
382 dispatch_indirect_info.dispatch_indirect_node.offset = 12;
383 render_graph.add_node(dispatch_indirect_info);
384 }
385 render_graph.submit_buffer_for_read(buffer);
386 EXPECT_EQ(6, log.size());
387
388 EXPECT_EQ(
389 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
390 "dst_stage_mask=VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT" +
391 endl() +
392 " - buffer_barrier(src_access_mask=, "
393 "dst_access_mask=VK_ACCESS_INDIRECT_COMMAND_READ_BIT, buffer=0x2, offset=0, "
394 "size=18446744073709551615)" +
395 endl() + ")",
396 log[0]);
397 EXPECT_EQ("bind_pipeline(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, pipeline=0x3)",
398 log[1]);
399 EXPECT_EQ(
400 "bind_descriptor_sets(pipeline_bind_point=VK_PIPELINE_BIND_POINT_COMPUTE, layout=0x4, "
401 "p_descriptor_sets=0x5)",
402 log[2]);
403 EXPECT_EQ("dispatch_indirect(buffer=0x2, offset=0)", log[3]);
404 EXPECT_EQ(
405 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, "
406 "VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, "
407 "dst_stage_mask=VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT" +
408 endl() +
409 " - buffer_barrier(src_access_mask=VK_ACCESS_SHADER_WRITE_BIT, "
410 "dst_access_mask=VK_ACCESS_SHADER_WRITE_BIT, buffer=0x1, offset=0, "
411 "size=18446744073709551615)" +
412 endl() + ")",
413 log[4]);
414 EXPECT_EQ("dispatch_indirect(buffer=0x2, offset=12)", log[5]);
415}
416} // 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_buffer(VkBuffer vk_buffer, const char *name=nullptr)
ccl_device_inline float3 log(float3 v)
TEST(vk_render_graph, dispatch_read_back)