从 ID3D11DeviceChild::GetDevice() 方法获取设备

Getting Device from ID3D11DeviceChild::GetDevice() method

我正在尝试 return 我的应用程序中的 ID3D11Device 对象使用此方法:

https://docs.microsoft.com/en-us/windows/win32/api/d3d11/nf-d3d11-id3d11devicechild-getdevice

更具体地说,我正在使用 returned 顶点缓冲区来尝试获取如下设备:

pContext->IAGetVertexBuffers(0, 1, &veBuffer, &Stride, &veBufferOffset);
if (veBuffer)
    veBuffer->GetDesc(&vedesc);

D3D11_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D11_USAGE_STAGING;
bufferDesc.ByteWidth = vedesc.ByteWidth;
bufferDesc.BindFlags = 0;
bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
bufferDesc.MiscFlags = 0;

ID3D11Device **pDeviceExtra = nullptr;
veBuffer->GetDevice(pDeviceExtra); //Can I use this to get to the device object?

//Create the buffer.
HRESULT hr = pDeviceExtra->CreateBuffer(&bufferDesc, NULL, &readVB);
assert(hr == S_OK);

pContext->CopyResource(readVB, veBuffer);

我想创建一个缓冲区资源,但是发生的事情是,当我尝试使用 returned 设备指针时,它说 "Expression must have a pointer to class type." 现在我对此做了一些研究,据我所知,你必须取消引用指向对象本身的指针。但是,在这种情况下,我不确定该怎么做?我已经在我的 DirectX 代码中创建了一个设备,但出于不同的原因,我想尽可能从顶点缓冲区中获取该设备。

ID3D11Device *device = nullptr;
veBuffer->GetDevice(&device);

// Call device method

device->Release();

备注:

  • 您应该将设备指针传递给可能想要创建资源的代码,或者为您的设备抽象创建一个单例,以便您可以从任何地方调用它,而不是像这样使用 hack。

  • 使用Microsoft::WRL::ComPtr而不是原始指针来管理引用计数。