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*

指向映射子资源的 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_DISCARDD3D11_MAP_WRITE_NO_OVERWRITE或两者都传递给 MapType 参数。 延迟上下文不支持其他 D3D11_MAP类型化值。

注释 从 Windows 8 开始提供的 Direct3D 11.1 运行时,可以使用 D3D11_MAP_WRITE_NO_OVERWRITE映射动态常量缓冲区和着色器资源视图(SRV)。 Direct3D 11 及更早的运行时限制到顶点或索引缓冲区的映射。 若要确定 Direct3D 设备是否支持这些功能,请使用 D3D11_FEATURE_D3D11_OPTIONS调用 ID3D11Device::CheckFeatureSupportCheckFeatureSupport 使用设备的功能填充 D3D11_FEATURE_DATA_D3D11_OPTIONS 结构的成员。 此处的相关成员 MapNoOverwriteOnDynamicConstantBufferMapNoOverwriteOnDynamicBufferSRV
 
有关如何使用 映射的信息,请参阅 如何:使用动态资源

pMappedResource 的 NULL 指针

如果提供了使用 D3D11_USAGE_DEFAULT创建的纹理,并且 API 在即时上下文中调用,则 pMappedResource 参数可能为 NULL。 这允许映射默认纹理,即使使用 D3D11_TEXTURE_LAYOUT_UNDEFINED创建纹理。 在此 API 调用后,可以使用 ID3D11DeviceContext3::WriteToSubresource 和/或 ID3D11DeviceContext3::ReadFromSubresource访问纹理。

不从映射用于写入的子资源读取

D3D11_MAP_WRITED3D11_MAP_WRITE_DISCARDD3D11_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

另请参阅

ID3D11DeviceContext