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
指定 CPU 在 GPU 繁忙时执行的操作的标志。 此标志是可选的。
[out, optional] pMappedResource
指向映射子资源的 D3D11_MAPPED_SUBRESOURCE 结构的指针。 请参阅有关 NULL 指针的备注部分。
返回值
类型: HRESULT
此方法返回 Direct3D 11 返回代码之一。
如果 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 参数时,必须确保应用不会读取 pData 成员 D3D11_MAPPED_SUBRESOURCE 点的子资源数据,因为这样做会导致严重的性能损失。 可以使用 PAGE_WRITECOMBINE将 pData 点分配到的内存区域,并且应用必须遵守与此类内存关联的所有限制。即使以下 C++ 代码也可以从内存中读取并触发性能损失,因为该代码可以扩展到以下 x86 程序集代码。
C++ 代码:
*((int*)MappedResource.pData) = 0;
x86 程序集代码:
AND DWORD PTR [EAX],0
使用适当的优化设置和语言构造来帮助避免这种性能损失。 例如,可以通过使用 可变 指针或通过优化代码速度而不是代码大小来避免 x 或 优化。
Windows Phone 8:支持此 API。
要求
要求 | 值 |
---|---|
目标平台 | Windows |
标头 | d3d11.h |
Library | D3D11.lib |