当前位置: 首页 > article >正文

Directx上传堆和默认堆注意事项

前景

之前我用directx写上传堆上传给默认堆Index,但是我发现数据无法被GPU读取

void HelloTriangle::createDefaultBuffer(const void* data, const UINT byteSize, ComPtr<ID3D12Resource>& defaultBuffer)
{
	ThrowIfFiled(m_Device->CreateCommittedResource(&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
		D3D12_HEAP_FLAG_NONE, &CD3DX12_RESOURCE_DESC::Buffer(byteSize),
		D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(defaultBuffer.GetAddressOf())
	));
	ComPtr<ID3D12Resource> upLoadBuffer;
	ThrowIfFiled(m_Device->CreateCommittedResource(&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
		D3D12_HEAP_FLAG_NONE, &CD3DX12_RESOURCE_DESC::Buffer(byteSize), D3D12_RESOURCE_STATE_GENERIC_READ,
		nullptr, IID_PPV_ARGS(upLoadBuffer.GetAddressOf())));

	D3D12_SUBRESOURCE_DATA subResourceData{};
	subResourceData.pData = data;
	subResourceData.RowPitch = byteSize;
	subResourceData.SlicePitch = subResourceData.RowPitch;

	UpdateSubresources(m_CommandList.Get(), defaultBuffer.Get(), upLoadBuffer.Get(),
		0, 0, 1, &subResourceData);
	m_CommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(defaultBuffer.Get(),
		D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ));
}

问题所在

原来数据复制给了upLoadBuffer但是还没有传递给默认堆的时候这个函数就结束了,上传堆就没了

解决

将上传堆和索引数据设置在类中,而不要放在临时的栈中,或者直接在这里就执行excuate

createIndexBuffer();
ID3D12CommandList* pCommandLists[] = { m_CommandList.Get() };
m_CommandQueue->ExecuteCommandLists(_countof(pCommandLists), pCommandLists);
waitForFinish();
void HelloTriangle::createIndexBuffer()
{
	UINT indices[] = {
		// 前
	0, 1, 2,
	0, 2, 3,

	// 后
	4, 6, 5,
	4, 7, 6,

	// 左
	4, 5, 1,
	4, 1, 0,

	// 右
	3, 2, 6,
	3, 6, 7,

	// 上
	1, 5, 6,
	1, 6, 2,

	// 下
	4, 0, 3,
	4, 3, 7
	};
	UINT indexBufferSize = m_IndexBufferSize = sizeof(indices);
	createDefaultBuffer(indices, indexBufferSize, m_IndexBuffer, m_UploadBuffer);
}
void HelloTriangle::createDefaultBuffer(const void* data, const UINT byteSize, ComPtr<ID3D12Resource>& defaultBuffer,
	ComPtr<ID3D12Resource>& upLoad)
{
	ThrowIfFiled(m_Device->CreateCommittedResource(&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
		D3D12_HEAP_FLAG_NONE, &CD3DX12_RESOURCE_DESC::Buffer(byteSize),
		D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(defaultBuffer.GetAddressOf())
	));
	
	ThrowIfFiled(m_Device->CreateCommittedResource(&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
		D3D12_HEAP_FLAG_NONE, &CD3DX12_RESOURCE_DESC::Buffer(byteSize), D3D12_RESOURCE_STATE_GENERIC_READ,
		nullptr, IID_PPV_ARGS(upLoad.GetAddressOf())));

	D3D12_SUBRESOURCE_DATA subResourceData{};
	subResourceData.pData = data;
	subResourceData.RowPitch = byteSize;
	subResourceData.SlicePitch = subResourceData.RowPitch;

	UpdateSubresources(m_CommandList.Get(), defaultBuffer.Get(), upLoad.Get(),
		0, 0, 1, &subResourceData);
	m_CommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(defaultBuffer.Get(),
		D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ));
	ThrowIfFiled(m_CommandList->Close());
}


http://www.kler.cn/a/561851.html

相关文章:

  • WPS中Word表格做好了,忘记写标题了怎么办?
  • 深入理解 Flink 中的 .name() 和 .uid() 方法
  • 网络安全-系统层攻击流程及防御措施
  • web安全——web应用程序技术
  • 智能证件照处理器(深度学习)
  • PHP 连接 Memcached 服务
  • 腾讯云cos 临时密钥 适用于前端直传等临时授权场景
  • 在嵌入式Linux中实现高并发TCP服务器:从select到epoll的演进与实战
  • Spring Cloud源码 - Eureka源码原理分析
  • MFC学习笔记-1
  • 基本网络安全的实现
  • 火语言RPA--Excel设置列宽
  • 分治算法、动态规划、贪心算法、分支限界法和回溯算法的深度对比
  • 十类DeepSeek学术提示词分享
  • 心理咨询小程序的未来发展
  • deepseek部署:ELK + Filebeat + Zookeeper + Kafka
  • WEEX交易所安全教學:如何應對剪切板被劫持駭客攻擊?
  • leetcode226-翻转二叉树
  • 高并发微服务日志管理:ELK、Loki、Fluentd 终极对决与实战指南
  • MySql:Authentication plugin ‘caching sha2 password‘ cannot be loaded