1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-11 10:24:10 +01:00

[d3d11] Add more general counter buffer allocator

We're going to need it for more than just UAV counters soon.
This commit is contained in:
Philip Rebohle 2018-08-30 15:14:26 +02:00
parent 715d25716b
commit 9992ba1a79
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 116 additions and 0 deletions

View File

@ -0,0 +1,52 @@
#include "d3d11_counter_buffer.h"
#include "d3d11_device.h"
namespace dxvk {
D3D11CounterBuffer::D3D11CounterBuffer(
const Rc<DxvkDevice>& Device,
const DxvkBufferCreateInfo& BufferInfo,
VkDeviceSize SliceLength)
: m_device (Device),
m_bufferInfo (BufferInfo),
m_sliceLength (SliceLength) {
}
D3D11CounterBuffer::~D3D11CounterBuffer() {
}
DxvkBufferSlice D3D11CounterBuffer::AllocSlice() {
std::lock_guard<std::mutex> lock(m_mutex);
if (m_freeSlices.size() == 0)
CreateBuffer();
DxvkBufferSlice slice = m_freeSlices.back();
m_freeSlices.pop_back();
return slice;
}
void D3D11CounterBuffer::FreeSlice(const DxvkBufferSlice& Slice) {
std::lock_guard<std::mutex> lock(m_mutex);
m_freeSlices.push_back(Slice);
}
void D3D11CounterBuffer::CreateBuffer() {
Rc<DxvkBuffer> buffer = m_device->createBuffer(
m_bufferInfo, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
VkDeviceSize sliceCount = m_bufferInfo.size / m_sliceLength;
for (uint32_t i = 0; i < sliceCount; i++) {
m_freeSlices.push_back(DxvkBufferSlice(
buffer, m_sliceLength * i, m_sliceLength));
}
}
}

View File

@ -0,0 +1,63 @@
#pragma once
#include "d3d11_include.h"
#include "../dxvk/dxvk_buffer.h"
#include "../dxvk/dxvk_device.h"
namespace dxvk {
class D3D11Device;
/**
* \brief D3D11 UAV counter slice allocator
*
* Thread safe allocator for buffer slices of
* the same size, which are typically used to
* store counters (such as UAV counters).
*/
class D3D11CounterBuffer : public RcObject {
public:
D3D11CounterBuffer(
const Rc<DxvkDevice>& Device,
const DxvkBufferCreateInfo& BufferInfo,
VkDeviceSize SliceLength);
~D3D11CounterBuffer();
/**
* \brief Allocates a counter slice
*
* Picks a slice from the free list or
* creates a new buffer if necessary.
* \returns The counter slice
*/
DxvkBufferSlice AllocSlice();
/**
* \brief Frees a counter slice
*
* Adds the given slice back to the
* free list so that it can be reused.
* \param [in] Slice the slice to free
*/
void FreeSlice(
const DxvkBufferSlice& Slice);
private:
Rc<DxvkDevice> m_device;
DxvkBufferCreateInfo m_bufferInfo;
VkDeviceSize m_sliceLength;
std::mutex m_mutex;
std::vector<DxvkBufferSlice> m_freeSlices;
void CreateBuffer();
};
}

View File

@ -23,6 +23,7 @@ d3d11_src = [
'd3d11_context.cpp', 'd3d11_context.cpp',
'd3d11_context_def.cpp', 'd3d11_context_def.cpp',
'd3d11_context_imm.cpp', 'd3d11_context_imm.cpp',
'd3d11_counter_buffer.cpp',
'd3d11_depth_stencil.cpp', 'd3d11_depth_stencil.cpp',
'd3d11_device.cpp', 'd3d11_device.cpp',
'd3d11_enums.cpp', 'd3d11_enums.cpp',