From 67c413f089ed79d5cf590c79f5bd2043a029c26d Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 13 Jan 2023 19:19:16 +0100 Subject: [PATCH] dxgsg9: Fix issues setting some kinds of automatic shader inputs --- panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx | 20 ++++++------- panda/src/dxgsg9/dxShaderContext9.cxx | 28 +++++++++++++++++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx index 963cf96141..b4e2834a00 100644 --- a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx +++ b/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; } diff --git a/panda/src/dxgsg9/dxShaderContext9.cxx b/panda/src/dxgsg9/dxShaderContext9.cxx index a737c342bf..bd3dec1bc0 100644 --- a/panda/src/dxgsg9/dxShaderContext9.cxx +++ b/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";