Cogs.Core
RenderBuffer.cpp
1#include "RenderBuffer.h"
2#include "Renderer.h"
3
4#include "Rendering/IBuffers.h"
5
6#include "Foundation/Logging/Logger.h"
7
8namespace
9{
10 Cogs::Logging::Log logger = Cogs::Logging::getLogger("RenderBuffer");
11}
12
13void Cogs::Core::RenderBuffer::update(Renderer * renderer)
14{
15 const size_t desiredSize = elementCount.getValue() ? elementCount.getValue() * elementSize.getValue() : bufferSize.getValue();
16
17 if (desiredSize == size && currentCount == bufferCount) return;
18
19 release(renderer);
20
21 size = desiredSize;
22 currentCount = bufferCount;
23
24 void * data = nullptr;
25 std::vector<uint32_t> fill;
29
30 for (auto & p : parameters) {
31 if (p.key == "flags") {
32 if (p.value == "Raw") {
33 bindFlags = BindFlags::RawBuffer;
34 } else if (p.value == "Structured") {
36 } else if (p.value == "StructuredWithCounter") {
38 }
39 } else if (p.key == "fill") {
40 if (p.type == ParsedDataType::UInt) {
41 fill.resize(size, p.uintValue);
42 data = fill.data();
43 }
44 else if (p.type == ParsedDataType::Int) {
45 char *dat = (char*)&p.intValue;
46 fill.resize(size);
47 memcpy(fill.data(), dat, sizeof(int32_t));
48 data = fill.data();
49 }
50 else if (p.type == ParsedDataType::Float) {
51 char *dat = (char*)&p.floatValue;
52 fill.resize(size);
53 memcpy(fill.data(), dat, sizeof(float));
54 data = fill.data();
55 }
56 } else if (p.key == "accessMode") {
57 if (p.value == "Read") {
58 accessMode = AccessMode::Read;
59 } else if (p.value == "Write") {
60 accessMode = AccessMode::Write;
61 } else if (p.value == "ReadWrite") {
62 accessMode = AccessMode::ReadWrite;
63 }
64 } else if (p.key == "usage") {
65 if (p.value == "Default") {
66 usage = Usage::Default;
67 } else if (p.value == "Dynamic") {
68 usage = Usage::Dynamic;
69 } else if (p.value == "Staging") {
70 usage = Usage::Staging;
71 }
72 }
73 }
74
75 auto device = renderer->getDevice();
76 auto buffers = device->getBuffers();
77 frames.resize(currentCount);
78 if (currentCount == 1) {
79 buffer = buffers->loadBuffer(data, size, usage, accessMode, bindFlags, static_cast<uint32_t>(elementSize));
80 buffers->annotate(buffer, "RenderBuffer");
81
82 if (!HandleIsValid(buffer)) {
83 LOG_ERROR(logger, "Could not create buffer with size=%zd.", size);
84 }
85 } else {
86 this->buffers.resize(currentCount);
87 for (size_t i = 0; i < currentCount; ++i) {
88 this->buffers[i] = buffers->loadBuffer(data, size, usage, accessMode, bindFlags, static_cast<uint32_t>(elementSize));
89 buffers->annotate(this->buffers[i], "RenderBuffer");
90
91 if (!HandleIsValid(this->buffers[i])) {
92 LOG_ERROR(logger, "Could not create buffer with size=%zd.", size);
93 }
94 }
95 }
96
97 if (HandleIsValid(buffer)) {
98 buffers->annotate(buffer, getName());
99 }
100}
101
102void Cogs::Core::RenderBuffer::release(Renderer * renderer)
103{
104 auto device = renderer->getDevice();
105 auto buffers = device->getBuffers();
106
107 if (!this->buffers.size() && HandleIsValid(buffer)) {
108 buffers->releaseBuffer(buffer);
109 } else {
110 for (size_t i = 0; i < this->buffers.size(); ++i) {
111 buffers->releaseBuffer(this->buffers[i]);
112 }
113 }
114}
Log implementation class.
Definition: LogManager.h:139
bool HandleIsValid(const ResourceHandle_t< T > &handle)
Check if the given resource is valid, that is not equal to NoHandle or InvalidHandle.
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Definition: LogManager.h:180
EAccessMode
Access mode enumeration.
Definition: Flags.h:44
@ Read
The buffer can be mapped and read from by the CPU after creation.
Definition: Flags.h:48
@ Write
The buffer can be mapped and written to by the CPU after creation.
Definition: Flags.h:50
@ None
The buffer can not be either read from or written to by the CPU after creation.
Definition: Flags.h:46
EBindFlags
Bind flags enumeration.
Definition: Flags.h:64
@ StructuredBufferWithCounter
The buffer can be bound as a structured buffer and read or written from shaders, with an additional a...
Definition: Flags.h:82
@ RawBuffer
The buffer can be bound as a byte address buffer and read or written from shaders.
Definition: Flags.h:78
@ None
The buffer will not be bound to the graphics pipeline. Suitable for staging resources.
Definition: Flags.h:66
@ StructuredBuffer
The buffer can be bound as a structured buffer and read or written from shaders.
Definition: Flags.h:80
EUsage
Usage enumeration.
Definition: Flags.h:24
@ Default
Default usage.
Definition: Flags.h:26
@ Dynamic
Buffer will be loaded and modified with some frequency.
Definition: Flags.h:30
@ Staging
Definition: Flags.h:33