尝试在英特尔 630 HD 上使用 DXGI 和 DirectX11 捕获桌面时出错
Error when trying to capture desktop using DXGI and DirectX11 on intel 630 HD
当我尝试使用 DXGI 捕获我的笔记本电脑上的内置屏幕时出现以下错误,该笔记本电脑运行在装有最新驱动程序的 Intel 630 HD 上。当我在 GTX 1070 上捕获外部屏幕 运行 时,代码有效。
SharpDX.SharpDXException
HResult=0x80070057
Message=HRESULT: [0x80070057], Module: [General], ApiCode: [E_INVALIDARG/Invalid Arguments], Message: The parameter is incorrect.
我表单中的代码:
desktopDuplicator = new DesktopDuplicatorD11(1,0, DesktopDuplicatorD11.VSyncLevel.None);
错误的代码部分:
private bool RetrieveFrame()
{
if (desktopImageTexture == null)
desktopImageTexture = new Texture2D(mDevice, mTextureDescription);
frameInfo = new OutputDuplicateFrameInformation();
try
{
mDeskDuplication.AcquireNextFrame(500, out frameInfo, out desktopResource);
}
catch (SharpDXException ex)
{
if (ex.ResultCode.Code == SharpDX.DXGI.ResultCode.WaitTimeout.Result.Code)
{
return true;
}
if (ex.ResultCode.Failure)
{
throw new DesktopDuplicationException("Failed to acquire next frame.");
}
}
using (var tempTexture = desktopResource.QueryInterface<Texture2D>())
{
mDevice.ImmediateContext.CopyResource(tempTexture, desktopImageTexture);
}
return false;
}
具体报错就行:
desktopImageTexture = new Texture2D(mDevice, mTextureDescription);
使用内显和intel 630时出现错误的原因是什么?
编辑 #1:
mTextureDescription 创建:
this.mTextureDescription = new Texture2DDescription()
{
CpuAccessFlags = CpuAccessFlags.Read,
BindFlags = BindFlags.None,
Format = Format.B8G8R8A8_UNorm,
Width = this.mOutputDescription.DesktopBounds.Right,
Height = this.mOutputDescription.DesktopBounds.Bottom,
OptionFlags = ResourceOptionFlags.None,
MipLevels = 1,
ArraySize = 1,
SampleDescription = { Count = 1, Quality = 0 },
Usage = ResourceUsage.Staging
};
整个桌面复制过程在同一个线程上完成。
更新 #2:
在英特尔 630 Width = this.mOutputDescription.DesktopBounds.Right,
returns 0 上,在我的 1070 上是 returns 1920.
首先,要从 API 获得有关无效参数的提示(这正是您所拥有的),您需要 enable Direct3D Debug Layer。这篇文章针对 C++ 解释了它,也可以用 C# 做类似的技巧。
其次,重要的是失败调用中的有效参数是什么,而不仅仅是代码。
代码大致正确,但如果 mOutputDescription
中的坐标为零或无效,则上述 API 调用也会失败。您需要设置断点并检查变量。
最简单的原因通常是实际问题。
Intel 的最终版 WDDM 2.6 驱动程序无法与可切换显卡一起正常工作,请更新至 DCH WDDM 2.7 驱动程序。
当我尝试使用 DXGI 捕获我的笔记本电脑上的内置屏幕时出现以下错误,该笔记本电脑运行在装有最新驱动程序的 Intel 630 HD 上。当我在 GTX 1070 上捕获外部屏幕 运行 时,代码有效。
SharpDX.SharpDXException
HResult=0x80070057
Message=HRESULT: [0x80070057], Module: [General], ApiCode: [E_INVALIDARG/Invalid Arguments], Message: The parameter is incorrect.
我表单中的代码:
desktopDuplicator = new DesktopDuplicatorD11(1,0, DesktopDuplicatorD11.VSyncLevel.None);
错误的代码部分:
private bool RetrieveFrame()
{
if (desktopImageTexture == null)
desktopImageTexture = new Texture2D(mDevice, mTextureDescription);
frameInfo = new OutputDuplicateFrameInformation();
try
{
mDeskDuplication.AcquireNextFrame(500, out frameInfo, out desktopResource);
}
catch (SharpDXException ex)
{
if (ex.ResultCode.Code == SharpDX.DXGI.ResultCode.WaitTimeout.Result.Code)
{
return true;
}
if (ex.ResultCode.Failure)
{
throw new DesktopDuplicationException("Failed to acquire next frame.");
}
}
using (var tempTexture = desktopResource.QueryInterface<Texture2D>())
{
mDevice.ImmediateContext.CopyResource(tempTexture, desktopImageTexture);
}
return false;
}
具体报错就行:
desktopImageTexture = new Texture2D(mDevice, mTextureDescription);
使用内显和intel 630时出现错误的原因是什么?
编辑 #1: mTextureDescription 创建:
this.mTextureDescription = new Texture2DDescription()
{
CpuAccessFlags = CpuAccessFlags.Read,
BindFlags = BindFlags.None,
Format = Format.B8G8R8A8_UNorm,
Width = this.mOutputDescription.DesktopBounds.Right,
Height = this.mOutputDescription.DesktopBounds.Bottom,
OptionFlags = ResourceOptionFlags.None,
MipLevels = 1,
ArraySize = 1,
SampleDescription = { Count = 1, Quality = 0 },
Usage = ResourceUsage.Staging
};
整个桌面复制过程在同一个线程上完成。
更新 #2:
在英特尔 630 Width = this.mOutputDescription.DesktopBounds.Right,
returns 0 上,在我的 1070 上是 returns 1920.
首先,要从 API 获得有关无效参数的提示(这正是您所拥有的),您需要 enable Direct3D Debug Layer。这篇文章针对 C++ 解释了它,也可以用 C# 做类似的技巧。
其次,重要的是失败调用中的有效参数是什么,而不仅仅是代码。
代码大致正确,但如果 mOutputDescription
中的坐标为零或无效,则上述 API 调用也会失败。您需要设置断点并检查变量。
最简单的原因通常是实际问题。
Intel 的最终版 WDDM 2.6 驱动程序无法与可切换显卡一起正常工作,请更新至 DCH WDDM 2.7 驱动程序。