none
DirectX 12 - ошибка RRS feed

  • Вопрос

  • нашел пример по DirectX 12, при сборке выдает ошибку на строке:

    device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&commandQueue));

    Вызвано исключение по адресу 0x00007FF71EEBA5E1 в qaz.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x0000000000000000.

    #include <d3d12.h>
    #include <dxgi1_4.h>
    #include <wrl\client.h>
    
    #pragma comment (lib, "d3d12.lib")
    #pragma comment (lib, "dxgi.lib")
    
    using namespace Microsoft::WRL;
    
    ComPtr<ID3D12Device> device;
    ComPtr<ID3D12CommandQueue> commandQueue;
    ComPtr<ID3D12CommandAllocator> commandAllocator;
    ComPtr<ID3D12Resource> resource;
    ComPtr<ID3D12PipelineState> pipelineState;
    ComPtr<ID3D12GraphicsCommandList> commandList;
    ComPtr<ID3D12DescriptorHeap> descriptorHeap;
    ComPtr<IDXGIFactory4> factory4;
    ComPtr<IDXGISwapChain> swapChain;
    ComPtr<IDXGISwapChain3> swapChain3;
    
    void Clear()
    {
    	device.ReleaseAndGetAddressOf();
    	commandQueue.ReleaseAndGetAddressOf();
    	commandAllocator.ReleaseAndGetAddressOf();
    	resource.ReleaseAndGetAddressOf();
    	pipelineState.ReleaseAndGetAddressOf();
    	commandList.ReleaseAndGetAddressOf();
    	descriptorHeap.ReleaseAndGetAddressOf();
    	factory4.ReleaseAndGetAddressOf();
    	swapChain.ReleaseAndGetAddressOf();
    	swapChain3.ReleaseAndGetAddressOf();
    }
    
    void Render()
    {
    	const float Color[] = { 0.4f, 0.6f, 0.9f, 1.0f };
    	commandList->ClearRenderTargetView(descriptorHeap->GetCPUDescriptorHandleForHeapStart(), Color, 0, nullptr);
    	commandList->Close();
    
    	ID3D12CommandList *pCommandList[] = { commandList.Get() };
    	commandQueue->ExecuteCommandLists(_countof(pCommandList), pCommandList);
    	swapChain3->Present(1, 0);
    }
    
    void Init(HWND hWnd)
    {
    	D3D12CreateDevice(nullptr, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device));
    	/*Спецификацией API можно указывать один из 4 вариантов аппаратной поддержки
    	D3D_FEATURE_LEVEL_11_0
    	D3D_FEATURE_LEVEL_11_1
    	D3D_FEATURE_LEVEL_12_0
    	D3D_FEATURE_LEVEL_12_1
    	в зависимости от того, какой уровень featurelevel поддерживает ваша видеокарта*/
    
    	D3D12_COMMAND_QUEUE_DESC queueDesc = {};
    	device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&commandQueue));
    
    	DXGI_SWAP_CHAIN_DESC swapChainDesc = {};
    	swapChainDesc.BufferCount = 2;
    	swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    	swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    	swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
    	swapChainDesc.OutputWindow = hWnd;
    	swapChainDesc.SampleDesc.Count = 1;
    	swapChainDesc.Windowed = TRUE;
    
    	CreateDXGIFactory1(IID_PPV_ARGS(&factory4));
    	factory4->CreateSwapChain(commandQueue.Get(), &swapChainDesc, &swapChain);
    
    	D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {};
    	rtvHeapDesc.NumDescriptors = 2;
    	rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
    
    	device->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(&descriptorHeap));
    
    	swapChain.As(&swapChain3);
    	swapChain3->GetBuffer(0, IID_PPV_ARGS(&resource));
    	device->CreateRenderTargetView(resource.Get(), nullptr,
    		descriptorHeap->GetCPUDescriptorHandleForHeapStart());
    
    	device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT,
    		IID_PPV_ARGS(&commandAllocator));
    
    	D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {};
    	device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&pipelineState));
    
    	device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, commandAllocator.Get(),
    		pipelineState.Get(), IID_PPV_ARGS(&commandList));
    }
    
    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);
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    	WNDCLASSEX wc;
    	ZeroMemory(&wc, sizeof(WNDCLASSEX));
    	wc.cbSize = sizeof(WNDCLASSEX);
    	wc.style = CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc = WindowProc;
    	wc.hInstance = hInstance;
    	wc.hCursor = LoadCursor(0, IDC_ARROW);
    	wc.lpszClassName = "WindowClass";
    	RegisterClassEx(&wc);
    	HWND hWnd = CreateWindowEx(0, "WindowClass", "Test DirectX 12 for D3D12CreateDevice", WS_SYSMENU | WS_MINIMIZEBOX,
    		(GetSystemMetrics(SM_CXSCREEN) - 1024) / 2, (GetSystemMetrics(SM_CYSCREEN) - 576) / 2, 1024, 576, 0, 0, hInstance, 0);
    	ShowWindow(hWnd, nCmdShow);
    	Init(hWnd);
    	MSG msg;
    	while (1)
    	{
    		while (PeekMessage(&msg, 0, 0, 0, 1))
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    		Render();
    		if (msg.message == WM_QUIT) break;
    	}
    	Clear();
    	return msg.wParam;
    }

    Пожалуйста подскажите что не так?
    • Изменено МГС 2 апреля 2017 г. 12:46
    2 апреля 2017 г. 12:44

Ответы

  • Вы понимаете, что функции возвращают значение не для того, чтобы его игнорировать? Смотрите какой HRESULT возвращается и сравнивайте со списком.

    Пробуйте даунгрейдить feature level еще ниже. Если более низкий подойдет - дело в видеокарте, если ни один не подойдет - дело в чем-то другом.

    2 апреля 2017 г. 14:47

Все ответы

  • то, что переменная device равна NULL, т.е. этот самый D3D_FEATURE_LEVEL_11_0, видимо, не поддерживается
    2 апреля 2017 г. 12:53
  • Перепробовал D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_12_0, D3D_FEATURE_LEVEL_12_1, результат один и тот же...
    2 апреля 2017 г. 13:09
  • Вы понимаете, что функции возвращают значение не для того, чтобы его игнорировать? Смотрите какой HRESULT возвращается и сравнивайте со списком.

    Пробуйте даунгрейдить feature level еще ниже. Если более низкий подойдет - дело в видеокарте, если ни один не подойдет - дело в чем-то другом.

    2 апреля 2017 г. 14:47
  • Спасибо, разобрался, действительно дело в видеокарте, NVIDIA 560 не поддерживает разработку приложений на DirectX 12, пока не обновлю карту буду сидеть на DirectX 11, так как до сих пор некоторые современные приложения используют DX9 а значит и DirectX 11 будет актуален еще очень долгое время.
    9 апреля 2017 г. 10:45