Blender V4.3
state_blend_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "testing/testing.h"
6
7#include "gpu_testing.hh"
8
9#include "GPU_batch.hh"
10#include "GPU_batch_presets.hh"
11#include "GPU_framebuffer.hh"
12#include "GPU_matrix.hh"
13
14#include "BLI_math_vector.hh"
15
16#include "intern/draw_cache.hh"
17
18namespace blender::gpu::tests {
19
20template<eGPUBlend blend_type>
21void blend_test(float4 source_a, float4 source_b, float4 expected_result)
22{
24 1,
25 false,
29 nullptr);
30 BLI_assert(offscreen != nullptr);
31 GPU_offscreen_bind(offscreen, false);
32 GPUTexture *color_texture = GPU_offscreen_color_texture(offscreen);
33 GPU_texture_clear(color_texture, GPU_DATA_FLOAT, source_a);
34
35 Batch *batch = DRW_cache_quad_get();
36
38 GPU_batch_uniform_4fv(batch, "color", source_b);
39 GPU_blend(blend_type);
40
42 GPU_offscreen_unbind(offscreen, false);
43 GPU_flush();
44
45 float4 read_back;
47 GPU_offscreen_read_color(offscreen, GPU_DATA_FLOAT, &read_back);
48 EXPECT_EQ(read_back, expected_result);
49
50 GPU_offscreen_free(offscreen);
52}
53
54static void test_blend_none()
55{
56 blend_test<GPU_BLEND_NONE>(float4(1.0f, 0.0f, 1.0f, 1.0f),
57 float4(0.0f, 1.0f, 0.0f, 0.5f),
58 float4(0.0f, 1.0f, 0.0f, 0.5f));
59}
60GPU_TEST(blend_none)
61
62static void test_blend_alpha()
63{
64 blend_test<GPU_BLEND_ALPHA>(float4(1.0f, 0.0f, 1.0f, 1.0f),
65 float4(0.0f, 1.0f, 0.0f, 0.5f),
66 float4(0.5f, 0.5f, 0.5f, 1.0f));
67}
68GPU_TEST(blend_alpha)
69
71{
72 blend_test<GPU_BLEND_ALPHA_PREMULT>(float4(1.0f, 0.0f, 1.0f, 1.0f),
73 float4(0.0f, 1.0f, 0.0f, 0.5f),
74 float4(0.5f, 1.0f, 0.5f, 1.0f));
75}
76GPU_TEST(blend_alpha_premult)
77
79{
80 blend_test<GPU_BLEND_ADDITIVE>(float4(1.0f, 0.0f, 1.0f, 1.0f),
81 float4(0.0f, 1.0f, 0.0f, 0.5f),
82 float4(1.0f, 0.5f, 1.0f, 1.0f));
83}
84GPU_TEST(blend_additive)
85
87{
88 blend_test<GPU_BLEND_ADDITIVE_PREMULT>(float4(1.0f, 0.0f, 1.0f, 1.0f),
89 float4(0.0f, 1.0f, 0.0f, 0.5f),
90 float4(1.0f, 1.0f, 1.0f, 1.5f));
91}
92GPU_TEST(blend_additive_premult)
93
95{
96 blend_test<GPU_BLEND_MULTIPLY>(float4(1.0f, 0.0f, 1.0f, 1.0f),
97 float4(0.0f, 1.0f, 0.0f, 0.5f),
98 float4(0.0f, 0.0f, 0.0f, 0.5f));
99}
100GPU_TEST(blend_multiply)
101
103{
104 blend_test<GPU_BLEND_SUBTRACT>(float4(1.0f, 1.0f, 1.0f, 1.0f),
105 float4(0.0f, 1.0f, 0.0f, 0.5f),
106 float4(1.0f, 0.0f, 1.0f, 0.5f));
107}
108GPU_TEST(blend_subtract)
109
110static void test_blend_invert()
111{
112 blend_test<GPU_BLEND_INVERT>(float4(1.0f, 1.0f, 1.0f, 1.0f),
113 float4(0.0f, 1.0f, 0.0f, 0.5f),
114 float4(0.0f, 0.0f, 0.0f, 1.0f));
115}
116GPU_TEST(blend_invert)
117
118static void test_blend_oit()
119{
120 blend_test<GPU_BLEND_OIT>(float4(1.0f, 1.0f, 1.0f, 1.0f),
121 float4(0.0f, 1.0f, 0.0f, 0.5f),
122 float4(1.0f, 2.0f, 1.0f, 0.5f));
123}
124GPU_TEST(blend_oit)
125
127{
128 blend_test<GPU_BLEND_BACKGROUND>(float4(1.0f, 1.0f, 1.0f, 1.0f),
129 float4(0.0f, 1.0f, 0.0f, 0.5f),
130 float4(0.5f, 0.5f, 0.5f, 0.5f));
131}
132GPU_TEST(blend_background)
133
134} // namespace blender::gpu::tests
#define BLI_assert(a)
Definition BLI_assert.h:50
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void GPU_batch_program_set_builtin(blender::gpu::Batch *batch, eGPUBuiltinShader shader_id)
void GPU_batch_draw(blender::gpu::Batch *batch)
#define GPU_batch_uniform_4fv(batch, name, val)
Definition GPU_batch.hh:307
GPUOffScreen * GPU_offscreen_create(int width, int height, bool with_depth_buffer, eGPUTextureFormat format, eGPUTextureUsage usage, char err_out[256])
void GPU_offscreen_bind(GPUOffScreen *offscreen, bool save)
GPUTexture * GPU_offscreen_color_texture(const GPUOffScreen *offscreen)
void GPU_offscreen_free(GPUOffScreen *offscreen)
void GPU_offscreen_read_color(GPUOffScreen *offscreen, eGPUDataFormat data_format, void *r_data)
void GPU_offscreen_unbind(GPUOffScreen *offscreen, bool restore)
@ GPU_SHADER_3D_UNIFORM_COLOR
void GPU_memory_barrier(eGPUBarrier barrier)
Definition gpu_state.cc:374
void GPU_flush()
Definition gpu_state.cc:294
void GPU_blend(eGPUBlend blend)
Definition gpu_state.cc:42
@ GPU_BARRIER_TEXTURE_FETCH
Definition GPU_state.hh:37
void GPU_texture_clear(GPUTexture *texture, eGPUDataFormat data_format, const void *data)
@ GPU_DATA_FLOAT
@ GPU_TEXTURE_USAGE_HOST_READ
@ GPU_TEXTURE_USAGE_ATTACHMENT
void DRW_shape_cache_free()
blender::gpu::Batch * DRW_cache_quad_get()
struct @620::@622 batch
#define GPU_TEST(test_name)
static void test_blend_none()
static void test_blend_alpha()
static void test_blend_background()
static void test_blend_alpha_premult()
void blend_test(float4 source_a, float4 source_b, float4 expected_result)
static void test_blend_multiply()
static void test_blend_invert()
static void test_blend_additive_premult()
static void test_blend_subtract()
static void test_blend_additive()
static void test_blend_oit()
VecBase< float, 4 > float4