Can not create Direct3D device

Started by
20 comments, last by computergeek101234 15 years, 3 months ago
I am playing with the source code from the book Beginning Game Programming 2nd. I am working on chapter 5 that first starts with initializing DirectX (D3D), my code compiles and links fine but when it runs it is setting the d3ddev (d3d device) to null and then going into the error if statement and not running. My video card is directX capable and I have the direct X 9 sdk install and linked in Visual C++ 2008. Here is the code: Thanks for any help. // Beginning Game Programming // Chapter 5 // Direct3D_Fullscreen program //header files to include #include <d3d9.h> #include <time.h> //application title #define APPTITLE "Direct3D_Fullscreen" //macros to read the keyboard asynchronously #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define KEY_UP(vk_code)((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) //screen resolution #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 //forward declarations LRESULT WINAPI WinProc(HWND,UINT,WPARAM,LPARAM); ATOM MyRegisterClass(HINSTANCE); int Game_Init(HWND); void Game_Run(HWND); void Game_End(HWND); //Direct3D objects LPDIRECT3D9 d3d = NULL; LPDIRECT3DDEVICE9 d3ddev = NULL; //window event callback function LRESULT WINAPI WinProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: Game_End(hWnd); PostQuitMessage(0); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam ); } //helper function to set up the window properties ATOM MyRegisterClass(HINSTANCE hInstance) { //create the window class structure WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); //fill the struct with info wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WinProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = APPTITLE; wc.hIconSm = NULL; //set up the window with the class info return RegisterClassEx(&wc); } //entry point for a Windows program int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // declare variables MSG msg; // register the class MyRegisterClass(hInstance); // initialize application //note--got rid of initinstance HWND hWnd; //create a new window hWnd = CreateWindow( APPTITLE, //window class APPTITLE, //title bar WS_EX_TOPMOST | WS_VISIBLE | WS_POPUP, //window style CW_USEDEFAULT, //x position of window CW_USEDEFAULT, //y position of window SCREEN_WIDTH, //width of the window SCREEN_HEIGHT, //height of the window NULL, //parent window NULL, //menu hInstance, //application instance NULL); //window parameters //was there an error creating the window? if (!hWnd) return FALSE; //display the window ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); //initialize the game if (!Game_Init(hWnd)) return 0; // main message loop int done = 0; while (!done) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { //look for quit message if (msg.message == WM_QUIT) done = 1; //decode and pass messages on to WndProc TranslateMessage(&msg); DispatchMessage(&msg); } else //process game loop (else prevents running after window is closed) Game_Run(hWnd); } return msg.wParam; } int Game_Init(HWND hwnd) { //initialize Direct3D d3d = Direct3DCreate9(D3D_SDK_VERSION); if (d3d == NULL) { MessageBox(hwnd, "Error initializing Direct3D", "Error", MB_OK); return 0; } //set Direct3D presentation parameters D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = FALSE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; d3dpp.BackBufferCount = 1; d3dpp.BackBufferWidth = SCREEN_WIDTH; d3dpp.BackBufferHeight = SCREEN_HEIGHT; d3dpp.hDeviceWindow = hwnd; //create Direct3D device d3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev); //if (d3ddev == NULL) //{ // MessageBox(hwnd, "Error creating Direct3D device", "Error", MB_OK); //return 0; //} //set random number seed srand(time(NULL)); //return okay return 1; } void Game_Run(HWND hwnd) { //make sure the Direct3D device is valid if (d3ddev == NULL) return; //clear the backbuffer to black d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,255,0), 1.0f, 0); //start rendering if (d3ddev->BeginScene()) { //do something //stop rendering d3ddev->EndScene(); } //display the back buffer on the screen d3ddev->Present(NULL, NULL, NULL, NULL); //check for escape key (to exit program) if (KEY_DOWN(VK_ESCAPE)) PostMessage(hwnd, WM_DESTROY, 0, 0); } void Game_End(HWND hwnd) { //release the Direct3D device if (d3ddev != NULL) d3ddev->Release(); //release the Direct3D object if (d3d != NULL) d3d->Release(); }
Advertisement
Solved: I changed D3DDEVTYPE_DEFAULT to D3DDEVTYPE_REF and did not use a hardware device but a software-emulated device it is working now
Sorry to interrupt, but...I also have a problem here. The "d3d" variable always returns null, and I can't figure out why. Can anyone help?
Quote:Original post by size_J
Solved: I changed D3DDEVTYPE_DEFAULT to D3DDEVTYPE_REF and did not use a hardware device but a software-emulated device it is working now


You shouldn't have to do this. The Ref device is implemented in software, and it's really for testing only. What's worse is that your program probably won't work on most computers if you use Ref. Try changing it to D3DDEVTYPE_HAL, and in the flags use D3DCREATE_HARDWARE_VERTEXPROCESSING and D3DCREATE_PUREDEVICE.

Also, call d3d->GetDeviceCaps() to make sure your video card can support whatever you need. I think all modern video cards should be able to support what I indicated above, though.

Quote:Original post by computergeek101234
Sorry to interrupt, but...I also have a problem here. The "d3d" variable always returns null, and I can't figure out why. Can anyone help?


Post your code and I'll take a look.
For both questions (D3D pointer being null, and failing to create the device), what do the Debug Runtimes tell you the error is?
Okay. It's the same as the first post by size_j. I'm also running through the tutorials in that book. Also, I'm sorry. It is the "d3ddev" variable that always returns null, not the "d3d". I know that I have the right harware, because I can play games like roller coaster tycoon and seaworld tycoon which use directx 9. Thanks in advance!
Quote:Original post by computergeek101234
Okay. It's the same as the first post by size_j. I'm also running through the tutorials in that book. Also, I'm sorry. It is the "d3ddev" variable that always returns null, not the "d3d". I know that I have the right harware, because I can play games like roller coaster tycoon and seaworld tycoon which use directx 9. Thanks in advance!
Well, the same answer applies: What do the debug runtimes say?

There's nothing I can see wrong with the code that would be caused by anything other than D3D being disabled somehow.

EDIT:
Quote:Original post by computergeek101234
Okay. It's the same as the first post by size_j. I'm also running through the tutorials in that book. Also, I'm sorry. It is the "d3ddev" variable that always returns null, not the "d3d". I know that I have the right harware, because I can play games like roller coaster tycoon and seaworld tycoon which use directx 9. Thanks in advance!
Roller Coaster Tycoon uses DirectDraw, not D3D. I've never played Seaworld Tycoon, but from the screenshots it looks like the same engine - so DirectDraw.

Can you run any D3D apps or SDK samples?
The Debug info is:

Direct3D9: (INFO) :Direct3D9 Debug Runtime selected.
Direct3D9: :Device doesn't support mip-maps
Direct3D9: (ERROR) :HAL Disabled: Device doesn't support texturing
Direct3D9: :Device doesn't support mip-maps
Direct3D9: (ERROR) :HAL Disabled: Device doesn't support texturing
Direct3D9: (ERROR) :HAL Disabled: Device doesn't support texturing
D3D9 Helper: Enhanced D3DDebugging disabled; Application was not compiled with D3D_DEBUG_INFO
Direct3D9: :Device doesn't support mip-maps

I can also run the samples
Quote:Original post by size_J
The Debug info is:

Direct3D9: (INFO) :Direct3D9 Debug Runtime selected.
Direct3D9: :Device doesn't support mip-maps
Direct3D9: (ERROR) :HAL Disabled: Device doesn't support texturing
Direct3D9: :Device doesn't support mip-maps
Direct3D9: (ERROR) :HAL Disabled: Device doesn't support texturing
Direct3D9: (ERROR) :HAL Disabled: Device doesn't support texturing
D3D9 Helper: Enhanced D3DDebugging disabled; Application was not compiled with D3D_DEBUG_INFO
Direct3D9: :Device doesn't support mip-maps
Looks like one or more of:
1. You don't have drivers installed.
2. You've disabled hardware acceleration from the DirectX Control Panel
3. You have an extremely old card that only does 2D (An old Matrox card for instance).
Okay. Here it is.

Direct3D9: (ERROR) :Invalid value for BackBufferFormat. ValidatePresentParameters fails.

I have the back buffer format set to D3DFMT_UNKNOWN. I already tried changing it to D3DFMT_X8R8G8B8. Does that help?

This topic is closed to new replies.

Advertisement