SwapChain wird nicht erzeugt



  • Hallo Leute,

    mein Programm unterbricht, da es auf einen ungültigen Zeiger verweist.
    Aber ich erzeuge doch den Swapchain.

    #include <Windows.h>
    #include <WindowsX.h>
    
    #include <d3d11.h>
    #include <d3dx10.h>
    #include <d3dx11.h>
    
    #pragma comment (lib, "d3d11.lib")
    #pragma comment (lib, "d3dx10.lib")
    #pragma comment (lib, "d3dx11.lib")
    
    // Defines
    
    #define SCREEN_WIDTH 1280
    #define SCREEN_HEIGHT 720
    
    // Globals
    
    IDXGISwapChain *swapchain;
    ID3D11Device *dev;
    ID3D11DeviceContext *devcon;
    ID3D11RenderTargetView *backbuffer;
    
    // Prototypes
    
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    
    void InitD3D(HWND hWnd);
    void CleanD3D();
    
    // Main
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
    {
    	HWND hWnd;
    	WNDCLASSEX WndClassEx;
    
    	ZeroMemory(&WndClassEx, sizeof(WNDCLASSEX));
    
    	WndClassEx.cbSize = sizeof(WNDCLASSEX);
    	WndClassEx.style = CS_HREDRAW | CS_VREDRAW;
    	WndClassEx.lpfnWndProc = WindowProc;
    	WndClassEx.hInstance = hInstance;
    	WndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW);
    	WndClassEx.hbrBackground = (HBRUSH)COLOR_WINDOW;
    	WndClassEx.lpszClassName = "WindowClass";
    
    	RegisterClassEx(&WndClassEx);
    
    	RECT wr = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT};
    
    	AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE);
    
    	hWnd = CreateWindowEx(NULL, "WindowClass", "Programm", WS_OVERLAPPEDWINDOW, 300, 175, wr.right - wr.left, wr.bottom - wr.top, NULL, NULL, hInstance, NULL);
    
    	ShowWindow(hWnd, iCmdShow);
    
    	InitD3D(hWnd);
    
    	MSG msg;
    
    	while (TRUE)
    	{
    		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    		{
    			TranslateMessage(&msg);
    
    			DispatchMessage(&msg);
    
    			if (msg.message == WM_QUIT)
    			{
    				break;
    			}
    		}
    	}
    
    	return msg.wParam;
    }
    
    // Methods
    
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)
    	{
    		case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    
    			return 0;
    		}
    	}
    
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
    void InitD3D(HWND hWnd)
    {
    	DXGI_SWAP_CHAIN_DESC scd;
    
    	ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
    
    	scd.BufferCount = 1;
    	scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    	scd.BufferDesc.Width = SCREEN_WIDTH;
    	scd.BufferDesc.Height = SCREEN_HEIGHT;
    	scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    	scd.OutputWindow = hWnd;
    	scd.SampleDesc.Count = 4;
    	scd.Windowed = TRUE;
    
    	D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL, D3D11_SDK_VERSION, &scd, &swapchain, &dev, NULL, &devcon);
    
    	ID3D11Texture2D *pBackBuffer;
    
    	swapchain -> GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID *) &pBackBuffer);  // Das ist der ungültige Zeiger
    	dev -> CreateRenderTargetView(pBackBuffer, NULL, &backbuffer);
    	pBackBuffer -> Release();
    	devcon -> OMSetRenderTargets(1, &backbuffer, NULL);
    
    	D3D11_VIEWPORT viewport;
    
    	ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
    
    	viewport.TopLeftX = 0;
    	viewport.TopLeftY = 0;
    	viewport.Width = SCREEN_WIDTH;
    	viewport.Height = SCREEN_HEIGHT;
    
    	devcon -> RSSetViewports(1, &viewport);
    }
    
    void CleanD3D()
    {
    	swapchain -> Release();
    	backbuffer -> Release();
    	dev -> Release();
    	devcon -> Release();
    }
    

    Hat jemand eine Idee?



  • Bist du dir sicher, dass dein D3D im Debug ist und keinen Fehler ausgibt?



  • Ja, beim Compilieren kommt kein Fehler, obwohl ich diese Funktion aufrufe:

    D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL, D3D11_SDK_VERSION, &scd, &swapchain, &dev, NULL, &devcon);
    

    Im Debugger steht, dass dev und swapchain 0x00000000 sind.



  • @Vyax
    Er meint du sollst die Debug-Features der D3D Runtime aufdrehen - wobei ich nicht weiss wie das bei D3D11 geht, aber das sollte sich leicht ergoogeln lassen.
    Mit dem Kompilieren hat das nichts zu tun.

    Und: Fehlercodes checken tut nicht weh, und so ganz manchmal hilft es einem auch weiter die Ursache des Fehlers zu finden.
    Also

    HRESULT hrCreate = D3D11CreateDeviceAndSwapChain(...);
    if (FAILED(hrCreate))
    {
        TRACE(_T("D3D11CreateDeviceAndSwapChain failed: error code 0x%08x\n"), hr);
        exit(1); // bzw. was auch immer
    }
    

Log in to reply