创建资源时传递 DXGI 信息

Direct3D 版本 10 运行时调用用户模式显示驱动程序的 CreateResource (D3D10) 函数来创建资源时,可以传递特定于 DXGI 的信息。 运行时可以将指针传递到 D3D10DDIARG_CREATERESOURCE 结构的 pPrimaryDesc 成员中的 DXGI_DDI_PRIMARY_DESC 结构,以指定可将资源用作主 (,即可以将资源扫描到显示) 。 仅当运行时还设置 D3D10DDIARG_CREATERESOURCE BindFlags 成员中的 D3D10_DDI_BIND_PRESENT 位时,运行时才会将 pPrimaryDesc 设置为非 NULL 值。

运行时可以在 DXGI_DDI_PRIMARY_DESC 的 Flags 成员中指定DXGI_DDI_PRIMARY_OPTIONAL标志,以通知用户模式显示驱动程序,驱动程序可以选择退出翻转样式演示文稿中的资源。 为了通知运行时不应在翻转样式演示文稿中使用资源,驱动程序在 DXGI_DDI_PRIMARY_DESC 的 DriverFlags 成员中设置DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT标志。

如果驱动程序在 createResource (D3D10) 调用创建资源时返回DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT,则当资源是演示文稿的源时,运行时将始终执行位块传输 (bitblt) 样式演示文稿 (而不是翻转样式演示文稿) 。 如果图形硬件无法扫描给定资源类型的特定子集,此功能非常有用。 例如,图形硬件可能无法扫描多采样的后台缓冲区类型的资源。 此外,扫描多采样的后台缓冲区的功能可能进一步取决于图面的格式。 如果图形硬件无法扫描出特定的多采样格式,则用户模式显示驱动程序会在 DXGI_DDI_PRIMARY_DESC 的 DriverFlags 成员中为此格式的资源设置DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT标志。

如果运行时未在 DXGI_DDI_PRIMARY_DESC 的 Flags 成员中设置DXGI_DDI_PRIMARY_OPTIONAL标志,以通知驱动程序选择退出翻转样式演示文稿中的资源的可能性,则驱动程序仍可以从调用 CreateResource (D3D10) 返回DXGI_DDI_ERR_UNSUPPORTED错误代码以及DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT标志。 驱动程序的 CreateResource (D3D10) 在调用 pfnSetErrorCb 函数时传递DXGI_DDI_ERR_UNSUPPORTED(如果驱动程序无法扫描出此类主数据库)。 返回DXGI_DDI_ERR_UNSUPPORTED以及DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT会导致 DXGI 在后台缓冲区和主图面之间插接表示路径中的代理图面。 代理图面在大小、多重采样和旋转方面始终与主要 (扫描输出) 图面匹配。 此过程的第一步是让 DXGI 确定哪些多重采样或旋转设置导致驱动程序拒绝扫描具有这些设置的表面。 DXGI 通过缩减并尝试创建一个不带旋转、不进行多重采样或两者都没有的主节点来做出此决定。 在 DXGI 确定驱动程序对扫描输出功能的支持后,DXGI 会创建主图面和代理图面,驱动程序应能够在这两个图面之间翻转。 DXGI 随后仍会通过调用驱动程序的 BltDXGI 函数来执行从后台缓冲区到代理图面的位字节,满足应用程序对自动旋转或多采样后台缓冲区的请求。 这些 bitblts 请求驱动程序执行多重采样解析或旋转。 有关 BltDXGI 的详细信息,请参阅 BltDXGI 参考页。