[Bf-blender-cvs] [9f7bca255ec] temp-gpu-uniform-builtin-structs: GPU: Added testcases for uniform builtin structs.

Jeroen Bakker noreply at git.blender.org
Wed Jul 7 14:04:33 CEST 2021


Commit: 9f7bca255ecd227a4ac3fa0bdf38087e5467deb0
Author: Jeroen Bakker
Date:   Wed Jul 7 14:04:11 2021 +0200
Branches: temp-gpu-uniform-builtin-structs
https://developer.blender.org/rB9f7bca255ecd227a4ac3fa0bdf38087e5467deb0

GPU: Added testcases for uniform builtin structs.

===================================================================

M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/intern/gpu_uniform_buffer_private.hh
M	source/blender/gpu/intern/gpu_uniform_buffer_structs.cc
A	source/blender/gpu/tests/gpu_uniform_buffer_struct_test.cc

===================================================================

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



More information about the Bf-blender-cvs mailing list