🎉 Celebrating 25 Years of GameDev.net! 🎉

Not many can claim 25 years on the Internet! Join us in celebrating this milestone. Learn more about our history, and thank you for being a part of our community!

Display mode changing problem

Started by
1 comment, last by Aeetes 24 years, 6 months ago
When you create the primary surface in full screen mode, the back surface is a member of primary. So, when you release primary surface, the back is release automatically. You release the back surface manually when you run in window mode.
Goodluck!

------------------

Advertisement
I have written a GUI class library using DD and DI. So far it only runs in 640x480x8 mode. However, when I attempted to add support for mode changing (different resolutions, still 8-bit though) my programs crashes on exit (page fault). After this, any DDraw program that I run (including the samples) always crashes on loading with a page fault. I can only run a DDraw program again after rebooting.

My library has surfaces for primary and back buffer. When I change the mode I first release both the primary and back buffers, switch the mode, then finally create new primary and back buffer surfaces.

If I ignore the surfaces, and just switch the mode, not releasing and recreating the primary and back buffer, the program runs fine. I stripped the program down to the point where it does nothing but change the mode, so I am certain that the problem has to do with it... Namely the surfaces I believe.

Here is the code for changing the mode:

code:
ARESULT AccessDisplay::SetDisplayMode(int nWidth, int nHeight, int nBPP) {	if (m_pDDSPrimary != NULL) {		m_pDDSPrimary->Release();		m_pDDSPrimary = NULL;	}	if (m_pDDSBuffer != NULL) {		m_pDDSBuffer->Release();		m_pDDSBuffer = NULL;	}	if (m_pDD->SetDisplayMode(nWidth, nHeight, nBPP, 0, 0) != DD_OK)		return AERROR;	DDSURFACEDESC2 ddsd;	ZeroMemory(&ddsd, sizeof(ddsd));	ddsd.dwSize = sizeof(ddsd);	ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;	ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;	ddsd.dwBackBufferCount = 1;	if (m_pDD->CreateSurface(&ddsd, &m_pDDSPrimary, NULL) != DD_OK)		return AERROR;		DDSCAPS2 ddscaps;	ZeroMemory(&ddscaps, sizeof(ddscaps));	ddscaps.dwCaps = DDSCAPS_BACKBUFFER;	if (m_pDDSPrimary->GetAttachedSurface(&ddscaps, &m_pDDSBuffer) != DD_OK)		return AERROR;	DDBLTFX ddbltfx;	ZeroMemory(&ddbltfx, sizeof(ddbltfx));	ddbltfx.dwSize = sizeof(ddbltfx);	ddbltfx.dwFillColor = 0;	if (m_pDDSPrimary->Blt(NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx) != DD_OK)		return AERROR;	if (m_pDDSBuffer->Blt(NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx) != DD_OK)		return AERROR;	return AOK;}

Does anyone have any ideas as to what could be causing this?

[This message has been edited by Aeetes (edited December 06, 1999).]

Thank you. I got it working a little later by just releasing the back buffer before the primary surface. Thanks, since I didn't really know that the reference was held by the primary surface (I'm new to COM programming, switching from good old DPMI under DJGPP). At least now I know why it worked when I switched the release order, thanks.

------------------
Where's my Golden Fleece?

This topic is closed to new replies.

Advertisement