User forums > Help

Problems with DX9.0c and MingW

(1/3) > >>

patlecat:
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;
}

--- End code ---

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
--- End code ---

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?

darthdespotism:

--- Code: ---#pragma comment (lib, "d3d9.lib")
--- End code ---


--- Code: ---#pragma *
--- End code ---
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

patlecat:
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
--- End code ---
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"!

patlecat:
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.

patlecat:
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>

--- End code ---

Navigation

[0] Message Index

[#] Next page

Go to full version