在Intel 630 HD上尝试使用DXGI和DirectX11捕获桌面时发生错误

问题描述 投票:0回答:1

当尝试使用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:在Intel 630上,Width = this.mOutputDescription.DesktopBounds.Right,返回0,而在我的1070上,它返回1920。

当尝试使用DXGI捕获笔记本电脑上的内置屏幕时,出现以下错误,该笔记本电脑在具有最新驱动程序的Intel 630 HD上运行。当我捕获运行中的外部屏幕时,该代码有效。

c# sharpdx dxgi desktop-duplication
1个回答
0
投票

首先,要从API获得有关无效参数的提示(这正是您所拥有的),您需要enable Direct3D Debug Layer。本文针对C ++进行了解释,并且也可以使用C#做类似的技巧。

© www.soinside.com 2019 - 2024. All rights reserved.