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