diff --git a/panda/src/dxgsg/dxGraphicsStateGuardian.I b/panda/src/dxgsg/dxGraphicsStateGuardian.I index 4dce57c800..9e4b3c018e 100644 --- a/panda/src/dxgsg/dxGraphicsStateGuardian.I +++ b/panda/src/dxgsg/dxGraphicsStateGuardian.I @@ -225,6 +225,15 @@ set_shademode(D3DSHADEMODE val) { } } +INLINE void DXGraphicsStateGuardian:: +SetDeviceTexture(LPDIRECTDRAWSURFACE7 pTexture) { + // this fn is useful because GetTexture() does an AddRef, so faster to cache it ourself + if (_pCurDeviceTexture != pTexture) { + _pCurDeviceTexture = pTexture; + _d3dDevice->SetTexture(0,_pCurDeviceTexture); + } +} + //////////////////////////////////////////////////////////////////// // Function: DXGraphicsStateGuardian::enable_fog // Access: diff --git a/panda/src/dxgsg/dxGraphicsStateGuardian.cxx b/panda/src/dxgsg/dxGraphicsStateGuardian.cxx index 99eabf5883..d194c7962f 100644 --- a/panda/src/dxgsg/dxGraphicsStateGuardian.cxx +++ b/panda/src/dxgsg/dxGraphicsStateGuardian.cxx @@ -124,11 +124,9 @@ static void CountDPs(DWORD nVerts,DWORD nTris) { cVertcount+=nVerts; cTricount+=nTris; - LPDIRECTDRAWSURFACE7 pCurTexture; - global_pD3DDevice->GetTexture(0,&pCurTexture); - if(pCurTexture==pLastTexture) { + if(_pCurDeviceTexture==pLastTexture) { cDP_noTexChangeCount++; - } else pLastTexture = pCurTexture; + } else pLastTexture = _pCurDeviceTexture; } #else #define CountDPs(nv,nt) @@ -348,6 +346,7 @@ DXGraphicsStateGuardian(GraphicsWindow *win) : GraphicsStateGuardian(win) { _fpsmeter_verts=NULL; _fpsmeter_font_surf=NULL; _dx_ready = false; + _pCurDeviceTexture = NULL; _CurShadeMode = D3DSHADE_FLAT; @@ -1250,7 +1249,6 @@ render_frame() { if(saved_alphaarg1!=D3DTA_TEXTURE) _d3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); - _d3dDevice->GetTexture(0, &saved_tex_surf); hr = _d3dDevice->SetTexture(0, _fpsmeter_font_surf); if(FAILED(hr)) { dxgsg_cat.error() << "SetTexture failed in draw fps meter, result = " << ConvD3DErrorToString(hr) << endl; @@ -1290,7 +1288,7 @@ render_frame() { _d3dDevice->SetRenderState(D3DRENDERSTATE_FILLMODE, saved_fill_state); } - _d3dDevice->SetTexture(0, saved_tex_surf); + _d3dDevice->SetTexture(0, _pCurDeviceTexture); } hr = _d3dDevice->EndScene(); @@ -3933,7 +3931,7 @@ apply_texture(TextureContext *tc) { // bugbug: does this handle the case of untextured geometry? // we dont see this bug cause we never mix textured/untextured - _d3dDevice->SetTexture(0, dtc->_surface ); + SetDeviceTexture(dtc->_surface); #if 0 if (dtc!=NULL) { diff --git a/panda/src/dxgsg/dxGraphicsStateGuardian.h b/panda/src/dxgsg/dxGraphicsStateGuardian.h index 9f1664fedb..10f21a8c5e 100644 --- a/panda/src/dxgsg/dxGraphicsStateGuardian.h +++ b/panda/src/dxgsg/dxGraphicsStateGuardian.h @@ -397,6 +397,8 @@ protected: DWORD _old_colormaskval; bool _alpha_test_enabled; int _decal_level; + LPDIRECTDRAWSURFACE7 _pCurDeviceTexture; + INLINE void SetDeviceTexture(LPDIRECTDRAWSURFACE7 pTexture); RenderModeProperty::Mode _current_fill_mode; //poinr/wireframe/solid