/* ** Sample Framework for deko3d Applications ** CDescriptorSet.h: Image/Sampler descriptor set class */ #pragma once #include "common.h" #include "CMemPool.h" template class CDescriptorSet { static_assert(NumDescriptors > 0, "Need a non-zero number of descriptors..."); static_assert(sizeof(DkImageDescriptor) == sizeof(DkSamplerDescriptor), "shouldn't happen"); static_assert(DK_IMAGE_DESCRIPTOR_ALIGNMENT == DK_SAMPLER_DESCRIPTOR_ALIGNMENT, "shouldn't happen"); static constexpr size_t DescriptorSize = sizeof(DkImageDescriptor); static constexpr size_t DescriptorAlign = DK_IMAGE_DESCRIPTOR_ALIGNMENT; CMemPool::Handle m_mem; public: CDescriptorSet() : m_mem{} { } CDescriptorSet(const CDescriptorSet&) = delete; CDescriptorSet& operator=(const CDescriptorSet&) = delete; ~CDescriptorSet() { m_mem.destroy(); } bool allocate(CMemPool& pool) { m_mem = pool.allocate(NumDescriptors*DescriptorSize, DescriptorAlign); return m_mem; } void bindForImages(dk::CmdBuf cmdbuf) { cmdbuf.bindImageDescriptorSet(m_mem.getGpuAddr(), NumDescriptors); } void bindForSamplers(dk::CmdBuf cmdbuf) { cmdbuf.bindSamplerDescriptorSet(m_mem.getGpuAddr(), NumDescriptors); } template void update(dk::CmdBuf cmdbuf, uint32_t id, T const& descriptor) { static_assert(sizeof(T) == DescriptorSize); cmdbuf.pushData(m_mem.getGpuAddr() + id*DescriptorSize, &descriptor, DescriptorSize); } template void update(dk::CmdBuf cmdbuf, uint32_t id, std::array const& descriptors) { static_assert(sizeof(T) == DescriptorSize); cmdbuf.pushData(m_mem.getGpuAddr() + id*DescriptorSize, descriptors.data(), descriptors.size()*DescriptorSize); } #ifdef DK_HPP_SUPPORT_VECTOR template > void update(dk::CmdBuf cmdbuf, uint32_t id, std::vector const& descriptors) { static_assert(sizeof(T) == DescriptorSize); cmdbuf.pushData(m_mem.getGpuAddr() + id*DescriptorSize, descriptors.data(), descriptors.size()*DescriptorSize); } #endif template void update(dk::CmdBuf cmdbuf, uint32_t id, std::initializer_list const& descriptors) { static_assert(sizeof(T) == DescriptorSize); cmdbuf.pushData(m_mem.getGpuAddr() + id*DescriptorSize, descriptors.data(), descriptors.size()*DescriptorSize); } };