5#include "testing/testing.h"
32 GPUFrameBuffer *
fb =
nullptr;
34 float4 color(1.0f, 1.0f, 1.0f, 0.0f);
35 int3 dispatch_size(1);
40 pass.clear_color_depth_stencil(
float4(0.25f, 0.5f, 100.0f, -2000.0f), 0.5f, 0xF0);
41 pass.state_stencil(0x80, 0x0F, 0x8F);
46 pass.framebuffer_set(&
fb);
48 pass.bind_texture(
"image",
tex);
49 pass.bind_texture(
"image", &
tex);
50 pass.bind_image(
"missing_image",
tex);
51 pass.bind_image(
"missing_image", &
tex);
52 pass.bind_ubo(
"missing_ubo", ubo);
53 pass.bind_ubo(
"missing_ubo", &ubo);
54 pass.bind_ssbo(
"missing_ssbo", ssbo);
55 pass.bind_ssbo(
"missing_ssbo", &ssbo);
56 pass.bind_ssbo(
"missing_vbo_as_ssbo", vbo);
57 pass.bind_ssbo(
"missing_vbo_as_ssbo", &vbo);
58 pass.bind_ssbo(
"missing_ibo_as_ssbo", ibo);
59 pass.bind_ssbo(
"missing_ibo_as_ssbo", &ibo);
60 pass.push_constant(
"color", color);
61 pass.push_constant(
"color", &color);
68 pass.dispatch(dispatch_size);
69 pass.dispatch(&dispatch_size);
74 dispatch_size =
int3(2);
76 std::string result = pass.serialize();
77 std::stringstream expected;
78 expected <<
".test.all_commands" << std::endl;
79 expected <<
" .state_set(6)" << std::endl;
80 expected <<
" .clear(color=(0.25, 0.5, 100, -2000), depth=0.5, stencil=0b11110000))"
83 <<
" .stencil_set(write_mask=0b10000000, reference=0b00001111, compare_mask=0b10001111)"
85 expected <<
" .shader_bind(gpu_shader_3D_image_color)" << std::endl;
86 expected <<
" .framebuffer_bind(nullptr)" << std::endl;
87 expected <<
" .subpass_transition(" << std::endl;
88 expected <<
"depth=ignore," << std::endl;
89 expected <<
"color0=write," << std::endl;
90 expected <<
"color1=read," << std::endl;
91 expected <<
"color2=ignore," << std::endl;
92 expected <<
"color3=ignore," << std::endl;
93 expected <<
"color4=ignore," << std::endl;
94 expected <<
"color5=ignore," << std::endl;
95 expected <<
"color6=ignore," << std::endl;
96 expected <<
"color7=ignore" << std::endl;
97 expected <<
")" << std::endl;
98 expected <<
" .bind_texture(0, sampler=internal)" << std::endl;
99 expected <<
" .bind_texture_ref(0, sampler=internal)" << std::endl;
100 expected <<
" .bind_image(-1)" << std::endl;
101 expected <<
" .bind_image_ref(-1)" << std::endl;
102 expected <<
" .bind_uniform_buf(-1)" << std::endl;
103 expected <<
" .bind_uniform_buf_ref(-1)" << std::endl;
104 expected <<
" .bind_storage_buf(-1)" << std::endl;
105 expected <<
" .bind_storage_buf_ref(-1)" << std::endl;
106 expected <<
" .bind_vertbuf_as_ssbo(-1)" << std::endl;
107 expected <<
" .bind_vertbuf_as_ssbo_ref(-1)" << std::endl;
108 expected <<
" .bind_indexbuf_as_ssbo(-1)" << std::endl;
109 expected <<
" .bind_indexbuf_as_ssbo_ref(-1)" << std::endl;
110 expected <<
" .push_constant(" << color_location <<
", data=(1, 1, 1, 0))" << std::endl;
111 expected <<
" .push_constant(" << color_location <<
", data=(1, 1, 1, 1))" << std::endl;
112 expected <<
" .push_constant(" << mvp_location <<
", data=(" << std::endl;
113 expected <<
"(1, 0, 0, 0)," << std::endl;
114 expected <<
"(0, 1, 0, 0)," << std::endl;
115 expected <<
"(0, 0, 1, 0)," << std::endl;
116 expected <<
"(0, 0, 0, 1)" << std::endl;
117 expected <<
")" << std::endl;
118 expected <<
")" << std::endl;
119 expected <<
" .draw(inst_len=1, vert_len=3, vert_first=0, res_id=0)" << std::endl;
120 expected <<
" .shader_bind(gpu_shader_3D_image_color)" << std::endl;
121 expected <<
" .dispatch(1, 1, 1)" << std::endl;
122 expected <<
" .dispatch_ref(2, 2, 2)" << std::endl;
123 expected <<
" .barrier(2)" << std::endl;
136 pass.push_constant(
"test_pass", 1);
145 pass.push_constant(
"test_pass", 2);
156 std::string result = pass.serialize();
157 std::stringstream expected;
158 expected <<
".test.sub_ordering" << std::endl;
159 expected <<
" .shader_bind(gpu_shader_3D_image_color)" << std::endl;
160 expected <<
" .push_constant(-1, data=1)" << std::endl;
161 expected <<
" .Sub1" << std::endl;
162 expected <<
" .push_constant(-1, data=11)" << std::endl;
163 expected <<
" .push_constant(-1, data=12)" << std::endl;
164 expected <<
" .Sub2" << std::endl;
165 expected <<
" .push_constant(-1, data=21)" << std::endl;
166 expected <<
" .push_constant(-1, data=22)" << std::endl;
167 expected <<
" .push_constant(-1, data=23)" << std::endl;
168 expected <<
" .push_constant(-1, data=2)" << std::endl;
191 std::string result = pass.serialize();
192 std::stringstream expected;
193 expected <<
".test.simple_draw" << std::endl;
194 expected <<
" .shader_bind(gpu_shader_3D_image_color)" << std::endl;
195 expected <<
" .draw(inst_len=1, vert_len=10, vert_first=1, res_id=1)" << std::endl;
196 expected <<
" .draw(inst_len=4, vert_len=20, vert_first=2, res_id=2)" << std::endl;
197 expected <<
" .draw(inst_len=2, vert_len=30, vert_first=3, res_id=3)" << std::endl;
198 expected <<
" .draw(inst_len=5, vert_len=40, vert_first=4, res_id=4)" << std::endl;
199 expected <<
" .draw(inst_len=1, vert_len=50, vert_first=5, res_id=5)" << std::endl;
200 expected <<
" .draw(inst_len=6, vert_len=60, vert_first=6, res_id=5)" << std::endl;
201 expected <<
" .draw(inst_len=3, vert_len=70, vert_first=7, res_id=6)" << std::endl;
202 expected <<
" .sub" << std::endl;
203 expected <<
" .draw(inst_len=3, vert_len=80, vert_first=8, res_id=8)" << std::endl;
213 PassMain pass = {
"test.multi_draw"};
228 std::string result = pass.serialize();
229 std::stringstream expected;
230 expected <<
".test.multi_draw" << std::endl;
231 expected <<
" .shader_bind(gpu_shader_3D_image_color)" << std::endl;
232 expected <<
" .draw_multi(5)" << std::endl;
233 expected <<
" .group(id=4, len=2)" << std::endl;
234 expected <<
" .proto(instance_len=2, resource_id=8, front_face)" << std::endl;
235 expected <<
" .group(id=3, len=2)" << std::endl;
236 expected <<
" .proto(instance_len=2, resource_id=7, front_face)" << std::endl;
237 expected <<
" .group(id=2, len=1)" << std::endl;
238 expected <<
" .proto(instance_len=1, resource_id=5, front_face)" << std::endl;
239 expected <<
" .group(id=1, len=15)" << std::endl;
240 expected <<
" .proto(instance_len=5, resource_id=4, back_face)" << std::endl;
241 expected <<
" .proto(instance_len=6, resource_id=5, front_face)" << std::endl;
242 expected <<
" .proto(instance_len=4, resource_id=2, front_face)" << std::endl;
243 expected <<
" .group(id=0, len=6)" << std::endl;
244 expected <<
" .proto(instance_len=3, resource_id=6, front_face)" << std::endl;
245 expected <<
" .proto(instance_len=2, resource_id=3, front_face)" << std::endl;
246 expected <<
" .proto(instance_len=1, resource_id=1, front_face)" << std::endl;
259 pass.sub(
"Sub3", 3.0f);
260 pass.sub(
"Sub2", 2.0f);
261 pass.sub(
"Sub5", 4.0f);
262 pass.sub(
"Sub4", 3.0f);
263 pass.sub(
"Sub1", 1.0f);
265 std::string result = pass.serialize();
266 std::stringstream expected;
267 expected <<
".test.sortable" << std::endl;
268 expected <<
" .Sub1" << std::endl;
269 expected <<
" .Sub2" << std::endl;
270 expected <<
" .Sub3" << std::endl;
271 expected <<
" .Sub4" << std::endl;
272 expected <<
" .Sub5" << std::endl;
325 result << val <<
" ";
328 StringRefNull expected_simple =
"2 1 1 1 1 3 3 1 1 1 1 1 3 2 2 2 2 2 2 1 1 1 ";
329 EXPECT_EQ(result.str(), expected_simple);
334 PassMain pass = {
"test.resource_id"};
350 result << val <<
" ";
356 StringRefNull expected_main =
"2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 ";
393 PassMain pass = {
"test.visibility"};
406 EXPECT_EQ(result.str(),
"11111111111111111111111111111011");
431 for (
const auto &val : debug.
matrices) {
434 for (
const auto &val : debug.
bounds) {
437 for (
const auto &val : debug.
infos) {
441 std::stringstream expected;
442 expected <<
"ObjectMatrices(" << std::endl;
443 expected <<
"model=(" << std::endl;
444 expected <<
"(1, 0, 0, 0)," << std::endl;
445 expected <<
"(0, 1, 0, 0)," << std::endl;
446 expected <<
"(0, 0, 1, 0)," << std::endl;
447 expected <<
"(0, 0, 0, 1)" << std::endl;
448 expected <<
")" << std::endl;
449 expected <<
", " << std::endl;
450 expected <<
"model_inverse=(" << std::endl;
451 expected <<
"(1, -0, 0, -0)," << std::endl;
452 expected <<
"(-0, 1, -0, 0)," << std::endl;
453 expected <<
"(0, -0, 1, -0)," << std::endl;
454 expected <<
"(-0, 0, -0, 1)" << std::endl;
455 expected <<
")" << std::endl;
456 expected <<
")" << std::endl;
457 expected <<
"ObjectMatrices(" << std::endl;
458 expected <<
"model=(" << std::endl;
459 expected <<
"(-0.5, 0, 0, 0)," << std::endl;
460 expected <<
"(0, -0.5, 0, 0)," << std::endl;
461 expected <<
"(0, 0, -0.5, 0)," << std::endl;
462 expected <<
"(0, 0, 0, 1)" << std::endl;
463 expected <<
")" << std::endl;
464 expected <<
", " << std::endl;
465 expected <<
"model_inverse=(" << std::endl;
466 expected <<
"(-2, -0, -0, 0)," << std::endl;
467 expected <<
"(-0, -2, 0, -0)," << std::endl;
468 expected <<
"(-0, 0, -2, 0)," << std::endl;
469 expected <<
"(0, -0, 0, 1)" << std::endl;
470 expected <<
")" << std::endl;
471 expected <<
")" << std::endl;
472 expected <<
"ObjectMatrices(" << std::endl;
473 expected <<
"model=(" << std::endl;
474 expected <<
"(0.5, 0, 0, 0)," << std::endl;
475 expected <<
"(0, 0.5, 0, 0)," << std::endl;
476 expected <<
"(0, 0, 0.5, 0)," << std::endl;
477 expected <<
"(0, 0, 0, 1)" << std::endl;
478 expected <<
")" << std::endl;
479 expected <<
", " << std::endl;
480 expected <<
"model_inverse=(" << std::endl;
481 expected <<
"(2, -0, 0, -0)," << std::endl;
482 expected <<
"(-0, 2, -0, 0)," << std::endl;
483 expected <<
"(0, -0, 2, -0)," << std::endl;
484 expected <<
"(-0, 0, -0, 1)" << std::endl;
485 expected <<
")" << std::endl;
486 expected <<
")" << std::endl;
487 expected <<
"ObjectBounds(skipped)" << std::endl;
488 expected <<
"ObjectBounds(skipped)" << std::endl;
489 expected <<
"ObjectBounds(" << std::endl;
490 expected <<
".bounding_corners[0](0.5, 0.5, 0.5)" << std::endl;
491 expected <<
".bounding_corners[1](1, 0, 0)" << std::endl;
492 expected <<
".bounding_corners[2](0, 1, 0)" << std::endl;
493 expected <<
".bounding_corners[3](0, 0, 1)" << std::endl;
494 expected <<
".sphere=(pos=(1, 1, 1), rad=0.866025" << std::endl;
495 expected <<
")" << std::endl;
496 expected <<
"ObjectInfos(skipped)" << std::endl;
497 expected <<
"ObjectInfos(skipped)" << std::endl;
498 expected <<
"ObjectInfos(skipped)" << std::endl;
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void orthographic_m4(float mat[4][4], float left, float right, float bottom, float top, float nearClip, float farClip)
#define GPU_ATTACHMENT_TEXTURE(_texture)
#define GPU_ATTACHMENT_NONE
int GPU_shader_get_uniform(GPUShader *shader, const char *name)
GPUShader * GPU_shader_get_builtin_shader(eGPUBuiltinShader shader)
@ GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA
@ GPU_SHADER_3D_IMAGE_COLOR
@ GPU_BARRIER_SHADER_IMAGE_ACCESS
struct GPUShader GPUShader
void ensure(GPUAttachment depth=GPU_ATTACHMENT_NONE, GPUAttachment color1=GPU_ATTACHMENT_NONE, GPUAttachment color2=GPU_ATTACHMENT_NONE, GPUAttachment color3=GPU_ATTACHMENT_NONE, GPUAttachment color4=GPU_ATTACHMENT_NONE, GPUAttachment color5=GPU_ATTACHMENT_NONE, GPUAttachment color6=GPU_ATTACHMENT_NONE, GPUAttachment color7=GPU_ATTACHMENT_NONE, GPUAttachment color8=GPU_ATTACHMENT_NONE)
SubmitDebugOutput submit_debug(PassSimple &pass, View &view)
ResourceHandle resource_handle(const ObjectRef &ref, float inflate_bounds=0.0f)
DataDebugOutput data_debug()
bool ensure_2d(eGPUTextureFormat format, int2 extent, eGPUTextureUsage usage=GPU_TEXTURE_USAGE_GENERAL, const float *data=nullptr, int mip_len=1)
void draw_procedural(GPUPrimType primitive, uint instance_len, uint vertex_len, uint vertex_first=-1, ResourceHandle handle={0}, uint custom_id=0)
PassBase< DrawCommandBufType > & sub(const char *name)
void push_constant(const char *name, const float &data)
additional_info("compositor_sum_float_shared") .push_constant(Type additional_info("compositor_sum_float_shared") .push_constant(Type GPU_RGBA32F
void DRW_shape_cache_free()
@ DRW_STATE_WRITE_STENCIL
#define DRAW_TEST(test_name)
BLI_INLINE float fb(float length, float L)
static void test_draw_pass_multi_draw()
static void test_draw_pass_all_commands()
static void test_draw_pass_simple_draw()
static void test_draw_visibility()
static void test_draw_manager_sync()
static void test_draw_resource_id_gen()
static void test_draw_pass_sub_ordering()
static void test_draw_pass_sortable()
MatT from_scale(const VecBase< typename MatT::base_type, ScaleDim > &scale)
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< int32_t, 3 > int3
VecBase< float, 3 > float3
const c_style_mat & ptr() const
static MatBase identity()
Span< ObjectInfos > infos
Span< ObjectMatrices > matrices
Span< ObjectBounds > bounds
Span< uint32_t > resource_id
Span< uint32_t > visibility