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