Directx10和Directx11很多resource类都有个Map()函数,个人感觉它是一个蛮重要的CPU和GPU沟通桥梁。下面以ID3D11DeviceContext::Map()为例讲下。

ID3D11DeviceContext::Map官方解释是:ID3D11DeviceContext::Map Method
  Get a pointer to the data contained in a subresource, and deny the GPU access to that subresource.

Syntax
HRESULT Map(
    ID3D11Resource *pResource,
    UINT Subresource,
    D3D11_MAP MapType,
    UINT MapFlags,
    D3D11_MAPPED_SUBRESOURCE *pMappedResource
);

个人理解总结是当需要用CPU读写(GPU的)subresouce(最常用如buffer)时,就用Map()得到该subresource的pointer(D3D11_MAPPED_SUBRESOURCE*),然后将D3D11_MAPPED_SUBRESOURCE::pData强制转换成CPU理解的类型(struct,class),CPU就可以对得到的struct*或class*读写了。

附录D3D11_MAPPED_SUBRESOURCE结构体
typedef struct D3D11_MAPPED_SUBRESOURCE
    {
    void *pData;
    UINT RowPitch;
    UINT DepthPitch;
    }  D3D11_MAPPED_SUBRESOURCE;

Map函数使用的几个经典场景1:debug时用CPU读写GPU之前读写的buffer(比如GPU计算输出的结果),然后再通过CPU输出来检验对错。
//将GPU读或读写的buffer *pGBuffer拷贝到可给CPU读的buffer并返回,以便调试
ID3D11Buffer* GPUBaseApp::CreateAndCopyToDebugBuf(ID3D11Buffer* pGBuffer)
{
 D3D11_BUFFER_DESC bufferDesc;
 ZeroMemory(&bufferDesc,sizeof(bufferDesc));
 pGBuffer->GetDesc(&bufferDesc);
 bufferDesc.CPUAccessFlags=D3D11_CPU_ACCESS_READ;
 bufferDesc.Usage=D3D11_USAGE_STAGING;
 bufferDesc.BindFlags=0;
 bufferDesc.MiscFlags=0;
 
 ID3D11Buffer* pDebugBuffer=NULL;

if( SUCCEEDED(m_pDevice->CreateBuffer(&bufferDesc,NULL,&pDebugBuffer)) )
 {
  m_pDeviceContext->CopyResource(pDebugBuffer,pGBuffer);
 }
 return pDebugBuffer;
}

HRESULT Function()
{
      
       //==============================================
      /

//===============================================
 //看Direct Compute的计算结果
 ID3D11Buffer* debugOutBuffer=NULL;
 ID3D11Buffer* debugInBuffer=NULL;

debugOutBuffer=CreateAndCopyToDebugBuf(m_pOutBuffer);
 debugInBuffer=CreateAndCopyToDebugBuf(m_pInputBuffer);

VoronoiOutBufType* pOut=NULL;
 VoronoiInBufType* pIn=NULL;

D3D11_MAPPED_SUBRESOURCE mappedOutResource;
 D3D11_MAPPED_SUBRESOURCE mappedInResource;

m_pDeviceContext->Map(debugOutBuffer,0,D3D11_MAP_READ,0,&mappedOutResource);
 pOut=(VoronoiOutBufType*)mappedOutResource.pData;

m_pDeviceContext->Map(debugInBuffer,0,D3D11_MAP_READ,0,&mappedInResource);
 pIn=(VoronoiInBufType*)mappedInResource.pData;

//printf("OutBuffer的结果如下:/n");
 //for(int i=0;i<30;i++)
 // printf("%d %f/n",pOut[i].index,pOut[i].dist);

m_pDeviceContext->Unmap(debugOutBuffer,0);
 SAFE_RELEASE(debugOutBuffer);

m_pDeviceContext->Unmap(debugInBuffer,0);
 SAFE_RELEASE(debugInBuffer);

//===============================================

//==============================================
      /

}

Map函数使用的几个经典场景2:更新GPU Shader中Constant buffer,把CPU中新的数据struct CB_MouseInfo mouseInfo写入GPU中Constant Buffer。
struct CB_MouseInfo
{
 UINT x;
 UINT y;
 UINT btDown;
};

CB_MouseInfo mouseInfo;

HRESULT GPUBaseApp::UpDateMouseInfoCB()
{
 HRESULT hr=S_OK;

D3D11_MAPPED_SUBRESOURCE subData;

ZeroMemory(&subData,sizeof(subData));

m_pDeviceContext->Map(m_pConstantBuffer,0,D3D11_MAP_WRITE_DISCARD,0,&subData);

memcpy(subData.pData,&mouseInfo,sizeof(CB_MouseInfo));

m_pDeviceContext->Unmap(&subData,0);

return hr;
}

注意点,当调用了Map(),最后记得调用ID3D11DeviceContext::Unmap Method使得GPU重新获取对该resouce的读写权。
Invalidate the pointer to a resource and re-enable the GPU's access to that resource.

Syntax
void Unmap(
    ID3D11Resource *pResource,
    UINT Subresource
);

Parameters:

pResource 
ID3D11Resource 
A pointer to a ID3D11Resource interface.

Subresource 
UINT 
A subresource to be unmapped.

转载于:https://www.cnblogs.com/RenderLife/archive/2012/09/26/2703583.html

【转】dx11 devicecontext-map相关推荐

  1. 深入优化GPU编程概述

    网上关于GPU编程优化的文章很多,本篇博客带领读者更深入的理解GPU编程以及各个函数的运行时间,为开发者优化Shader编程提供一些指导.除了Shader编程中的变量定义精度优化,还有函数的优化,下面 ...

  2. Vulkan Cascade Shadow Map的故事

    你只需做你自己,做你想做的事,不要沦为人海中的沧海一粟. --<沉默的多数派> 序 最近几周,看了看知乎上关于阴影的文章,虽然我记得大二的时候好像也看过那本<Unity Shader ...

  3. DX11——基本概念及初始化流程(一)

    1 Direct3D 11设备介绍 Direct3D设备可以用来创建和释放对象,渲染图元,与图形驱动和硬件通信.Direct3D 11将设备分离为一个创建资源的设备(device)对象的对象和一个执行 ...

  4. 笔记----DX11.0转为DX11.2

    在DX11.2中已经移除了D3DX,xnamath等文件 数学库由DirectXMath,D3DX由DirectXTK,DirectXTex代替 DirectXTex:点击打开链接 DirectXTK ...

  5. Surface Shaders with DX11 / OpenGL Core Tessellation 表面着色的曲面细分 - Unity Shader Reference 系列5

    Surface Shaders with DX11 / OpenGL Core Tessellation DX11/OpenGL核心下表面着色器的曲面细分 本文档主要是对Unity官方手册的个人理解与 ...

  6. Map的分类和不同的应用场景

    java为数据结构中的映射定义了一个接口java.util.Map; 它有四个实现类,分别是HashMap,Hashtable,LinkedHashMap和TreeMap 可能很多人只使用过HashM ...

  7. java1.8新增超实用Map方法——Map.getOrDefault()和Map.value()方法详解

    1. Map.getOrDefault() 翻译一下官方解释: java.util.Map<K, V> V getOrDefault(Object key, V defaultValue) ...

  8. Go 学习笔记(67)— Go 并发安全字典 sync.Map

    1. 并发不安全的 map Go 语言中的 map 在并发情况下,只读是线程安全的,同时读写是线程不安全的. 换句话说,在同一时间段内,让不同 goroutine 中的代码,对同一个字典进行读写操作是 ...

  9. Python 常用内置函数map、zip、filter、reduce、enumerate

    Python 中有许多非常实用的内置函数,通过这些函数我们可以方便的实现某些功能,下面就列举一些常用的内置函数. 1. map() 函数 map() 可以根据提供的函数对指定序列做映射,它接受一个函数 ...

  10. 将request中的所有参数存放到自定义的map中

    /*** <获取参数map>* * @return 参数map* @throws Exception */protected Map<String, Object> getPa ...

最新文章

  1. TF31003:您的用户帐户没有连接到 Team Foundation Server 的权限
  2. 吴恩达机器学习笔记:(四)矩阵、多元梯度下降
  3. Python多进程multiprocessing共享数据Value(包括常用的整数、字符串)、列表及字典以及Queue
  4. 线性表易错点与线性表程序设计易错点
  5. ITK:向二进制图像添加噪声
  6. kotlin函数式编程_我最喜欢的Kotlin函数式编程示例
  7. delphi random 六位_《蒙面唱将猜猜猜》第五季将播,六位唱将率先登场
  8. Vulkan in 30 minutes
  9. 财政部:瑞幸咖啡虚增收入21.19亿元 虚增利润9.08亿元
  10. 带参数的update mysql_mysql参数sql_update 说明
  11. 【Redis笔记】简单动态字符串(SDS)
  12. 如何在Mac视频中添加表情符号
  13. matlab平滑图像轮廓,Matlab 画平滑轮廓 print 高质量 figure
  14. 排队器拦截_如何绕过浏览器的弹窗拦截机制
  15. (result, consumed) = self._buffer_decode(data, self.errors, final)
  16. mac连接wifi无ip/无法访问网络
  17. Flask——1.初识flask微框架
  18. fastadmin 获取表格选中列的id和值
  19. 全国计算机建模三等奖,青春榜样 | 吴昊 : 守得云开见月明
  20. 模拟360导航的钢琴效果实现

热门文章

  1. ubuntu atpdpkg
  2. 《Puppet实战手册》——导读
  3. 获取当前上下文Activity
  4. Oracle 11g R2 X64数据库安装
  5. 企业库第4版最后版本下载
  6. Linux设备驱动02:Linux内核模块
  7. 【汇编优化】之x86架构intrinsic优化
  8. C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?
  9. find_first_of()和 find_last_of()
  10. mplab 语法错误不报错_Python怎么解决报错?