Sign in to follow this  

CreateDevice in IDirect3D9 gives "D3DERR_INVALIDCALL"

This topic is 4415 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

i downloaded some sample code off a site and put it into dev c after taking care of a few link errors it compiled and linked fine but nothing happens ... i get a flash of the console then nothing the code is as follows
#include <d3d8.h>

LPDIRECT3D8             g_pD3D			= NULL;
LPDIRECT3DDEVICE8       g_pD3DDevice	= NULL;

HRESULT InitialiseD3D(HWND hWnd)
{
	//First of all, create the main D3D object. If it is created successfully we 
	//should get a pointer to an IDirect3D8 interface.
    g_pD3D = Direct3DCreate8(D3D_SDK_VERSION);
	if(g_pD3D == NULL)
	{
        return E_FAIL;
	}

    //Get the current display mode
    D3DDISPLAYMODE d3ddm;
    if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
	{
        return E_FAIL;
	}

	//Create a structure to hold the settings for our device
    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory(&d3dpp, sizeof(d3dpp));

	//Fill the structure. 
	//We want our program to be windowed, and set the back buffer to a format
	//that matches our current display mode
    d3dpp.Windowed			= TRUE;
    d3dpp.SwapEffect		= D3DSWAPEFFECT_COPY_VSYNC;
    d3dpp.BackBufferFormat	= d3ddm.Format;

	//Create a Direct3D device.
	if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 
								   D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDevice)))
    {
        return E_FAIL;
    }
    
    return S_OK;
}

void Render()
{
    if(g_pD3DDevice == NULL)
	{
        return;
	}

    //Clear the backbuffer to a green color
    g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 255, 0), 1.0f, 0);
    
    //Begin the scene
    g_pD3DDevice->BeginScene();
    
    //Rendering of our game objects will go here
    
    //End the scene
    g_pD3DDevice->EndScene();
    
    //Filp the back and front buffers so that whatever has been rendered on the back buffer
	//will now be visible on screen (front buffer).
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}

void CleanUp()
{
    if(g_pD3DDevice != NULL)
	{
        g_pD3DDevice->Release();
		g_pD3DDevice = NULL;
	}

    if(g_pD3D != NULL)
	{
        g_pD3D->Release();
		g_pD3D = NULL;
	}
}

void GameLoop()
{
	//Enter the game loop
    MSG msg; 
    BOOL fMessage;

	PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
	
	while(msg.message != WM_QUIT)
	{
		fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);

		if(fMessage)
		{
			//Process message
			TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
		else
		{
			//No message to process, so render the current scene
			Render();
		}

	}
}

//The windows message handler
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
		break;
		case WM_KEYUP: 
            switch (wParam)
			{ 
                case VK_ESCAPE:
					//User has pressed the escape key, so quit
	                DestroyWindow(hWnd);
					return 0;
		        break;
            } 
        break;

    }

    return DefWindowProc(hWnd, msg, wParam, lParam);
}

//Application entry point
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
    //Register the window class
    WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L, 
                     GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                     "DX Project 1", NULL};
    RegisterClassEx(&wc);

    //Create the application's window
    HWND hWnd = CreateWindow("DX Project 1", "www.andypike.com: Tutorial 1", 
                              WS_OVERLAPPEDWINDOW, 50, 50, 500, 500,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL);

    //Initialize Direct3D
    if(SUCCEEDED(InitialiseD3D(hWnd)))
    { 
        //Show our window
        ShowWindow(hWnd, SW_SHOWDEFAULT);
        UpdateWindow(hWnd);

		//Start game running: Enter the game loop
		GameLoop();
    }
    
	CleanUp();

	UnregisterClass("DX Project 1", wc.hInstance);
    
	return 0;
}




it compiles and run's fine but i dont even get a window edit: i checked and RegisterClassEx doesnt return 0 and hWnd isnt NULL so my problem isnt there? [Edited by - rkaganda on November 11, 2005 7:28:08 PM]

Share this post


Link to post
Share on other sites
Single step it through your debugger to see where it's failing.

It could be a number of things. Is directX installed? Are your display properties valid?

Share this post


Link to post
Share on other sites
I found that im returning E_FAIL at line 38

if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDevice)))
{
return E_FAIL;
}





DXGetErrorString9() gives me "D3DERR_INVALIDCALL"

hWnd, &d3dpp, and &g_pD3DDevice arent not NULL.
I've also tired changing D3DCREATE_SOFTWARE_VERTEXPROCESSING to D3DCREATE_HARDWARE_VERTEXPROCESSING and D3DDEVTYPE_HAL to D3DDEVTYPE_REF but the same error results.

Wherebouts could I be going wrong?

[Edited by - rkaganda on November 11, 2005 5:11:59 PM]

Share this post


Link to post
Share on other sites

This topic is 4415 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