diff --git a/examples/mc_cube/mc_cube.cpp b/examples/mc_cube/mc_cube.cpp index de97403..a454e6d 100644 --- a/examples/mc_cube/mc_cube.cpp +++ b/examples/mc_cube/mc_cube.cpp @@ -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); @@ -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} + } + }); } { @@ -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)); diff --git a/examples/scop/AssetLoader.cpp b/examples/scop/AssetLoader.cpp index 2bf2acb..31a1246 100644 --- a/examples/scop/AssetLoader.cpp +++ b/examples/scop/AssetLoader.cpp @@ -400,9 +400,11 @@ Mesh AssetLoader::loadMesh(const std::filesystem::path& path, std::optionalmNumMaterials, *overrideMaterial); } else { std::unique_ptr 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); diff --git a/examples/scop/Material.cpp b/examples/scop/Material.cpp index c5b7b94..a427075 100644 --- a/examples/scop/Material.cpp +++ b/examples/scop/Material.cpp @@ -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); @@ -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)); @@ -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); @@ -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{ @@ -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); @@ -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{ diff --git a/examples/scop/Renderer.cpp b/examples/scop/Renderer.cpp index aea6f45..619bde1 100644 --- a/examples/scop/Renderer.cpp +++ b/examples/scop/Renderer.cpp @@ -60,25 +60,27 @@ 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); @@ -86,7 +88,7 @@ Renderer::Renderer(gfx::Device* device, GLFWwindow* window, gfx::Surface* surfac 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); diff --git a/include/Graphics/Buffer.hpp b/include/Graphics/Buffer.hpp index e57daf3..45845ad 100644 --- a/include/Graphics/Buffer.hpp +++ b/include/Graphics/Buffer.hpp @@ -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; diff --git a/include/Graphics/Enums.hpp b/include/Graphics/Enums.hpp index 4ee9a64..3db9418 100644 --- a/include/Graphics/Enums.hpp +++ b/include/Graphics/Enums.hpp @@ -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; @@ -152,7 +154,9 @@ using Backends = Flags; enum class BindingType : uint8_t { - uniformBuffer, + uniformBuffer [[deprecated("use constantBuffer")]], + constantBuffer, + structuredBuffer, sampledTexture, sampler }; diff --git a/include/Graphics/ParameterBlockLayout.hpp b/include/Graphics/ParameterBlockLayout.hpp index a88fe6a..1bdc608 100644 --- a/include/Graphics/ParameterBlockLayout.hpp +++ b/include/Graphics/ParameterBlockLayout.hpp @@ -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; }; diff --git a/include/Graphics/ParameterBlockPool.hpp b/include/Graphics/ParameterBlockPool.hpp index 03760c1..d00e003 100644 --- a/include/Graphics/ParameterBlockPool.hpp +++ b/include/Graphics/ParameterBlockPool.hpp @@ -10,11 +10,13 @@ #ifndef PARAMETERBLOCKPOOL_HPP #define PARAMETERBLOCKPOOL_HPP +#include "Graphics/Enums.hpp" #include "Graphics/ParameterBlock.hpp" #include "Graphics/ParameterBlockLayout.hpp" #include #include +#include namespace gfx { @@ -24,9 +26,7 @@ class ParameterBlockPool public: struct Descriptor { - uint32_t maxUniformBuffers = 16; - uint32_t maxTextures = 4; - uint32_t maxSamplers = 4; + std::map maxBindingCount; auto operator<=>(const Descriptor&) const = default; }; diff --git a/src/Metal/MetalBuffer.hpp b/src/Metal/MetalBuffer.hpp index 099a87b..9db57ae 100644 --- a/src/Metal/MetalBuffer.hpp +++ b/src/Metal/MetalBuffer.hpp @@ -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 m_mtlBuffer = nil; diff --git a/src/Metal/MetalBuffer.mm b/src/Metal/MetalBuffer.mm index 72a09a7..ac30fb5 100644 --- a/src/Metal/MetalBuffer.mm +++ b/src/Metal/MetalBuffer.mm @@ -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)) { @@ -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); } diff --git a/src/Metal/MetalParameterBlockPool.mm b/src/Metal/MetalParameterBlockPool.mm index 010c3be..3e8db70 100644 --- a/src/Metal/MetalParameterBlockPool.mm +++ b/src/Metal/MetalParameterBlockPool.mm @@ -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 }; diff --git a/src/Vulkan/VulkanCommandBuffer.cpp b/src/Vulkan/VulkanCommandBuffer.cpp index bdc3ef4..473d9a4 100644 --- a/src/Vulkan/VulkanCommandBuffer.cpp +++ b/src/Vulkan/VulkanCommandBuffer.cpp @@ -228,7 +228,7 @@ void VulkanCommandBuffer::setParameterBlock(const std::shared_ptr(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(binding.usages & (BindingUsage::vertexWrite | BindingUsage::fragmentWrite))) { diff --git a/src/Vulkan/VulkanEnums.hpp b/src/Vulkan/VulkanEnums.hpp index 7fc0f8d..bc13efa 100644 --- a/src/Vulkan/VulkanEnums.hpp +++ b/src/Vulkan/VulkanEnums.hpp @@ -111,28 +111,38 @@ 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: @@ -140,6 +150,7 @@ constexpr vk::DescriptorType toVkDescriptorType(BindingType tpe) default: throw std::runtime_error("not implemented"); } + #pragma GCC diagnostic pop } constexpr vk::ShaderStageFlags toVkShaderStageFlags(BindingUsages use) diff --git a/src/Vulkan/VulkanParameterBlockPool.cpp b/src/Vulkan/VulkanParameterBlockPool.cpp index ac9135c..54b2ffc 100644 --- a/src/Vulkan/VulkanParameterBlockPool.cpp +++ b/src/Vulkan/VulkanParameterBlockPool.cpp @@ -11,8 +11,9 @@ #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 { @@ -20,14 +21,17 @@ namespace gfx VulkanParameterBlockPool::VulkanParameterBlockPool(const VulkanDevice* device, const ParameterBlockPool::Descriptor& descriptor) : m_device(device) { - std::array 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 poolSizes(descriptor.maxBindingCount.size()); + for (uint32_t i = 0; auto [key, val] : descriptor.maxBindingCount) { + assert(i( diff --git a/src/pch.hpp b/src/pch.hpp index 621deb5..152f82e 100644 --- a/src/pch.hpp +++ b/src/pch.hpp @@ -31,6 +31,7 @@ #include // IWYU pragma: keep #include // IWYU pragma: keep #include // IWYU pragma: keep +#include // IWYU pragma: keep #if defined(GFX_BUILD_METAL) #if defined(__OBJC__) diff --git a/tests/test_descriptor_operator.cpp b/tests/test_descriptor_operator.cpp index b44072e..d0c87fd 100644 --- a/tests/test_descriptor_operator.cpp +++ b/tests/test_descriptor_operator.cpp @@ -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" @@ -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 } }; @@ -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); } diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index e90b711..ad1df8e 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -12,7 +12,7 @@ if(NOT GFX_SLANG_FORCE_DOWNLOAD) endif() if(NOT slang_FOUND) - set(SLANG_URL "https://github.com/shader-slang/slang/releases/download/v2025.24.2/slang-2025.24.2") + set(SLANG_URL "https://github.com/shader-slang/slang/releases/download/v2026.4.2/slang-2026.4.2") if(APPLE) string(APPEND SLANG_URL "-macos") elseif(WIN32)