ID3D11DeviceContext::Map 方法 (d3d11.h)
获取指向 子资源中包含的数据的指针,并拒绝对该子资源的 GPU 访问。
语法
HRESULT Map(
[in] ID3D11Resource *pResource,
[in] UINT Subresource,
[in] D3D11_MAP MapType,
[in] UINT MapFlags,
[out, optional] D3D11_MAPPED_SUBRESOURCE *pMappedResource
);
参数
[in] pResource
类型:ID3D11Resource*
指向 ID3D11Resource 接口的指针。
[in] Subresource
类型:UINT
子资源的索引号。
[in] MapType
类型:D3D11_MAP
一个 D3D11_MAP类型的值,该值指定资源的 CPU 读取和写入权限。
[in] MapFlags
类型:UINT
标志,指定 GPU 繁忙时 CPU 执行的作。 此标志是可选的。
[out, optional] pMappedResource
指向映射子资源的 D3D11_MAPPED_SUBRESOURCE 结构的指针。 请参阅有关 NULL 指针的“备注”部分。
返回值
类型:HRESULT
如果 MapFlags 指定 D3D11_MAP_FLAG_DO_NOT_WAIT 并且 GPU 尚未使用资源完成,此方法也会返回 DXGI_ERROR_WAS_STILL_DRAWING。
如果 MapType 允许任何 CPU 读取访问并删除视频卡,此方法也会返回 DXGI_ERROR_DEVICE_REMOVED。
有关这些错误代码的详细信息,请参阅 DXGI_ERROR。
言论
如果在延迟的上下文中调用 Map,则只能将 D3D11_MAP_WRITE_DISCARD、D3D11_MAP_WRITE_NO_OVERWRITE或两者都传递给 MapType 参数。 延迟上下文不支持其他 D3D11_MAP类型化值。
pMappedResource 的 NULL 指针
如果提供了使用 D3D11_USAGE_DEFAULT创建的纹理,并且 API 在即时上下文中调用,则 pMappedResource 参数可能为 NULL。 这允许映射默认纹理,即使使用 D3D11_TEXTURE_LAYOUT_UNDEFINED创建纹理。 在此 API 调用后,可以使用 ID3D11DeviceContext3::WriteToSubresource 和/或 ID3D11DeviceContext3::ReadFromSubresource访问纹理。不从映射用于写入的子资源读取
将 D3D11_MAP_WRITE、D3D11_MAP_WRITE_DISCARD或 D3D11_MAP_WRITE_NO_OVERWRITE 传递给 MapType 参数时,必须确保应用不会读取 pDataD3D11_MAPPED_SUBRESOURCE 点成员的子资源数据,因为这样做可能会导致重大性能损失。 可以使用 PAGE_WRITECOMBINE分配 pData 点的内存区域,并且应用必须遵循与此类内存关联的所有限制。即使是以下C++代码也可以从内存中读取并触发性能损失,因为代码可以扩展到以下 x86 程序集代码。
C++代码:
*((int*)MappedResource.pData) = 0;
x86 程序集代码:
AND DWORD PTR [EAX],0
使用适当的优化设置和语言构造来帮助避免这种性能损失。 例如,可以使用 可变 指针或通过优化代码速度而不是代码大小来避免 xor 优化。
Windows Phone 8: 此 API 受支持。
要求
要求 | 价值 |
---|---|
目标平台 | 窗户 |
标头 | d3d11.h |
库 | D3D11.lib |