[Bf-blender-cvs] [0271c736a9f] temp-gpu-uniform-builtin-structs: Moved to own unit.

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


Commit: 0271c736a9f6aec1c326501a8e73bf8c12329882
Author: Jeroen Bakker
Date:   Wed Jul 7 08:52:34 2021 +0200
Branches: temp-gpu-uniform-builtin-structs
https://developer.blender.org/rB0271c736a9f6aec1c326501a8e73bf8c12329882

Moved to own unit.

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

M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/GPU_shader.h
A	source/blender/gpu/GPU_uniform_buffer_types.h
M	source/blender/gpu/intern/gpu_shader.cc
M	source/blender/gpu/intern/gpu_shader_interface.cc
M	source/blender/gpu/intern/gpu_shader_interface.hh
M	source/blender/gpu/intern/gpu_uniform_buffer_private.hh
A	source/blender/gpu/intern/gpu_uniform_buffer_structs.cc
A	source/blender/gpu/shaders/material/gpu_shader_builtin_uniforms_lib.glsl

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

diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index abb7330d292..919e42f4377 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -87,6 +87,7 @@ set(SRC
   intern/gpu_state.cc
   intern/gpu_texture.cc
   intern/gpu_uniform_buffer.cc
+  intern/gpu_uniform_buffer_structs.cc
   intern/gpu_vertex_buffer.cc
   intern/gpu_vertex_format.cc
   intern/gpu_viewport.c
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index 5bc47be0459..d0b3bb5e9e6 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -23,6 +23,8 @@
 
 #pragma once
 
+#include "GPU_uniform_buffer_types.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -40,12 +42,6 @@ typedef enum eGPUShaderTFBType {
   GPU_SHADER_TFB_TRIANGLES = 3,
 } eGPUShaderTFBType;
 
-typedef enum GPUUniformBuiltinStructType {
-  GPU_UNIFORM_STRUCT_NONE = 0,
-  GPU_UNIFORM_STRUCT_1,
-  GPU_NUM_UNIFORM_STRUCTS, /* Special value, denotes number of structs. */
-} GPUUniformBuiltinStructType;
-
 GPUShader *GPU_shader_create(const char *vertcode,
                              const char *fragcode,
                              const char *geomcode,
@@ -125,14 +121,6 @@ typedef enum {
   GPU_NUM_UNIFORMS, /* Special value, denotes number of builtin uniforms. */
 } GPUUniformBuiltin;
 
-typedef struct GPUUniformBuiltinStruct1 {
-  float ModelMatrix[4][4];
-  float ModelViewProjectionMatrix[4][4];
-  float color[4];
-  float WorldClipPlanes[6][4];
-  int SrgbTransform;
-} GPUUniformBuiltinStruct1;
-
 typedef enum {
   GPU_UNIFORM_BLOCK_VIEW = 0, /* viewBlock */
   GPU_UNIFORM_BLOCK_MODEL,    /* modelBlock */
diff --git a/source/blender/gpu/GPU_uniform_buffer_types.h b/source/blender/gpu/GPU_uniform_buffer_types.h
new file mode 100644
index 00000000000..36ce53d21c7
--- /dev/null
+++ b/source/blender/gpu/GPU_uniform_buffer_types.h
@@ -0,0 +1,46 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2021 Blender Foundation.
+ * All rights reserved.
+ */
+
+/** \file
+ * \ingroup gpu
+ */
+
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum GPUUniformBuiltinStructType {
+  GPU_UNIFORM_STRUCT_NONE = 0,
+  GPU_UNIFORM_STRUCT_1,
+  GPU_NUM_UNIFORM_STRUCTS, /* Special value, denotes number of structs. */
+} GPUUniformBuiltinStructType;
+
+typedef struct GPUUniformBuiltinStruct1 {
+  float ModelMatrix[4][4];
+  float ModelViewProjectionMatrix[4][4];
+  float color[4];
+  float WorldClipPlanes[6][4];
+  int SrgbTransform;
+} GPUUniformBuiltinStruct1;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/source/blender/gpu/intern/gpu_shader.cc b/source/blender/gpu/intern/gpu_shader.cc
index 310b506b2e5..373162d35f7 100644
--- a/source/blender/gpu/intern/gpu_shader.cc
+++ b/source/blender/gpu/intern/gpu_shader.cc
@@ -34,6 +34,7 @@
 #include "gpu_backend.hh"
 #include "gpu_context_private.hh"
 #include "gpu_shader_private.hh"
+#include "gpu_uniform_buffer_private.hh"
 
 #include "CLG_log.h"
 
@@ -184,7 +185,7 @@ GPUShader *GPU_shader_create_ex(const char *vertcode,
 
   if (G.debug & G_DEBUG_GPU) {
     std::optional<GPUUniformBuiltinStructType> best_struct_type =
-        shader->interface->best_builtin_uniform_struct();
+        find_smallest_uniform_builtin_struct(*shader->interface);
     if (best_struct_type) {
       if (/*uniform_struct_type != GPU_UNIFORM_STRUCT_NONE &&*/
           uniform_struct_type != *best_struct_type) {
diff --git a/source/blender/gpu/intern/gpu_shader_interface.cc b/source/blender/gpu/intern/gpu_shader_interface.cc
index a4d077eef61..364ec1aacfc 100644
--- a/source/blender/gpu/intern/gpu_shader_interface.cc
+++ b/source/blender/gpu/intern/gpu_shader_interface.cc
@@ -129,45 +129,6 @@ void ShaderInterface::debug_print()
   printf("\n");
 }
 
-/* TODO(jbakker): move to new compile unit (GPU_uniform_structs.cc). */
-
-static bool can_hold_element(const GPUUniformBuiltinStructType struct_type,
-                             const GPUUniformBuiltin builtin_uniform)
-{
-  switch (struct_type) {
-    case GPU_UNIFORM_STRUCT_NONE:
-      return false;
-      break;
-
-    case GPU_UNIFORM_STRUCT_1:
-      return ELEM(builtin_uniform,
-                  GPU_UNIFORM_MODEL,
-                  GPU_UNIFORM_MVP,
-                  GPU_UNIFORM_COLOR,
-                  GPU_UNIFORM_CLIPPLANES,
-                  GPU_UNIFORM_SRGB_TRANSFORM);
-      break;
-
-    case GPU_NUM_UNIFORM_STRUCTS:
-      return false;
-      break;
-  }
-  return false;
-}
-
-static bool can_hold_data(const ShaderInterface &interface,
-                          const GPUUniformBuiltinStructType struct_type)
-{
-  for (int i = 0; i < GPU_NUM_UNIFORMS; i++) {
-    const GPUUniformBuiltin builtin_uniform = static_cast<const GPUUniformBuiltin>(i);
-    const bool builtin_is_used = interface.builtins_[i] != -1;
-    if (builtin_is_used && !can_hold_element(struct_type, builtin_uniform)) {
-      return false;
-    }
-  }
-  return true;
-}
-
 bool ShaderInterface::has_builtin_uniforms() const
 {
   for (int i = 0; i < GPU_NUM_UNIFORMS; i++) {
@@ -178,18 +139,4 @@ bool ShaderInterface::has_builtin_uniforms() const
   return false;
 }
 
-std::optional<const GPUUniformBuiltinStructType> ShaderInterface::best_builtin_uniform_struct()
-    const
-{
-  if (!this->has_builtin_uniforms()) {
-    return std::nullopt;
-  }
-
-  if (can_hold_data(*this, GPU_UNIFORM_STRUCT_1)) {
-    return std::make_optional(GPU_UNIFORM_STRUCT_1);
-  }
-
-  return std::nullopt;
-}
-
 }  // namespace blender::gpu
diff --git a/source/blender/gpu/intern/gpu_shader_interface.hh b/source/blender/gpu/intern/gpu_shader_interface.hh
index 00afc4dde98..d882e71e656 100644
--- a/source/blender/gpu/intern/gpu_shader_interface.hh
+++ b/source/blender/gpu/intern/gpu_shader_interface.hh
@@ -77,6 +77,7 @@ class ShaderInterface {
   virtual ~ShaderInterface();
 
   void debug_print(void);
+  bool has_builtin_uniforms() const;
 
   inline const ShaderInput *attr_get(const char *name) const
   {
@@ -126,8 +127,6 @@ class ShaderInterface {
     return builtin_blocks_[builtin];
   }
 
-  std::optional<const GPUUniformBuiltinStructType> best_builtin_uniform_struct() const;
-
  protected:
   static inline const char *builtin_uniform_name(GPUUniformBuiltin u);
   static inline const char *builtin_uniform_block_name(GPUUniformBlockBuiltin u);
@@ -145,7 +144,6 @@ class ShaderInterface {
   inline const ShaderInput *input_lookup(const ShaderInput *const inputs,
                                          const uint inputs_len,
                                          const int binding) const;
-  bool has_builtin_uniforms() const;
 };
 
 inline const char *ShaderInterface::builtin_uniform_name(GPUUniformBuiltin u)
diff --git a/source/blender/gpu/intern/gpu_uniform_buffer_private.hh b/source/blender/gpu/intern/gpu_uniform_buffer_private.hh
index e8fc1343eaf..b514b312c11 100644
--- a/source/blender/gpu/intern/gpu_uniform_buffer_private.hh
+++ b/source/blender/gpu/intern/gpu_uniform_buffer_private.hh
@@ -24,11 +24,18 @@
 
 #include "BLI_sys_types.h"
 
+#include <optional>
+
+#include "GPU_shader.h"
+#include "GPU_uniform_buffer_types.h"
+
 struct GPUUniformBuf;
 
 namespace blender {
 namespace gpu {
 
+class ShaderInterface;
+
 #ifdef DEBUG
 #  define DEBUG_NAME_LEN 64
 #else
@@ -79,6 +86,21 @@ static inline const UniformBuf *unwrap(const GPUUniformBuf *vert)
   return reinterpret_cast<const UniformBuf *>(vert);
 }
 
+class UniformBuiltinStructType {
+ public:
+  UniformBuiltinStructType(const GPUUniformBuiltinStructType type);
+
+  GPUUniformBuiltinStructType type;
+
+  bool has_all_builtin_uniforms(const ShaderInterface &interface) const;
+
+ private:
+  bool has_attribute(const GPUUniformBuiltin builtin_uniform) const;
+};
+
+std::optional<const GPUUniformBuiltinStructType> find_smallest_uniform_builtin_struct(
+    const ShaderInterface &interface);
+
 #undef DEBUG_NAME_LEN
 
 }  // namespace gpu
diff --git a/source/blender/gpu/intern/gpu_uniform_buffer_structs.cc b/source/blender/gpu/intern/gpu_uniform_buffer_structs.cc
new file mode 100644
index 00000000000..897d1088e43
--- /dev/null
+++ b/source/blender/gpu/intern/gpu_uniform_buffer_structs.cc
@@ -0,0 +1,94 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2021 Blender Foundation.
+ * All rights reserved.
+ */
+
+/** \file
+ * \ingroup gpu
+ */
+
+#include "gpu_uniform_buffer_private.hh"
+
+#include "GPU_shader.h"
+#include "GPU_uniform_buffer_types.h"
+#include "gpu_shader_interface.hh"
+
+namespace blender::gpu {
+
+/* -------------------------------------------------------------------- */
+/** \name Struct type
+ * \{ */
+
+UniformBuiltinStructType::UniformBuiltinStructType(const GPUUniformBuiltinStructType type)
+    : type(type)
+{
+}
+
+bool UniformBuiltinStructType::has_a

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list