[英]What does ComPtr.As() do?
我正在从一些示例中学习DirectX 12,但是我无法理解ComPtr.As()方法的作用。
ComPtr<ID3D12Device> device;
ComPtr<ID3D12Device> device2;
// Do Stuff with Device
device.As(&device2); // What does this do?
您在哪里找到此示例代码? 看起来很腥。 这是对As
的废话。 如果将其扩展到基础QueryInterface
这同样很愚蠢:
hr = device->QueryInterface( IID_PPV_ARGS(device2) );
实际上,您的代码最好编写为:
device2 = device;
通常,您将使用As
从现有接口获取新接口。 例如,对于Direct3D 11,您将设备创建为Direct3D 11.0接口,然后必须使用QueryInterface
11.1、11.2、11.3和/或11.4版本才能使用它们:
ComPtr<ID3D11Device> device;
DX::ThrowIfFailed(D3D11CreateDevice(..., device.ReleaseAndGetAddressOf());
ComPtr<ID3D11Device2> device2;
hr = device.As(&device2);
if (FAILED(hr))
// Do whatever handling you do if the system doesn't support 11.2
Direct3D 11的另一个常见用途是处理可能不存在的调试接口:
#ifndef NDEBUG
ComPtr<ID3D11Debug> d3dDebug;
if (SUCCEEDED(device.As(&d3dDebug)))
{
ComPtr<ID3D11InfoQueue> d3dInfoQueue;
if (SUCCEEDED(d3dDebug.As(&d3dInfoQueue)))
{
#ifdef _DEBUG
d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, true);
d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, true);
#endif
D3D11_MESSAGE_ID hide [] =
{
D3D11_MESSAGE_ID_SETPRIVATEDATA_CHANGINGPARAMS,
// TODO: Add more message IDs here as needed.
};
D3D11_INFO_QUEUE_FILTER filter = {};
filter.DenyList.NumIDs = _countof(hide);
filter.DenyList.pIDList = hide;
d3dInfoQueue->AddStorageFilterEntries(&filter);
}
}
#endif
同样重要的是,不要忽略从As
返回的HRESULT返回值。 您应该使用SUCCEEDED
或FAILED
宏,或者使用ThrowIfFailed之类的快速失败。
参见ComPtr 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.