Blender V4.3
vk_render_graph_test_render.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, begin_clear_attachments_end_read_back)
12{
14 VkHandle<VkImageView> image_view(2u);
15 VkHandle<VkBuffer> buffer(3u);
16
18 VKResourceStateTracker resources;
19 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
20 resources.add_image(image, 1, VK_IMAGE_LAYOUT_UNDEFINED, ResourceOwner::APPLICATION);
21 resources.add_buffer(buffer);
22
23 {
24 VKResourceAccessInfo access_info = {};
25 access_info.images.append(
26 {image, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 0});
27 VKBeginRenderingNode::CreateInfo begin_rendering(access_info);
28 begin_rendering.node_data.color_attachments[0].sType =
29 VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
30 begin_rendering.node_data.color_attachments[0].imageLayout =
31 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
32 begin_rendering.node_data.color_attachments[0].imageView = image_view;
33 begin_rendering.node_data.color_attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
34 begin_rendering.node_data.color_attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
35 begin_rendering.node_data.vk_rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO;
36 begin_rendering.node_data.vk_rendering_info.colorAttachmentCount = 1;
37 begin_rendering.node_data.vk_rendering_info.layerCount = 1;
38 begin_rendering.node_data.vk_rendering_info.pColorAttachments =
39 begin_rendering.node_data.color_attachments;
40
41 render_graph.add_node(begin_rendering);
42 }
43
44 {
45 VKClearAttachmentsNode::CreateInfo clear_attachments = {};
46 clear_attachments.attachment_count = 1;
47 clear_attachments.attachments[0].aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
48 clear_attachments.attachments[0].clearValue.color.float32[0] = 0.2;
49 clear_attachments.attachments[0].clearValue.color.float32[1] = 0.4;
50 clear_attachments.attachments[0].clearValue.color.float32[2] = 0.6;
51 clear_attachments.attachments[0].clearValue.color.float32[3] = 1.0;
52 clear_attachments.attachments[0].colorAttachment = 0;
53 clear_attachments.vk_clear_rect.baseArrayLayer = 0;
54 clear_attachments.vk_clear_rect.layerCount = 1;
55 clear_attachments.vk_clear_rect.rect.extent.width = 1920;
56 clear_attachments.vk_clear_rect.rect.extent.height = 1080;
57 render_graph.add_node(clear_attachments);
58 }
59
60 {
61 VKEndRenderingNode::CreateInfo end_rendering = {};
62 render_graph.add_node(end_rendering);
63 }
64
65 {
66 VKCopyImageToBufferNode::CreateInfo copy_image_to_buffer = {};
67 copy_image_to_buffer.src_image = image;
68 copy_image_to_buffer.dst_buffer = buffer;
69 copy_image_to_buffer.region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
70 render_graph.add_node(copy_image_to_buffer);
71 }
72
73 render_graph.submit_buffer_for_read(buffer);
74 EXPECT_EQ(6, log.size());
76 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
77 "dst_stage_mask=VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT" +
78 endl() +
79 " - image_barrier(src_access_mask=, "
80 "dst_access_mask=VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, "
81 "old_layout=VK_IMAGE_LAYOUT_UNDEFINED, "
82 "new_layout=VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, image=0x1, "
83 "subresource_range=" +
84 endl() +
85 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
86 "base_array_layer=0, layer_count=4294967295 )" +
87 endl() + ")",
88 log[0]);
89 EXPECT_EQ("begin_rendering(p_rendering_info=flags=, render_area=" + endl() +
90 " offset=" + endl() + " x=0, y=0 , extent=" + endl() +
91 " width=0, height=0 , layer_count=1, view_mask=0, color_attachment_count=1, "
92 "p_color_attachments=" +
93 endl() +
94 " image_view=0x2, image_layout=VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, "
95 "resolve_mode=VK_RESOLVE_MODE_NONE, resolve_image_view=0, "
96 "resolve_image_layout=VK_IMAGE_LAYOUT_UNDEFINED, "
97 "load_op=VK_ATTACHMENT_LOAD_OP_DONT_CARE, store_op=VK_ATTACHMENT_STORE_OP_STORE" +
98 endl() + ")",
99 log[1]);
100 EXPECT_EQ(
101 "clear_attachments( - attachment(aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, "
102 "color_attachment=0)" +
103 endl() + " - rect(rect=" + endl() + " offset=" + endl() +
104 " x=0, y=0 , extent=" + endl() +
105 " width=1920, height=1080 , base_array_layer=0, layer_count=1)" + endl() + ")",
106 log[2]);
107 EXPECT_EQ("end_rendering()", log[3]);
108 EXPECT_EQ(
109 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, "
110 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
111 endl() +
112 " - image_barrier(src_access_mask=VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, "
113 "dst_access_mask=VK_ACCESS_TRANSFER_READ_BIT, "
114 "old_layout=VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, "
115 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image=0x1, subresource_range=" +
116 endl() +
117 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
118 "base_array_layer=0, layer_count=4294967295 )" +
119 endl() + ")",
120 log[4]);
121 EXPECT_EQ(
122 "copy_image_to_buffer(src_image=0x1, src_image_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "
123 "dst_buffer=0x3" +
124 endl() +
125 " - region(buffer_offset=0, buffer_row_length=0, buffer_image_height=0, "
126 "image_subresource=" +
127 endl() +
128 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, mip_level=0, base_array_layer=0, "
129 "layer_count=0 , image_offset=" +
130 endl() + " x=0, y=0, z=0 , image_extent=" + endl() +
131 " width=0, height=0, depth=0 )" + endl() + ")",
132 log[5]);
133}
134
135TEST(vk_render_graph, begin_draw_end)
136{
138 VkHandle<VkImageView> image_view(2u);
139 VkHandle<VkPipelineLayout> pipeline_layout(4u);
140 VkHandle<VkPipeline> pipeline(3u);
141
143 VKResourceStateTracker resources;
144 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
145 resources.add_image(image, 1, VK_IMAGE_LAYOUT_UNDEFINED, ResourceOwner::APPLICATION);
146
147 {
148 VKResourceAccessInfo access_info = {};
149 access_info.images.append(
150 {image, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 0});
151 VKBeginRenderingNode::CreateInfo begin_rendering(access_info);
152 begin_rendering.node_data.color_attachments[0].sType =
153 VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
154 begin_rendering.node_data.color_attachments[0].imageLayout =
155 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
156 begin_rendering.node_data.color_attachments[0].imageView = image_view;
157 begin_rendering.node_data.color_attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
158 begin_rendering.node_data.color_attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
159 begin_rendering.node_data.vk_rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO;
160 begin_rendering.node_data.vk_rendering_info.colorAttachmentCount = 1;
161 begin_rendering.node_data.vk_rendering_info.layerCount = 1;
162 begin_rendering.node_data.vk_rendering_info.pColorAttachments =
163 begin_rendering.node_data.color_attachments;
164
165 render_graph.add_node(begin_rendering);
166 }
167
168 {
169 VKResourceAccessInfo access_info = {};
170 VKDrawNode::CreateInfo draw(access_info);
171 draw.node_data.first_instance = 0;
172 draw.node_data.first_vertex = 0;
173 draw.node_data.instance_count = 1;
174 draw.node_data.vertex_count = 4;
177 draw.node_data.pipeline_data.vk_descriptor_set = VK_NULL_HANDLE;
178 draw.node_data.pipeline_data.vk_pipeline = pipeline;
179 draw.node_data.pipeline_data.vk_pipeline_layout = pipeline_layout;
180 render_graph.add_node(draw);
181 }
182
183 {
184 VKEndRenderingNode::CreateInfo end_rendering = {};
185 render_graph.add_node(end_rendering);
186 }
187
188 render_graph.submit();
189 EXPECT_EQ(5, log.size());
190 EXPECT_EQ(
191 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
192 "dst_stage_mask=VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT" +
193 endl() +
194 " - image_barrier(src_access_mask=, "
195 "dst_access_mask=VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, "
196 "old_layout=VK_IMAGE_LAYOUT_UNDEFINED, "
197 "new_layout=VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, image=0x1, subresource_range=" +
198 endl() +
199 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, "
200 "level_count=4294967295, base_array_layer=0, layer_count=4294967295 )" +
201 endl() + ")",
202 log[0]);
203 EXPECT_EQ("begin_rendering(p_rendering_info=flags=, render_area=" + endl() +
204 " offset=" + endl() + " x=0, y=0 , extent=" + endl() +
205 " width=0, height=0 , layer_count=1, view_mask=0, "
206 "color_attachment_count=1, p_color_attachments=" +
207 endl() +
208 " image_view=0x2, image_layout=VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, "
209 "resolve_mode=VK_RESOLVE_MODE_NONE, resolve_image_view=0, "
210 "resolve_image_layout=VK_IMAGE_LAYOUT_UNDEFINED, "
211 "load_op=VK_ATTACHMENT_LOAD_OP_DONT_CARE, store_op=VK_ATTACHMENT_STORE_OP_STORE" +
212 endl() + ")",
213 log[1]);
214 EXPECT_EQ("bind_pipeline(pipeline_bind_point=VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline=0x3)",
215 log[2]);
216 EXPECT_EQ("draw(vertex_count=4, instance_count=1, first_vertex=0, first_instance=0)", log[3]);
217 EXPECT_EQ("end_rendering()", log[4]);
218}
219
220TEST(vk_render_graph, begin_draw_end__layered)
221{
223 VkHandle<VkImageView> image_view(2u);
224 VkHandle<VkPipelineLayout> pipeline_layout(4u);
225 VkHandle<VkPipeline> pipeline(3u);
226
228 VKResourceStateTracker resources;
229 VKRenderGraph render_graph(std::make_unique<CommandBufferLog>(log), resources);
230 resources.add_image(image, 2, VK_IMAGE_LAYOUT_UNDEFINED, ResourceOwner::APPLICATION);
231
232 {
233 VKResourceAccessInfo access_info = {};
234 access_info.images.append(
235 {image, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 0});
236 VKBeginRenderingNode::CreateInfo begin_rendering(access_info);
237 begin_rendering.node_data.color_attachments[0].sType =
238 VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
239 begin_rendering.node_data.color_attachments[0].imageLayout =
240 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
241 begin_rendering.node_data.color_attachments[0].imageView = image_view;
242 begin_rendering.node_data.color_attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
243 begin_rendering.node_data.color_attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
244 begin_rendering.node_data.vk_rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO;
245 begin_rendering.node_data.vk_rendering_info.colorAttachmentCount = 1;
246 begin_rendering.node_data.vk_rendering_info.layerCount = 1;
247 begin_rendering.node_data.vk_rendering_info.pColorAttachments =
248 begin_rendering.node_data.color_attachments;
249
250 render_graph.add_node(begin_rendering);
251 }
252
253 {
254 VKResourceAccessInfo access_info = {};
255 access_info.images.append({image, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 1});
256 VKDrawNode::CreateInfo draw(access_info);
257 draw.node_data.first_instance = 0;
258 draw.node_data.first_vertex = 0;
259 draw.node_data.instance_count = 1;
260 draw.node_data.vertex_count = 4;
263 draw.node_data.pipeline_data.vk_descriptor_set = VK_NULL_HANDLE;
264 draw.node_data.pipeline_data.vk_pipeline = pipeline;
265 draw.node_data.pipeline_data.vk_pipeline_layout = pipeline_layout;
266 render_graph.add_node(draw);
267 }
268
269 {
270 VKEndRenderingNode::CreateInfo end_rendering = {};
271 render_graph.add_node(end_rendering);
272 }
273
274 render_graph.submit();
275 EXPECT_EQ(7, log.size());
276 EXPECT_EQ(
277 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
278 "dst_stage_mask=VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT" +
279 endl() +
280 " - image_barrier(src_access_mask=, "
281 "dst_access_mask=VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, "
282 "old_layout=VK_IMAGE_LAYOUT_UNDEFINED, "
283 "new_layout=VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, image=0x1, subresource_range=" +
284 endl() +
285 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, "
286 "level_count=4294967295, base_array_layer=0, layer_count=4294967295 )" +
287 endl() + ")",
288 log[0]);
289 EXPECT_EQ(
290 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, "
291 "dst_stage_mask=VK_PIPELINE_STAGE_ALL_COMMANDS_BIT" +
292 endl() +
293 " - image_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
294 "dst_access_mask=VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_SHADER_WRITE_BIT, "
295 "VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, "
296 "VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, "
297 "old_layout=VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, "
298 "new_layout=VK_IMAGE_LAYOUT_GENERAL, "
299 "image=0x1, subresource_range=" +
300 endl() +
301 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
302 "base_array_layer=1, layer_count=0 )" +
303 endl() + ")",
304 log[1]);
305 EXPECT_EQ("begin_rendering(p_rendering_info=flags=, render_area=" + endl() +
306 " offset=" + endl() + " x=0, y=0 , extent=" + endl() +
307 " width=0, height=0 , layer_count=1, view_mask=0, "
308 "color_attachment_count=1, p_color_attachments=" +
309 endl() +
310 " image_view=0x2, image_layout=VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, "
311 "resolve_mode=VK_RESOLVE_MODE_NONE, resolve_image_view=0, "
312 "resolve_image_layout=VK_IMAGE_LAYOUT_UNDEFINED, "
313 "load_op=VK_ATTACHMENT_LOAD_OP_DONT_CARE, store_op=VK_ATTACHMENT_STORE_OP_STORE" +
314 endl() + ")",
315 log[2]);
316 EXPECT_EQ("bind_pipeline(pipeline_bind_point=VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline=0x3)",
317 log[3]);
318 EXPECT_EQ("draw(vertex_count=4, instance_count=1, first_vertex=0, first_instance=0)", log[4]);
319 EXPECT_EQ("end_rendering()", log[5]);
320 EXPECT_EQ(
321 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, "
322 "dst_stage_mask=VK_PIPELINE_STAGE_ALL_COMMANDS_BIT" +
323 endl() +
324 " - image_barrier(src_access_mask=VK_ACCESS_SHADER_READ_BIT, "
325 "VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, "
326 "VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, "
327 "VK_ACCESS_TRANSFER_WRITE_BIT, dst_access_mask=VK_ACCESS_SHADER_READ_BIT, "
328 "VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, "
329 "VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, "
330 "VK_ACCESS_TRANSFER_WRITE_BIT, old_layout=VK_IMAGE_LAYOUT_GENERAL, "
331 "new_layout=VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, image=0x1, subresource_range=" +
332 endl() +
333 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
334 "base_array_layer=1, layer_count=0 )" +
335 endl() + ")",
336 log[6]);
337}
338
339} // 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_image(VkImage vk_image, uint32_t layer_count, VkImageLayout vk_image_layout, ResourceOwner owner, const char *name=nullptr)
void add_buffer(VkBuffer vk_buffer, const char *name=nullptr)
input_tx image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "preview_img") .compute_source("compositor_compute_preview.glsl") .do_static_compilation(true)
ccl_device_inline float3 log(float3 v)
TEST(vk_render_graph, dispatch_read_back)