Browse Source

dxgsg9: Fix issues setting some kinds of automatic shader inputs

rdb 2 years ago
parent
commit
67c413f089
2 changed files with 38 additions and 10 deletions
  1. 10 10
      panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx
  2. 28 0
      panda/src/dxgsg9/dxShaderContext9.cxx

+ 10 - 10
panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx

@@ -3139,6 +3139,7 @@ set_state_and_transform(const RenderState *target,
   }
   _target_rs = target;
 
+  int shader_deps = 0;
   determine_target_shader();
 
   int alpha_test_slot = AlphaTestAttrib::get_class_slot();
@@ -3168,10 +3169,7 @@ set_state_and_transform(const RenderState *target,
     do_issue_color_scale();
     _state_mask.set_bit(color_slot);
     _state_mask.set_bit(color_scale_slot);
-    if (_current_shader_context) {
-      _current_shader_context->issue_parameters(this, Shader::SSD_color);
-      _current_shader_context->issue_parameters(this, Shader::SSD_colorscale);
-    }
+    shader_deps |= Shader::SSD_color | Shader::SSD_colorscale;
   }
 
   int cull_face_slot = CullFaceAttrib::get_class_slot();
@@ -3212,6 +3210,7 @@ set_state_and_transform(const RenderState *target,
     // PStatTimer timer(_draw_set_state_render_mode_pcollector);
     do_issue_render_mode();
     _state_mask.set_bit(render_mode_slot);
+    shader_deps |= Shader::SSD_render_mode;
   }
 
   int rescale_normal_slot = RescaleNormalAttrib::get_class_slot();
@@ -3272,6 +3271,7 @@ set_state_and_transform(const RenderState *target,
     _state_mask.set_bit(texture_slot);
     _state_mask.set_bit(tex_matrix_slot);
     _state_mask.set_bit(tex_gen_slot);
+    shader_deps |= Shader::SSD_tex_matrix | Shader::SSD_tex_gen;
   }
 
   int material_slot = MaterialAttrib::get_class_slot();
@@ -3280,9 +3280,7 @@ set_state_and_transform(const RenderState *target,
     // PStatTimer timer(_draw_set_state_material_pcollector);
     do_issue_material();
     _state_mask.set_bit(material_slot);
-    if (_current_shader_context) {
-      _current_shader_context->issue_parameters(this, Shader::SSD_material);
-    }
+    shader_deps |= Shader::SSD_material;
   }
 
   int light_slot = LightAttrib::get_class_slot();
@@ -3307,9 +3305,7 @@ set_state_and_transform(const RenderState *target,
     // PStatTimer timer(_draw_set_state_fog_pcollector);
     do_issue_fog();
     _state_mask.set_bit(fog_slot);
-    if (_current_shader_context) {
-      _current_shader_context->issue_parameters(this, Shader::SSD_fog);
-    }
+    shader_deps |= Shader::SSD_fog;
   }
 
   int scissor_slot = ScissorAttrib::get_class_slot();
@@ -3320,6 +3316,10 @@ set_state_and_transform(const RenderState *target,
     _state_mask.set_bit(scissor_slot);
   }
 
+  if (_current_shader_context != nullptr && shader_deps != 0) {
+    _current_shader_context->issue_parameters(this, shader_deps);
+  }
+
   _state_rs = _target_rs;
 }
 

+ 28 - 0
panda/src/dxgsg9/dxShaderContext9.cxx

@@ -245,6 +245,7 @@ issue_parameters(GSG *gsg, int altered) {
           HRESULT hr;
           PN_stdfloat v [4];
           LMatrix4f temp_matrix = LCAST(float, *val);
+          LMatrix3f temp_matrix3;
 
           hr = D3D_OK;
 
@@ -306,6 +307,33 @@ issue_parameters(GSG *gsg, int altered) {
             hr = cgD3D9SetUniform(p, v);
             break;
 
+          case Shader::SMP_upper3x3:
+            // TRANSPOSE REQUIRED
+            temp_matrix3 = temp_matrix.get_upper_3();
+            temp_matrix3.transpose_in_place();
+            data = temp_matrix3.get_data();
+
+            hr = cgD3D9SetUniform(p, data);
+            break;
+
+          case Shader::SMP_transpose3x3:
+            // NO TRANSPOSE REQUIRED
+            temp_matrix3 = temp_matrix.get_upper_3();
+            data = temp_matrix3.get_data();
+
+            hr = cgD3D9SetUniform(p, data);
+            break;
+
+          case Shader::SMP_cell15:
+            hr = cgD3D9SetUniform(p, data + 15);
+            continue;
+          case Shader::SMP_cell14:
+            hr = cgD3D9SetUniform(p, data + 14);
+            continue;
+          case Shader::SMP_cell13:
+            hr = cgD3D9SetUniform(p, data + 13);
+            continue;
+
           default:
             dxgsg9_cat.error()
               << "issue_parameters () SMP parameter type not implemented " << spec._piece << "\n";