Browse Source

More work in progress.

aignacio_sf 20 years ago
parent
commit
3e8cd1e273
2 changed files with 256 additions and 77 deletions
  1. 248 74
      panda/src/dxgsg9/dxShaderContext9.cxx
  2. 8 3
      panda/src/dxgsg9/dxShaderContext9.h

+ 248 - 74
panda/src/dxgsg9/dxShaderContext9.cxx

@@ -33,26 +33,26 @@ CLP(ShaderContext)(ShaderExpansion *s, GSG *gsg) : ShaderContext(s) {
 
 #ifdef HAVE_CGDX9
 
-  dxgsg9_cat.debug ( ) << "SHADER: Create ShaderContext \n";
+  DBG_SH1  dxgsg9_cat.debug ( ) << "SHADER: Create ShaderContext \n"; DBG_E
 
-  _cg_context = (CGcontext)0;
+//  _cg_context = (CGcontext)0;
   _cg_profile[SHADER_type_vert] = CG_PROFILE_UNKNOWN;
   _cg_profile[SHADER_type_frag] = CG_PROFILE_UNKNOWN;
   _cg_program[SHADER_type_vert] = (CGprogram)0;
   _cg_program[SHADER_type_frag] = (CGprogram)0;
 
   if (header == "//Cg") {
-    // Create the Cg context.
-    _cg_context = cgCreateContext();
-    if (_cg_context == 0) {
+
+    // CGcontext is created once during Reset ( )
+
+    if (gsg -> _cg_context == 0) {
       release_resources();
       cerr << "Cg not supported by this video card.\n";
       return;
     }
 
-cgD3D9SetDevice(gsg -> _d3d_device);
 
-// IGNORE THIS FOR NOW, SEEMS TO BE LOADING IN API SPECIFIC PROFILES
+// IGNORE THIS FOR NOW, SEEMS TO BE LOADING IN GL SPECIFIC PROFILES
 if (false)
 {
     // Parse any directives in the source.
@@ -83,13 +83,14 @@ if (false)
       return;
     }
 
+this -> _name = s->get_name ( );
+
     // Compile the program.
     try_cg_compile(s, gsg);
     cerr << _cg_errors;
     return;
   }
 #endif
-
   cerr << s->get_name() << ": unrecognized shader language " << header << "\n";
 }
 
@@ -176,15 +177,15 @@ try_cg_compile(ShaderExpansion *s, GSG *gsg)
 
   cgGetError();
   _cg_program[0] =
-    cgCreateProgram(_cg_context, CG_SOURCE, s->_text.c_str(),
+    cgCreateProgram(gsg -> _cg_context, CG_SOURCE, s->_text.c_str(),
                     _cg_profile[0], "vshader", (const char**)NULL);
-  print_cg_compile_errors(s->get_name(), _cg_context);
+  print_cg_compile_errors(s->get_name(), gsg -> _cg_context);
 
   cgGetError();
   _cg_program[1] =
-    cgCreateProgram(_cg_context, CG_SOURCE, s->_text.c_str(),
+    cgCreateProgram(gsg -> _cg_context, CG_SOURCE, s->_text.c_str(),
                     _cg_profile[1], "fshader", (const char**)NULL);
-  print_cg_compile_errors(s->get_name(), _cg_context);
+  print_cg_compile_errors(s->get_name(), gsg -> _cg_context);
 
   if ((_cg_program[SHADER_type_vert]==0)||(_cg_program[SHADER_type_frag]==0)) {
     release_resources();
@@ -198,6 +199,9 @@ try_cg_compile(ShaderExpansion *s, GSG *gsg)
   // omission on nvidia's part.  The following code fetches the output listing,
   // detects the error, repairs the code, and resumbits the repaired code to Cg.
   if ((_cg_profile[1] == CG_PROFILE_ARBFP1) && (gsg->get_supports_shadow_filter ( ))) {
+
+    DBG_SH1  dxgsg9_cat.debug ( ) << "SHADER COMPILE HACK\n"; DBG_E
+
     bool shadowunit[32];
     bool anyshadow = false;
     memset(shadowunit, 0, sizeof(shadowunit));
@@ -253,9 +257,9 @@ try_cg_compile(ShaderExpansion *s, GSG *gsg)
       }
       cgDestroyProgram(_cg_program[1]);
       _cg_program[1] =
-        cgCreateProgram(_cg_context, CG_OBJECT, result.c_str(),
+        cgCreateProgram(gsg -> _cg_context, CG_OBJECT, result.c_str(),
                         _cg_profile[1], "fshader", (const char**)NULL);
-      print_cg_compile_errors(s->get_name(), _cg_context);
+      print_cg_compile_errors(s->get_name(), gsg -> _cg_context);
       if (_cg_program[SHADER_type_frag]==0) {
         release_resources();
         return false;
@@ -281,7 +285,7 @@ try_cg_compile(ShaderExpansion *s, GSG *gsg)
   DWORD assembly_flags;
 
 // ?????
-  paramater_shadowing = !TRUE;
+  paramater_shadowing = FALSE;
   assembly_flags = 0;
 
   cgD3D9LoadProgram(_cg_program[SHADER_type_vert], paramater_shadowing, assembly_flags);
@@ -291,7 +295,7 @@ try_cg_compile(ShaderExpansion *s, GSG *gsg)
     + cgGetProfileString(_cg_profile[SHADER_type_vert]) + " "
     + cgGetProfileString(_cg_profile[SHADER_type_frag]) + "\n";
 
-  dxgsg9_cat.debug ( ) << "SHADER: try_cg_compile \n";
+  DBG_SH1  dxgsg9_cat.debug ( ) << "SHADER: try_cg_compile \n"; DBG_E
 
   return true;
 }
@@ -316,9 +320,7 @@ CLP(ShaderContext)::
 void CLP(ShaderContext)::
 release_resources() {
 #ifdef HAVE_CGDX9
-  if (_cg_context) {
-    cgDestroyContext(_cg_context);
-    _cg_context = (CGcontext)0;
+  {
     _cg_profile[SHADER_type_vert] = (CGprofile)0;
     _cg_profile[SHADER_type_frag] = (CGprofile)0;
     _cg_program[SHADER_type_vert] = (CGprogram)0;
@@ -337,9 +339,9 @@ release_resources() {
 void CLP(ShaderContext)::
 bind(GSG *gsg) {
 #ifdef HAVE_CGDX9
-  if (_cg_context != 0) {
+  if (gsg -> _cg_context != 0) {
 
-dxgsg9_cat.debug ( ) << "SHADER: bind \n";
+    DBG_SH5  dxgsg9_cat.debug ( ) << "SHADER: bind \n";  DBG_E
 
     // clear the last cached FVF to make sure the next SetFVF call goes through
     gsg -> _last_fvf = 0;
@@ -380,17 +382,18 @@ dxgsg9_cat.debug ( ) << "SHADER: bind \n";
         << D3DERRORSTRING(hr);
     }
 
-dxgsg9_cat.debug ( )
-  << "SHADER: V "
-  << vertex_shader
-  << " P "
-  << pixel_shader
-  << " CG VS"
-  << _cg_program[SHADER_type_vert]
-  << " CG PS"
-  << _cg_program[SHADER_type_frag]
-  << "\n";
-
+    DBG_SH5  dxgsg9_cat.debug ( )
+      << this -> _name
+      << "\nSHADER: V "
+      << vertex_shader
+      << " P "
+      << pixel_shader
+      << " CG VS"
+      << _cg_program[SHADER_type_vert]
+      << " CG PS"
+      << _cg_program[SHADER_type_frag]
+      << "\n";
+    DBG_E
   }
 #endif
 }
@@ -404,7 +407,7 @@ void CLP(ShaderContext)::
 unbind(GSG *gsg)
 {
 #ifdef HAVE_CGDX9
-  if (_cg_context != 0) {
+  if (gsg -> _cg_context != 0) {
 // ?????    cgD3D9DisableProfile(_cg_profile[SHADER_type_vert]);
 // ?????    cgD3D9DisableProfile(_cg_profile[SHADER_type_frag]);
     HRESULT hr;
@@ -422,7 +425,7 @@ unbind(GSG *gsg)
         << D3DERRORSTRING(hr);
     }
 
-dxgsg9_cat.debug ( ) << "SHADER: unbind \n";
+    DBG_SH5  dxgsg9_cat.debug ( ) << "SHADER: unbind \n"; DBG_E
 
   }
 #endif
@@ -442,6 +445,11 @@ issue_cg_auto_bind(const ShaderAutoBind &bind, GSG *gsg)
   LMatrix4f temp_matrix;
 
   CGparameter p = bind.parameter;
+
+  HRESULT hr;
+
+  DBG_SH1  dxgsg9_cat.debug ( ) << "SHADER: issue_cg_auto_bind " << bind.value << "\n"; DBG_E
+
   switch(bind.value) {
   case SIC_mat_modelview:
   case SIC_inv_modelview:
@@ -471,13 +479,23 @@ issue_cg_auto_bind(const ShaderAutoBind &bind, GSG *gsg)
     {
       case CG_GL_MODELVIEW_MATRIX:
 
-// which one ?????
-p_matrix = &(gsg -> _external_transform -> get_mat ( ));
+// SHADER ISSUE: which matrix ?????
+//p_matrix = &(gsg -> _external_transform -> get_mat ( ));
 p_matrix = &(gsg -> _internal_transform -> get_mat ( ));
 
+// SHADER ISSUE: ***** DX_TRANSPOSE REQUIRED FOR COMPATIBILITY
+        temp_matrix.transpose_from (*p_matrix);
+        p_matrix = &temp_matrix;
+
         break;
       case CG_GL_PROJECTION_MATRIX:
+
         p_matrix = &gsg->_projection_mat;
+
+// SHADER ISSUE: ***** DX_TRANSPOSE REQUIRED FOR COMPATIBILITY
+        temp_matrix.transpose_from (*p_matrix);
+        p_matrix = &temp_matrix;
+
         break;
       case CG_GL_TEXTURE_MATRIX:
 
@@ -485,25 +503,99 @@ p_matrix = &(gsg -> _internal_transform -> get_mat ( ));
 
         tex_matrix_attrib = gsg->_state._tex_matrix;
 
-// using default ?????
+// SHADER ISSUE: using default ????? GL texture matrix = which DX texture matrix ?????
 p_matrix = &(tex_matrix_attrib -> get_mat ( ));
 
+// SHADER ISSUE: ***** DX_TRANSPOSE REQUIRED FOR COMPATIBILITY
+        temp_matrix.transpose_from (*p_matrix);
+        p_matrix = &temp_matrix;
+
         break;
       case CG_GL_MODELVIEW_PROJECTION_MATRIX:
 
         const LMatrix4f *model_matrix;
         const LMatrix4f *projection_matrix;
 
-// which one ?????
-model_matrix = &(gsg -> _external_transform -> get_mat ( ));
-model_matrix = &(gsg -> _internal_transform -> get_mat ( ));
+DBG_SH4  dxgsg9_cat.debug ( ) << "SHADER: issue_cg_auto_bind CG_GL_MODELVIEW_PROJECTION_MATRIX " << bind.value << "\n"; DBG_E
 
         projection_matrix = &gsg->_projection_mat;
 
-// which one ?????
-// temp_matrix.multiply (*projection_matrix, *model_matrix);
-temp_matrix.multiply (*model_matrix, *projection_matrix);
+// which matrix ?????
+// which multiply order ?????
+        static int state = 3;
+        switch (state & 0x03)
+        {
+          case 0:
+            model_matrix = &(gsg -> _external_transform -> get_mat ( ));
+            temp_matrix.multiply (*projection_matrix, *model_matrix);
+            break;
+          case 1:
+            model_matrix = &(gsg -> _internal_transform -> get_mat ( ));
+            temp_matrix.multiply (*projection_matrix, *model_matrix);
+            break;
+          case 2:
+            model_matrix = &(gsg -> _external_transform -> get_mat ( ));
+            temp_matrix.multiply (*model_matrix, *projection_matrix);
+            break;
+          case 3:
+            model_matrix = &(gsg -> _internal_transform -> get_mat ( ));
+            temp_matrix.multiply (*model_matrix, *projection_matrix);
+            break;
+        }
+
+DBG_SH4
+    const float *data;
+    data = model_matrix -> get_data ( );
+    dxgsg9_cat.debug ( ) << "MODELVIEW MATRIX \n" <<
+      data[ 0] << " " << data[ 1] << " " << data[ 2] << " " << data[ 3] << "\n" <<
+      data[ 4] << " " << data[ 5] << " " << data[ 6] << " " << data[ 7] << "\n" <<
+      data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
+      data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
+
+    model_matrix = &(gsg -> _external_transform -> get_mat ( ));
+    data = model_matrix -> get_data ( );
+    dxgsg9_cat.debug ( ) << "EXTERNAL MODELVIEW MATRIX \n" <<
+      data[ 0] << " " << data[ 1] << " " << data[ 2] << " " << data[ 3] << "\n" <<
+      data[ 4] << " " << data[ 5] << " " << data[ 6] << " " << data[ 7] << "\n" <<
+      data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
+      data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
+
+    data = projection_matrix -> get_data ( );
+    dxgsg9_cat.debug ( ) << "PROJECTION MATRIX \n" <<
+      data[ 0] << " " << data[ 1] << " " << data[ 2] << " " << data[ 3] << "\n" <<
+      data[ 4] << " " << data[ 5] << " " << data[ 6] << " " << data[ 7] << "\n" <<
+      data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
+      data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
+
+    D3DMATRIX d3d_matrix;
+
+    data = &d3d_matrix._11;
+
+    gsg -> _d3d_device -> GetTransform (D3DTS_WORLDMATRIX(0), &d3d_matrix);
+    dxgsg9_cat.debug ( ) << "D3DTS_WORLDMATRIX(0) \n" <<
+      data[ 0] << " " << data[ 1] << " " << data[ 2] << " " << data[ 3] << "\n" <<
+      data[ 4] << " " << data[ 5] << " " << data[ 6] << " " << data[ 7] << "\n" <<
+      data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
+      data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
+DBG_E
 
+/*
+gsg -> _d3d_device -> GetTransform (D3DTS_WORLDMATRIX(1), &d3d_matrix);
+    dxgsg9_cat.debug ( ) << "D3DTS_WORLDMATRIX(1) \n" <<
+      data[ 0] << " " << data[ 1] << " " << data[ 2] << " " << data[ 3] << "\n" <<
+      data[ 4] << " " << data[ 5] << " " << data[ 6] << " " << data[ 7] << "\n" <<
+      data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
+      data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
+gsg -> _d3d_device -> GetTransform (D3DTS_WORLDMATRIX(2), &d3d_matrix);
+    dxgsg9_cat.debug ( ) << "D3DTS_WORLDMATRIX(2) \n" <<
+      data[ 0] << " " << data[ 1] << " " << data[ 2] << " " << data[ 3] << "\n" <<
+      data[ 4] << " " << data[ 5] << " " << data[ 6] << " " << data[ 7] << "\n" <<
+      data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
+      data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
+*/
+
+// SHADER ISSUE: ***** DX_TRANSPOSE REQUIRED FOR COMPATIBILITY
+        temp_matrix.transpose_in_place ( );
         p_matrix = &temp_matrix;
         break;
     }
@@ -527,21 +619,61 @@ temp_matrix.multiply (*model_matrix, *projection_matrix);
         p_matrix = &matrix;
         break;
     }
-    cgD3D9SetUniformArray (p, 0, 16, p_matrix -> get_data ( ));
+
+    hr = cgD3D9SetUniform (p, p_matrix -> get_data ( ));
+    if (FAILED (hr)) {
+      dxgsg9_cat.error()
+        << "cgD3D9SetUniform "
+        << bind.value << " failed "
+        << " size " << cgD3D9TypeToSize(cgGetParameterType(p))
+        << D3DERRORSTRING(hr);
+
+        switch (hr)
+        {
+          case CGD3D9ERR_INVALIDPARAM:
+            dxgsg9_cat.error() << "CGD3D9ERR_INVALIDPARAM\n";
+            break;
+          case CGD3D9ERR_NODEVICE:
+            dxgsg9_cat.error() << "CGD3D9ERR_NODEVICE\n";
+            break;
+          case CGD3D9ERR_NOTLOADED:
+            dxgsg9_cat.error() << "CGD3D9ERR_NOTLOADED\n";
+            break;
+          case CGD3D9ERR_NOTUNIFORM:
+            dxgsg9_cat.error() << "CGD3D9ERR_NOTUNIFORM\n";
+            break;
+          case CGD3D9ERR_NULLVALUE:
+            dxgsg9_cat.error() << "CGD3D9ERR_NULLVALUE\n";
+            break;
+          case CGD3D9ERR_OUTOFRANGE:
+            dxgsg9_cat.error() << "CGD3D9ERR_OUTOFRANGE\n";
+            break;
+        }
+    }
     return;
   case SIC_sys_windowsize:
     t[0] = gsg->get_current_display_region ( )->get_pixel_width();
     t[1] = gsg->get_current_display_region ( )->get_pixel_height();
     t[2] = 1;
     t[3] = 1;
-    cgD3D9SetUniformArray (p, 0, 4, t.get_data());
+    hr = cgD3D9SetUniform (p, t.get_data());
+    if (FAILED (hr)) {
+      dxgsg9_cat.error()
+        << "cgD3D9SetUniform " << bind.value << " failed "
+        << D3DERRORSTRING(hr);
+    }
     return;
   case SIC_sys_pixelsize:
     t[0] = 1.0 / gsg->get_current_display_region ( )->get_pixel_width();
     t[1] = 1.0 / gsg->get_current_display_region ( )->get_pixel_height();
     t[2] = 1;
     t[3] = 1;
-    cgD3D9SetUniformArray (p, 0, 4, t.get_data());
+    hr = cgD3D9SetUniform (p, t.get_data());
+    if (FAILED (hr)) {
+      dxgsg9_cat.error()
+        << "cgD3D9SetUniform " << bind.value << " failed "
+        << D3DERRORSTRING(hr);
+    }
     return;
   case SIC_sys_cardcenter:
     px = gsg->get_current_display_region ( )->get_pixel_width();
@@ -552,7 +684,12 @@ temp_matrix.multiply (*model_matrix, *projection_matrix);
     t[1] = yhi*0.5;
     t[2] = 1;
     t[3] = 1;
-    cgD3D9SetUniformArray (p, 0, 4, t.get_data());
+    hr = cgD3D9SetUniform (p, t.get_data());
+    if (FAILED (hr)) {
+      dxgsg9_cat.error()
+        << "cgD3D9SetUniform " << bind.value << " failed "
+        << D3DERRORSTRING(hr);
+    }
     return;
   }
 }
@@ -570,13 +707,18 @@ void CLP(ShaderContext)::
 issue_parameters(GSG *gsg)
 {
 #ifdef HAVE_CGDX9
-  if (_cg_context != 0) {
+
+DBG_SH3  dxgsg9_cat.debug ( ) << "SHADER: issue_parameters\n"; DBG_E
+
+  if (gsg -> _cg_context != 0) {
     // Pass in k-float parameters.
     for (int i=0; i<(int)_cg_fbind.size(); i++) {
       InternalName *id = _cg_fbind[i].name;
       const ShaderInput *input = gsg->_target._shader->get_shader_input(id);
-//      cgD3D9SetParameter4fv(_cg_fbind[i].parameter, input->get_vector().get_data());
-      cgD3D9SetUniformArray (_cg_fbind[i].parameter, 0, 4, input->get_vector().get_data());
+
+DBG_SH3  dxgsg9_cat.debug ( ) << "SHADER: issue_parameters, _cg_fbind \n"; DBG_E
+
+      cgD3D9SetUniform (_cg_fbind[i].parameter, input->get_vector().get_data());
     }
 
     // Pass in k-float4x4 parameters.
@@ -587,7 +729,9 @@ issue_parameters(GSG *gsg)
       if (input->get_nodepath().is_empty()) {
         dat = LMatrix4f::ident_mat().get_data();
 
-        cgD3D9SetUniformArray (_cg_npbind[i].parameter, 0, 16, dat);
+DBG_SH3  dxgsg9_cat.debug ( ) << "SHADER: issue_parameters, _cg_npbind \n"; DBG_E
+
+        cgD3D9SetUniform (_cg_npbind[i].parameter, dat);
 
       } else {
         dat = input->get_nodepath().node()->get_transform()->get_mat().get_data();
@@ -611,10 +755,10 @@ issue_parameters(GSG *gsg)
         matrix [14] = dat[11];
         matrix [15] = dat[15];
 
-        cgD3D9SetUniformArray (_cg_npbind[i].parameter, 0, 16, matrix);
-      }
+DBG_SH3  dxgsg9_cat.debug ( ) << "SHADER: issue_parameters, _cg_npbind 2 \n"; DBG_E
 
-//      cgD3D9SetMatrixParameterfc(_cg_npbind[i].parameter, dat);
+        cgD3D9SetUniform (_cg_npbind[i].parameter, matrix);
+      }
     }
 
     // Pass in system parameters
@@ -624,6 +768,9 @@ issue_parameters(GSG *gsg)
 
     // Pass in trans,tpose,row,col,xvec,yvec,zvec,pos parameters
     for (int i=0; i<(int)_cg_parameter_bind.size(); i++) {
+
+DBG_SH3  dxgsg9_cat.debug ( ) << "SHADER: issue_parameters, _cg_parameter_bind \n"; DBG_E
+
       bind_cg_transform(_cg_parameter_bind[i], gsg);
     }
   }
@@ -643,7 +790,7 @@ void CLP(ShaderContext)::
 issue_transform(GSG *gsg)
 {
 #ifdef HAVE_CGDX9
-  if (_cg_context != 0) {
+  if (gsg -> _cg_context != 0) {
     // Pass in modelview, projection, etc.
     for (int i=0; i<(int)_cg_auto_trans.size(); i++) {
       issue_cg_auto_bind(_cg_auto_trans[i], gsg);
@@ -665,9 +812,12 @@ void CLP(ShaderContext)::
 disable_shader_vertex_arrays(GSG *gsg)
 {
 #ifdef HAVE_CGDX9
-  if (_cg_context) {
+  if (gsg -> _cg_context) {
     for (int i=0; i<(int)_cg_varying.size(); i++) {
-// ?????      cgD3D9DisableClientState(_cg_varying[i].parameter);
+
+// ORIGINAL GL CODE: NO EQUIVALENT IN DX
+//    cgGLDisableClientState(_cg_varying[i].parameter);
+
     }
   }
 #endif
@@ -689,7 +839,10 @@ update_shader_vertex_arrays(CLP(ShaderContext) *prev, GSG *gsg)
 {
   if (prev) prev->disable_shader_vertex_arrays(gsg);
 #ifdef HAVE_CGDX9
-  if (_cg_context) {
+  if (gsg -> _cg_context) {
+
+// RETURN
+//return;
 
 /* ?????
 #ifdef SUPPORT_IMMEDIATE_MODE
@@ -704,6 +857,9 @@ update_shader_vertex_arrays(CLP(ShaderContext) *prev, GSG *gsg)
       Geom::NumericType numeric_type;
       int start, stride, num_values;
       int nvarying = _cg_varying.size();
+
+DBG_SH1  dxgsg9_cat.debug ( ) << "SHADER: update_shader_vertex_arrays: nvarying " << nvarying <<  "\n"; DBG_E
+
       for (int i=0; i<nvarying; i++) {
         InternalName *name = _cg_varying[i].name;
         int texslot = _cg_varying[i].append_uv;
@@ -722,6 +878,8 @@ update_shader_vertex_arrays(CLP(ShaderContext) *prev, GSG *gsg)
         }
         if (gsg->_vertex_data->get_array_info(name, array_data, num_values,
               numeric_type, start, stride)) {
+
+
 // ?????
 /*
           const unsigned char *client_pointer = gsg->setup_array_data(array_data);
@@ -731,16 +889,25 @@ update_shader_vertex_arrays(CLP(ShaderContext) *prev, GSG *gsg)
 */
 
 // Set DirectX Vertex Declaration
-
+/*
   HRESULT hr;
   IDirect3DVertexDeclaration9 *vertex_declaration;
 
 
 vertex_declaration = 0;
+*/
 
-dxgsg9_cat.debug ( ) << "SHADER: update_shader_vertex_arrays \n";
+    DBG_SH1  dxgsg9_cat.debug ( ) << "SHADER: update_shader_vertex_arrays " << i <<  "\n"; DBG_E
 
+    DBG_SH1  dxgsg9_cat.debug ( )
+      << "\n  name " << name -> get_name ( )
+      << "  num_values " << num_values
+      << "  numeric_type " << numeric_type
+      << "  start " << start
+      << "  stride " << stride
+      << "\n"; DBG_E
 
+/*
   hr = gsg -> _d3d_device -> SetVertexDeclaration (vertex_declaration);
   if (FAILED (hr)) {
     dxgsg9_cat.error()
@@ -765,6 +932,7 @@ stride = 0;
       << "SetStreamSource failed "
       << D3DERRORSTRING(hr);
   }
+*/
 
 // ?????          cgD3D9EnableClientState(_cg_varying[i].parameter);
         } else {
@@ -785,7 +953,7 @@ void CLP(ShaderContext)::
 disable_shader_texture_bindings(GSG *gsg)
 {
 #ifdef HAVE_CGDX9
-  if (_cg_context) {
+  if (gsg -> _cg_context) {
     for (int i=0; i<(int)_cg_texbind.size(); i++) {
       int texunit = cgGetParameterResourceIndex(_cg_texbind[i].parameter);
 
@@ -802,6 +970,8 @@ disable_shader_texture_bindings(GSG *gsg)
       // This is probably faster - but maybe not as safe?
       // cgD3D9DisableTextureParameter(_cg_texbind[i].parameter);
 */
+
+// NOT SURE IF THIS IS CORRECT FROM GL TO DX
       HRESULT hr;
 
       hr = gsg -> _d3d_device -> SetTexture (texunit, NULL);
@@ -833,7 +1003,7 @@ update_shader_texture_bindings(CLP(ShaderContext) *prev, GSG *gsg)
 {
   if (prev) prev->disable_shader_texture_bindings(gsg);
 #ifdef HAVE_CGDX9
-  if (_cg_context) {
+  if (gsg -> _cg_context) {
     for (int i=0; i<(int)_cg_texbind.size(); i++) {
       Texture *tex = 0;
       InternalName *id = _cg_texbind[i].name;
@@ -862,6 +1032,8 @@ update_shader_texture_bindings(CLP(ShaderContext) *prev, GSG *gsg)
         continue;
       }
       int texunit = cgGetParameterResourceIndex(_cg_texbind[i].parameter);
+
+// ?????
 /*
       gsg->_glActiveTexture(GL_TEXTURE0 + texunit);
 
@@ -872,6 +1044,7 @@ update_shader_texture_bindings(CLP(ShaderContext) *prev, GSG *gsg)
       }
       GLP(Enable)(target);
 */
+// NOT SURE IF THIS IS CORRECT FROM GL TO DX
       gsg->apply_texture(texunit, tc);
     }
   }
@@ -960,6 +1133,9 @@ bind_cg_transform(const ShaderTransBind &stb, GSG *gsg)
   //    data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
   //    data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
 
+
+  DBG_SH4  dxgsg9_cat.debug ( ) << "bind_cg_transform " << stb.trans_piece << "\n"; DBG_E
+
   data = total->get_mat().get_data();
   switch (stb.trans_piece) {
 /*
@@ -979,7 +1155,7 @@ bind_cg_transform(const ShaderTransBind &stb, GSG *gsg)
     float matrix [16];
 
     case SHADER_data_matrix:
-      cgD3D9SetUniformArray (stb.parameter, 0, 16, data);
+      cgD3D9SetUniform (stb.parameter, data);
       break;
     case SHADER_data_transpose:
       matrix [0] = data[0];
@@ -998,47 +1174,47 @@ bind_cg_transform(const ShaderTransBind &stb, GSG *gsg)
       matrix [13] = data[7];
       matrix [14] = data[11];
       matrix [15] = data[15];
-      cgD3D9SetUniformArray (stb.parameter, 0, 16, matrix);
+      cgD3D9SetUniform (stb.parameter, matrix);
       break;
     case SHADER_data_row0:
-      cgD3D9SetUniformArray (stb.parameter, 0, 4, data);
+      cgD3D9SetUniform (stb.parameter, data);
       break;
     case SHADER_data_row1:
-      cgD3D9SetUniformArray (stb.parameter, 0, 4, data + 4);
+      cgD3D9SetUniform (stb.parameter, data + 4);
       break;
     case SHADER_data_row2:
-      cgD3D9SetUniformArray (stb.parameter, 0, 4, data + 8);
+      cgD3D9SetUniform (stb.parameter, data + 8);
       break;
     case SHADER_data_row3:
-      cgD3D9SetUniformArray (stb.parameter, 0, 4, data + 12);
+      cgD3D9SetUniform (stb.parameter, data + 12);
       break;
     case SHADER_data_col0:
       vector [0] = data[0];
       vector [1] = data[4];
       vector [2] = data[8];
       vector [3] = data[12];
-      cgD3D9SetUniformArray (stb.parameter, 0, 4, vector);
+      cgD3D9SetUniform (stb.parameter, vector);
       break;
     case SHADER_data_col1:
       vector [0] = data[1];
       vector [1] = data[5];
       vector [2] = data[9];
       vector [3] = data[13];
-      cgD3D9SetUniformArray (stb.parameter, 0, 4, vector);
+      cgD3D9SetUniform (stb.parameter, vector);
       break;
     case SHADER_data_col2:
       vector [0] = data[2];
       vector [1] = data[6];
       vector [2] = data[10];
       vector [3] = data[14];
-      cgD3D9SetUniformArray (stb.parameter, 0, 4, vector);
+      cgD3D9SetUniform (stb.parameter, vector);
       break;
     case SHADER_data_col3:
       vector [0] = data[3];
       vector [1] = data[7];
       vector [2] = data[11];
       vector [3] = data[15];
-      cgD3D9SetUniformArray (stb.parameter, 0, 4, vector);
+      cgD3D9SetUniform (stb.parameter, vector);
       break;
   }
 }
@@ -1552,5 +1728,3 @@ compile_cg_parameter(CGparameter p)
   return false;
 }
 #endif
-
-

+ 8 - 3
panda/src/dxgsg9/dxShaderContext9.h

@@ -46,14 +46,15 @@ class CLP(GraphicsStateGuardian);
 // Description : xyz
 ////////////////////////////////////////////////////////////////////
 
+typedef CLP(GraphicsStateGuardian) GSG;
+
 class EXPCL_PANDADX CLP(ShaderContext): public ShaderContext {
 public:
-  typedef CLP(GraphicsStateGuardian) GSG;
 
   CLP(ShaderContext)(ShaderExpansion *s, GSG *gsg);
   ~CLP(ShaderContext)();
 
-  INLINE bool valid(void);
+  INLINE bool valid(GSG *gsg);
   void bind(GSG *gsg);
   void unbind(GSG *gsg);
   void issue_parameters(GSG *gsg);
@@ -63,6 +64,9 @@ public:
   void disable_shader_texture_bindings(GSG *gsg);
   void update_shader_texture_bindings(CLP(ShaderContext) *prev, GSG *gsg);
 
+  // FOR DEBUGGING
+  string _name;
+
 private:
 
 #ifdef HAVE_CGDX9
@@ -116,7 +120,8 @@ private:
     PT(InternalName) name;
     int append_uv;
   };
-  CGcontext _cg_context;
+
+//  CGcontext _cg_context;
   CGprofile _cg_profile[2];
   CGprogram _cg_program[2];
   string    _cg_errors;