【转】dx11 devicecontext-map
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相关推荐
- 深入优化GPU编程概述
网上关于GPU编程优化的文章很多,本篇博客带领读者更深入的理解GPU编程以及各个函数的运行时间,为开发者优化Shader编程提供一些指导.除了Shader编程中的变量定义精度优化,还有函数的优化,下面 ...
- Vulkan Cascade Shadow Map的故事
你只需做你自己,做你想做的事,不要沦为人海中的沧海一粟. --<沉默的多数派> 序 最近几周,看了看知乎上关于阴影的文章,虽然我记得大二的时候好像也看过那本<Unity Shader ...
- DX11——基本概念及初始化流程(一)
1 Direct3D 11设备介绍 Direct3D设备可以用来创建和释放对象,渲染图元,与图形驱动和硬件通信.Direct3D 11将设备分离为一个创建资源的设备(device)对象的对象和一个执行 ...
- 笔记----DX11.0转为DX11.2
在DX11.2中已经移除了D3DX,xnamath等文件 数学库由DirectXMath,D3DX由DirectXTK,DirectXTex代替 DirectXTex:点击打开链接 DirectXTK ...
- Surface Shaders with DX11 / OpenGL Core Tessellation 表面着色的曲面细分 - Unity Shader Reference 系列5
Surface Shaders with DX11 / OpenGL Core Tessellation DX11/OpenGL核心下表面着色器的曲面细分 本文档主要是对Unity官方手册的个人理解与 ...
- Map的分类和不同的应用场景
java为数据结构中的映射定义了一个接口java.util.Map; 它有四个实现类,分别是HashMap,Hashtable,LinkedHashMap和TreeMap 可能很多人只使用过HashM ...
- java1.8新增超实用Map方法——Map.getOrDefault()和Map.value()方法详解
1. Map.getOrDefault() 翻译一下官方解释: java.util.Map<K, V> V getOrDefault(Object key, V defaultValue) ...
- Go 学习笔记(67)— Go 并发安全字典 sync.Map
1. 并发不安全的 map Go 语言中的 map 在并发情况下,只读是线程安全的,同时读写是线程不安全的. 换句话说,在同一时间段内,让不同 goroutine 中的代码,对同一个字典进行读写操作是 ...
- Python 常用内置函数map、zip、filter、reduce、enumerate
Python 中有许多非常实用的内置函数,通过这些函数我们可以方便的实现某些功能,下面就列举一些常用的内置函数. 1. map() 函数 map() 可以根据提供的函数对指定序列做映射,它接受一个函数 ...
- 将request中的所有参数存放到自定义的map中
/*** <获取参数map>* * @return 参数map* @throws Exception */protected Map<String, Object> getPa ...
最新文章
- TF31003:您的用户帐户没有连接到 Team Foundation Server 的权限
- 吴恩达机器学习笔记:(四)矩阵、多元梯度下降
- Python多进程multiprocessing共享数据Value(包括常用的整数、字符串)、列表及字典以及Queue
- 线性表易错点与线性表程序设计易错点
- ITK:向二进制图像添加噪声
- kotlin函数式编程_我最喜欢的Kotlin函数式编程示例
- delphi random 六位_《蒙面唱将猜猜猜》第五季将播,六位唱将率先登场
- Vulkan in 30 minutes
- 财政部:瑞幸咖啡虚增收入21.19亿元 虚增利润9.08亿元
- 带参数的update mysql_mysql参数sql_update 说明
- 【Redis笔记】简单动态字符串(SDS)
- 如何在Mac视频中添加表情符号
- matlab平滑图像轮廓,Matlab 画平滑轮廓 print 高质量 figure
- 排队器拦截_如何绕过浏览器的弹窗拦截机制
- (result, consumed) = self._buffer_decode(data, self.errors, final)
- mac连接wifi无ip/无法访问网络
- Flask——1.初识flask微框架
- fastadmin 获取表格选中列的id和值
- 全国计算机建模三等奖,青春榜样 | 吴昊 : 守得云开见月明
- 模拟360导航的钢琴效果实现