Sign in to follow this  

Full Screen - Flickering

This topic is 4278 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hey, I'm working on a main menu in DX9 w. C++. It works very well in windowed mode. But when I'm toggling full screen mode the screen immediately starts to _flicker_. Because of this I can see right through the app. I see Visual Studio etc. But also the start bar (activity bar or what it's called, the thing down there). There no "box" appears showing that the program has started (in windowed mode it does). If I hold the mouse over the top left corner the custom cursor icon disappears, and when I press that area a window with the size of my screen appears. It's all white. It responds to all commands but doesnt show any gfx (text only). If I display a messagebox the flicker stops until I remove it. What could be wrong here? I can't alt tab (if I do device would be lost probably), and haven't got dual screens which makes it hard for me to debug.

Share this post


Link to post
Share on other sites
What sort of Win32 initialization have you got? How are you handling the windows messages? Have you cross-referenced this against the SDK tutorials (and/or the DXUT framework)??

The only Direct3D reason I can think of is tearing due to no VSYNC, but that won't show any of the contents underneath/behind...

hth
Jack

Share this post


Link to post
Share on other sites
BOOL cApplication::Run()
{
MSG Msg;

// Register window class
if(!RegisterClassEx(&m_wcex))
return FALSE;

// Create the Main Window
m_hWnd = CreateWindow(m_Class, m_Caption,
m_style,
m_XPos, m_YPos,
m_Width, m_Height,
NULL, NULL, m_hInst, NULL);
if(!m_hWnd)
return FALSE;

// Show and update the window
ShowWindow(m_hWnd, SW_NORMAL);
UpdateWindow(m_hWnd);

// Make sure client area is correct size
Resize(m_Width, m_Height);

// Initialize COM
CoInitialize(NULL);

if(Init() == TRUE) {
// Enter the message pump
ZeroMemory(&Msg, sizeof(MSG));
while(Msg.message != WM_QUIT) {

// Handle Windows messages (if any)
if(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
} else {
// Do per-frame processing, break on FALSE return value
if(Frame() == FALSE)
break;
}
}
}

Shutdown();

// Shutdown COM
CoUninitialize();

// Unregister the window class
UnregisterClass(m_Class, m_hInst);

return TRUE;
}


I use this code. It's from Jim Adams' RPG book for Dx8.
But I think there could be something wrong with init here:

BOOL cApp::Init()
{

// Initialize the graphics device
m_Graphics.Init();

// Fullscreen:
m_Graphics.SetMode(GethWnd(), FALSE, TRUE);
// Small window:
//m_Graphics.SetMode(GethWnd(), TRUE, TRUE,640,480);

m_Graphics.Clear(0x00000000, 1.0f);

m_Graphics.Display();

// Set perspective
m_Graphics.SetPerspective(0.6f,1.33333f,1.0f,20000.0f);

m_StateManager.Push(IntroFrame, this);
return TRUE;
}


SetMode:
BOOL cGraphics::SetMode(HWND hWnd, BOOL Windowed, BOOL UseZBuffer, long Width, long Height, char BPP)
{
D3DPRESENT_PARAMETERS d3dpp;
D3DFORMAT Format, AltFormat;
RECT WndRect, ClientRect;
long WndWidth, WndHeight;
float Aspect;

// Error checking
if((m_hWnd = hWnd) == NULL)
return FALSE;
if(m_pD3D == NULL)
return FALSE;

// Get the current display format
if(FAILED(m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &m_d3ddm)))
return FALSE;

// Configure width
if(!Width) {
// Default to screen width if fullscreen
if(Windowed == FALSE) {
m_Width = m_d3ddm.Width;
} else {
// Otherwise grab from client size
GetClientRect(m_hWnd, &ClientRect);
m_Width = ClientRect.right;
}
} else {
m_Width = Width;
}

// Configure height
if(!Height) {
// Default to screen height if fullscreen
if(Windowed == FALSE) {
m_Height = m_d3ddm.Height;
} else {
// Otherwise grab from client size
GetClientRect(m_hWnd, &ClientRect);
m_Height = ClientRect.bottom;
}
} else {
m_Height = Height;
}

// Configure BPP
if(!(m_BPP = BPP) || Windowed == TRUE) {
if(!(m_BPP = GetFormatBPP(m_d3ddm.Format)))
return FALSE;
}

// Resize client window if using windowed mode
if(Windowed == TRUE) {
GetWindowRect(m_hWnd, &WndRect);
GetClientRect(m_hWnd, &ClientRect);

WndWidth = (WndRect.right - (ClientRect.right - m_Width)) - WndRect.left;
WndHeight = (WndRect.bottom - (ClientRect.bottom - m_Height)) - WndRect.top;

MoveWindow(m_hWnd, WndRect.left, WndRect.top, WndWidth, WndHeight, TRUE);
}

// Clear presentation structure
ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));

// Default to no hardware acceleration detected
m_HAL = FALSE;

// Setup Windowed or fullscreen usage
if((m_Windowed = Windowed) == TRUE) {
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = m_d3ddm.Format;

// See if card supports HAL
if(CheckFormat(m_d3ddm.Format, TRUE, TRUE) == TRUE) {
m_HAL = TRUE;
} else {
// Return error if not emulated
if(CheckFormat(m_d3ddm.Format, TRUE, FALSE) == FALSE)
return FALSE;
}
} else {
d3dpp.Windowed = FALSE;
d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;

d3dpp.BackBufferWidth = m_Width;
d3dpp.BackBufferHeight = m_Height;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // or D3DPRESENT_INTERVAL_DEFAULT or D3DPRESENT_INTERVAL_IMMEDIATE

// Figure display format to use
if(m_BPP == 32) {
Format = D3DFMT_X8R8G8B8;
AltFormat = D3DFMT_X8R8G8B8;
}
if(m_BPP == 24) {
Format = D3DFMT_R8G8B8;
AltFormat = D3DFMT_R8G8B8;
}
if(m_BPP == 16) {
Format = D3DFMT_R5G6B5;
AltFormat = D3DFMT_X1R5G5B5;
}
if(m_BPP == 8) {
Format = D3DFMT_P8;
AltFormat = D3DFMT_P8;
}

// Check for HAL device
if(CheckFormat(Format, FALSE, TRUE) == TRUE) {
m_HAL = TRUE;
} else {
// Check for HAL device in alternate format
if(CheckFormat(AltFormat, FALSE, TRUE) == TRUE) {
m_HAL = TRUE;
Format = AltFormat;
} else {
// Check for Emulation device
if(CheckFormat(Format, FALSE, FALSE) == FALSE) {
// Check for Emulation device in alternate format
if(CheckFormat(AltFormat, FALSE, FALSE) == FALSE)
return FALSE;
else
Format = AltFormat;
}
}
}

d3dpp.BackBufferFormat = Format;
}

// Setup Zbuffer format - 16 bit
if((m_ZBuffer = UseZBuffer) == TRUE) {
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
} else {
d3dpp.EnableAutoDepthStencil = FALSE;
}

// Create the Direct3D Device object
if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
(m_HAL == TRUE) ? D3DDEVTYPE_HAL : D3DDEVTYPE_REF,
hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &m_pD3DDevice))) {

// Try to create Direct3D without ZBuffer support
// if selected and first call failed.
if(m_ZBuffer == TRUE) {
m_ZBuffer = FALSE;
d3dpp.EnableAutoDepthStencil = FALSE;

if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
(m_HAL == TRUE) ? D3DDEVTYPE_HAL : D3DDEVTYPE_REF,
hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &m_pD3DDevice)))
return FALSE;
} else
return FALSE;
}

// Set default rendering states

// Enable texture rendering stages and filter types

// Calculate the aspect ratio based on window size

// Create a sprite interface


return TRUE;
}



Maybe I'll rewrite the code completely but I mean that code should work.
The error could also have something to do with the statemanager I use. Got to check that too.

Share this post


Link to post
Share on other sites
This might help you out.

For your window style use WS_POPUP

For your window size use these:

WindowWidth = GetSystemMetrices(SM_CXSCREEN)
WindowHeight = GetSystemMetrices(SM_CXSCREEN)

Hope that helps out. Good luck

Share this post


Link to post
Share on other sites
Crap lol. Still got some flickering, but it's a bit different now.

The text flickers. What I do:

1. Loaded the Main Menu (no flickering) (looks like it all works here)
2. Changed state to "GameFrame" (=started game) -> Menu is in the background (flickers)
3. Changed back to the menu (game is flickering in the background)
4. I switch between the states a few times. No flickering.
5. I switch one time more. Flickering starts all over again.

Hmm. Ill see if I can find the error.

Share this post


Link to post
Share on other sites
Turns out some of the flickering stops if I clear the screen between state changes.

It has something to do with the backbuffer then?

EDIT: Looks like Adams doesn't clear the screen anywhere, apparently his program works (I cant compile it it's DX8, but how does he do??). So now I added code for clearing the screen every frame and it works.

[Edited by - IlyaZ on April 2, 2006 4:53:25 PM]

Share this post


Link to post
Share on other sites

This topic is 4278 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this