Cogs.Core
BuffersD3D12.h
1#pragma once
2
3#include "../Base/BuffersCommon.h"
4
5#include "CommonD3D12.h"
6
7#include <unordered_map>
8
9#include "Foundation/Collections/ConfigurablePagedPool.h"
10
11namespace Cogs
12{
14 {
15 PoolBuffer * next;
16 uint8_t * mappedRegion;
17 D3D12_GPU_VIRTUAL_ADDRESS mappedGpuRegion;
18 size_t offset;
19 struct BufferPool * pool;
20 ID3D12Resource * resource;
21 };
22
24 {
26 uint32_t elementSize;
27 D3D12_HEAP_TYPE heapType;
28 D3D12_RESOURCE_STATES resourceState;
29 struct BufferPool * pool;
30 };
31
33 {
34 BufferPage(BufferContext & context, size_t pageSize);
35 BufferPage(BufferPage &&) = default;
36 BufferPage(BufferPage &) = delete;
37
38 PoolBuffer * getHead() { return reinterpret_cast<PoolBuffer *>(storage.data()); }
39
41 private:
42 std::vector<uint8_t> storage;
43 uint8_t * mappedRegion;
44 D3D12_GPU_VIRTUAL_ADDRESS mappedGpuRegion;
45 };
46
47 struct BufferPool : public Collections::ConfigurablePagedPool<BufferContext, BufferPage, PoolBuffer>
48 {
49 void initialize(ResourcePointer<ID3D12Device> device, size_t capacity, uint32_t elementSize, uint32_t pageSize = 128)
50 {
51 BufferContext context;
52 context.device = device;
53 context.elementSize = elementSize;
54 context.heapType = D3D12_HEAP_TYPE_UPLOAD;
55 context.resourceState = D3D12_RESOURCE_STATE_GENERIC_READ;
56 context.pool = this;
57
58 ConfigurablePagedPool::initialize(context, capacity, pageSize);
59 }
60 };
61
62 struct BufferD3D12 : public ResourceD3D12
63 {
64 union
65 {
66 D3D12_VERTEX_BUFFER_VIEW vertexBufferView;
67 D3D12_INDEX_BUFFER_VIEW indexBufferView;
68 D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc;
69 D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc;
70 };
71
72 union
73 {
74 const VertexFormat * vertexFormat;
75 const DXGI_FORMAT * indexFormat;
76 };
77
78 union
79 {
80 size_t count;
81 size_t size;
82 };
83
84 uint32_t bindFlags = 0;
85 ResourcePointer<ID3D12Resource> counterResource;
86
87 ResourceD3D12 uploadResource;
88 };
89
91 {
92 D3D12_INPUT_ELEMENT_DESC inputElements[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
93 UINT inputElementCount = 0;
94 };
95
97 {
98 void initialize(struct GraphicsDeviceD3D12 * graphicsDevice);
99
100 struct GraphicsDeviceD3D12 * graphicsDevice;
101
102 VertexBufferHandle loadVertexBuffer(const void * vertexData, const size_t count, const VertexFormat & vertexFormat) override;
103 VertexBufferHandle loadVertexBuffer(const void * vertexData, const size_t count, VertexFormatHandle vertexFormat) override;
104 void releaseVertexBuffer(VertexBufferHandle vertexBufferHandle);
105
106 IndexBufferHandle loadIndexBuffer(const void * vertexData, const size_t count, const size_t indexSize);
107 void releaseIndexBuffer(IndexBufferHandle indexBufferHandle);
108
109 InputLayoutHandle loadInputLayout(const VertexFormatHandle * vertexFormats, const size_t count, EffectHandle effectHandle);
110 void releaseInputLayout(InputLayoutHandle vertexFormatHandle);
111
112 BufferHandle loadBuffer(const void * data, const size_t size, Usage::EUsage usage, uint32_t accessMode, uint32_t bindFlags, uint32_t stride = 0);
113 void releaseBuffer(BufferHandle bufferHandle);
114
115 void retrieveSubBuffer(void * data, BufferHandle source, const size_t offset, const size_t size);
116
117 void * getNativeHandle(BufferHandle bufferHandle) override;
118
119 void releaseResources();
120
121 BufferPool & getBufferPool(const size_t size, uint32_t bindFlags = 0);
122 void releaseBufferInternal(BufferHandle bufferHandle);
123
126
127 std::unordered_map<size_t, VertexFormat> vertexFormats;
128
129 void allocateBuffer(ResourceD3D12 & resource, size_t size, const void * data = nullptr);
130 private:
131
132 BufferPool bufferPool256;
133 BufferPool bufferPool1024;
134
136
137 struct EffectsD3D12 * effects;
138 };
139}
Provides a configurable pool implementation usable as base implementation for several pool-like stora...
Contains all Cogs related functionality.
Definition: FieldSetter.h:23
void releaseVertexBuffer(VertexBufferHandle vertexBufferHandle)
Release the vertex buffer with the given handle.
BufferHandle loadBuffer(const void *data, const size_t size, Usage::EUsage usage, uint32_t accessMode, uint32_t bindFlags, uint32_t stride=0)
Loads a new buffer using the given data to populate the buffer.
void releaseInputLayout(InputLayoutHandle vertexFormatHandle)
Releases the input layout with the given inputLayoutHandle.
void retrieveSubBuffer(void *data, BufferHandle source, const size_t offset, const size_t size)
Retrieves the contents of a buffer.
void releaseResources()
Releases all allocated buffer resources.
void * getNativeHandle(BufferHandle bufferHandle) override
Get the device-specific handle (D3D buffer pointer, OpenGL buffer ID etc) associated with the given b...
void releaseIndexBuffer(IndexBufferHandle indexBufferHandle)
Releases the index buffer with the given handle.
IndexBufferHandle loadIndexBuffer(const void *vertexData, const size_t count, const size_t indexSize)
Loads a new index buffer and populates it with the given indexData.
VertexBufferHandle loadVertexBuffer(const void *vertexData, const size_t count, const VertexFormat &vertexFormat) override
Loads a new vertex buffer and populates it with the given data.
void releaseBuffer(BufferHandle bufferHandle)
Releases the buffer with the given bufferHandle.
InputLayoutHandle loadInputLayout(const VertexFormatHandle *vertexFormats, const size_t count, EffectHandle effectHandle)
Loads a new input layout to map vertex flow between vertex buffers with the given vertexFormats to ef...
EUsage
Usage enumeration.
Definition: Flags.h:24
Vertex format structure used to describe a single vertex for the input assembler.
Definition: VertexFormat.h:60