From 18fc45119a27e34417d9356e0fb66351d4e24007 Mon Sep 17 00:00:00 2001 From: cxgeorge <> Date: Wed, 2 May 2001 05:16:26 +0000 Subject: [PATCH] add fps meter --- panda/src/dxgsg/config_dxgsg.cxx | 4 ++ panda/src/dxgsg/config_dxgsg.h | 3 + panda/src/dxgsg/dxGraphicsStateGuardian.cxx | 68 +++++++++++++++++---- panda/src/dxgsg/dxGraphicsStateGuardian.h | 6 ++ 4 files changed, 69 insertions(+), 12 deletions(-) diff --git a/panda/src/dxgsg/config_dxgsg.cxx b/panda/src/dxgsg/config_dxgsg.cxx index f93045aa64..1a104aa553 100644 --- a/panda/src/dxgsg/config_dxgsg.cxx +++ b/panda/src/dxgsg/config_dxgsg.cxx @@ -28,6 +28,10 @@ bool dx_cull_traversal = config_dxgsg.GetBool("dx-cull-traversal", true); bool dx_ignore_mipmaps = config_dxgsg.GetBool("dx-ignore-mipmaps", false); float dx_global_miplevel_bias = config_dxgsg.GetFloat("dx-global-miplevel-bias", 0.0); +bool dx_force_16bpp_screenbuffers = config_dxgsg.GetBool("dx-force-16bpp-screenbuffers", false); +bool dx_show_fps_meter = config_dxgsg.GetBool("dx-show-fps-meter", false); +float dx_fps_meter_update_interval = config_dxgsg.GetFloat("dx-fps-meter-update-interval", 1.7); + #ifdef _DEBUG bool dx_debug_view_mipmaps = config_dxgsg.GetBool("dx-debug-view-mipmaps", false); bool dx_force_16bpptextures = config_dxgsg.GetBool("dx-force-16bpptextures", false); diff --git a/panda/src/dxgsg/config_dxgsg.h b/panda/src/dxgsg/config_dxgsg.h index 9eaeb0c148..3e1ab97830 100644 --- a/panda/src/dxgsg/config_dxgsg.h +++ b/panda/src/dxgsg/config_dxgsg.h @@ -15,6 +15,9 @@ extern bool dx_show_transforms; extern bool dx_full_screen; extern bool dx_cull_traversal; extern bool dx_ignore_mipmaps; +extern bool dx_force_16bpp_screenbuffers; +extern bool dx_show_fps_meter; +extern float dx_fps_meter_update_interval; #ifdef _DEBUG extern float dx_global_miplevel_bias; diff --git a/panda/src/dxgsg/dxGraphicsStateGuardian.cxx b/panda/src/dxgsg/dxGraphicsStateGuardian.cxx index 0a36b0e5b0..b6652e0b78 100644 --- a/panda/src/dxgsg/dxGraphicsStateGuardian.cxx +++ b/panda/src/dxgsg/dxGraphicsStateGuardian.cxx @@ -269,6 +269,10 @@ init_dx( LPDIRECTDRAW7 context, _view_rect = viewrect; HRESULT hr; + _start_time = 0.0; + _start_frame_count = _cur_frame_count = 0; + _current_fps = 0.0; + _pTexPixFmts = new DDPIXELFORMAT[MAX_DX_TEXPIXFMTS]; assert(_pTexPixFmts!=NULL); @@ -705,7 +709,39 @@ render_frame(const AllAttributesWrapper &initial_state) { _d3dDevice->EndScene(); + if(dx_show_fps_meter) { + + DWORD now = timeGetTime(); // this is win32 fn + + float time_delta = (now - _start_time)/1000.0; + + if(time_delta > dx_fps_meter_update_interval) { + // didnt use global clock object, it wasnt working properly when I tried, + // its probably slower due to cache faults, and I can easily track all the + // info I need in dxgsg + DWORD num_frames = _cur_frame_count - _start_frame_count; + + _current_fps = num_frames / time_delta; + _start_time = now; + _start_frame_count = _cur_frame_count; + } + + HDC hDC; + + if(SUCCEEDED(_back->GetDC(&hDC))) { + char fps_msg[20]; + sprintf(fps_msg, "%7.02f fps", _current_fps); + SetTextColor(hDC, RGB(255,255,0) ); + SetBkMode(hDC, TRANSPARENT ); + TextOutA(hDC, (_view_rect.right-_view_rect.left)-85, 0, fps_msg, strlen(fps_msg)); + _back->ReleaseDC(hDC); + } + + _cur_frame_count++; // only used by fps meter right now + } + _win->end_frame(); + show_frame(); #ifdef PRINT_TEXSTATS @@ -1720,9 +1756,11 @@ draw_sprite(const GeomSprite *geom) { vertex_size+=sizeof(D3DCOLOR); } - nassertv(_pCurFvfBufPtr == NULL); // make sure the storage pointer is clean. - nassertv(nprims * 4 * vertex_size < VERT_BUFFER_SIZE); - nassertv(nprims * 6 < D3DMAXNUMVERTICES ); + #ifdef _DEBUG + nassertv(_pCurFvfBufPtr == NULL); // make sure the storage pointer is clean. + nassertv(nprims * 4 * vertex_size < VERT_BUFFER_SIZE); + nassertv(nprims * 6 < D3DMAXNUMVERTICES ); + #endif _pCurFvfBufPtr = _pFvfBufBasePtr; // _pCurFvfBufPtr changes, _pFvfBufBasePtr doesn't const float TexCrdSets[4][2] = {{0.0,0.0},{1.0,0.0},{0.0,1.0},{1.0,1.0}}; @@ -3665,20 +3703,26 @@ void DXGraphicsStateGuardian::apply_material( const Material* material ) { //////////////////////////////////////////////////////////////////// void DXGraphicsStateGuardian:: apply_fog(Fog *fog) { - _d3dDevice->SetRenderState(D3DRENDERSTATE_FOGTABLEMODE, - get_fog_mode_type(fog->get_mode())); - _d3dDevice->SetRenderState(D3DRENDERSTATE_FOGVERTEXMODE, - get_fog_mode_type(fog->get_mode())); + // need to re-examine this fog stuff - switch (fog->get_mode()) { + Fog::Mode panda_fogmode = fog->get_mode(); + D3DFOGMODE d3dfogmode = get_fog_mode_type(panda_fogmode); + + if(_D3DDevDesc.dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_FOGTABLE ) { + _d3dDevice->SetRenderState(D3DRENDERSTATE_FOGTABLEMODE, d3dfogmode); + } else if(_D3DDevDesc.dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_FOGVERTEX ) { + _d3dDevice->SetRenderState(D3DRENDERSTATE_FOGVERTEXMODE, d3dfogmode); + } + + switch (panda_fogmode) { case Fog::M_linear: { float fog_start = fog->get_start(); float fog_end = fog->get_end(); _d3dDevice->SetRenderState( D3DRENDERSTATE_FOGSTART, - *((LPDWORD) (&fog_start)) ); + *((LPDWORD) (&fog_start)) ); _d3dDevice->SetRenderState( D3DRENDERSTATE_FOGEND, - *((LPDWORD) (&fog_end)) ); + *((LPDWORD) (&fog_end)) ); } break; case Fog::M_exponential: @@ -3686,7 +3730,7 @@ apply_fog(Fog *fog) { { float fog_density = fog->get_density(); _d3dDevice->SetRenderState( D3DRENDERSTATE_FOGDENSITY, - *((LPDWORD) (&fog_density)) ); + *((LPDWORD) (&fog_density)) ); } break; case Fog::M_spline: @@ -3695,7 +3739,7 @@ apply_fog(Fog *fog) { Colorf fog_colr = fog->get_color(); _d3dDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR, - D3DRGBA(fog_colr[0], fog_colr[1], fog_colr[2], 0.0)); + D3DRGBA(fog_colr[0], fog_colr[1], fog_colr[2], 0.0)); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/dxgsg/dxGraphicsStateGuardian.h b/panda/src/dxgsg/dxGraphicsStateGuardian.h index ee4c7f2def..c6049a6f5e 100644 --- a/panda/src/dxgsg/dxGraphicsStateGuardian.h +++ b/panda/src/dxgsg/dxGraphicsStateGuardian.h @@ -365,6 +365,12 @@ protected: int _pass_number; + // vars for frames/sec meter + DWORD _start_time; + DWORD _start_frame_count; + DWORD _cur_frame_count; + float _current_fps; + public: static GraphicsStateGuardian* make_DXGraphicsStateGuardian(const FactoryParams ¶ms);