Skip to main content
GameDev.net gamedev.net
🔒 Locked

DirectDraw - Lost surfaces problems

Started by illuna Sep 30, 1999 at 12:10 PM 7 replies 2.7k views
Original Post
illuna
illuna
Hi

I programmed the code to restore the surfaces if the display mode changed. It works just right but I need to know how to loose a surface otherwise (it works already when I change the resolution of the screen and the color palette). Can you suggest me other ways to loose a surface so I can check my code?

Thanks!

Here is a sample code

BOOL RestoreAll(void){
HRESULT ddrval;
ddrval = lpDDSPrimary->Restore();

if (ddrval==DDERR_WRONGMODE){
// Display mode changed
// No problem here
}
else if (FAILED(ddrval)){
// Random restore failure
// How can I make this case happen?
}
else{
// We're ok retore everything else
// How can I make this case happen?
}
return TRUE;
}

CGameProgrammer
CGameProgrammer
After you restore lost surfaces, do they lock correctly? Mine don't. Blt, BltFast, and GetDC work fine, but Lock returns DDERR_SURFACELOST.

------------------
~CGameProgrammer( );

~CGameProgrammer( ); Developer Image Exchange -- New Features: Upload screenshots of your games (size is unlimited) and upload the game itself (up to 10MB). Free. No registration needed.
illuna
illuna
CGameProgrammer,

Well. I wouldn't be able to anwser your question. I'm 19 and I'm a junior programmer. I'm just beginning to master DirectDraw but mayby someone else here would know the anwser?

Illuna

mason
mason
Now that you mention it...

I've had all shades of trouble trying to get DDraw surfaces to restore correctly. The only thing that's seemed to work is if I Release() all surfaces (including the primary), Release() the DDraw interface, create a completely new DDraw interface, and then create completely new surfaces.

This solution for me was easier than trying to figure out exactly why surface restoring was sketchy, but I'm still curious, so if anyone's seen this and solved it, I'd love to hear about it.

Mason McCuskey
Spin Studios
www.spin-studios.com

Founder, Cuttlefish Industries
The Cuttlefish Engine lets anyone develop great games for iPad, iPhone, Android, WP7, the web, and more!
Zenroth
Zenroth
Not sure bout locking,but I have had no problems restoring surfaces. Thue I do use a linked list to keep track of all the bitmaps loaded and there flags ect. Then if I detect a lost surface I just call restorallsurfaces(); which is a directx 6 command.

Then i reload in the data for any video bitmaps.

Also system memory bitmaps don't seem to get lost.

mutex
mutex
here's what i do. create a class that manages a directdraw surface. the class will load a bitmap onto the surface, destroy the surface, etc. whenever you need to use the surface (when you need to Blt), check if the surface is lost. if it is, restore it, and then reload the data. it works fine with my game, and you can see an example (together with other garbage) with source at members.xoom.com/mutex0. goto defyengine

CGameProgrammer
CGameProgrammer
That's what I do. I wrote a CImage class. I too have a ReloadAll() command, and it works: all surfaces get reloaded. The problem isn't restoring the surfaces; it's getting the Lock command to work after doing so.

Probably mason is right: I gotta reload all surfaces. Probably many games do this, because if you Alt+Tab to something else, then switch back to their game, it takes several full seconds to restore everything.

------------------
~CGameProgrammer( );

~CGameProgrammer( ); Developer Image Exchange -- New Features: Upload screenshots of your games (size is unlimited) and upload the game itself (up to 10MB). Free. No registration needed.
Sphet
Sphet
An alternative might be to use your own buffers, not direct draw surfaces? That way they never get lost.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.