mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 22:29:15 +01:00
[d3d11] Use DxvkStagingBuffer in D3D11DeviceContext
This commit is contained in:
parent
0bc19472e8
commit
80c5b61e26
@ -19,6 +19,7 @@ namespace dxvk {
|
|||||||
m_annotation(this),
|
m_annotation(this),
|
||||||
m_multithread(this, false),
|
m_multithread(this, false),
|
||||||
m_device (Device),
|
m_device (Device),
|
||||||
|
m_staging (Device, StagingBufferSize),
|
||||||
m_csFlags (CsFlags),
|
m_csFlags (CsFlags),
|
||||||
m_csChunk (AllocCsChunk()),
|
m_csChunk (AllocCsChunk()),
|
||||||
m_cmdData (nullptr) {
|
m_cmdData (nullptr) {
|
||||||
@ -4421,45 +4422,12 @@ namespace dxvk {
|
|||||||
|
|
||||||
DxvkBufferSlice D3D11DeviceContext::AllocStagingBuffer(
|
DxvkBufferSlice D3D11DeviceContext::AllocStagingBuffer(
|
||||||
VkDeviceSize Size) {
|
VkDeviceSize Size) {
|
||||||
constexpr VkDeviceSize StagingBufferSize = 4 * 1024 * 1024;
|
return m_staging.alloc(256, Size);
|
||||||
|
|
||||||
DxvkBufferCreateInfo info;
|
|
||||||
info.size = Size;
|
|
||||||
info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT
|
|
||||||
| VK_BUFFER_USAGE_STORAGE_BUFFER_BIT
|
|
||||||
| VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
|
|
||||||
info.stages = VK_PIPELINE_STAGE_TRANSFER_BIT
|
|
||||||
| VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
|
|
||||||
| VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
|
|
||||||
info.access = VK_ACCESS_TRANSFER_READ_BIT
|
|
||||||
| VK_ACCESS_SHADER_READ_BIT;
|
|
||||||
|
|
||||||
// Create a dedicated buffer for large allocations
|
|
||||||
VkDeviceSize alignedSize = align(Size, 256);
|
|
||||||
|
|
||||||
if (alignedSize >= StagingBufferSize) {
|
|
||||||
return DxvkBufferSlice(m_device->createBuffer(info,
|
|
||||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise, try to suballocate from an existing buffer
|
|
||||||
if (m_stagingOffset + alignedSize > StagingBufferSize || m_stagingBuffer == nullptr) {
|
|
||||||
info.size = StagingBufferSize;
|
|
||||||
|
|
||||||
m_stagingBuffer = m_device->createBuffer(info,
|
|
||||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
|
|
||||||
m_stagingOffset = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
DxvkBufferSlice slice(m_stagingBuffer, m_stagingOffset, Size);
|
|
||||||
m_stagingOffset += alignedSize;
|
|
||||||
return slice;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void D3D11DeviceContext::ResetStagingBuffer() {
|
void D3D11DeviceContext::ResetStagingBuffer() {
|
||||||
m_stagingBuffer = nullptr;
|
m_staging.reset();
|
||||||
m_stagingOffset = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "../dxvk/dxvk_adapter.h"
|
#include "../dxvk/dxvk_adapter.h"
|
||||||
#include "../dxvk/dxvk_cs.h"
|
#include "../dxvk/dxvk_cs.h"
|
||||||
#include "../dxvk/dxvk_device.h"
|
#include "../dxvk/dxvk_device.h"
|
||||||
|
#include "../dxvk/dxvk_staging.h"
|
||||||
|
|
||||||
#include "../d3d10/d3d10_multithread.h"
|
#include "../d3d10/d3d10_multithread.h"
|
||||||
|
|
||||||
@ -21,6 +22,8 @@ namespace dxvk {
|
|||||||
friend class D3D11DeviceContextExt;
|
friend class D3D11DeviceContextExt;
|
||||||
// Needed in order to call EmitCs for pushing markers
|
// Needed in order to call EmitCs for pushing markers
|
||||||
friend class D3D11UserDefinedAnnotation;
|
friend class D3D11UserDefinedAnnotation;
|
||||||
|
|
||||||
|
constexpr static VkDeviceSize StagingBufferSize = 4ull << 20;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
D3D11DeviceContext(
|
D3D11DeviceContext(
|
||||||
@ -696,8 +699,7 @@ namespace dxvk {
|
|||||||
Rc<DxvkDevice> m_device;
|
Rc<DxvkDevice> m_device;
|
||||||
Rc<DxvkDataBuffer> m_updateBuffer;
|
Rc<DxvkDataBuffer> m_updateBuffer;
|
||||||
|
|
||||||
Rc<DxvkBuffer> m_stagingBuffer;
|
DxvkStagingBuffer m_staging;
|
||||||
VkDeviceSize m_stagingOffset = 0ull;
|
|
||||||
|
|
||||||
DxvkCsChunkFlags m_csFlags;
|
DxvkCsChunkFlags m_csFlags;
|
||||||
DxvkCsChunkRef m_csChunk;
|
DxvkCsChunkRef m_csChunk;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user