Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions examples/mc_cube/mc_cube.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,14 +169,14 @@ class Application

m_vpMatrixBpLayout = m_device->newParameterBlockLayout(gfx::ParameterBlockLayout::Descriptor{
.bindings = {
gfx::ParameterBlockBinding{ .type = gfx::BindingType::uniformBuffer, .usages = gfx::BindingUsage::vertexRead }
gfx::ParameterBlockBinding{ .type = gfx::BindingType::constantBuffer, .usages = gfx::BindingUsage::vertexRead }
}
});
assert(m_vpMatrixBpLayout);

m_modelMatrixBpLayout = m_device->newParameterBlockLayout(gfx::ParameterBlockLayout::Descriptor{
.bindings = {
gfx::ParameterBlockBinding{ .type = gfx::BindingType::uniformBuffer, .usages = gfx::BindingUsage::vertexRead }
gfx::ParameterBlockBinding{ .type = gfx::BindingType::constantBuffer, .usages = gfx::BindingUsage::vertexRead }
}
});
assert(m_modelMatrixBpLayout);
Expand Down Expand Up @@ -210,7 +210,13 @@ class Application

for (uint8_t i = 0; i < maxFrameInFlight; i++) {
m_commandBufferPools.at(i) = m_device->newCommandBufferPool();
m_parameterBlockPools.at(i) = m_device->newParameterBlockPool(gfx::ParameterBlockPool::Descriptor{});
m_parameterBlockPools.at(i) = m_device->newParameterBlockPool(gfx::ParameterBlockPool::Descriptor{
.maxBindingCount = {
{gfx::BindingType::constantBuffer, 2},
{gfx::BindingType::sampledTexture, 1},
{gfx::BindingType::sampler, 1}
}
});
}

{
Expand Down Expand Up @@ -313,14 +319,14 @@ class Application
{
m_vpMatrix.at(i) = m_device->newBuffer(gfx::Buffer::Descriptor{
.size=sizeof(glm::mat4x4),
.usages=gfx::BufferUsage::uniformBuffer,
.usages=gfx::BufferUsage::constantBuffer,
.storageMode = gfx::ResourceStorageMode::hostVisible
});
assert(m_vpMatrix.at(i));

m_modelMatrix.at(i) = m_device->newBuffer(gfx::Buffer::Descriptor{
.size=sizeof(glm::mat4x4),
.usages=gfx::BufferUsage::uniformBuffer,
.usages=gfx::BufferUsage::constantBuffer,
.storageMode = gfx::ResourceStorageMode::hostVisible
});
assert(m_modelMatrix.at(i));
Expand Down
8 changes: 5 additions & 3 deletions examples/scop/AssetLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -400,9 +400,11 @@ Mesh AssetLoader::loadMesh(const std::filesystem::path& path, std::optional<std:
materials.assign(scene->mNumMaterials, *overrideMaterial);
} else {
std::unique_ptr<gfx::ParameterBlockPool> parameterBlockPool = m_device->newParameterBlockPool({
.maxUniformBuffers = 500,
.maxTextures = 500,
.maxSamplers = 500
.maxBindingCount = {
{gfx::BindingType::constantBuffer, 500},
{gfx::BindingType::sampledTexture, 500},
{gfx::BindingType::sampler, 500}
}
});
assert(parameterBlockPool);

Expand Down
12 changes: 6 additions & 6 deletions examples/scop/Material.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ FlatColorMaterial::FlatColorMaterial(const gfx::Device& device)
if (!pbLayout) {
pbLayout = device.newParameterBlockLayout(gfx::ParameterBlockLayout::Descriptor{
.bindings = {
gfx::ParameterBlockBinding{ .type = gfx::BindingType::uniformBuffer, .usages = gfx::BindingUsage::fragmentRead },
gfx::ParameterBlockBinding{ .type = gfx::BindingType::constantBuffer, .usages = gfx::BindingUsage::fragmentRead },
}
});
assert(pbLayout);
Expand Down Expand Up @@ -84,7 +84,7 @@ FlatColorMaterial::FlatColorMaterial(const gfx::Device& device)

m_materialData = device.newBuffer(gfx::Buffer::Descriptor{
.size = sizeof(shader::flat_color::MaterialData),
.usages = gfx::BufferUsage::uniformBuffer,
.usages = gfx::BufferUsage::constantBuffer,
.storageMode = gfx::ResourceStorageMode::hostVisible});
setDiffuseColor(glm::vec4(1.0f, 1.0f, 1.0f, 1.0f));
setSpecularColor(glm::vec3(0.0f, 0.0f, 0.0f));
Expand All @@ -109,7 +109,7 @@ TexturedMaterial::TexturedMaterial(const gfx::Device& device)
gfx::ParameterBlockBinding{ .type = gfx::BindingType::sampledTexture, .usages = gfx::BindingUsage::fragmentRead },
gfx::ParameterBlockBinding{ .type = gfx::BindingType::sampledTexture, .usages = gfx::BindingUsage::fragmentRead },
gfx::ParameterBlockBinding{ .type = gfx::BindingType::sampledTexture, .usages = gfx::BindingUsage::fragmentRead },
gfx::ParameterBlockBinding{ .type = gfx::BindingType::uniformBuffer, .usages = gfx::BindingUsage::fragmentRead }
gfx::ParameterBlockBinding{ .type = gfx::BindingType::constantBuffer, .usages = gfx::BindingUsage::fragmentRead }
}
});
assert(pbLayout);
Expand Down Expand Up @@ -154,7 +154,7 @@ TexturedMaterial::TexturedMaterial(const gfx::Device& device)

m_materialData = device.newBuffer(gfx::Buffer::Descriptor{
.size = sizeof(shader::textured::MaterialData),
.usages = gfx::BufferUsage::uniformBuffer,
.usages = gfx::BufferUsage::constantBuffer,
.storageMode = gfx::ResourceStorageMode::hostVisible});

setSampler(device.newSampler(gfx::Sampler::Descriptor{
Expand Down Expand Up @@ -191,7 +191,7 @@ ScopMaterial::ScopMaterial(const gfx::Device& device)
.bindings = {
gfx::ParameterBlockBinding{ .type = gfx::BindingType::sampler, .usages = gfx::BindingUsage::fragmentRead },
gfx::ParameterBlockBinding{ .type = gfx::BindingType::sampledTexture, .usages = gfx::BindingUsage::fragmentRead },
gfx::ParameterBlockBinding{ .type = gfx::BindingType::uniformBuffer, .usages = gfx::BindingUsage::fragmentRead },
gfx::ParameterBlockBinding{ .type = gfx::BindingType::constantBuffer, .usages = gfx::BindingUsage::fragmentRead },
}
});
assert(pbLayout);
Expand Down Expand Up @@ -232,7 +232,7 @@ ScopMaterial::ScopMaterial(const gfx::Device& device)

m_materialData = device.newBuffer(gfx::Buffer::Descriptor{
.size = sizeof(shader::scop::MaterialData),
.usages = gfx::BufferUsage::uniformBuffer,
.usages = gfx::BufferUsage::constantBuffer,
.storageMode = gfx::ResourceStorageMode::hostVisible});

setSampler(device.newSampler(gfx::Sampler::Descriptor{
Expand Down
12 changes: 7 additions & 5 deletions examples/scop/Renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,33 +60,35 @@ Renderer::Renderer(gfx::Device* device, GLFWwindow* window, gfx::Surface* surfac
assert(frameData.commandBufferPool);

frameData.parameterBlockPool = m_device->newParameterBlockPool({
.maxUniformBuffers = 2, .maxTextures = 0, .maxSamplers = 0
.maxBindingCount = {
{gfx::BindingType::constantBuffer, 2},
}
});
assert(frameData.parameterBlockPool);

frameData.vpMatrix = m_device->newBuffer(gfx::Buffer::Descriptor{
.size = sizeof(glm::mat4x4),
.usages = gfx::BufferUsage::uniformBuffer,
.usages = gfx::BufferUsage::constantBuffer,
.storageMode = gfx::ResourceStorageMode::hostVisible});
assert(frameData.vpMatrix);

frameData.sceneDataBuffer = m_device->newBuffer(gfx::Buffer::Descriptor{
.size = sizeof(shader::SceneData),
.usages = gfx::BufferUsage::uniformBuffer,
.usages = gfx::BufferUsage::constantBuffer,
.storageMode = gfx::ResourceStorageMode::hostVisible});
}

m_vpMatrixBpLayout = m_device->newParameterBlockLayout(gfx::ParameterBlockLayout::Descriptor{
.bindings = {
gfx::ParameterBlockBinding{ .type = gfx::BindingType::uniformBuffer, .usages = gfx::BindingUsage::vertexRead }
gfx::ParameterBlockBinding{ .type = gfx::BindingType::constantBuffer, .usages = gfx::BindingUsage::vertexRead }
}
});
assert(m_vpMatrixBpLayout);
s_vpMatrixBpLayout = m_vpMatrixBpLayout;

m_sceneDataBpLayout = m_device->newParameterBlockLayout(gfx::ParameterBlockLayout::Descriptor{
.bindings = {
gfx::ParameterBlockBinding{ .type = gfx::BindingType::uniformBuffer, .usages = gfx::BindingUsage::fragmentRead }
gfx::ParameterBlockBinding{ .type = gfx::BindingType::constantBuffer, .usages = gfx::BindingUsage::fragmentRead }
}
});
assert(m_sceneDataBpLayout);
Expand Down
2 changes: 1 addition & 1 deletion include/Graphics/Buffer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class Buffer
struct Descriptor
{
size_t size = 0;
BufferUsages usages = BufferUsage::uniformBuffer;
BufferUsages usages = BufferUsage::constantBuffer;
ResourceStorageMode storageMode = ResourceStorageMode::hostVisible;

auto operator<=>(const Descriptor&) const = default;
Expand Down
16 changes: 10 additions & 6 deletions include/Graphics/Enums.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,11 +127,13 @@ enum class VertexAttributeFormat : uint8_t

enum class BufferUsage : uint8_t
{
vertexBuffer = 1 << 0,
indexBuffer = 1 << 1,
uniformBuffer = 1 << 2,
copySource = 1 << 3,
copyDestination = 1 << 4
vertexBuffer = 1 << 0,
indexBuffer = 1 << 1,
uniformBuffer [[deprecated("use constantBuffer")]] = 1 << 2 ,
constantBuffer = 1 << 2,
structuredBuffer = 1 << 3,
copySource = 1 << 4,
copyDestination = 1 << 5
};
GFX_ENABLE_BITMASK_OPERATORS(BufferUsage);
using BufferUsages = Flags<BufferUsage>;
Expand All @@ -152,7 +154,9 @@ using Backends = Flags<Backend>;

enum class BindingType : uint8_t
{
uniformBuffer,
uniformBuffer [[deprecated("use constantBuffer")]],
constantBuffer,
structuredBuffer,
sampledTexture,
sampler
};
Expand Down
2 changes: 1 addition & 1 deletion include/Graphics/ParameterBlockLayout.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ namespace gfx

struct ParameterBlockBinding
{
BindingType type = BindingType::uniformBuffer;
BindingType type = BindingType::constantBuffer;
BindingUsages usages = BindingUsage::vertexRead | BindingUsage::fragmentRead;
auto operator<=>(const ParameterBlockBinding&) const = default;
};
Expand Down
6 changes: 3 additions & 3 deletions include/Graphics/ParameterBlockPool.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@
#ifndef PARAMETERBLOCKPOOL_HPP
#define PARAMETERBLOCKPOOL_HPP

#include "Graphics/Enums.hpp"
#include "Graphics/ParameterBlock.hpp"
#include "Graphics/ParameterBlockLayout.hpp"

#include <cstdint>
#include <memory>
#include <map>

namespace gfx
{
Expand All @@ -24,9 +26,7 @@ class ParameterBlockPool
public:
struct Descriptor
{
uint32_t maxUniformBuffers = 16;
uint32_t maxTextures = 4;
uint32_t maxSamplers = 4;
std::map<BindingType, uint32_t> maxBindingCount;
auto operator<=>(const Descriptor&) const = default;
};

Expand Down
2 changes: 1 addition & 1 deletion src/Metal/MetalBuffer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class MetalBuffer : public Buffer
void* contentVoid() override;

private:
BufferUsages m_usages = BufferUsage::uniformBuffer;
BufferUsages m_usages = BufferUsage::constantBuffer;
ResourceStorageMode m_storageMode = ResourceStorageMode::hostVisible;

id<MTLBuffer> m_mtlBuffer = nil;
Expand Down
4 changes: 2 additions & 2 deletions src/Metal/MetalBuffer.mm
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

MetalBuffer::MetalBuffer(MetalBuffer&& other) noexcept
: Buffer(std::move(other)),
m_usages(std::exchange(other.m_usages, BufferUsage::uniformBuffer)),
m_usages(std::exchange(other.m_usages, BufferUsage::constantBuffer)),
m_storageMode(std::exchange(other.m_storageMode, ResourceStorageMode::hostVisible)),
m_mtlBuffer(std::exchange(other.m_mtlBuffer, nil))
{
Expand Down Expand Up @@ -60,7 +60,7 @@
Buffer::operator=(std::move(other));
if (this != &other)
{
m_usages = std::exchange(other.m_usages, BufferUsage::uniformBuffer);
m_usages = std::exchange(other.m_usages, BufferUsage::constantBuffer);
m_storageMode = std::exchange(other.m_storageMode, ResourceStorageMode::hostVisible);
m_mtlBuffer = std::exchange(other.m_mtlBuffer, nil);
}
Expand Down
2 changes: 1 addition & 1 deletion src/Metal/MetalParameterBlockPool.mm
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
MetalParameterBlockPool::MetalParameterBlockPool(const MetalDevice* device, const ParameterBlockPool::Descriptor& descriptor)
: m_device(device)
{
size_t totalBindings = descriptor.maxUniformBuffers + descriptor.maxTextures + descriptor.maxSamplers;
size_t totalBindings = std::accumulate(descriptor.maxBindingCount.begin(), descriptor.maxBindingCount.end(), 0, [](auto acc, const auto& kv) { return acc + kv.second; });
size_t bufferSize = totalBindings * 32; // argument buffer must be 32 byte aligned, worst case of one descriptor per block

Buffer::Descriptor buffDesc = { .size = bufferSize, .storageMode = ResourceStorageMode::hostVisible };
Expand Down
2 changes: 1 addition & 1 deletion src/Vulkan/VulkanCommandBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ void VulkanCommandBuffer::setParameterBlock(const std::shared_ptr<const Paramete
syncReq.stageMask |= vk::PipelineStageFlagBits2::eFragmentShader;

if (static_cast<bool>(binding.usages & (BindingUsage::vertexRead | BindingUsage::fragmentRead))) {
assert(binding.type == BindingType::uniformBuffer); // currently only uniform buffer are implemented
assert(binding.type == BindingType::constantBuffer); // currently only constant buffer are implemented
syncReq.accessMask |= vk::AccessFlagBits2::eUniformRead;
}
if (static_cast<bool>(binding.usages & (BindingUsage::vertexWrite | BindingUsage::fragmentWrite))) {
Expand Down
13 changes: 12 additions & 1 deletion src/Vulkan/VulkanEnums.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,35 +111,46 @@ constexpr vk::Format toVkFormat(VertexAttributeFormat fmt)

constexpr vk::BufferUsageFlags toVkBufferUsageFlags(BufferUsages use)
{
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
vk::BufferUsageFlags vkUsages;

if (use & BufferUsage::vertexBuffer)
vkUsages |= vk::BufferUsageFlagBits::eVertexBuffer;
if (use & BufferUsage::indexBuffer)
vkUsages |= vk::BufferUsageFlagBits::eIndexBuffer;
if (use & BufferUsage::uniformBuffer)
if (use & BufferUsage::uniformBuffer || use & BufferUsage::constantBuffer)
vkUsages |= vk::BufferUsageFlagBits::eUniformBuffer;
if (use & BufferUsage::structuredBuffer)
vkUsages |= vk::BufferUsageFlagBits::eStorageBuffer;
if (use & BufferUsage::copySource)
vkUsages |= vk::BufferUsageFlagBits::eTransferSrc;
if (use & BufferUsage::copyDestination)
vkUsages |= vk::BufferUsageFlagBits::eTransferDst;

return vkUsages;
#pragma GCC diagnostic pop
}

constexpr vk::DescriptorType toVkDescriptorType(BindingType tpe)
{
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
switch (tpe)
{
case BindingType::uniformBuffer:
case BindingType::constantBuffer:
return vk::DescriptorType::eUniformBuffer;
case BindingType::structuredBuffer:
return vk::DescriptorType::eStorageBuffer;
case BindingType::sampledTexture:
return vk::DescriptorType::eSampledImage;
case BindingType::sampler:
return vk::DescriptorType::eSampler;
default:
throw std::runtime_error("not implemented");
}
#pragma GCC diagnostic pop
}

constexpr vk::ShaderStageFlags toVkShaderStageFlags(BindingUsages use)
Expand Down
18 changes: 11 additions & 7 deletions src/Vulkan/VulkanParameterBlockPool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,27 @@

#include "Vulkan/VulkanParameterBlockPool.hpp"
#include "Vulkan/VulkanDevice.hpp"
#include "Vulkan/VulkanEnums.hpp"
#include "Vulkan/VulkanParameterBlock.hpp"
#include "VulkanParameterBlockLayout.hpp"
#include "Vulkan/VulkanParameterBlockLayout.hpp"

namespace gfx
{

VulkanParameterBlockPool::VulkanParameterBlockPool(const VulkanDevice* device, const ParameterBlockPool::Descriptor& descriptor)
: m_device(device)
{
std::array<vk::DescriptorPoolSize, 3> poolSizes = {
vk::DescriptorPoolSize{.type=vk::DescriptorType::eUniformBuffer, .descriptorCount=descriptor.maxUniformBuffers > 0 ? descriptor.maxUniformBuffers : 1},
vk::DescriptorPoolSize{.type=vk::DescriptorType::eSampledImage, .descriptorCount=descriptor.maxTextures > 0 ? descriptor.maxTextures : 1},
vk::DescriptorPoolSize{.type=vk::DescriptorType::eSampler, .descriptorCount=descriptor.maxSamplers > 0 ? descriptor.maxSamplers : 1}
};
std::vector<vk::DescriptorPoolSize> poolSizes(descriptor.maxBindingCount.size());
for (uint32_t i = 0; auto [key, val] : descriptor.maxBindingCount) {
assert(i<descriptor.maxBindingCount.size());
poolSizes[i++] = vk::DescriptorPoolSize{
.type = toVkDescriptorType(key),
.descriptorCount = val
};
}

auto descriptorPoolCreateInfo = vk::DescriptorPoolCreateInfo{}
.setMaxSets(descriptor.maxUniformBuffers + descriptor.maxTextures + descriptor.maxSamplers)
.setMaxSets(std::accumulate(descriptor.maxBindingCount.begin(), descriptor.maxBindingCount.end(), 0, [](auto acc, const auto& kv) { return acc + kv.second; }))
.setPoolSizes(poolSizes);

m_descriptorPool = std::shared_ptr<vk::DescriptorPool>(
Expand Down
1 change: 1 addition & 0 deletions src/pch.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include <print> // IWYU pragma: keep
#include <ctime> // IWYU pragma: keep
#include <mutex> // IWYU pragma: keep
#include <numeric> // IWYU pragma: keep

#if defined(GFX_BUILD_METAL)
#if defined(__OBJC__)
Expand Down
5 changes: 3 additions & 2 deletions tests/test_descriptor_operator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include "Graphics/Buffer.hpp"
#include "Graphics/Device.hpp"
#include "Graphics/Enums.hpp"
#include "Graphics/GraphicsPipeline.hpp"
#include "Graphics/Instance.hpp"
#include "Graphics/ParameterBlockLayout.hpp"
Expand Down Expand Up @@ -78,7 +79,7 @@ TEST(descriptor_operator, parameter_block_layout_descriptor)
gfx::ParameterBlockLayout::Descriptor lhs {};
lhs.bindings = {
{
.type=gfx::BindingType::uniformBuffer,
.type=gfx::BindingType::constantBuffer,
.usages=gfx::BindingUsage::vertexRead
}
};
Expand All @@ -93,7 +94,7 @@ TEST(descriptor_operator, parameter_block_pool_descriptor)
{
gfx::ParameterBlockPool::Descriptor lhs {};
gfx::ParameterBlockPool::Descriptor rhs = lhs;
rhs.maxUniformBuffers = lhs.maxUniformBuffers + 1;
rhs.maxBindingCount[gfx::BindingType::constantBuffer] = lhs.maxBindingCount[gfx::BindingType::constantBuffer] + 1;

expectDescriptorComparableInMap(lhs, rhs);
}
Expand Down
Loading
Loading