From 9a23eea39a4c64bad69d0122778dbefc14e88926 Mon Sep 17 00:00:00 2001 From: aignacio_sf <> Date: Thu, 12 Jan 2006 02:08:07 +0000 Subject: [PATCH] work in progress --- panda/src/dxgsg9/dxShaderContext9.cxx | 117 ++++++++++++++++++++++++-- 1 file changed, 110 insertions(+), 7 deletions(-) diff --git a/panda/src/dxgsg9/dxShaderContext9.cxx b/panda/src/dxgsg9/dxShaderContext9.cxx index 4882d6656c..12050939b4 100644 --- a/panda/src/dxgsg9/dxShaderContext9.cxx +++ b/panda/src/dxgsg9/dxShaderContext9.cxx @@ -32,6 +32,9 @@ CLP(ShaderContext)(ShaderExpansion *s, GSG *gsg) : ShaderContext(s) { s->parse_line(header, true, true); #ifdef HAVE_CGDX9 + + dxgsg9_cat.debug ( ) << "SHADER: Create ShaderContext \n"; + _cg_context = (CGcontext)0; _cg_profile[SHADER_type_vert] = CG_PROFILE_UNKNOWN; _cg_profile[SHADER_type_frag] = CG_PROFILE_UNKNOWN; @@ -47,6 +50,11 @@ CLP(ShaderContext)(ShaderExpansion *s, GSG *gsg) : ShaderContext(s) { return; } +cgD3D9SetDevice(gsg -> _d3d_device); + +// IGNORE THIS FOR NOW, SEEMS TO BE LOADING IN API SPECIFIC PROFILES +if (false) +{ // Parse any directives in the source. string directive; while (!s->parse_eof()) { @@ -57,6 +65,7 @@ CLP(ShaderContext)(ShaderExpansion *s, GSG *gsg) : ShaderContext(s) { suggest_cg_profile(pieces[2], pieces[3]); } } +} // Select a profile if no preferred profile specified in the source. if (_cg_profile[SHADER_type_vert] == CG_PROFILE_UNKNOWN) { @@ -272,7 +281,7 @@ try_cg_compile(ShaderExpansion *s, GSG *gsg) DWORD assembly_flags; // ????? - paramater_shadowing = TRUE; + paramater_shadowing = !TRUE; assembly_flags = 0; cgD3D9LoadProgram(_cg_program[SHADER_type_vert], paramater_shadowing, assembly_flags); @@ -281,6 +290,9 @@ try_cg_compile(ShaderExpansion *s, GSG *gsg) _cg_errors = s->get_name() + ": compiled to " + cgGetProfileString(_cg_profile[SHADER_type_vert]) + " " + cgGetProfileString(_cg_profile[SHADER_type_frag]) + "\n"; + + dxgsg9_cat.debug ( ) << "SHADER: try_cg_compile \n"; + return true; } #endif @@ -327,14 +339,58 @@ bind(GSG *gsg) { #ifdef HAVE_CGDX9 if (_cg_context != 0) { +dxgsg9_cat.debug ( ) << "SHADER: bind \n"; + + // clear the last cached FVF to make sure the next SetFVF call goes through + gsg -> _last_fvf = 0; + // Pass in k-parameters and transform-parameters issue_parameters(gsg); + HRESULT hr; + // Bind the shaders. // ????? cgD3D9EnableProfile(_cg_profile[SHADER_type_vert]); - cgD3D9BindProgram(_cg_program[SHADER_type_vert]); + hr = cgD3D9BindProgram(_cg_program[SHADER_type_vert]); + if (FAILED (hr)) { + dxgsg9_cat.error() + << "cgD3D9BindProgram vertex shader failed\n"; + } // ????? cgD3D9EnableProfile(_cg_profile[SHADER_type_frag]); - cgD3D9BindProgram(_cg_program[SHADER_type_frag]); + hr = cgD3D9BindProgram(_cg_program[SHADER_type_frag]); + if (FAILED (hr)) { + dxgsg9_cat.error() + << "cgD3D9BindProgram pixel shader failed\n"; + } + + + IDirect3DVertexShader9 *vertex_shader; + IDirect3DPixelShader9 *pixel_shader; + + hr = gsg -> _d3d_device -> GetVertexShader (&vertex_shader); + if (FAILED (hr)) { + dxgsg9_cat.error() + << "GetVertexShader ( ) failed " + << D3DERRORSTRING(hr); + } + hr = gsg -> _d3d_device -> GetPixelShader (&pixel_shader); + if (FAILED (hr)) { + dxgsg9_cat.error() + << "GetPixelShader ( ) failed " + << 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"; + } #endif } @@ -345,12 +401,29 @@ bind(GSG *gsg) { // Description: This function disables a currently-bound shader. //////////////////////////////////////////////////////////////////// void CLP(ShaderContext):: -unbind() +unbind(GSG *gsg) { #ifdef HAVE_CGDX9 if (_cg_context != 0) { // ????? cgD3D9DisableProfile(_cg_profile[SHADER_type_vert]); // ????? cgD3D9DisableProfile(_cg_profile[SHADER_type_frag]); + HRESULT hr; + + hr = gsg -> _d3d_device -> SetVertexShader (NULL); + if (FAILED (hr)) { + dxgsg9_cat.error() + << "SetVertexShader (NULL) failed " + << D3DERRORSTRING(hr); + } + hr = gsg -> _d3d_device -> SetPixelShader (NULL); + if (FAILED (hr)) { + dxgsg9_cat.error() + << "SetPixelShader (NULL) failed " + << D3DERRORSTRING(hr); + } + +dxgsg9_cat.debug ( ) << "SHADER: unbind \n"; + } #endif } @@ -665,11 +738,32 @@ update_shader_vertex_arrays(CLP(ShaderContext) *prev, GSG *gsg) vertex_declaration = 0; +dxgsg9_cat.debug ( ) << "SHADER: update_shader_vertex_arrays \n"; + hr = gsg -> _d3d_device -> SetVertexDeclaration (vertex_declaration); - if (SUCCEEDED (hr)) - { + if (FAILED (hr)) { + dxgsg9_cat.error() + << "SetVertexDeclaration failed " + << D3DERRORSTRING(hr); + } + + UINT stream_number; + IDirect3DVertexBuffer9 *vertex_buffer; + UINT offset; + UINT stride; + +stream_number = 0; +vertex_buffer = 0; +offset = 0; +stride = 0; + + hr = gsg -> _d3d_device -> SetStreamSource (stream_number, vertex_buffer, offset, stride); + if (FAILED (hr)) { + dxgsg9_cat.error() + << "SetStreamSource failed " + << D3DERRORSTRING(hr); } // ????? cgD3D9EnableClientState(_cg_varying[i].parameter); @@ -708,7 +802,16 @@ disable_shader_texture_bindings(GSG *gsg) // This is probably faster - but maybe not as safe? // cgD3D9DisableTextureParameter(_cg_texbind[i].parameter); */ - gsg -> _d3d_device -> SetTexture (texunit, NULL); + HRESULT hr; + + hr = gsg -> _d3d_device -> SetTexture (texunit, NULL); + if (FAILED (hr)) { + dxgsg9_cat.error() + << "SetTexture (" + << texunit + << ", NULL) failed " + << D3DERRORSTRING(hr); + } } } #endif