Blender V5.0
vk_render_graph_test_types.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
7#include <locale>
8#include <sstream>
9
11#include "vk_common.hh"
12#include "vk_to_string.hh"
13
15
16BLI_INLINE std::string &endl()
17{
18 static std::string endl;
19 if (endl.empty()) {
20 std::stringstream ss;
21 ss << std::endl;
22 endl = ss.str();
23 }
24 return endl;
25}
26
29 bool is_recording_ = false;
30
31 public:
32 CommandBufferLog(Vector<std::string> &log, bool use_dynamic_rendering_local_read_ = true)
33 : log_(log)
34 {
35 use_dynamic_rendering_local_read = use_dynamic_rendering_local_read_;
36 }
37 virtual ~CommandBufferLog() {}
38
39 void begin_recording() override
40 {
41 EXPECT_FALSE(is_recording_);
42 is_recording_ = true;
43 }
44
45 void end_recording() override
46 {
47 EXPECT_TRUE(is_recording_);
48 is_recording_ = false;
49 }
50
51 void bind_pipeline(VkPipelineBindPoint pipeline_bind_point, VkPipeline pipeline) override
52 {
53 EXPECT_TRUE(is_recording_);
54 std::stringstream ss;
55 ss << "bind_pipeline(";
56 ss << "pipeline_bind_point=" << to_string(pipeline_bind_point);
57 ss << ", pipeline=" << to_string(pipeline);
58 ss << ")";
59 log_.append(ss.str());
60 }
61
62 void bind_descriptor_sets(VkPipelineBindPoint pipeline_bind_point,
63 VkPipelineLayout layout,
64 uint32_t first_set,
65 uint32_t descriptor_set_count,
66 const VkDescriptorSet *p_descriptor_sets,
67 uint32_t dynamic_offset_count,
68 const uint32_t *p_dynamic_offsets) override
69 {
70 UNUSED_VARS(pipeline_bind_point,
71 layout,
72 first_set,
73 descriptor_set_count,
74 p_descriptor_sets,
75 dynamic_offset_count,
76 p_dynamic_offsets);
77 EXPECT_TRUE(is_recording_);
78 std::stringstream ss;
79 ss << "bind_descriptor_sets(";
80 ss << "pipeline_bind_point=" << to_string(pipeline_bind_point);
81 ss << ", layout=" << to_string(layout);
82 ss << ", p_descriptor_sets=" << to_string(p_descriptor_sets[0]);
83 ss << ")";
84 log_.append(ss.str());
85 }
86
87 void bind_index_buffer(VkBuffer buffer, VkDeviceSize offset, VkIndexType index_type) override
88 {
89 UNUSED_VARS(buffer, offset, index_type);
90 EXPECT_TRUE(is_recording_);
91 GTEST_FAIL() << __func__ << " not implemented!";
92 }
93
94 void bind_vertex_buffers(uint32_t first_binding,
95 uint32_t binding_count,
96 const VkBuffer *p_buffers,
97 const VkDeviceSize *p_offsets) override
98 {
99 UNUSED_VARS(first_binding, binding_count, p_buffers, p_offsets);
100 EXPECT_TRUE(is_recording_);
101 GTEST_FAIL() << __func__ << " not implemented!";
102 }
103
104 void draw(uint32_t vertex_count,
105 uint32_t instance_count,
106 uint32_t first_vertex,
107 uint32_t first_instance) override
108 {
109 EXPECT_TRUE(is_recording_);
110 std::stringstream ss;
111 ss << "draw(";
112 ss << "vertex_count=" << vertex_count;
113 ss << ", instance_count=" << instance_count;
114 ss << ", first_vertex=" << first_vertex;
115 ss << ", first_instance=" << first_instance;
116 ss << ")";
117 log_.append(ss.str());
118 }
119
120 void draw_indexed(uint32_t index_count,
121 uint32_t instance_count,
122 uint32_t first_index,
123 int32_t vertex_offset,
124 uint32_t first_instance) override
125 {
126 EXPECT_TRUE(is_recording_);
127 std::stringstream ss;
128 ss << "draw_indexed(";
129 ss << "index_count=" << index_count;
130 ss << ", instance_count=" << instance_count;
131 ss << ", first_index=" << first_index;
132 ss << ", vertex_offset=" << vertex_offset;
133 ss << ", first_instance=" << first_instance;
134 ss << ")";
135 log_.append(ss.str());
136 }
137
138 void draw_indirect(VkBuffer buffer,
139 VkDeviceSize offset,
140 uint32_t draw_count,
141 uint32_t stride) override
142 {
143 UNUSED_VARS(buffer, offset, draw_count, stride);
144 EXPECT_TRUE(is_recording_);
145 GTEST_FAIL() << __func__ << " not implemented!";
146 }
147
148 void draw_indexed_indirect(VkBuffer buffer,
149 VkDeviceSize offset,
150 uint32_t draw_count,
151 uint32_t stride) override
152 {
153 UNUSED_VARS(buffer, offset, draw_count, stride);
154 EXPECT_TRUE(is_recording_);
155 GTEST_FAIL() << __func__ << " not implemented!";
156 }
157
158 void dispatch(uint32_t group_count_x, uint32_t group_count_y, uint32_t group_count_z) override
159 {
160 UNUSED_VARS(group_count_x, group_count_y, group_count_z);
161 EXPECT_TRUE(is_recording_);
162 std::stringstream ss;
163 ss << "dispatch(";
164 ss << "group_count_x=" << group_count_x;
165 ss << ", group_count_y=" << group_count_y;
166 ss << ", group_count_z=" << group_count_z;
167 ss << ")";
168 log_.append(ss.str());
169 }
170
171 void dispatch_indirect(VkBuffer buffer, VkDeviceSize offset) override
172 {
173 EXPECT_TRUE(is_recording_);
174 std::stringstream ss;
175 ss << "dispatch_indirect(";
176 ss << "buffer=" << to_string(buffer);
177 ss << ", offset=" << offset;
178 ss << ")";
179 log_.append(ss.str());
180 }
181
182 void update_buffer(VkBuffer dst_buffer,
183 VkDeviceSize dst_offset,
184 VkDeviceSize data_size,
185 const void * /*p_data*/) override
186 {
187 EXPECT_TRUE(is_recording_);
188 std::stringstream ss;
189 ss << "update_buffer(";
190 ss << "dst_buffer=" << to_string(dst_buffer);
191 ss << ", dst_offset=" << dst_offset;
192 ss << ", data_size=" << data_size;
193 ss << ")";
194 log_.append(ss.str());
195 }
196 void copy_buffer(VkBuffer src_buffer,
197 VkBuffer dst_buffer,
198 uint32_t region_count,
199 const VkBufferCopy *p_regions) override
200 {
201 EXPECT_TRUE(is_recording_);
202 std::stringstream ss;
203 ss << "copy_buffer(";
204 ss << "src_buffer=" << to_string(src_buffer);
205 ss << ", dst_buffer=" << to_string(dst_buffer);
206 ss << std::endl;
207 for (const VkBufferCopy &region : Span<const VkBufferCopy>(p_regions, region_count)) {
208 ss << " - region(" << to_string(region, 1) << ")" << std::endl;
209 }
210 ss << ")";
211 log_.append(ss.str());
212 }
213
214 void copy_image(VkImage src_image,
215 VkImageLayout src_image_layout,
216 VkImage dst_image,
217 VkImageLayout dst_image_layout,
218 uint32_t region_count,
219 const VkImageCopy *p_regions) override
220 {
221 EXPECT_TRUE(is_recording_);
222 std::stringstream ss;
223 ss << "copy_image(";
224 ss << "src_image=" << to_string(src_image);
225 ss << ", src_image_layout=" << to_string(src_image_layout);
226 ss << ", dst_image=" << to_string(dst_image);
227 ss << ", dst_image_layout=" << to_string(dst_image_layout);
228 ss << std::endl;
229 for (const VkImageCopy &region : Span<const VkImageCopy>(p_regions, region_count)) {
230 ss << " - region(" << to_string(region, 1) << ")" << std::endl;
231 }
232 ss << ")";
233 log_.append(ss.str());
234 }
235
236 void blit_image(VkImage src_image,
237 VkImageLayout src_image_layout,
238 VkImage dst_image,
239 VkImageLayout dst_image_layout,
240 uint32_t region_count,
241 const VkImageBlit *p_regions,
242 VkFilter filter) override
243 {
244 EXPECT_TRUE(is_recording_);
245 std::stringstream ss;
246 ss << "blit_image(";
247 ss << "src_image=" << to_string(src_image);
248 ss << ", src_image_layout=" << to_string(src_image_layout);
249 ss << ", dst_image=" << to_string(dst_image);
250 ss << ", dst_image_layout=" << to_string(dst_image_layout);
251 ss << ", filter=" << to_string(filter);
252 ss << std::endl;
253 for (const VkImageBlit &region : Span<const VkImageBlit>(p_regions, region_count)) {
254 ss << " - region(" << to_string(region, 1) << ")" << std::endl;
255 }
256 ss << ")";
257 log_.append(ss.str());
258 }
259
260 void copy_buffer_to_image(VkBuffer src_buffer,
261 VkImage dst_image,
262 VkImageLayout dst_image_layout,
263 uint32_t region_count,
264 const VkBufferImageCopy *p_regions) override
265 {
266 EXPECT_TRUE(is_recording_);
267 std::stringstream ss;
268 ss << "copy_buffer_to_image(";
269 ss << "src_buffer=" << to_string(src_buffer);
270 ss << ", dst_image=" << to_string(dst_image);
271 ss << ", src_image_layout=" << to_string(dst_image_layout);
272 ss << std::endl;
273 for (const VkBufferImageCopy &region : Span<const VkBufferImageCopy>(p_regions, region_count))
274 {
275 ss << " - region(" << to_string(region, 1) << ")" << std::endl;
276 }
277 ss << ")";
278 log_.append(ss.str());
279 }
280
281 void copy_image_to_buffer(VkImage src_image,
282 VkImageLayout src_image_layout,
283 VkBuffer dst_buffer,
284 uint32_t region_count,
285 const VkBufferImageCopy *p_regions) override
286 {
287 EXPECT_TRUE(is_recording_);
288 std::stringstream ss;
289 ss << "copy_image_to_buffer(";
290 ss << "src_image=" << to_string(src_image);
291 ss << ", src_image_layout=" << to_string(src_image_layout);
292 ss << ", dst_buffer=" << to_string(dst_buffer);
293 ss << std::endl;
294 for (const VkBufferImageCopy &region : Span<const VkBufferImageCopy>(p_regions, region_count))
295 {
296 ss << " - region(" << to_string(region, 1) << ")" << std::endl;
297 }
298 ss << ")";
299 log_.append(ss.str());
300 }
301
302 void fill_buffer(VkBuffer dst_buffer,
303 VkDeviceSize dst_offset,
304 VkDeviceSize size,
305 uint32_t data) override
306 {
307 EXPECT_TRUE(is_recording_);
308 std::stringstream ss;
309 ss << "fill_buffer(";
310 ss << "dst_buffer=" << to_string(dst_buffer);
311 ss << ", dst_offset=" << dst_offset;
312 ss << ", size=" << size;
313 ss << ", data=" << data;
314 ss << ")";
315 log_.append(ss.str());
316 }
317
318 void clear_color_image(VkImage image,
319 VkImageLayout image_layout,
320 const VkClearColorValue *p_color,
321 uint32_t range_count,
322 const VkImageSubresourceRange *p_ranges) override
323 {
324 UNUSED_VARS(p_color, range_count, p_ranges);
325 EXPECT_TRUE(is_recording_);
326 std::stringstream ss;
327 ss << "clear_color_image(";
328 ss << "image=" << to_string(image);
329 ss << ", image_layout=" << to_string(image_layout);
330 ss << ")";
331 log_.append(ss.str());
332 }
333
334 void clear_depth_stencil_image(VkImage image,
335 VkImageLayout image_layout,
336 const VkClearDepthStencilValue *p_depth_stencil,
337 uint32_t range_count,
338 const VkImageSubresourceRange *p_ranges) override
339 {
340 UNUSED_VARS(image, image_layout, p_depth_stencil, range_count, p_ranges);
341 EXPECT_TRUE(is_recording_);
342 GTEST_FAIL() << __func__ << " not implemented!";
343 }
344
345 void clear_attachments(uint32_t attachment_count,
346 const VkClearAttachment *p_attachments,
347 uint32_t rect_count,
348 const VkClearRect *p_rects) override
349 {
350 UNUSED_VARS(attachment_count, p_attachments, rect_count, p_rects);
351 EXPECT_TRUE(is_recording_);
352 std::stringstream ss;
353 ss << "clear_attachments(";
354 for (const VkClearAttachment &attachment :
355 Span<VkClearAttachment>(p_attachments, attachment_count))
356 {
357 ss << " - attachment(" << to_string(attachment, 1) << ")" << std::endl;
358 }
359 for (const VkClearRect &rect : Span<VkClearRect>(p_rects, rect_count)) {
360 ss << " - rect(" << to_string(rect, 1) << ")" << std::endl;
361 }
362 ss << ")";
363
364 log_.append(ss.str());
365 }
366
367 void pipeline_barrier(VkPipelineStageFlags src_stage_mask,
368 VkPipelineStageFlags dst_stage_mask,
369 VkDependencyFlags dependency_flags,
370 uint32_t memory_barrier_count,
371 const VkMemoryBarrier *p_memory_barriers,
372 uint32_t buffer_memory_barrier_count,
373 const VkBufferMemoryBarrier *p_buffer_memory_barriers,
374 uint32_t image_memory_barrier_count,
375 const VkImageMemoryBarrier *p_image_memory_barriers) override
376 {
377 UNUSED_VARS(dependency_flags, memory_barrier_count, p_memory_barriers);
378 EXPECT_TRUE(is_recording_);
379 std::stringstream ss;
380 ss << "pipeline_barrier(";
381 ss << "src_stage_mask=" << to_string_vk_pipeline_stage_flags(src_stage_mask);
382 ss << ", dst_stage_mask=" << to_string_vk_pipeline_stage_flags(dst_stage_mask);
383 ss << std::endl;
384 for (VkImageMemoryBarrier image_barrier :
385 Span<VkImageMemoryBarrier>(p_image_memory_barriers, image_memory_barrier_count))
386 {
387 ss << " - image_barrier(" << to_string(image_barrier, 1) << ")" << std::endl;
388 }
389 for (VkBufferMemoryBarrier buffer_barrier :
390 Span<VkBufferMemoryBarrier>(p_buffer_memory_barriers, buffer_memory_barrier_count))
391 {
392 ss << " - buffer_barrier(" << to_string(buffer_barrier, 1) << ")" << std::endl;
393 }
394 ss << ")";
395
396 log_.append(ss.str());
397 }
398
399 void push_constants(VkPipelineLayout layout,
400 VkShaderStageFlags stage_flags,
401 uint32_t offset,
402 uint32_t size,
403 const void *p_values) override
404 {
405 UNUSED_VARS(layout, stage_flags, offset, size, p_values);
406 EXPECT_TRUE(is_recording_);
407 GTEST_FAIL() << __func__ << " not implemented!";
408 }
409
410 void begin_rendering(const VkRenderingInfo *p_rendering_info) override
411 {
412 EXPECT_TRUE(is_recording_);
413 std::stringstream ss;
414 ss << "begin_rendering(";
415 ss << "p_rendering_info=" << to_string(*p_rendering_info);
416 ss << ")";
417 log_.append(ss.str());
418 }
419
420 void end_rendering() override
421 {
422 EXPECT_TRUE(is_recording_);
423 std::stringstream ss;
424 ss << "end_rendering()";
425 log_.append(ss.str());
426 }
427
428 void begin_query(VkQueryPool /*vk_query_pool*/,
429 uint32_t /*query_index*/,
430 VkQueryControlFlags /*vk_query_control_flags*/) override
431 {
432 }
433 void end_query(VkQueryPool /*vk_query_pool*/, uint32_t /*query_index*/) override {}
434 void reset_query_pool(VkQueryPool /*vk_query_pool*/,
435 uint32_t /*first_query*/,
436 uint32_t /*query_count*/) override
437 {
438 }
439
440 void set_viewport(const Vector<VkViewport> viewports) override
441 {
442 EXPECT_TRUE(is_recording_);
443 std::stringstream ss;
444 ss << "set_viewport(num_viewports=" << viewports.size() << ")";
445 log_.append(ss.str());
446 }
447
448 void set_scissor(const Vector<VkRect2D> scissors) override
449 {
450 EXPECT_TRUE(is_recording_);
451 std::stringstream ss;
452 ss << "set_scissor(num_scissors=" << scissors.size() << ")";
453 log_.append(ss.str());
454 }
455
456 void set_line_width(const float line_width) override
457 {
458 EXPECT_TRUE(is_recording_);
459 std::stringstream ss;
460 ss << "set_line_width(line_width=" << line_width << ")";
461 log_.append(ss.str());
462 }
463
464 void begin_debug_utils_label(const VkDebugUtilsLabelEXT * /*vk_debug_utils_label*/) override {}
465 void end_debug_utils_label() override {}
466
467 /* VK_EXT_descriptor_buffer */
469 uint32_t /*buffer_count*/,
470 const VkDescriptorBufferBindingInfoEXT * /*p_binding_infos*/) override
471 {
472 }
473 void set_descriptor_buffer_offsets(VkPipelineBindPoint /*pipeline_bind_point*/,
474 VkPipelineLayout /*layout*/,
475 uint32_t /*first_set*/,
476 uint32_t /*set_count*/,
477 const uint32_t * /*p_buffer_indices*/,
478 const VkDeviceSize * /*p_offsets*/) override
479 {
480 }
481};
482
483class VKRenderGraphTest : public ::testing::Test {
484 public:
486 {
487 resources.use_dynamic_rendering_local_read = use_dynamic_rendering_local_read;
488 render_graph = std::make_unique<VKRenderGraph>(resources);
489 command_buffer = std::make_unique<CommandBufferLog>(log, use_dynamic_rendering_local_read);
490 }
491
492 protected:
495 std::unique_ptr<VKRenderGraph> render_graph;
496 std::unique_ptr<CommandBufferLog> command_buffer;
498};
499
500class VKRenderGraphTest_P : public ::testing::TestWithParam<std::tuple<bool>> {
501 public:
503 {
504 use_dynamic_rendering_local_read = std::get<0>(GetParam());
505 resources.use_dynamic_rendering_local_read = use_dynamic_rendering_local_read;
506 render_graph = std::make_unique<VKRenderGraph>(resources);
507 command_buffer = std::make_unique<CommandBufferLog>(log, use_dynamic_rendering_local_read);
508 }
509
510 protected:
511 VkImageLayout color_attachment_layout() const
512 {
513 return use_dynamic_rendering_local_read ? VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR :
514 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
515 }
516 std::string color_attachment_layout_str() const
517 {
518 return use_dynamic_rendering_local_read ? "VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR" :
519 "VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL";
520 }
521
524 std::unique_ptr<VKRenderGraph> render_graph;
525 std::unique_ptr<CommandBufferLog> command_buffer;
527};
528
535template<typename VKObjectType> union VkHandle {
536 VKObjectType vk_handle;
538
540
541 operator VKObjectType() const
542 {
543 return vk_handle;
544 }
545};
546
547static inline void submit(std::unique_ptr<VKRenderGraph> &render_graph,
548 std::unique_ptr<CommandBufferLog> &command_buffer)
549{
550 VKScheduler scheduler;
551 VKCommandBuilder command_builder;
553 command_builder.build_nodes(*render_graph, *command_buffer, node_handles);
554
555 command_buffer->begin_recording();
556 command_builder.record_commands(*render_graph, *command_buffer, node_handles);
557 command_buffer->end_recording();
558
559 render_graph->reset();
560}
561} // namespace blender::gpu::render_graph
#define BLI_INLINE
#define UNUSED_VARS(...)
BMesh const char void * data
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
int64_t size() const
void clear_attachments(uint32_t attachment_count, const VkClearAttachment *p_attachments, uint32_t rect_count, const VkClearRect *p_rects) override
void begin_rendering(const VkRenderingInfo *p_rendering_info) override
void update_buffer(VkBuffer dst_buffer, VkDeviceSize dst_offset, VkDeviceSize data_size, const void *) override
void begin_debug_utils_label(const VkDebugUtilsLabelEXT *) override
void push_constants(VkPipelineLayout layout, VkShaderStageFlags stage_flags, uint32_t offset, uint32_t size, const void *p_values) override
void clear_depth_stencil_image(VkImage image, VkImageLayout image_layout, const VkClearDepthStencilValue *p_depth_stencil, uint32_t range_count, const VkImageSubresourceRange *p_ranges) override
void pipeline_barrier(VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask, VkDependencyFlags dependency_flags, uint32_t memory_barrier_count, const VkMemoryBarrier *p_memory_barriers, uint32_t buffer_memory_barrier_count, const VkBufferMemoryBarrier *p_buffer_memory_barriers, uint32_t image_memory_barrier_count, const VkImageMemoryBarrier *p_image_memory_barriers) override
void copy_image_to_buffer(VkImage src_image, VkImageLayout src_image_layout, VkBuffer dst_buffer, uint32_t region_count, const VkBufferImageCopy *p_regions) override
void draw(uint32_t vertex_count, uint32_t instance_count, uint32_t first_vertex, uint32_t first_instance) override
void bind_pipeline(VkPipelineBindPoint pipeline_bind_point, VkPipeline pipeline) override
void draw_indirect(VkBuffer buffer, VkDeviceSize offset, uint32_t draw_count, uint32_t stride) override
void copy_image(VkImage src_image, VkImageLayout src_image_layout, VkImage dst_image, VkImageLayout dst_image_layout, uint32_t region_count, const VkImageCopy *p_regions) override
CommandBufferLog(Vector< std::string > &log, bool use_dynamic_rendering_local_read_=true)
void bind_vertex_buffers(uint32_t first_binding, uint32_t binding_count, const VkBuffer *p_buffers, const VkDeviceSize *p_offsets) override
void reset_query_pool(VkQueryPool, uint32_t, uint32_t) override
void begin_query(VkQueryPool, uint32_t, VkQueryControlFlags) override
void dispatch_indirect(VkBuffer buffer, VkDeviceSize offset) override
void draw_indexed_indirect(VkBuffer buffer, VkDeviceSize offset, uint32_t draw_count, uint32_t stride) override
void copy_buffer_to_image(VkBuffer src_buffer, VkImage dst_image, VkImageLayout dst_image_layout, uint32_t region_count, const VkBufferImageCopy *p_regions) override
void set_scissor(const Vector< VkRect2D > scissors) override
void bind_descriptor_buffers(uint32_t, const VkDescriptorBufferBindingInfoEXT *) override
void fill_buffer(VkBuffer dst_buffer, VkDeviceSize dst_offset, VkDeviceSize size, uint32_t data) override
void draw_indexed(uint32_t index_count, uint32_t instance_count, uint32_t first_index, int32_t vertex_offset, uint32_t first_instance) override
void clear_color_image(VkImage image, VkImageLayout image_layout, const VkClearColorValue *p_color, uint32_t range_count, const VkImageSubresourceRange *p_ranges) override
void copy_buffer(VkBuffer src_buffer, VkBuffer dst_buffer, uint32_t region_count, const VkBufferCopy *p_regions) override
void dispatch(uint32_t group_count_x, uint32_t group_count_y, uint32_t group_count_z) override
void bind_index_buffer(VkBuffer buffer, VkDeviceSize offset, VkIndexType index_type) override
void set_descriptor_buffer_offsets(VkPipelineBindPoint, VkPipelineLayout, uint32_t, uint32_t, const uint32_t *, const VkDeviceSize *) override
void set_viewport(const Vector< VkViewport > viewports) override
void bind_descriptor_sets(VkPipelineBindPoint pipeline_bind_point, VkPipelineLayout layout, uint32_t first_set, uint32_t descriptor_set_count, const VkDescriptorSet *p_descriptor_sets, uint32_t dynamic_offset_count, const uint32_t *p_dynamic_offsets) override
void blit_image(VkImage src_image, VkImageLayout src_image_layout, VkImage dst_image, VkImageLayout dst_image_layout, uint32_t region_count, const VkImageBlit *p_regions, VkFilter filter) override
void set_line_width(const float line_width) override
void record_commands(VKRenderGraph &render_graph, VKCommandBufferInterface &command_buffer, Span< NodeHandle > node_handles)
void build_nodes(VKRenderGraph &render_graph, VKCommandBufferInterface &command_buffer, Span< NodeHandle > node_handles)
Span< NodeHandle > select_nodes(const VKRenderGraph &render_graph)
#define filter
#define log
static void submit(std::unique_ptr< VKRenderGraph > &render_graph, std::unique_ptr< CommandBufferLog > &command_buffer)
const char * to_string(ShaderStage stage)
Definition mtl_shader.mm:51
std::string to_string_vk_pipeline_stage_flags(const VkPipelineStageFlags vk_pipeline_stage_flags)