Browse Source

shader: Refactor bind_parameter method, less redundancy

rdb 1 year ago
parent
commit
1188ae6291

+ 5 - 4
panda/src/display/graphicsStateGuardian.cxx

@@ -1034,7 +1034,7 @@ fetch_specified_value(Shader::ShaderMatSpec &spec, const LVecBase4 *cache,
     break;
 
   case Shader::SMF_shader_input_ptr:
-    return _target_shader->get_shader_input_data(spec._arg[0], scratch,
+    return _target_shader->get_shader_input_data(spec._id._name, scratch,
       spec._scalar_type, spec._array_count, spec._num_rows, spec._num_cols, pad_rows);
 
   default:
@@ -1601,7 +1601,6 @@ fetch_specified_part(Shader::ShaderMatInput part, const InternalName *name,
     // fall through
   }
   case Shader::SMO_struct_constant_x: {
-    int offset = 0;
     const ShaderType::Struct *struct_type = type->as_struct();
     for (size_t i = 0; i < struct_type->get_num_members(); ++i) {
       const ShaderType::Struct::Member &member = struct_type->get_member(i);
@@ -1612,8 +1611,10 @@ fetch_specified_part(Shader::ShaderMatInput part, const InternalName *name,
       uint32_t num_columns;
       if (member.type->as_scalar_type(scalar_type, num_elements, num_rows, num_columns)) {
         Shader::ShaderPtrData data;
-        _target_shader->get_shader_input_data(((InternalName *)name)->append(member.name), &into[offset], scalar_type, num_elements, num_rows, num_columns, true);
-        offset += num_elements * num_rows;
+        _target_shader->get_shader_input_data(
+          ((InternalName *)name)->append(member.name),
+          (char *)into + member.offset,
+          scalar_type, num_elements, num_rows, num_columns, false);
       }
     }
     break;

File diff suppressed because it is too large
+ 170 - 547
panda/src/gobj/shader.cxx


+ 16 - 6
panda/src/gobj/shader.h

@@ -427,10 +427,7 @@ public:
     size_t _cache_offset[2];
     Parameter         _id;
     ShaderMatFunc     _func;
-    ShaderMatInput    _part[2];
-    CPT(InternalName) _arg[2];
     int               _dep = SSD_NONE;
-    int               _index = 0;
     ShaderMatPiece    _piece;
     int               _offset = 0;
     int               _array_count = 1;
@@ -513,15 +510,16 @@ protected:
   bool expect_float_vector(const InternalName *name, const ::ShaderType *type, int lo, int hi);
   bool expect_float_matrix(const InternalName *name, const ::ShaderType *type, int lo, int hi);
   bool expect_coordinate_system(const InternalName *name, const ::ShaderType *type,
-                                vector_string &pieces, int &next,
-                                ShaderMatSpec &spec, bool fromflag);
+                                vector_string &pieces, int &next, bool fromflag,
+                                ShaderMatInput *part, CPT(InternalName) *arg);
   static bool check_light_struct_member(const std::string &name, const ::ShaderType *type,
                                         ShaderMatPiece &piece, int &offset);
   int cp_dependency(ShaderMatInput inp);
   int cp_size(ShaderMatInput inp, const ::ShaderType *type);
 
 public:
-  void cp_add_mat_spec(ShaderMatSpec &spec);
+  size_t cp_add_mat_part(ShaderMatInput input, const InternalName *arg,
+                         const ShaderType *type, int begin = 0, int end = 1);
   size_t cp_get_mat_cache_size() const;
   size_t cp_get_mat_scratch_size(bool pad_rows) const;
 
@@ -606,6 +604,18 @@ public:
   bool link();
   bool bind_vertex_input(const InternalName *name, const ::ShaderType *type, int location);
   bool bind_parameter(const Parameter &parameter);
+  bool bind_parameter(const Parameter &parameter, ShaderMatInput part,
+                      const InternalName *arg = nullptr,
+                      int index = 0, int offset = 0);
+  bool bind_parameter_xform(const Parameter &parameter,
+                            ShaderMatInput part0, const InternalName *arg0,
+                            ShaderMatInput part1 = SMO_identity,
+                            const InternalName *arg1 = nullptr,
+                            int index = 0, bool transpose = false,
+                            int offset = 0);
+  bool do_bind_parameter(const Parameter &parameter, ShaderMatFunc func,
+                         ShaderMatPiece piece, int offset = 0, int dep = 0,
+                         size_t cache_offset0 = 0, size_t cache_offset1 = 0);
   bool r_bind_struct_members(const Parameter &param, const InternalName *name,
                              const ::ShaderType::Struct *struct_type,
                              int &location, int &offset);

+ 6 - 0
panda/src/gobj/shaderType.h

@@ -47,6 +47,12 @@ public:
     ST_int,
     ST_uint,
     ST_bool,
+
+#ifdef STDFLOAT_DOUBLE
+    ST_stdfloat = ST_double,
+#else
+    ST_stdfloat = ST_float,
+#endif
   };
 
   enum class Access {

+ 5 - 5
tests/display/test_glsl_shader.py

@@ -785,18 +785,18 @@ def test_glsl_struct_pseudo_light(gsg):
     # Something that looks like a named light source, but isn't one at all
     preamble = """
     struct FakeLightParameters {
-      vec4 color;
       vec4 specular;
+      vec4 position;
     };
     uniform FakeLightParameters test;
     """
     code = """
-    assert(test.color == vec4(1, 2, 3, 4));
-    assert(test.specular == vec4(5, 6, 7, 8));
+    assert(test.specular == vec4(1, 2, 3, 4));
+    assert(test.position == vec4(5, 6, 7, 8));
     """
     run_glsl_test(gsg, code, preamble, {
-        'test.color': (1, 2, 3, 4),
-        'test.specular': (5, 6, 7, 8),
+        'test.specular': (1, 2, 3, 4),
+        'test.position': (5, 6, 7, 8),
     })
 
 

Some files were not shown because too many files changed in this diff