Лучший отвечающий
DirectX 12 - ошибка

Вопрос
-
нашел пример по 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
Ответы
-
- Предложено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 3 апреля 2017 г. 8:09
- Помечено в качестве ответа МГС 9 апреля 2017 г. 10:45
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
-
- Предложено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 3 апреля 2017 г. 8:09
- Помечено в качестве ответа МГС 9 апреля 2017 г. 10:45
2 апреля 2017 г. 14:47 -
Спасибо, разобрался, действительно дело в видеокарте, NVIDIA 560 не поддерживает разработку приложений на DirectX 12, пока не обновлю карту буду сидеть на DirectX 11, так как до сих пор некоторые современные приложения используют DX9 а значит и DirectX 11 будет актуален еще очень долгое время.9 апреля 2017 г. 10:45