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*

指向映射子资源的 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类型的值。

注意Direct3D 11.1 运行时从 Windows 8 开始提供,支持使用 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 参数时,必须确保应用不会读取 pData 成员 D3D11_MAPPED_SUBRESOURCE 点的子资源数据,因为这样做会导致严重的性能损失。 可以使用 PAGE_WRITECOMBINEpData 点分配到的内存区域,并且应用必须遵守与此类内存关联的所有限制。
注意  

即使以下 C++ 代码也可以从内存中读取并触发性能损失,因为该代码可以扩展到以下 x86 程序集代码。

C++ 代码:

*((int*)MappedResource.pData) = 0;

x86 程序集代码:

AND DWORD PTR [EAX],0
 

使用适当的优化设置和语言构造来帮助避免这种性能损失。 例如,可以通过使用 可变 指针或通过优化代码速度而不是代码大小来避免 x 或 优化。

Windows Phone 8:支持此 API。

要求

要求
目标平台 Windows
标头 d3d11.h
Library D3D11.lib

另请参阅

ID3D11DeviceContext