You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
4.2 KiB
149 lines
4.2 KiB
#include "NativePipelineTypes.h"
|
|
#include "details/GslUtils.h"
|
|
|
|
namespace cc {
|
|
|
|
namespace render {
|
|
|
|
void BufferPool::init(gfx::Device* deviceIn, uint32_t sz, bool bDynamic) {
|
|
CC_EXPECTS(deviceIn);
|
|
CC_EXPECTS(sz);
|
|
CC_EXPECTS(!device);
|
|
CC_EXPECTS(bufferSize == 0);
|
|
|
|
device = deviceIn;
|
|
bufferSize = sz;
|
|
dynamic = bDynamic;
|
|
}
|
|
|
|
void BufferPool::syncResources() {
|
|
for (auto& buffer : currentBuffers) {
|
|
freeBuffers.emplace_back(std::move(buffer));
|
|
}
|
|
currentBuffers.clear();
|
|
|
|
for (auto& bufferView : currentBufferViews) {
|
|
freeBufferViews.emplace_back(std::move(bufferView));
|
|
}
|
|
currentBufferViews.clear();
|
|
}
|
|
|
|
gfx::Buffer* BufferPool::allocateBuffer() {
|
|
CC_EXPECTS(device);
|
|
CC_EXPECTS(bufferSize);
|
|
|
|
gfx::Buffer* ptr = nullptr;
|
|
|
|
if (freeBuffers.empty()) {
|
|
{
|
|
gfx::BufferInfo info{
|
|
gfx::BufferUsageBit::UNIFORM | gfx::BufferUsageBit::TRANSFER_DST,
|
|
gfx::MemoryUsageBit::HOST | gfx::MemoryUsageBit::DEVICE,
|
|
bufferSize,
|
|
bufferSize};
|
|
freeBuffers.emplace_back(device->createBuffer(info));
|
|
}
|
|
|
|
if (dynamic) {
|
|
gfx::BufferViewInfo info{
|
|
freeBuffers.back().get(),
|
|
0, bufferSize};
|
|
freeBufferViews.emplace_back(device->createBuffer(info));
|
|
}
|
|
}
|
|
{
|
|
CC_ENSURES(!freeBuffers.empty());
|
|
auto& buffer = freeBuffers.back();
|
|
ptr = buffer.get();
|
|
CC_EXPECTS(buffer->getSize() == bufferSize);
|
|
currentBuffers.emplace_back(std::move(buffer));
|
|
freeBuffers.pop_back();
|
|
}
|
|
if (dynamic) {
|
|
CC_ENSURES(!freeBufferViews.empty());
|
|
auto& bufferView = freeBufferViews.back();
|
|
ptr = bufferView.get();
|
|
CC_EXPECTS(bufferView->getSize() == bufferSize);
|
|
currentBufferViews.emplace_back(std::move(bufferView));
|
|
freeBufferViews.pop_back();
|
|
}
|
|
CC_ENSURES(ptr);
|
|
if (dynamic) {
|
|
CC_ENSURES(ptr->isBufferView());
|
|
} else {
|
|
CC_ENSURES(!ptr->isBufferView());
|
|
}
|
|
return ptr;
|
|
}
|
|
|
|
void UniformBlockResource::init(gfx::Device* deviceIn, uint32_t sz, bool bDynamic) {
|
|
CC_EXPECTS(cpuBuffer.empty());
|
|
cpuBuffer.resize(sz);
|
|
bufferPool.init(deviceIn, sz, bDynamic);
|
|
}
|
|
|
|
gfx::Buffer* UniformBlockResource::createFromCpuBuffer() {
|
|
CC_EXPECTS(cpuBuffer.size() == bufferPool.bufferSize);
|
|
auto* bufferOrView = bufferPool.allocateBuffer();
|
|
if (bufferPool.dynamic) {
|
|
auto* buffer = bufferPool.currentBuffers.back().get();
|
|
buffer->update(cpuBuffer.data(), static_cast<uint32_t>(cpuBuffer.size()));
|
|
} else {
|
|
bufferOrView->update(cpuBuffer.data(), static_cast<uint32_t>(cpuBuffer.size()));
|
|
}
|
|
return bufferOrView;
|
|
}
|
|
|
|
void DescriptorSetPool::init(gfx::Device* deviceIn,
|
|
IntrusivePtr<gfx::DescriptorSetLayout> layout) {
|
|
CC_EXPECTS(deviceIn);
|
|
CC_EXPECTS(layout);
|
|
CC_EXPECTS(!device);
|
|
CC_EXPECTS(!setLayout);
|
|
device = deviceIn;
|
|
setLayout = std::move(layout);
|
|
}
|
|
|
|
void DescriptorSetPool::syncDescriptorSets() {
|
|
for (auto& set : currentDescriptorSets) {
|
|
freeDescriptorSets.emplace_back(std::move(set));
|
|
}
|
|
currentDescriptorSets.clear();
|
|
}
|
|
|
|
gfx::DescriptorSet& DescriptorSetPool::getCurrentDescriptorSet() {
|
|
CC_EXPECTS(!currentDescriptorSets.empty());
|
|
return *currentDescriptorSets.back();
|
|
}
|
|
|
|
const gfx::DescriptorSet& DescriptorSetPool::getCurrentDescriptorSet() const {
|
|
CC_EXPECTS(!currentDescriptorSets.empty());
|
|
return *currentDescriptorSets.back();
|
|
}
|
|
|
|
gfx::DescriptorSet* DescriptorSetPool::allocateDescriptorSet() {
|
|
CC_EXPECTS(device);
|
|
CC_EXPECTS(setLayout);
|
|
|
|
gfx::DescriptorSet* ptr = nullptr;
|
|
|
|
if (freeDescriptorSets.empty()) {
|
|
freeDescriptorSets.emplace_back(
|
|
device->createDescriptorSet(gfx::DescriptorSetInfo{setLayout.get()}));
|
|
}
|
|
|
|
{
|
|
CC_ENSURES(!freeDescriptorSets.empty());
|
|
auto& set = freeDescriptorSets.back();
|
|
ptr = set.get();
|
|
CC_EXPECTS(set->getLayout() == setLayout);
|
|
currentDescriptorSets.emplace_back(std::move(set));
|
|
freeDescriptorSets.pop_back();
|
|
}
|
|
CC_ENSURES(ptr);
|
|
return ptr;
|
|
}
|
|
|
|
} // namespace render
|
|
|
|
} // namespace cc
|
|
|