From 9f7bca255ecd227a4ac3fa0bdf38087e5467deb0 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 7 Jul 2021 14:04:11 +0200 Subject: GPU: Added testcases for uniform builtin structs. --- source/blender/gpu/CMakeLists.txt | 1 + .../gpu/intern/gpu_uniform_buffer_private.hh | 9 +- .../gpu/intern/gpu_uniform_buffer_structs.cc | 7 +- .../gpu/tests/gpu_uniform_buffer_struct_test.cc | 97 ++++++++++++++++++++++ 4 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 source/blender/gpu/tests/gpu_uniform_buffer_struct_test.cc (limited to 'source/blender') diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index 919e42f4377..ab85a80b57c 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -401,6 +401,7 @@ if(WITH_GTESTS) tests/gpu_index_buffer_test.cc tests/gpu_shader_builtin_test.cc tests/gpu_shader_test.cc + tests/gpu_uniform_buffer_struct_test.cc tests/gpu_testing.hh ) diff --git a/source/blender/gpu/intern/gpu_uniform_buffer_private.hh b/source/blender/gpu/intern/gpu_uniform_buffer_private.hh index 06ec14780a8..8de5bfdcf93 100644 --- a/source/blender/gpu/intern/gpu_uniform_buffer_private.hh +++ b/source/blender/gpu/intern/gpu_uniform_buffer_private.hh @@ -98,7 +98,7 @@ class UniformBuiltinStructType { GPUUniformBuiltinStructType type; struct AttributeBinding { int binding = -1; - size_t offset = -1; + size_t offset = 0; bool has_binding() const; }; @@ -108,7 +108,7 @@ class UniformBuiltinStructType { return m_attribute_bindings[builtin_uniform]; } - const size_t data_size() const + size_t data_size() const { return m_data_size; } @@ -132,6 +132,11 @@ class UniformBuiltinStruct { return m_data; }; + const UniformBuiltinStructType &type_info() const + { + return m_type_info; + } + bool uniform_int(int location, int comp_len, int array_size, const int *data); bool uniform_float(int location, int comp_len, int array_size, const float *data); diff --git a/source/blender/gpu/intern/gpu_uniform_buffer_structs.cc b/source/blender/gpu/intern/gpu_uniform_buffer_structs.cc index bdb16d2ec54..b48cc8469eb 100644 --- a/source/blender/gpu/intern/gpu_uniform_buffer_structs.cc +++ b/source/blender/gpu/intern/gpu_uniform_buffer_structs.cc @@ -58,7 +58,8 @@ static bool is_valid_location(int location) static constexpr UniformBuiltinStructType::AttributeBinding determine_binding_struct_1( const GPUUniformBuiltin builtin_uniform) { - UniformBuiltinStructType::AttributeBinding result; + UniformBuiltinStructType::AttributeBinding result = {-1, 0}; + switch (builtin_uniform) { case GPU_UNIFORM_MODEL: result.binding = to_binding_location(builtin_uniform); @@ -228,7 +229,7 @@ UniformBuiltinStruct::~UniformBuiltinStruct() bool UniformBuiltinStruct::uniform_int(int location, int comp_len, int array_size, const int *data) { - if (is_valid_location(location)) { + if (!is_valid_location(location)) { return false; } const GPUUniformBuiltin builtin_uniform = to_builtin_uniform(location); @@ -250,7 +251,7 @@ bool UniformBuiltinStruct::uniform_float(int location, int array_size, const float *data) { - if (is_valid_location(location)) { + if (!is_valid_location(location)) { return false; } const GPUUniformBuiltin builtin_uniform = to_builtin_uniform(location); diff --git a/source/blender/gpu/tests/gpu_uniform_buffer_struct_test.cc b/source/blender/gpu/tests/gpu_uniform_buffer_struct_test.cc new file mode 100644 index 00000000000..8468bb1c66a --- /dev/null +++ b/source/blender/gpu/tests/gpu_uniform_buffer_struct_test.cc @@ -0,0 +1,97 @@ +#include "testing/testing.h" + +#include "GPU_uniform_buffer_types.h" +#include "gpu_uniform_buffer_private.hh" + +#include "BLI_math.h" + +namespace blender::gpu::tests { + +TEST(GPUUniformStruct, struct1) +{ + UniformBuiltinStruct uniform_struct(GPU_UNIFORM_STRUCT_1); + const UniformBuiltinStructType &type_info = uniform_struct.type_info(); + const GPUUniformBuiltinStruct1 *struct_data = static_cast( + uniform_struct.data()); + EXPECT_EQ(type_info.data_size(), sizeof(*struct_data)); + + /* ModelMatrix attribute. */ + { + const UniformBuiltinStructType::AttributeBinding &binding = type_info.attribute_binding( + GPU_UNIFORM_MODEL); + float m4[4][4]; + unit_m4(m4); + + const bool result = uniform_struct.uniform_float(binding.binding, 4, 4, (const float *)m4); + EXPECT_TRUE(result); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + EXPECT_EQ(struct_data->ModelMatrix[i][j], m4[i][j]); + } + } + } + + /* ModelViewProjectionMatrix attribute. */ + { + const UniformBuiltinStructType::AttributeBinding &binding = type_info.attribute_binding( + GPU_UNIFORM_MVP); + float m4[4][4]; + unit_m4(m4); + + const bool result = uniform_struct.uniform_float(binding.binding, 4, 4, (const float *)m4); + EXPECT_TRUE(result); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + EXPECT_EQ(struct_data->ModelViewProjectionMatrix[i][j], m4[i][j]); + } + } + } + + /* Color attribute. */ + { + const UniformBuiltinStructType::AttributeBinding &binding = type_info.attribute_binding( + GPU_UNIFORM_COLOR); + float color[4] = {1.0f, 0.0f, 1.0f, 1.0f}; + const bool result = uniform_struct.uniform_float(binding.binding, 4, 1, color); + EXPECT_TRUE(result); + for (int i = 0; i < 4; i++) { + EXPECT_EQ(struct_data->color[i], color[i]); + } + } + + /* WorldClipPlanes attribute. */ + { + const UniformBuiltinStructType::AttributeBinding &binding = type_info.attribute_binding( + GPU_UNIFORM_CLIPPLANES); + + float clip_planes[6][4] = { + {01.0f, 02.0f, 03.0f, 04.0f}, + {11.0f, 12.0f, 13.0f, 14.0f}, + {21.0f, 22.0f, 23.0f, 24.0f}, + {31.0f, 32.0f, 33.0f, 34.0f}, + {41.0f, 42.0f, 43.0f, 44.0f}, + {51.0f, 52.0f, 53.0f, 54.0f}, + }; + + const bool result = uniform_struct.uniform_float( + binding.binding, 4, 6, (const float *)clip_planes); + EXPECT_TRUE(result); + for (int i = 0; i < 6; i++) { + for (int j = 0; j < 4; j++) { + EXPECT_EQ(struct_data->WorldClipPlanes[i][j], clip_planes[i][j]); + } + } + } + + /* SrgbTransform attribute. */ + { + const UniformBuiltinStructType::AttributeBinding &binding = type_info.attribute_binding( + GPU_UNIFORM_SRGB_TRANSFORM); + int srgb_transform = true; + const bool result = uniform_struct.uniform_int(binding.binding, 1, 1, &srgb_transform); + EXPECT_TRUE(result); + EXPECT_EQ(struct_data->SrgbTransform, srgb_transform); + } +} + +} // namespace blender::gpu::tests \ No newline at end of file -- cgit v1.2.3