Direct3D11 截图崩溃
Direct3D11 Screenshot crash
基本上,我正在尝试获取 Direct3D11 应用程序的屏幕截图(每 1 秒一次,不保存)。代码在我的 PC(Intel CPU、Radeon GPU)上运行良好,但在其他 2 个(Intel CPU + Intel 集成 GPU、Intel CPU + Nvidia GPU)上经过几次迭代后崩溃。
void extractBitmap(void* texture) {
if (texture) {
ID3D11Texture2D* d3dtex = (ID3D11Texture2D*)texture;
ID3D11Texture2D* pNewTexture = NULL;
D3D11_TEXTURE2D_DESC desc;
d3dtex->GetDesc(&desc);
desc.BindFlags = 0;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
desc.Usage = D3D11_USAGE_STAGING;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
HRESULT hRes = D3D11Device->CreateTexture2D(&desc, NULL, &pNewTexture);
if (FAILED(hRes)) {
printCon(std::string("CreateTexture2D FAILED:" + format_error(hRes)).c_str());
if (hRes == DXGI_ERROR_DEVICE_REMOVED)
printCon(std::string("DXGI_ERROR_DEVICE_REMOVED -- " + format_error(D3D11Device->GetDeviceRemovedReason())).c_str());
}
else {
if (pNewTexture) {
D3D11DeviceContext->CopyResource(pNewTexture, d3dtex);
// Wokring with texture
pNewTexture->Release();
}
}
}
return;
}
D3D11SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast< void** >(&pBackBuffer));
extractBitmap(pBackBuffer);
pBackBuffer->Release();
崩溃日志:
CreateTexture2D FAILED:887a0005
DXGI_ERROR_DEVICE_REMOVED -- 887a0020
一旦我注释掉 D3D11DeviceContext->CopyResource(pNewTexture, d3dtex);
代码在所有 3 台 PC 上都能正常工作。
知道了。我在单独的线程中 运行 我的代码。在我将它移动到 hooked Present() 之后,应用程序没有崩溃。
基本上,我正在尝试获取 Direct3D11 应用程序的屏幕截图(每 1 秒一次,不保存)。代码在我的 PC(Intel CPU、Radeon GPU)上运行良好,但在其他 2 个(Intel CPU + Intel 集成 GPU、Intel CPU + Nvidia GPU)上经过几次迭代后崩溃。
void extractBitmap(void* texture) {
if (texture) {
ID3D11Texture2D* d3dtex = (ID3D11Texture2D*)texture;
ID3D11Texture2D* pNewTexture = NULL;
D3D11_TEXTURE2D_DESC desc;
d3dtex->GetDesc(&desc);
desc.BindFlags = 0;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
desc.Usage = D3D11_USAGE_STAGING;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
HRESULT hRes = D3D11Device->CreateTexture2D(&desc, NULL, &pNewTexture);
if (FAILED(hRes)) {
printCon(std::string("CreateTexture2D FAILED:" + format_error(hRes)).c_str());
if (hRes == DXGI_ERROR_DEVICE_REMOVED)
printCon(std::string("DXGI_ERROR_DEVICE_REMOVED -- " + format_error(D3D11Device->GetDeviceRemovedReason())).c_str());
}
else {
if (pNewTexture) {
D3D11DeviceContext->CopyResource(pNewTexture, d3dtex);
// Wokring with texture
pNewTexture->Release();
}
}
}
return;
}
D3D11SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast< void** >(&pBackBuffer));
extractBitmap(pBackBuffer);
pBackBuffer->Release();
崩溃日志:
CreateTexture2D FAILED:887a0005
DXGI_ERROR_DEVICE_REMOVED -- 887a0020
一旦我注释掉 D3D11DeviceContext->CopyResource(pNewTexture, d3dtex);
代码在所有 3 台 PC 上都能正常工作。
知道了。我在单独的线程中 运行 我的代码。在我将它移动到 hooked Present() 之后,应用程序没有崩溃。