nvidia - Fix for DirectX 7 latency on Windows 7? -


we have piece of software programmed against dirextx 7 sdk (i.e code uses lpdirectdrawsurface7 , likes) , runs in fullscreen. main task putting on screen in response external triggers in reliable manner. behaves on windows xp: bsically software waits trigger , when triggered, creates new frame, puts in backbuffer, tells dx flip buffers. result approximate delay between trigger , when frame shown on screen is, depending on video card , drivers, 3 frames or 50msec 60hz screen. tested on variety of systems, running nvidia cards. on systems higher end cards 2 frames.

when running same software on windows 7 (with no other software installed @ all) however, cannot lower 5 frames. meaning somewhere in pipeline os or driver or both eat 2 frames, near unacceptable application. tried disabling aero/desktop composition/different driver versions/different video cards no avail.

  • where come from? documented somewhere?
  • is there easy way fix? know directx 7 old, upgrading compile agains more recent version might tons of work type of fix nice. maybe flag can set in code?

edit here's code seems relevant:

creation of front/back surfaces:

ddraw7->setcooperativelevel( getsafehwnd(),   ddscl_exclusive | ddscl_fullscreen | ddscl_allowmodex | ddscl_multithreaded )  ddsurfacedesc2 desc; zeromemory( &desc, sizeof(desc) ); desc.dwsize = sizeof( desc ); desc.dwflags =  ddsd_caps | ddsd_backbuffercount; desc.ddscaps.dwcaps = ddscaps_primarysurface | ddscaps_flip |                       ddscaps_complex | ddscaps_3ddevice |                       ddscaps_videomemory | ddscaps_localvidmem; desc.dwbackbuffercount = 1; ddraw7->createsurface( &desc, &primsurf, 0 )  ddscaps2 surfcaps; zeromemory( &surfcaps,sizeof( surfcaps ) ); surfcaps.dwcaps = ddscaps_backbuffer; primsurf->getattachedsurface( &surfcaps, &backsurf ); 

creation of surfaces used render frames before drawn:

ddsurfacedesc2 desc; zeromemory( &desc, sizeof(desc) ); desc.dwsize = sizeof(desc); desc.dwflags = ddsd_width | ddsd_height | ddsd_caps ; desc.dwwidth = w; desc.dwheight = h; desc.ddscaps.dwcaps = ddscaps_offscreenplain | ddscaps_videomemory; desc.ddpfpixelformat.dwsize = sizeof( ddpixelformat ); desc.ddpfpixelformat.dwflags = ddpf_paletteindexed8;  lpdirectdrawsurface7 surf; hresult r=ddraw7->createsurface( &desc, &surf, 0 ) 

rendering loop, in onidle:

//clear surface ddbltfx bltfx; zeromemory( &bltfx, sizeof(bltfx) ); bltfx.dwsize = sizeof( bltfx ); bltfx.dwfillcolor = rgbtopixel( r, g, b ); backsurf->blt( rect, 0, 0, ddblt_colorfill | ddblt_wait, &bltfx )  //blit prerendered surface onto it, x/y/rect etc calculated properly) backsurf->bltfast( x, y, sourcesurf, s&sourcerect, ddbltfast_wait );  primsurf->flip( 0, ddflip_wait )  primsurf->blt(&drect,backsurf,&srect,ddblt_wait,0); 

i think windows xp thing red herring. last version of windows ran directx 7 directly windows 2000. windows xp emulating dx7 in dx9, same windows 7 doing.

i'll venture guess application uses palettized textures, , when dx emulates functionality (as dropped after dx7) it's generating texture using indexed colors. might try profiling app gpuview see if there's delay in pushing texture gpu. e.g., perhaps win7 driver compressing first?


Comments

Popular posts from this blog

blackberry 10 - how to add multiple markers on the google map just by url? -

php - guestbook returning database data to flash -

delphi - Dynamic file type icon -