Не удается создать устройство D2D1

Я пытаюсь следовать официальному руководству Microsoft по взаимодействию DirectX и XAML, чтобы создать библиотеку времени выполнения C++ для примитивного рисования изображений для приложения UWP. Тем не менее, код пронизан ошибками и опечатками. Мне удалось адаптировать его части, но я получаю ошибки во время выполнения.

Я адаптировал код следующим образом.

Microsoft::WRL::ComPtr<ISurfaceImageSourceNativeWithD2D> m_sisNativeWithD2D;

IInspectable* sisInspectable = (IInspectable*) reinterpret_cast<IInspectable*>(surfaceImageSource);
sisInspectable->QueryInterface(__uuidof(ISurfaceImageSourceNativeWithD2D), (void **)&m_sisNativeWithD2D);

Microsoft::WRL::ComPtr<ID3D11Device> m_d3dDevice;
Microsoft::WRL::ComPtr<ID3D11DeviceContext> m_d3dContext;
Microsoft::WRL::ComPtr<ID2D1Device> m_d2dDevice;

// Create the DXGI device
D3D11CreateDevice(
    NULL,
    D3D_DRIVER_TYPE_HARDWARE,
    NULL,
    0,
    NULL,
    NULL,
    D3D11_SDK_VERSION,
    &m_d3dDevice,
    NULL,
    &m_d3dContext);

Microsoft::WRL::ComPtr<IDXGIDevice> dxgiDevice;
m_d3dDevice.As(&dxgiDevice);

// To enable multi-threaded access (optional)
Microsoft::WRL::ComPtr<ID3D10Multithread> d3dMultiThread;

m_d3dDevice->QueryInterface(__uuidof(ID3D10Multithread), (void **)&d3dMultiThread);

d3dMultiThread->SetMultithreadProtected(TRUE);

// Create the D2D device
HRESULT d2d1 = D2D1CreateDevice(dxgiDevice.Get(), NULL, &m_d2dDevice);

Во время отладки кода я вижу, что d2d1 ручка возвращается E_INVALIDARG, Я попытался передать свойства устройства вместо NULL и отключение многопоточного доступа, но ошибка сохраняется. Объекты до этой строки кажутся правильно инициализированными.

Что может быть причиной такого поведения?

редактировать

Комментарий VTT помог в создании устройства, но кажется, что устройство не подходит. Мой адаптированный код выглядит следующим образом.

Microsoft::WRL::ComPtr<ISurfaceImageSourceNativeWithD2D> m_sisNativeWithD2D;

IInspectable* sisInspectable = (IInspectable*) reinterpret_cast<IInspectable*>(surfaceImageSource);
sisInspectable->QueryInterface(__uuidof(ISurfaceImageSourceNativeWithD2D), (void **)&m_sisNativeWithD2D);

Microsoft::WRL::ComPtr<ID3D11Device> m_d3dDevice;
Microsoft::WRL::ComPtr<ID3D11DeviceContext> m_d3dContext;
Microsoft::WRL::ComPtr<ID2D1Device> m_d2dDevice;

D3D_FEATURE_LEVEL array[] = {
    D3D_FEATURE_LEVEL_11_1,
    D3D_FEATURE_LEVEL_11_0,
    D3D_FEATURE_LEVEL_10_1,
    D3D_FEATURE_LEVEL_10_0,
    D3D_FEATURE_LEVEL_9_3,
    D3D_FEATURE_LEVEL_9_2,
    D3D_FEATURE_LEVEL_9_1,
};

D3D_FEATURE_LEVEL selectedFeatureLevel;

// Create the DXGI device
D3D11CreateDevice(
    NULL,
    D3D_DRIVER_TYPE_HARDWARE,
    NULL,
    D3D11_CREATE_DEVICE_BGRA_SUPPORT,
    array,
    sizeof(array)/sizeof(D3D_FEATURE_LEVEL),
    D3D11_SDK_VERSION,
    &m_d3dDevice,
    &selectedFeatureLevel,
    &m_d3dContext);

//Microsoft::WRL::ComPtr<IDXGIDevice> dxgiDevice;
//m_d3dDevice.As(&dxgiDevice);

Microsoft::WRL::ComPtr<IDXGIDevice> dxgiDevice;
auto hr = m_d3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&dxgiDevice);

// To enable multi-threaded access (optional)
Microsoft::WRL::ComPtr<ID3D10Multithread> d3dMultiThread;
m_d3dDevice->QueryInterface(__uuidof(ID3D10Multithread), (void **)&d3dMultiThread);
d3dMultiThread->SetMultithreadProtected(TRUE);

// Create the D2D device
HRESULT d2d1 = D2D1CreateDevice(dxgiDevice.Get(), NULL, &m_d2dDevice);

// Set the D2D device
m_sisNativeWithD2D->SetDevice(m_d2dDevice.Get());

Microsoft::WRL::ComPtr<ID2D1DeviceContext> drawingContext;

RECT rect;
rect.top = 0;
rect.left = 0;
rect.right = 50;
rect.bottom = 50;

POINT offset;

HRESULT beginDrawHR = m_sisNativeWithD2D->BeginDraw(rect, __uuidof(ID2D1DeviceContext), &drawingContext, &offset);

Однако здесь BeginDraw() метод терпит неудачу с E_INVALIDARG, Я предполагаю, что это из-за неправильной конструкции устройства.

0 ответов

Другие вопросы по тегам