Author Topic: Problems with DX9.0c and MingW  (Read 13588 times)

Offline patlecat

  • Multiple posting newcomer
  • *
  • Posts: 62
Problems with DX9.0c and MingW
« on: May 28, 2007, 01:15:41 pm »
I compiled this sample code as Release:
Code
// include the basic windows header files and the Direct3D header file
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>
#include <D3d9types.h>

// define the screen resolution and keyboard macros
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

// include the Direct3D Library file
#pragma comment (lib, "d3d9.lib")

// global declarations
LPDIRECT3D9 d3d;    // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class
LPDIRECT3DVERTEXBUFFER9 t_buffer = NULL;    // the pointer to the vertex buffer

// function prototypes
void initD3D(HWND hWnd);    // sets up and initializes Direct3D
void render_frame(void);    // renders a single frame
void cleanD3D(void);    // closes Direct3D and releases memory
void init_graphics(void);    // 3D declarations

struct CUSTOMVERTEX {FLOAT X, Y, Z, RHW; DWORD COLOR;};
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    HWND hWnd;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    // wc.hbrBackground = (HBRUSH)COLOR_WINDOW;    // not needed any more
    wc.lpszClassName = "WindowClass";

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL,
                          "WindowClass",
                          "Our Direct3D Program",
                          WS_EX_TOPMOST | WS_POPUP,    // fullscreen values
                          0, 0,    // the starting x and y positions should be 0
                          SCREEN_WIDTH, SCREEN_HEIGHT,    // set the window to 640 x 480
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);

    // set up and initialize Direct3D
    initD3D(hWnd);

    // enter the main loop:

    MSG msg;

    while(TRUE)
    {
        DWORD starting_point = GetTickCount();

        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
                break;

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        render_frame();

        // check the 'escape' key
        if(KEY_DOWN(VK_ESCAPE))
            PostMessage(hWnd, WM_DESTROY, 0, 0);

        while ((GetTickCount() - starting_point) < 25);
    }

    // clean up DirectX and COM
    cleanD3D();

    return msg.wParam;
}


// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            } break;
    }

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


// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
    //IDirect3D9 Pointer
    d3d = Direct3DCreate9(D3D_SDK_VERSION);
    //d3d = (LPDIRECT3D9)Direct3DCreate9(D3D9b_SDK_VERSION);

    if (!d3d)
        return;

    D3DPRESENT_PARAMETERS d3dpp;

    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = FALSE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hWnd;
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    d3dpp.BackBufferWidth = SCREEN_WIDTH;
    d3dpp.BackBufferHeight = SCREEN_HEIGHT;

    // create a device class using this information and the info from the d3dpp stuct
    d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hWnd,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3ddev);

    init_graphics();    // call the function to initialize the triangle

    return;
}


// this is the function used to render a single frame
void render_frame(void)
{
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

    d3ddev->BeginScene();

        // select which vertex format we are using
        d3ddev->SetFVF(CUSTOMFVF);

        // select the vertex buffer to display
        d3ddev->SetStreamSource(0, t_buffer, 0, sizeof(CUSTOMVERTEX));

        // copy the vertex buffer to the back buffer
        d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

    d3ddev->EndScene();

    d3ddev->Present(NULL, NULL, NULL, NULL);

    return;
}


// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
    t_buffer->Release();    // close and release the vertex buffer
    d3ddev->Release();    // close and release the 3D device
    d3d->Release();    // close and release Direct3D

    return;
}


// this is the function that puts the 3D models into video RAM
void init_graphics(void)
{
    // create the vertices using the CUSTOMVERTEX struct
    CUSTOMVERTEX t_vert[] =
    {
        { 320.0f, 50.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { 520.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { 120.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), },
    };

    // create a vertex buffer interface called t_buffer
    d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                               0,
                               CUSTOMFVF,
                               D3DPOOL_MANAGED,
                               &t_buffer,
                               NULL);

    VOID* pVoid;    // a void pointer

    // lock t_buffer and load the vertices into it
    t_buffer->Lock(0, 0, (void**)&pVoid, 0);
    memcpy(pVoid, t_vert, sizeof(t_vert));
    t_buffer->Unlock();

    return;
}

and got this error:
Code
-------------- Build: Debug in dxTest1 ---------------
mingw32-g++.exe -DWIN32 -DNDEBUG -D_WINDOWS -D_MBCS -Wall -g -march=athlon-xp -O3 -W -g -D_UNICODE -IE:\DX90SDK\include -Ih:\MinGW\include -c H:\myProjects2\dxTest1\main.cpp -o obj\Debug\main.o
In file included from E:/DX90SDK/include/d3d9.h:211,
from H:\myProjects2\dxTest1\main.cpp:4:
E:/DX90SDK/include/d3d9types.h:25: warning: ignoring #pragma warning
E:/DX90SDK/include/d3d9types.h:1850: warning: ignoring #pragma warning
H:\myProjects2\dxTest1\main.cpp:14: warning: ignoring #pragma comment
H:\myProjects2\dxTest1\main.cpp:38: warning: unused parameter 'hPrevInstance'
H:\myProjects2\dxTest1\main.cpp:38: warning: unused parameter 'lpCmdLine'
mingw32-g++.exe -LE:\DX90SDK\lib\x86 -Lh:\MinGW\lib -o bin\Debug\dxTest1.exe obj\Debug\main.o -s -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -ld3d8
obj\Debug\main.o: In function `Z7initD3DP6HWND__':
H:/myProjects2/dxTest1/main.cpp:124: undefined reference to `Direct3DCreate9@4'
obj\Debug\main.o: In function `WinMain@16':
H:/myProjects2/dxTest1/main.cpp:124: undefined reference to `Direct3DCreate9@4'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 1 seconds)
2 errors, 5 warnings

I checked my project settings, they are clearly set to Release not Debug. What could be the solution here?


BTW: Why does the CB template produce DX8 code instead of DX9?? Or why is the desired version not chosable in the Wizard?

Offline darthdespotism

  • Almost regular
  • **
  • Posts: 163
    • Coder's Nemesis
Re: Problems with DX9.0c and MingW
« Reply #1 on: May 28, 2007, 02:24:54 pm »
Code
#pragma comment (lib, "d3d9.lib")

Code
#pragma *
depends on the Compiler. As far as I know MinGW does not support this way of linking libs. You should either use the included (?) DirectX9 - libs named correctly (libd3d9.o) via -ld3d9 in the build settings (or try -d3d9.lib at the same spot, not sure if this works)
Project->Build Options->Linker Settings

Offline patlecat

  • Multiple posting newcomer
  • *
  • Posts: 62
Re: Problems with DX9.0c and MingW
« Reply #2 on: May 28, 2007, 06:13:32 pm »
Thanks but that doesn't help.

I found that there are some settings that I cannot change in CB, and I really don't know where they are :? Why is it always trying to compile in Debug? And why is it using this -ld3d8 option when in fact I added the d3d9 lib?
Code
-------------- Build: Debug in dxTest1 ---------------
mingw32-g++.exe -LE:\DX90SDK\lib\x86 -Lh:\MinGW\lib -o bin\Debug\dxTest1.exe obj\Debug\main.o -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -ld3d8
obj\Debug\main.o: In function `Z7initD3DP6HWND__':
H:/myProjects2/dxTest1/main.cpp:124: undefined reference to `Direct3DCreate9@4'
collect2: ld returned 1 exit status
undefined reference to `Direct3DCreate9@4'

BTW I found out that in the project settings the Release build was set to "GUI mode" whereas the Debug build was set to "Console"!

« Last Edit: May 28, 2007, 06:22:14 pm by patlecat »

Offline patlecat

  • Multiple posting newcomer
  • *
  • Posts: 62
Re: Problems with DX9.0c and MingW
« Reply #3 on: May 28, 2007, 06:33:12 pm »
Ok part of the problem is solved because I manually changed <Add library="d3d8" /> to <Add library="d3d9" /> in the ".cbp" File. But this is not a correct behavior of CB!

Still it compiles as Debug instead of Release.

Offline patlecat

  • Multiple posting newcomer
  • *
  • Posts: 62
Re: Problems with DX9.0c and MingW
« Reply #4 on: May 28, 2007, 07:47:27 pm »
Here is the content of my project file. What must I change to have a normal Release build?
Code
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="dxTest1" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin\Debug\dxTest1.exe" prefix_auto="1" extension_auto="1" />
<Option working_dir="bin\Debug\" />
<Option object_output="obj\Debug\" />
<Option type="0" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin\Release\dxTest1.exe" prefix_auto="1" extension_auto="1" />
<Option working_dir="bin\Release\" />
<Option object_output="obj\Release\" />
<Option type="0" />
<Option compiler="gcc" />
<Compiler>
<Add option="-march=athlon-xp" />
<Add option="-O2" />
<Add option="-W" />
<Add directory="${#dx}" />
</Compiler>
<Linker>
<Add option="-s" />
<Add library="d3d9.lib" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add option="-DWIN32" />
<Add option="-DNDEBUG" />
<Add option="-D_WINDOWS" />
<Add option="-D_MBCS" />
<Add directory="${#dx}\include" />
</Compiler>
<Linker>
<Add library="kernel32" />
<Add library="user32" />
<Add library="gdi32" />
<Add library="winspool" />
<Add library="comdlg32" />
<Add library="advapi32" />
<Add library="shell32" />
<Add library="ole32" />
<Add library="oleaut32" />
<Add library="uuid" />
<Add library="odbc32" />
<Add library="odbccp32" />
<Add library="d3d9" />
<Add directory="${#dx}\lib\x86" />
</Linker>
<Unit filename="main.cpp" />
<Extensions>
<code_completion />
</Extensions>
</Project>
</CodeBlocks_project_file>

Offline Ceniza

  • Developer
  • Lives here!
  • *****
  • Posts: 1441
    • CenizaSOFT
Re: Problems with DX9.0c and MingW
« Reply #5 on: May 28, 2007, 07:58:53 pm »
Could you please tell us the svn revision number you are using?

When you say it's still compiling in Debug mode, does it mean that even when you select Release in the toolbar it still says "Compiling Debug"? If so, be sure you're really using the latest available Nightly build.

Now, about the addition of libraries, have in mind that if you have 2 targets you have 3 places where you can add those liker libraries: project global, target 1 (Release) and target 2 (Debug). Maybe you've been checking only those for one of the targets.

Offline patlecat

  • Multiple posting newcomer
  • *
  • Posts: 62
Re: Problems with DX9.0c and MingW
« Reply #6 on: May 28, 2007, 08:04:35 pm »
Hi Ceniza :)

I'm using CB v3988 and yes I am selecting "Release" in the toolbar.
**Added** I updated to 3989 and now it seems that I can compile as Release. But what happened in between?

Quote
Now, about the addition of libraries, have in mind that if you have 2 targets you have 3 places where you can add those linker libraries: project global, target 1 (Release) and target 2 (Debug). Maybe you've been checking only those for one of the targets.
I'm sorry but I don't understand what you mean here. Where would target1 and target2 be? You can see from my .cbp file what I added. And I only added stuff to the Release target not Debug.
« Last Edit: May 28, 2007, 08:12:19 pm by patlecat »

Offline patlecat

  • Multiple posting newcomer
  • *
  • Posts: 62
Re: Problems with DX9.0c and MingW
« Reply #7 on: May 28, 2007, 09:33:50 pm »
Ok with CB 3989 I still have problems, but with linking this time.

Now it say that it can't find d3d9.lib even though the paths must be right. But I find it strange, that CB looks for libs in a directory that doesn't exist: X:DX90SDK\lib\x86 I only have X:DX90SDK\lib

Code
-------------- Build: Release in dxTest2 ---------------
mingw32-g++.exe -Wall -DWIN32 -DNDEBUG -D_WINDOWS -D_MBCS -O2 -D_UNICODE -IE:\DX90SDK\include -Ih:\MinGW\include -c H:\myProjects2\dxTest2\main.cpp -o obj\Release\main.o
In file included from E:/DX90SDK/include/d3d9.h:211,
from H:\myProjects2\dxTest2\main.cpp:4:
E:/DX90SDK/include/d3d9types.h:25: warning: ignoring #pragma warning
E:/DX90SDK/include/d3d9types.h:1850: warning: ignoring #pragma warning
In file included from E:/DX90SDK/include/d3dx9.h:47,
from H:\myProjects2\dxTest2\main.cpp:5:
E:/DX90SDK/include/d3dx9math.h:19: warning: ignoring #pragma warning
In file included from E:/DX90SDK/include/d3dx9.h:47,
from H:\myProjects2\dxTest2\main.cpp:5:
E:/DX90SDK/include/d3dx9math.h:1761: warning: ignoring #pragma warning
In file included from E:/DX90SDK/include/d3dx9.h:48,
from H:\myProjects2\dxTest2\main.cpp:5:
E:/DX90SDK/include/d3dx9core.h:644:1: warning: multi-line comment
H:\myProjects2\dxTest2\main.cpp:16: warning: ignoring #pragma comment
H:\myProjects2\dxTest2\main.cpp:17: warning: ignoring #pragma comment
In file included from E:/DX90SDK/include/d3dx9math.h:1756,
from E:/DX90SDK/include/d3dx9.h:47,
from H:\myProjects2\dxTest2\main.cpp:5:
E:/DX90SDK/include/d3dx9math.inl: In constructor 'D3DXVECTOR2_16F::D3DXVECTOR2_16F(const D3DXFLOAT16*)':
...
E:/DX90SDK/include/d3dx9math.inl:737: warning: dereferencing type-punned pointer will break strict-aliasing rules
H:\myProjects2\dxTest2\main.cpp: In function 'void render_frame()':
H:\myProjects2\dxTest2\main.cpp:170: warning: taking address of temporary
H:\myProjects2\dxTest2\main.cpp:171: warning: taking address of temporary
H:\myProjects2\dxTest2\main.cpp:172: warning: taking address of temporary
mingw32-g++.exe -LE:\DX90SDK\lib\x86 -Lh:\MinGW\lib -o bin\Release\dxTest2.exe obj\Release\main.o -s -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -ld3d9 -ld3dx9 -mwindows
h:/mingw/bin/../lib/gcc/mingw32/4.2.0/../../../../mingw32/bin/ld.exe: cannot find -ld3dx9
collect2: ld returned 1 exit status

The actual project file:
Code
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="dxTest2" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin\Debug\dxTest2.exe" prefix_auto="1" extension_auto="1" />
<Option working_dir="bin\Debug\" />
<Option object_output="obj\Debug\" />
<Option type="0" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin\Release\dxTest2.exe" prefix_auto="1" extension_auto="1" />
<Option working_dir="bin\Release\" />
<Option object_output="obj\Release\" />
<Option type="0" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add option="-DWIN32" />
<Add option="-DNDEBUG" />
<Add option="-D_WINDOWS" />
<Add option="-D_MBCS" />
<Add directory="${#dx}\include" />
</Compiler>
<Linker>
<Add library="kernel32" />
<Add library="user32" />
<Add library="gdi32" />
<Add library="winspool" />
<Add library="comdlg32" />
<Add library="advapi32" />
<Add library="shell32" />
<Add library="ole32" />
<Add library="oleaut32" />
<Add library="uuid" />
<Add library="odbc32" />
<Add library="odbccp32" />
<Add library="d3d9" />
<Add library="d3dx9" />
<Add directory="${#dx}\lib\x86" />
<Add directory="${#dx}\lib" />
</Linker>
<Unit filename="main.cpp" />
<Extensions>
<code_completion />
</Extensions>
</Project>
</CodeBlocks_project_file>

Building the Debug works fine, I get an .exe which runs fine. Strange...
« Last Edit: May 28, 2007, 10:06:24 pm by patlecat »

Offline patlecat

  • Multiple posting newcomer
  • *
  • Posts: 62
Re: Problems with DX9.0c and MingW
« Reply #8 on: May 28, 2007, 10:40:35 pm »
I'm getting crazy with CB. I restarted CB a few minutes later and suddenly Debug compiles fine and produces a nice .exe. Then I try to build Release but it has the above problem again. Then I restart CB and change some options and suddenly Debug doesnt build anymore. :shock:

Offline Ceniza

  • Developer
  • Lives here!
  • *****
  • Posts: 1441
    • CenizaSOFT
Re: Problems with DX9.0c and MingW
« Reply #9 on: May 29, 2007, 03:46:27 am »
The fact that you selected a target in the toolbar and it still tried to compile the other one was a bug introduced in that version and fixed in the next one, that's why I asked.

Maybe I'm not using the best words to describe the options, so I'll put this image:



If you click on the different "options" at the right thingy (tree) you can see how the Linker settings will change. Same for Compiler settings, Search directories, etc. Be sure you have checked the options for all of them and that everything is right.

Have in mind the "Project global" applies to all targets.
« Last Edit: May 29, 2007, 06:37:04 am by Ceniza »

Offline patlecat

  • Multiple posting newcomer
  • *
  • Posts: 62
Re: Problems with DX9.0c and MingW
« Reply #10 on: May 29, 2007, 07:07:32 pm »
Ah you meant those settings! Okay. Thanks but as you can see from my .cbp project file I have already made entries there.

My most simple dx9 program now builds fine with Rel and Deb. But the next example has problems now, I want/need to include the d3dx9.lib. This only works in Debug (with d3dx9d.lib), the Release version though does not link with this lib. :x

Offline patlecat

  • Multiple posting newcomer
  • *
  • Posts: 62
Re: Problems with DX9.0c and MingW
« Reply #11 on: May 31, 2007, 02:00:46 pm »
Ooooooookay, I just had to install the Aug06 DX-SDK and everything went fine from then on! It seems that mine was a bit older.

Thanks for ur help guys :P

Offline darthdespotism

  • Almost regular
  • **
  • Posts: 163
    • Coder's Nemesis
Re: Problems with DX9.0c and MingW
« Reply #12 on: May 31, 2007, 03:29:02 pm »
Ooooooookay, I just had to install the Aug06 DX-SDK and everything went fine from then on! It seems that mine was a bit older.

Thanks for ur help guys :P

Have you already tired something with DirectInput?
I tried to port a Project of mine from VC6 to MinGW but as far without success

Offline patlecat

  • Multiple posting newcomer
  • *
  • Posts: 62
Re: Problems with DX9.0c and MingW
« Reply #13 on: May 31, 2007, 04:56:11 pm »
No not with DirectInput yet. But gimme some small piece of demo code and I'll try it out here.

Offline darthdespotism

  • Almost regular
  • **
  • Posts: 163
    • Coder's Nemesis
Re: Problems with DX9.0c and MingW
« Reply #14 on: May 31, 2007, 08:16:18 pm »
Oh thats going to be some kind of difficult. The code I tried to port was about 20k LOC and as I was not really involved in the DirectX-Code (my friend did this) I'm not sure if I can do this.