Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <jeroen@blender.org>2021-07-07 15:04:11 +0300
committerJeroen Bakker <jeroen@blender.org>2021-07-07 15:04:11 +0300
commit9f7bca255ecd227a4ac3fa0bdf38087e5467deb0 (patch)
tree0a56d45fd2f5c41987dcdd3ab4a274e3c44f537f /source/blender
parent8f2bb1b1f055b55f41165b00de58109dab6df8f9 (diff)
GPU: Added testcases for uniform builtin structs.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/gpu/CMakeLists.txt1
-rw-r--r--source/blender/gpu/intern/gpu_uniform_buffer_private.hh9
-rw-r--r--source/blender/gpu/intern/gpu_uniform_buffer_structs.cc7
-rw-r--r--source/blender/gpu/tests/gpu_uniform_buffer_struct_test.cc97
4 files changed, 109 insertions, 5 deletions
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<const GPUUniformBuiltinStruct1 *>(
+ 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