diff --git a/CHANGELOG b/CHANGELOG index 4b91294e..9a10d8b7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +- rename IFence::Desc -> FenceDesc, add label to FenceDesc - implement dynamic rendering in Vulkan - remove IFramebuffer and IFramebufferLayout - rename IFramebufferLayout::Desc -> FramebufferLayoutDesc diff --git a/include/slang-rhi.h b/include/slang-rhi.h index 417d7916..b508a64e 100644 --- a/include/slang-rhi.h +++ b/include/slang-rhi.h @@ -706,6 +706,8 @@ struct SamplerDesc float borderColor[4] = {1.0f, 1.0f, 1.0f, 1.0f}; float minLOD = -FLT_MAX; float maxLOD = FLT_MAX; + + const char* label = nullptr; }; class ISampler : public ISlangUnknown @@ -922,17 +924,19 @@ class IAccelerationStructure : public IResourceView virtual SLANG_NO_THROW DeviceAddress SLANG_MCALL getDeviceAddress() = 0; }; +struct FenceDesc +{ + uint64_t initialValue = 0; + bool isShared = false; + + const char* label = nullptr; +}; + class IFence : public ISlangUnknown { SLANG_COM_INTERFACE(0x9daf743c, 0xbc69, 0x4887, {0x80, 0x8b, 0xe6, 0xcf, 0x1f, 0x9e, 0x48, 0xa0}); public: - struct Desc - { - uint64_t initialValue = 0; - bool isShared = false; - }; - /// Returns the currently signaled value on the device. virtual SLANG_NO_THROW Result SLANG_MCALL getCurrentValue(uint64_t* outValue) = 0; @@ -2389,7 +2393,7 @@ class IDevice : public ISlangUnknown virtual SLANG_NO_THROW Result SLANG_MCALL createAccelerationStructure(const IAccelerationStructure::CreateDesc& desc, IAccelerationStructure** outView) = 0; - virtual SLANG_NO_THROW Result SLANG_MCALL createFence(const IFence::Desc& desc, IFence** outFence) = 0; + virtual SLANG_NO_THROW Result SLANG_MCALL createFence(const FenceDesc& desc, IFence** outFence) = 0; /// Wait on the host for the fences to signals. /// `timeout` is in nanoseconds, can be set to `kTimeoutInfinite`. diff --git a/src/d3d12/d3d12-device.cpp b/src/d3d12/d3d12-device.cpp index 43f8ca27..3f49708c 100644 --- a/src/d3d12/d3d12-device.cpp +++ b/src/d3d12/d3d12-device.cpp @@ -1963,7 +1963,7 @@ Result DeviceImpl::createQueryPool(const IQueryPool::Desc& desc, IQueryPool** ou } } -Result DeviceImpl::createFence(const IFence::Desc& desc, IFence** outFence) +Result DeviceImpl::createFence(const FenceDesc& desc, IFence** outFence) { RefPtr fence = new FenceImpl(); SLANG_RETURN_ON_FAIL(fence->init(this, desc)); diff --git a/src/d3d12/d3d12-device.h b/src/d3d12/d3d12-device.h index 81146250..ffb82afe 100644 --- a/src/d3d12/d3d12-device.h +++ b/src/d3d12/d3d12-device.h @@ -157,7 +157,7 @@ class DeviceImpl : public RendererBase virtual SLANG_NO_THROW Result SLANG_MCALL createQueryPool(const IQueryPool::Desc& desc, IQueryPool** outState) override; - virtual SLANG_NO_THROW Result SLANG_MCALL createFence(const IFence::Desc& desc, IFence** outFence) override; + virtual SLANG_NO_THROW Result SLANG_MCALL createFence(const FenceDesc& desc, IFence** outFence) override; virtual SLANG_NO_THROW Result SLANG_MCALL waitForFences(GfxCount fenceCount, IFence** fences, uint64_t* fenceValues, bool waitForAll, uint64_t timeout) diff --git a/src/d3d12/d3d12-fence.cpp b/src/d3d12/d3d12-fence.cpp index 88a65ba7..c97827f9 100644 --- a/src/d3d12/d3d12-fence.cpp +++ b/src/d3d12/d3d12-fence.cpp @@ -17,13 +17,17 @@ HANDLE FenceImpl::getWaitEvent() return m_waitEvent; } -Result FenceImpl::init(DeviceImpl* device, const IFence::Desc& desc) +Result FenceImpl::init(DeviceImpl* device, const FenceDesc& desc) { SLANG_RETURN_ON_FAIL(device->m_device->CreateFence( desc.initialValue, desc.isShared ? D3D12_FENCE_FLAG_SHARED : D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(m_fence.writeRef()) )); + if (desc.label) + { + m_fence->SetName(string::to_wstring(desc.label).c_str()); + } return SLANG_OK; } diff --git a/src/d3d12/d3d12-fence.h b/src/d3d12/d3d12-fence.h index 848d3b0a..581850ef 100644 --- a/src/d3d12/d3d12-fence.h +++ b/src/d3d12/d3d12-fence.h @@ -14,7 +14,7 @@ class FenceImpl : public FenceBase HANDLE getWaitEvent(); - Result init(DeviceImpl* device, const IFence::Desc& desc); + Result init(DeviceImpl* device, const FenceDesc& desc); virtual SLANG_NO_THROW Result SLANG_MCALL getCurrentValue(uint64_t* outValue) override; diff --git a/src/debug-layer/debug-device.cpp b/src/debug-layer/debug-device.cpp index 1252766f..14111dcb 100644 --- a/src/debug-layer/debug-device.cpp +++ b/src/debug-layer/debug-device.cpp @@ -503,7 +503,7 @@ Result DebugDevice::createQueryPool(const IQueryPool::Desc& desc, IQueryPool** o return SLANG_OK; } -Result DebugDevice::createFence(const IFence::Desc& desc, IFence** outFence) +Result DebugDevice::createFence(const FenceDesc& desc, IFence** outFence) { SLANG_RHI_API_FUNC; RefPtr result = new DebugFence(); diff --git a/src/debug-layer/debug-device.h b/src/debug-layer/debug-device.h index 0f981876..1640cdfd 100644 --- a/src/debug-layer/debug-device.h +++ b/src/debug-layer/debug-device.h @@ -109,7 +109,7 @@ class DebugDevice : public DebugObject virtual SLANG_NO_THROW const DeviceInfo& SLANG_MCALL getDeviceInfo() const override; virtual SLANG_NO_THROW Result SLANG_MCALL createQueryPool(const IQueryPool::Desc& desc, IQueryPool** outPool) override; - virtual SLANG_NO_THROW Result SLANG_MCALL createFence(const IFence::Desc& desc, IFence** outFence) override; + virtual SLANG_NO_THROW Result SLANG_MCALL createFence(const FenceDesc& desc, IFence** outFence) override; virtual SLANG_NO_THROW Result SLANG_MCALL waitForFences(GfxCount fenceCount, IFence** fences, uint64_t* values, bool waitForAll, uint64_t timeout) override; virtual SLANG_NO_THROW Result SLANG_MCALL diff --git a/src/metal/metal-device.cpp b/src/metal/metal-device.cpp index ad7adffc..b4c92ace 100644 --- a/src/metal/metal-device.cpp +++ b/src/metal/metal-device.cpp @@ -768,7 +768,7 @@ Result DeviceImpl::createQueryPool(const IQueryPool::Desc& desc, IQueryPool** ou return SLANG_OK; } -Result DeviceImpl::createFence(const IFence::Desc& desc, IFence** outFence) +Result DeviceImpl::createFence(const FenceDesc& desc, IFence** outFence) { AUTORELEASEPOOL diff --git a/src/metal/metal-device.h b/src/metal/metal-device.h index 4fa67ea6..91eb997d 100644 --- a/src/metal/metal-device.h +++ b/src/metal/metal-device.h @@ -88,7 +88,7 @@ class DeviceImpl : public RendererBase virtual SLANG_NO_THROW Result SLANG_MCALL getTextureRowAlignment(Size* outAlignment) override; - virtual SLANG_NO_THROW Result SLANG_MCALL createFence(const IFence::Desc& desc, IFence** outFence) override; + virtual SLANG_NO_THROW Result SLANG_MCALL createFence(const FenceDesc& desc, IFence** outFence) override; virtual SLANG_NO_THROW Result SLANG_MCALL waitForFences(GfxCount fenceCount, IFence** fences, uint64_t* fenceValues, bool waitForAll, uint64_t timeout) diff --git a/src/metal/metal-fence.cpp b/src/metal/metal-fence.cpp index 12a08b3d..df38a1be 100644 --- a/src/metal/metal-fence.cpp +++ b/src/metal/metal-fence.cpp @@ -5,7 +5,7 @@ namespace rhi::metal { FenceImpl::~FenceImpl() {} -Result FenceImpl::init(DeviceImpl* device, const IFence::Desc& desc) +Result FenceImpl::init(DeviceImpl* device, const FenceDesc& desc) { m_device = device; m_event = NS::TransferPtr(m_device->m_device->newSharedEvent()); diff --git a/src/metal/metal-fence.h b/src/metal/metal-fence.h index f822b4c4..1b8a0b5f 100644 --- a/src/metal/metal-fence.h +++ b/src/metal/metal-fence.h @@ -12,7 +12,7 @@ class FenceImpl : public FenceBase ~FenceImpl(); - Result init(DeviceImpl* device, const IFence::Desc& desc); + Result init(DeviceImpl* device, const FenceDesc& desc); virtual SLANG_NO_THROW Result SLANG_MCALL getCurrentValue(uint64_t* outValue) override; diff --git a/src/metal/metal-sampler.cpp b/src/metal/metal-sampler.cpp index 193a607f..33a30939 100644 --- a/src/metal/metal-sampler.cpp +++ b/src/metal/metal-sampler.cpp @@ -32,6 +32,7 @@ Result SamplerImpl::init(DeviceImpl* device, const SamplerDesc& desc) samplerDesc->setLodMaxClamp(std::clamp(desc.maxLOD, samplerDesc->lodMinClamp(), 1000.f)); samplerDesc->setSupportArgumentBuffers(true); + samplerDesc->setLabel(MetalUtil::createString(desc.label)); // TODO: no support for reduction op diff --git a/src/renderer-shared.cpp b/src/renderer-shared.cpp index 9ed516f6..43914c57 100644 --- a/src/renderer-shared.cpp +++ b/src/renderer-shared.cpp @@ -525,7 +525,7 @@ Result RendererBase::createMutableRootShaderObject(IShaderProgram* program, ISha return SLANG_E_NOT_AVAILABLE; } -Result RendererBase::createFence(const IFence::Desc& desc, IFence** outFence) +Result RendererBase::createFence(const FenceDesc& desc, IFence** outFence) { SLANG_UNUSED(desc); *outFence = nullptr; diff --git a/src/renderer-shared.h b/src/renderer-shared.h index 0bec7d68..85996311 100644 --- a/src/renderer-shared.h +++ b/src/renderer-shared.h @@ -1148,7 +1148,7 @@ class RendererBase : public IDevice, public ComObject createMutableRootShaderObject(IShaderProgram* program, IShaderObject** outObject) override; // Provides a default implementation that returns SLANG_E_NOT_AVAILABLE. - virtual SLANG_NO_THROW Result SLANG_MCALL createFence(const IFence::Desc& desc, IFence** outFence) override; + virtual SLANG_NO_THROW Result SLANG_MCALL createFence(const FenceDesc& desc, IFence** outFence) override; // Provides a default implementation that returns SLANG_E_NOT_AVAILABLE. virtual SLANG_NO_THROW Result SLANG_MCALL diff --git a/src/vulkan/vk-device.cpp b/src/vulkan/vk-device.cpp index 793cec23..1308a2d7 100644 --- a/src/vulkan/vk-device.cpp +++ b/src/vulkan/vk-device.cpp @@ -1386,6 +1386,18 @@ void DeviceImpl::_transitionImageLayout( _transitionImageLayout(commandBuffer, image, format, desc, oldLayout, newLayout); } +void DeviceImpl::_labelObject(uint64_t object, VkDebugReportObjectTypeEXT objectType, const char* label) +{ + if (label && m_api.vkDebugMarkerSetObjectNameEXT) + { + VkDebugMarkerObjectNameInfoEXT nameDesc = {VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT}; + nameDesc.object = object; + nameDesc.objectType = objectType; + nameDesc.pObjectName = label; + m_api.vkDebugMarkerSetObjectNameEXT(m_api.m_device, &nameDesc); + } +} + Result DeviceImpl::getTextureAllocationInfo(const TextureDesc& descIn, Size* outSize, Size* outAlignment) { TextureDesc desc = fixupTextureDesc(descIn); @@ -1589,15 +1601,7 @@ Result DeviceImpl::createTexture(const TextureDesc& descIn, const SubresourceDat // Bind the memory to the image m_api.vkBindImageMemory(m_device, texture->m_image, texture->m_imageMemory, 0); - if (desc.label && m_api.vkDebugMarkerSetObjectNameEXT) - { - VkDebugMarkerObjectNameInfoEXT nameDesc = {}; - nameDesc.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT; - nameDesc.object = (uint64_t)texture->m_image; - nameDesc.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT; - nameDesc.pObjectName = desc.label; - m_api.vkDebugMarkerSetObjectNameEXT(m_api.m_device, &nameDesc); - } + _labelObject((uint64_t)texture->m_image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, desc.label); VKBufferHandleRAII uploadBuffer; if (initData) @@ -1924,15 +1928,7 @@ Result DeviceImpl::createBufferImpl( SLANG_RETURN_ON_FAIL(buffer->m_buffer.init(m_api, desc.size, usage, reqMemoryProperties)); } - if (desc.label && m_api.vkDebugMarkerSetObjectNameEXT) - { - VkDebugMarkerObjectNameInfoEXT nameDesc = {}; - nameDesc.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT; - nameDesc.object = (uint64_t)buffer->m_buffer.m_buffer; - nameDesc.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT; - nameDesc.pObjectName = desc.label; - m_api.vkDebugMarkerSetObjectNameEXT(m_api.m_device, &nameDesc); - } + _labelObject((uint64_t)buffer->m_buffer.m_buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, desc.label); if (initData) { @@ -2026,6 +2022,8 @@ Result DeviceImpl::createSampler(SamplerDesc const& desc, ISampler** outSampler) VkSampler sampler; SLANG_VK_RETURN_ON_FAIL(m_api.vkCreateSampler(m_device, &samplerInfo, nullptr, &sampler)); + _labelObject((uint64_t)sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, desc.label); + RefPtr samplerImpl = new SamplerImpl(this); samplerImpl->m_sampler = sampler; returnComPtr(outSampler, samplerImpl); @@ -2491,7 +2489,7 @@ Result DeviceImpl::createQueryPool(const IQueryPool::Desc& desc, IQueryPool** ou return SLANG_OK; } -Result DeviceImpl::createFence(const IFence::Desc& desc, IFence** outFence) +Result DeviceImpl::createFence(const FenceDesc& desc, IFence** outFence) { RefPtr fence = new FenceImpl(this); SLANG_RETURN_ON_FAIL(fence->init(desc)); diff --git a/src/vulkan/vk-device.h b/src/vulkan/vk-device.h index 3592b367..ca03cc96 100644 --- a/src/vulkan/vk-device.h +++ b/src/vulkan/vk-device.h @@ -93,7 +93,7 @@ class DeviceImpl : public RendererBase virtual SLANG_NO_THROW Result SLANG_MCALL getTextureRowAlignment(Size* outAlignment) override; - virtual SLANG_NO_THROW Result SLANG_MCALL createFence(const IFence::Desc& desc, IFence** outFence) override; + virtual SLANG_NO_THROW Result SLANG_MCALL createFence(const FenceDesc& desc, IFence** outFence) override; virtual SLANG_NO_THROW Result SLANG_MCALL waitForFences(GfxCount fenceCount, IFence** fences, uint64_t* fenceValues, bool waitForAll, uint64_t timeout) @@ -129,6 +129,8 @@ class DeviceImpl : public RendererBase void* pUserData ); + void _labelObject(uint64_t object, VkDebugReportObjectTypeEXT objectType, const char* label); + void _transitionImageLayout( VkImage image, VkFormat format, @@ -136,6 +138,7 @@ class DeviceImpl : public RendererBase VkImageLayout oldLayout, VkImageLayout newLayout ); + void _transitionImageLayout( VkCommandBuffer commandBuffer, VkImage image, diff --git a/src/vulkan/vk-fence.cpp b/src/vulkan/vk-fence.cpp index 8c413454..39aabc3b 100644 --- a/src/vulkan/vk-fence.cpp +++ b/src/vulkan/vk-fence.cpp @@ -17,7 +17,7 @@ FenceImpl::~FenceImpl() } } -Result FenceImpl::init(const IFence::Desc& desc) +Result FenceImpl::init(const FenceDesc& desc) { if (!m_device->m_api.m_extendedFeatures.vulkan12Features.timelineSemaphore) return SLANG_E_NOT_AVAILABLE; @@ -61,6 +61,8 @@ Result FenceImpl::init(const IFence::Desc& desc) m_device->m_api.vkCreateSemaphore(m_device->m_api.m_device, &createInfo, nullptr, &m_semaphore) ); + m_device->_labelObject((uint64_t)m_semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, desc.label); + return SLANG_OK; } diff --git a/src/vulkan/vk-fence.h b/src/vulkan/vk-fence.h index 8b11f0ce..2327e798 100644 --- a/src/vulkan/vk-fence.h +++ b/src/vulkan/vk-fence.h @@ -14,7 +14,7 @@ class FenceImpl : public FenceBase ~FenceImpl(); - Result init(const IFence::Desc& desc); + Result init(const FenceDesc& desc); virtual SLANG_NO_THROW Result SLANG_MCALL getCurrentValue(uint64_t* outValue) override;