Blender V5.0
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
12
13TEST_P(VKRenderGraphTestRender, begin_clear_attachments_end_read_back)
14{
15 VkHandle<VkImage> image(1u);
16 VkHandle<VkImageView> image_view(2u);
17 VkHandle<VkBuffer> buffer(3u);
18
19 resources.add_image(image, false);
20 resources.add_buffer(buffer);
21
22 {
23 VKResourceAccessInfo access_info = {};
24 access_info.images.append(
25 {image, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_ASPECT_COLOR_BIT, {}});
26 VKBeginRenderingNode::CreateInfo begin_rendering(access_info);
27 begin_rendering.node_data.color_attachments[0].sType =
28 VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
29 begin_rendering.node_data.color_attachments[0].imageLayout = color_attachment_layout();
30 begin_rendering.node_data.color_attachments[0].imageView = image_view;
31 begin_rendering.node_data.color_attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
32 begin_rendering.node_data.color_attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
33 begin_rendering.node_data.vk_rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO;
34 begin_rendering.node_data.vk_rendering_info.colorAttachmentCount = 1;
35 begin_rendering.node_data.vk_rendering_info.layerCount = 1;
36 begin_rendering.node_data.vk_rendering_info.pColorAttachments =
37 begin_rendering.node_data.color_attachments;
38
39 render_graph->add_node(begin_rendering);
40 }
41
42 {
43 VKClearAttachmentsNode::CreateInfo clear_attachments = {};
44 clear_attachments.attachment_count = 1;
45 clear_attachments.attachments[0].aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
46 clear_attachments.attachments[0].clearValue.color.float32[0] = 0.2;
47 clear_attachments.attachments[0].clearValue.color.float32[1] = 0.4;
48 clear_attachments.attachments[0].clearValue.color.float32[2] = 0.6;
49 clear_attachments.attachments[0].clearValue.color.float32[3] = 1.0;
50 clear_attachments.attachments[0].colorAttachment = 0;
51 clear_attachments.vk_clear_rect.baseArrayLayer = 0;
52 clear_attachments.vk_clear_rect.layerCount = 1;
53 clear_attachments.vk_clear_rect.rect.extent.width = 1920;
54 clear_attachments.vk_clear_rect.rect.extent.height = 1080;
55 render_graph->add_node(clear_attachments);
56 }
57
58 {
59 VKEndRenderingNode::CreateInfo end_rendering = {};
60 render_graph->add_node(end_rendering);
61 }
62
63 {
64 VKCopyImageToBufferNode::CreateInfo copy_image_to_buffer = {};
65 copy_image_to_buffer.node_data.src_image = image;
66 copy_image_to_buffer.node_data.dst_buffer = buffer;
67 copy_image_to_buffer.node_data.region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
68 copy_image_to_buffer.vk_image_aspects = VK_IMAGE_ASPECT_COLOR_BIT;
69 render_graph->add_node(copy_image_to_buffer);
70 }
71
72 submit(render_graph, command_buffer);
73
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=" +
83 color_attachment_layout_str() +
84 ", image=0x1, "
85 "subresource_range=" +
86 endl() +
87 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
88 "base_array_layer=0, layer_count=4294967295 )" +
89 endl() + ")",
90 log[0]);
91 EXPECT_EQ("begin_rendering(p_rendering_info=flags=, render_area=" + endl() +
92 " offset=" + endl() + " x=0, y=0 , extent=" + endl() +
93 " width=0, height=0 , layer_count=1, view_mask=0, color_attachment_count=1, "
94 "p_color_attachments=" +
95 endl() + " image_view=0x2, image_layout=" + color_attachment_layout_str() +
96 ", "
97 "resolve_mode=VK_RESOLVE_MODE_NONE, resolve_image_view=0, "
98 "resolve_image_layout=VK_IMAGE_LAYOUT_UNDEFINED, "
99 "load_op=VK_ATTACHMENT_LOAD_OP_DONT_CARE, store_op=VK_ATTACHMENT_STORE_OP_STORE" +
100 endl() + ")",
101 log[1]);
102 EXPECT_EQ(
103 "clear_attachments( - attachment(aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, "
104 "color_attachment=0)" +
105 endl() + " - rect(rect=" + endl() + " offset=" + endl() +
106 " x=0, y=0 , extent=" + endl() +
107 " width=1920, height=1080 , base_array_layer=0, layer_count=1)" + endl() + ")",
108 log[2]);
109 EXPECT_EQ("end_rendering()", log[3]);
110 EXPECT_EQ(
111 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, "
112 "dst_stage_mask=VK_PIPELINE_STAGE_TRANSFER_BIT" +
113 endl() +
114 " - image_barrier(src_access_mask=VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, "
115 "dst_access_mask=VK_ACCESS_TRANSFER_READ_BIT, "
116 "old_layout=" +
117 color_attachment_layout_str() +
118 ", "
119 "new_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image=0x1, subresource_range=" +
120 endl() +
121 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
122 "base_array_layer=0, layer_count=4294967295 )" +
123 endl() + ")",
124 log[4]);
125 EXPECT_EQ(
126 "copy_image_to_buffer(src_image=0x1, src_image_layout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "
127 "dst_buffer=0x3" +
128 endl() +
129 " - region(buffer_offset=0, buffer_row_length=0, buffer_image_height=0, "
130 "image_subresource=" +
131 endl() +
132 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, mip_level=0, base_array_layer=0, "
133 "layer_count=0 , image_offset=" +
134 endl() + " x=0, y=0, z=0 , image_extent=" + endl() +
135 " width=0, height=0, depth=0 )" + endl() + ")",
136 log[5]);
137}
138
140{
141 VkHandle<VkImage> image(1u);
142 VkHandle<VkImageView> image_view(2u);
143 VkHandle<VkPipelineLayout> pipeline_layout(4u);
144 VkHandle<VkPipeline> pipeline(3u);
145
146 resources.add_image(image, false);
147
148 {
149 VKResourceAccessInfo access_info = {};
150 access_info.images.append(
151 {image, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_ASPECT_COLOR_BIT, {}});
152 VKBeginRenderingNode::CreateInfo begin_rendering(access_info);
153 begin_rendering.node_data.color_attachments[0].sType =
154 VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
155 begin_rendering.node_data.color_attachments[0].imageLayout = color_attachment_layout();
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;
175 draw.node_data.graphics.pipeline_data.push_constants_data = nullptr;
176 draw.node_data.graphics.pipeline_data.push_constants_size = 0;
177 draw.node_data.graphics.pipeline_data.vk_descriptor_set = VK_NULL_HANDLE;
178 draw.node_data.graphics.pipeline_data.vk_pipeline = pipeline;
179 draw.node_data.graphics.pipeline_data.vk_pipeline_layout = pipeline_layout;
180 draw.node_data.graphics.viewport.viewports.append(VkViewport{});
181 draw.node_data.graphics.viewport.scissors.append(VkRect2D{});
182 render_graph->add_node(draw);
183 }
184
185 {
186 VKEndRenderingNode::CreateInfo end_rendering = {};
187 render_graph->add_node(end_rendering);
188 }
189
190 submit(render_graph, command_buffer);
191 EXPECT_EQ(7, log.size());
192 EXPECT_EQ(
193 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
194 "dst_stage_mask=VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT" +
195 endl() +
196 " - image_barrier(src_access_mask=, "
197 "dst_access_mask=VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, "
198 "old_layout=VK_IMAGE_LAYOUT_UNDEFINED, "
199 "new_layout=" +
200 color_attachment_layout_str() + ", image=0x1, subresource_range=" + endl() +
201 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, "
202 "level_count=4294967295, base_array_layer=0, layer_count=4294967295 )" +
203 endl() + ")",
204 log[0]);
205 EXPECT_EQ("begin_rendering(p_rendering_info=flags=, render_area=" + endl() +
206 " offset=" + endl() + " x=0, y=0 , extent=" + endl() +
207 " width=0, height=0 , layer_count=1, view_mask=0, "
208 "color_attachment_count=1, p_color_attachments=" +
209 endl() + " image_view=0x2, image_layout=" + color_attachment_layout_str() +
210 ", "
211 "resolve_mode=VK_RESOLVE_MODE_NONE, resolve_image_view=0, "
212 "resolve_image_layout=VK_IMAGE_LAYOUT_UNDEFINED, "
213 "load_op=VK_ATTACHMENT_LOAD_OP_DONT_CARE, store_op=VK_ATTACHMENT_STORE_OP_STORE" +
214 endl() + ")",
215 log[1]);
216 EXPECT_EQ("set_viewport(num_viewports=1)", log[2]);
217 EXPECT_EQ("set_scissor(num_scissors=1)", log[3]);
218 EXPECT_EQ("bind_pipeline(pipeline_bind_point=VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline=0x3)",
219 log[4]);
220 EXPECT_EQ("draw(vertex_count=4, instance_count=1, first_vertex=0, first_instance=0)", log[5]);
221 EXPECT_EQ("end_rendering()", log[6]);
222}
223
224TEST_P(VKRenderGraphTestRender, begin_draw_end__layered)
225{
226 VkHandle<VkImage> image(1u);
227 VkHandle<VkImageView> image_view(2u);
228 VkHandle<VkPipelineLayout> pipeline_layout(4u);
229 VkHandle<VkPipeline> pipeline(3u);
230
231 resources.add_image(image, true);
232
233 {
234 VKResourceAccessInfo access_info = {};
235 access_info.images.append({image,
236 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
237 VK_IMAGE_ASPECT_COLOR_BIT,
238 {0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS}});
239 VKBeginRenderingNode::CreateInfo begin_rendering(access_info);
240 begin_rendering.node_data.color_attachments[0].sType =
241 VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
242 begin_rendering.node_data.color_attachments[0].imageLayout = color_attachment_layout();
243 begin_rendering.node_data.color_attachments[0].imageView = image_view;
244 begin_rendering.node_data.color_attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
245 begin_rendering.node_data.color_attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
246 begin_rendering.node_data.vk_rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO;
247 begin_rendering.node_data.vk_rendering_info.colorAttachmentCount = 1;
248 begin_rendering.node_data.vk_rendering_info.layerCount = 1;
249 begin_rendering.node_data.vk_rendering_info.pColorAttachments =
250 begin_rendering.node_data.color_attachments;
251
252 render_graph->add_node(begin_rendering);
253 }
254
255 {
256 VKResourceAccessInfo access_info = {};
257 access_info.images.append({image,
258 VK_ACCESS_SHADER_READ_BIT,
259 VK_IMAGE_ASPECT_COLOR_BIT,
260 {0, VK_REMAINING_MIP_LEVELS, 1, VK_REMAINING_ARRAY_LAYERS}});
261 VKDrawNode::CreateInfo draw(access_info);
262 draw.node_data.first_instance = 0;
263 draw.node_data.first_vertex = 0;
264 draw.node_data.instance_count = 1;
265 draw.node_data.vertex_count = 4;
266 draw.node_data.graphics.pipeline_data.push_constants_data = nullptr;
267 draw.node_data.graphics.pipeline_data.push_constants_size = 0;
268 draw.node_data.graphics.pipeline_data.vk_descriptor_set = VK_NULL_HANDLE;
269 draw.node_data.graphics.pipeline_data.vk_pipeline = pipeline;
270 draw.node_data.graphics.pipeline_data.vk_pipeline_layout = pipeline_layout;
271 draw.node_data.graphics.viewport.viewports.append(VkViewport{});
272 draw.node_data.graphics.viewport.scissors.append(VkRect2D{});
273 render_graph->add_node(draw);
274 }
275
276 {
277 VKEndRenderingNode::CreateInfo end_rendering = {};
278 render_graph->add_node(end_rendering);
279 }
280
281 submit(render_graph, command_buffer);
282 EXPECT_EQ(9, log.size());
283 EXPECT_EQ(
284 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "
285 "dst_stage_mask=VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT" +
286 endl() +
287 " - image_barrier(src_access_mask=, "
288 "dst_access_mask=VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, "
289 "old_layout=VK_IMAGE_LAYOUT_UNDEFINED, "
290 "new_layout=" +
291 color_attachment_layout_str() + ", image=0x1, subresource_range=" + endl() +
292 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, "
293 "level_count=4294967295, base_array_layer=0, layer_count=4294967295 )" +
294 endl() + ")",
295 log[0]);
296 EXPECT_EQ(
297 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, "
298 "dst_stage_mask=VK_PIPELINE_STAGE_ALL_COMMANDS_BIT" +
299 endl() +
300 " - image_barrier(src_access_mask=VK_ACCESS_TRANSFER_WRITE_BIT, "
301 "dst_access_mask=VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_SHADER_WRITE_BIT, "
302 "VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, "
303 "VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, "
304 "old_layout=" +
305 color_attachment_layout_str() +
306 ", "
307 "new_layout=VK_IMAGE_LAYOUT_GENERAL, "
308 "image=0x1, subresource_range=" +
309 endl() +
310 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
311 "base_array_layer=1, layer_count=4294967295 )" +
312 endl() + ")",
313 log[1]);
314 EXPECT_EQ("begin_rendering(p_rendering_info=flags=, render_area=" + endl() +
315 " offset=" + endl() + " x=0, y=0 , extent=" + endl() +
316 " width=0, height=0 , layer_count=1, view_mask=0, "
317 "color_attachment_count=1, p_color_attachments=" +
318 endl() + " image_view=0x2, image_layout=" + color_attachment_layout_str() +
319 ", "
320 "resolve_mode=VK_RESOLVE_MODE_NONE, resolve_image_view=0, "
321 "resolve_image_layout=VK_IMAGE_LAYOUT_UNDEFINED, "
322 "load_op=VK_ATTACHMENT_LOAD_OP_DONT_CARE, store_op=VK_ATTACHMENT_STORE_OP_STORE" +
323 endl() + ")",
324 log[2]);
325 EXPECT_EQ("set_viewport(num_viewports=1)", log[3]);
326 EXPECT_EQ("set_scissor(num_scissors=1)", log[4]);
327 EXPECT_EQ("bind_pipeline(pipeline_bind_point=VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline=0x3)",
328 log[5]);
329 EXPECT_EQ("draw(vertex_count=4, instance_count=1, first_vertex=0, first_instance=0)", log[6]);
330 EXPECT_EQ("end_rendering()", log[7]);
331 EXPECT_EQ(
332 "pipeline_barrier(src_stage_mask=VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, "
333 "dst_stage_mask=VK_PIPELINE_STAGE_ALL_COMMANDS_BIT" +
334 endl() +
335 " - image_barrier(src_access_mask=VK_ACCESS_SHADER_READ_BIT, "
336 "VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, "
337 "VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, "
338 "VK_ACCESS_TRANSFER_WRITE_BIT, dst_access_mask=VK_ACCESS_SHADER_READ_BIT, "
339 "VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, "
340 "VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, "
341 "VK_ACCESS_TRANSFER_WRITE_BIT, old_layout=VK_IMAGE_LAYOUT_GENERAL, "
342 "new_layout=" +
343 color_attachment_layout_str() + ", image=0x1, subresource_range=" + endl() +
344 " aspect_mask=VK_IMAGE_ASPECT_COLOR_BIT, base_mip_level=0, level_count=4294967295, "
345 "base_array_layer=1, layer_count=4294967295 )" +
346 endl() + ")",
347 log[8]);
348}
349
350INSTANTIATE_TEST_SUITE_P(, VKRenderGraphTestRender, ::testing::Values(true, false));
351
352} // namespace blender::gpu::render_graph
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
#define log
INSTANTIATE_TEST_SUITE_P(, VKRenderGraphTestRender, ::testing::Values(true, false))
TEST_P(VKRenderGraphTestRender, begin_clear_attachments_end_read_back)
static void submit(std::unique_ptr< VKRenderGraph > &render_graph, std::unique_ptr< CommandBufferLog > &command_buffer)