diff --git a/include/slang-rhi.h b/include/slang-rhi.h index 6518100e..4d52a5bd 100644 --- a/include/slang-rhi.h +++ b/include/slang-rhi.h @@ -257,6 +257,12 @@ enum class Format _Count, }; +enum class IndexFormat +{ + UInt16, + UInt32, +}; + // TODO: Aspect = Color, Depth, Stencil, etc. // TODO: Channel = R, G, B, A, D, S, etc. // TODO: Pick : pixel or texel @@ -1656,7 +1662,8 @@ class IRenderCommandEncoder : public ICommandEncoder setVertexBuffers(slot, 1, &buffer, &offset); } - virtual SLANG_NO_THROW void SLANG_MCALL setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset = 0) = 0; + virtual SLANG_NO_THROW void SLANG_MCALL + setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset = 0) = 0; virtual SLANG_NO_THROW Result SLANG_MCALL draw(GfxCount vertexCount, GfxIndex startVertex = 0) = 0; diff --git a/src/command-writer.h b/src/command-writer.h index 8ddb8898..9f13a5ec 100644 --- a/src/command-writer.h +++ b/src/command-writer.h @@ -235,7 +235,7 @@ class CommandWriter )); } - void setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset) + void setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset) { auto bufferOffset = encodeObject(static_cast(buffer)); m_commands.push_back( diff --git a/src/d3d/d3d-util.cpp b/src/d3d/d3d-util.cpp index 7b7fa278..b6739e45 100644 --- a/src/d3d/d3d-util.cpp +++ b/src/d3d/d3d-util.cpp @@ -332,6 +332,19 @@ DXGI_FORMAT D3DUtil::getMapFormat(Format format) } } +DXGI_FORMAT D3DUtil::getIndexFormat(IndexFormat indexFormat) +{ + switch (indexFormat) + { + case IndexFormat::UInt16: + return DXGI_FORMAT_R16_UINT; + case IndexFormat::UInt32: + return DXGI_FORMAT_R32_UINT; + default: + return DXGI_FORMAT_UNKNOWN; + } +} + DXGI_FORMAT D3DUtil::calcResourceFormat(UsageType usage, Int usageFlags, DXGI_FORMAT format) { SLANG_UNUSED(usage); diff --git a/src/d3d/d3d-util.h b/src/d3d/d3d-util.h index fdb7a229..db63ae87 100644 --- a/src/d3d/d3d-util.h +++ b/src/d3d/d3d-util.h @@ -76,6 +76,8 @@ class D3DUtil /// DXGI_FORMAT_UNKNOWN static DXGI_FORMAT getMapFormat(Format format); + static DXGI_FORMAT getIndexFormat(IndexFormat indexFormat); + /// Given the usage, flags, and format will return the most suitable format. Will return DXGI_UNKNOWN if combination /// is not possible static DXGI_FORMAT calcFormat(UsageType usage, DXGI_FORMAT format); diff --git a/src/d3d11/d3d11-device.cpp b/src/d3d11/d3d11-device.cpp index d115ad75..579419e3 100644 --- a/src/d3d11/d3d11-device.cpp +++ b/src/d3d11/d3d11-device.cpp @@ -983,9 +983,9 @@ void DeviceImpl::setVertexBuffers( ->IASetVertexBuffers((UINT)startSlot, (UINT)slotCount, dxBuffers, &vertexStrides[0], &vertexOffsets[0]); } -void DeviceImpl::setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset) +void DeviceImpl::setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset) { - DXGI_FORMAT dxFormat = D3DUtil::getMapFormat(indexFormat); + DXGI_FORMAT dxFormat = D3DUtil::getIndexFormat(indexFormat); m_immediateContext->IASetIndexBuffer(((BufferImpl*)buffer)->m_buffer, dxFormat, UINT(offset)); } diff --git a/src/d3d11/d3d11-device.h b/src/d3d11/d3d11-device.h index 708ec944..44d7683c 100644 --- a/src/d3d11/d3d11-device.h +++ b/src/d3d11/d3d11-device.h @@ -66,7 +66,7 @@ class DeviceImpl : public ImmediateDevice IBuffer* const* buffers, const Offset* offsets ) override; - virtual void setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset) override; + virtual void setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset) override; virtual void setViewports(GfxCount count, Viewport const* viewports) override; virtual void setScissorRects(GfxCount count, ScissorRect const* rects) override; virtual void setPipeline(IPipeline* state) override; diff --git a/src/d3d12/d3d12-command-encoder.cpp b/src/d3d12/d3d12-command-encoder.cpp index 88d41048..75e731a1 100644 --- a/src/d3d12/d3d12-command-encoder.cpp +++ b/src/d3d12/d3d12-command-encoder.cpp @@ -995,10 +995,10 @@ void RenderCommandEncoderImpl::setVertexBuffers( } } -void RenderCommandEncoderImpl::setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset) +void RenderCommandEncoderImpl::setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset) { m_boundIndexBuffer = (BufferImpl*)buffer; - m_boundIndexFormat = D3DUtil::getMapFormat(indexFormat); + m_boundIndexFormat = D3DUtil::getIndexFormat(indexFormat); m_boundIndexOffset = (UINT)offset; } diff --git a/src/d3d12/d3d12-command-encoder.h b/src/d3d12/d3d12-command-encoder.h index 0c014e05..3282c326 100644 --- a/src/d3d12/d3d12-command-encoder.h +++ b/src/d3d12/d3d12-command-encoder.h @@ -213,7 +213,7 @@ class RenderCommandEncoderImpl : public IRenderCommandEncoder, public CommandEnc setVertexBuffers(GfxIndex startSlot, GfxCount slotCount, IBuffer* const* buffers, const Offset* offsets) override; virtual SLANG_NO_THROW void SLANG_MCALL - setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset = 0) override; + setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset = 0) override; Result prepareDraw(); virtual SLANG_NO_THROW Result SLANG_MCALL draw(GfxCount vertexCount, GfxIndex startVertex = 0) override; diff --git a/src/debug-layer/debug-command-encoder.cpp b/src/debug-layer/debug-command-encoder.cpp index 0eae2f95..84dfb767 100644 --- a/src/debug-layer/debug-command-encoder.cpp +++ b/src/debug-layer/debug-command-encoder.cpp @@ -264,7 +264,7 @@ void DebugRenderCommandEncoder::setVertexBuffers( baseObject->setVertexBuffers(startSlot, slotCount, innerBuffers.data(), offsets); } -void DebugRenderCommandEncoder::setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset) +void DebugRenderCommandEncoder::setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset) { SLANG_RHI_API_FUNC; auto innerBuffer = static_cast(buffer)->baseObject.get(); diff --git a/src/debug-layer/debug-command-encoder.h b/src/debug-layer/debug-command-encoder.h index 19e4e308..298a0abd 100644 --- a/src/debug-layer/debug-command-encoder.h +++ b/src/debug-layer/debug-command-encoder.h @@ -159,7 +159,7 @@ class DebugRenderCommandEncoder : public UnownedDebugObjectsetIndexBuffer(buffer, indexFormat, offset); } @@ -591,7 +591,7 @@ class CommandBufferImpl : public ICommandBuffer, public ComObject case CommandName::SetIndexBuffer: m_device->setIndexBuffer( m_writer.getObject(cmd.operands[0]), - (Format)cmd.operands[1], + (IndexFormat)cmd.operands[1], (UInt)cmd.operands[2] ); break; diff --git a/src/immediate-device.h b/src/immediate-device.h index c97cd7f0..70b1ff6b 100644 --- a/src/immediate-device.h +++ b/src/immediate-device.h @@ -60,7 +60,7 @@ class ImmediateDevice : public Device IBuffer* const* buffers, const Offset* offsets ) = 0; - virtual void setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset = 0) = 0; + virtual void setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset = 0) = 0; virtual void draw(GfxCount vertexCount, GfxIndex startVertex = 0) = 0; virtual void drawIndexed(GfxCount indexCount, GfxIndex startIndex = 0, GfxIndex baseVertex = 0) = 0; virtual void drawInstanced( @@ -133,7 +133,7 @@ class ImmediateComputeDeviceBase : public ImmediateDevice SLANG_UNUSED(buffers); SLANG_UNUSED(offsets); } - virtual void setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset = 0) override + virtual void setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset = 0) override { SLANG_UNUSED(buffer); SLANG_UNUSED(indexFormat); diff --git a/src/metal/metal-command-encoder.cpp b/src/metal/metal-command-encoder.cpp index 689e485c..081181a4 100644 --- a/src/metal/metal-command-encoder.cpp +++ b/src/metal/metal-command-encoder.cpp @@ -389,17 +389,17 @@ void RenderCommandEncoderImpl::setVertexBuffers( } } -void RenderCommandEncoderImpl::setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset) +void RenderCommandEncoderImpl::setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset) { m_indexBuffer = static_cast(buffer)->m_buffer.get(); m_indexBufferOffset = offset; switch (indexFormat) { - case Format::R16_UINT: + case IndexFormat::UInt16: m_indexBufferType = MTL::IndexTypeUInt16; break; - case Format::R32_UINT: + case IndexFormat::UInt32: m_indexBufferType = MTL::IndexTypeUInt32; break; default: diff --git a/src/metal/metal-command-encoder.h b/src/metal/metal-command-encoder.h index a07ad49d..94cc4faf 100644 --- a/src/metal/metal-command-encoder.h +++ b/src/metal/metal-command-encoder.h @@ -187,7 +187,7 @@ class RenderCommandEncoderImpl : public IRenderCommandEncoder, public CommandEnc setVertexBuffers(GfxIndex startSlot, GfxCount slotCount, IBuffer* const* buffers, const Offset* offsets) override; virtual SLANG_NO_THROW void SLANG_MCALL - setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset = 0) override; + setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset = 0) override; virtual SLANG_NO_THROW void SLANG_MCALL setStencilReference(uint32_t referenceValue) override; diff --git a/src/vulkan/vk-command-encoder.cpp b/src/vulkan/vk-command-encoder.cpp index 8d2bf2b4..237b35d3 100644 --- a/src/vulkan/vk-command-encoder.cpp +++ b/src/vulkan/vk-command-encoder.cpp @@ -1211,15 +1211,15 @@ void RenderCommandEncoderImpl::setVertexBuffers( } } -void RenderCommandEncoderImpl::setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset) +void RenderCommandEncoderImpl::setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset) { VkIndexType indexType = VK_INDEX_TYPE_UINT16; switch (indexFormat) { - case Format::R16_UINT: + case IndexFormat::UInt16: indexType = VK_INDEX_TYPE_UINT16; break; - case Format::R32_UINT: + case IndexFormat::UInt32: indexType = VK_INDEX_TYPE_UINT32; break; default: diff --git a/src/vulkan/vk-command-encoder.h b/src/vulkan/vk-command-encoder.h index c06784d5..6ad38e3d 100644 --- a/src/vulkan/vk-command-encoder.h +++ b/src/vulkan/vk-command-encoder.h @@ -206,7 +206,7 @@ class RenderCommandEncoderImpl : public IRenderCommandEncoder, public CommandEnc setVertexBuffers(GfxIndex startSlot, GfxCount slotCount, IBuffer* const* buffers, const Offset* offsets) override; virtual SLANG_NO_THROW void SLANG_MCALL - setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset = 0) override; + setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset = 0) override; Result prepareDraw(); diff --git a/src/wgpu/wgpu-command-encoder.cpp b/src/wgpu/wgpu-command-encoder.cpp index ea0a9df6..aa26342e 100644 --- a/src/wgpu/wgpu-command-encoder.cpp +++ b/src/wgpu/wgpu-command-encoder.cpp @@ -436,13 +436,13 @@ void RenderCommandEncoderImpl::setVertexBuffers( } } -void RenderCommandEncoderImpl::setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset) +void RenderCommandEncoderImpl::setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset) { BufferImpl* bufferImpl = static_cast(buffer); m_device->m_ctx.api.wgpuRenderPassEncoderSetIndexBuffer( m_renderPassEncoder, bufferImpl->m_buffer, - indexFormat == Format::R32_UINT ? WGPUIndexFormat_Uint32 : WGPUIndexFormat_Uint16, + indexFormat == IndexFormat::UInt32 ? WGPUIndexFormat_Uint32 : WGPUIndexFormat_Uint16, offset, bufferImpl->m_desc.size - offset ); diff --git a/src/wgpu/wgpu-command-encoder.h b/src/wgpu/wgpu-command-encoder.h index e98c052a..532101a9 100644 --- a/src/wgpu/wgpu-command-encoder.h +++ b/src/wgpu/wgpu-command-encoder.h @@ -158,7 +158,7 @@ class RenderCommandEncoderImpl : public IRenderCommandEncoder, public CommandEnc setVertexBuffers(GfxIndex startSlot, GfxCount slotCount, IBuffer* const* buffers, const Offset* offsets) override; virtual SLANG_NO_THROW void SLANG_MCALL - setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset = 0) override; + setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset = 0) override; virtual SLANG_NO_THROW void SLANG_MCALL setStencilReference(uint32_t referenceValue) override; diff --git a/tests/test-instanced-draw.cpp b/tests/test-instanced-draw.cpp index 58721738..41672da0 100644 --- a/tests/test-instanced-draw.cpp +++ b/tests/test-instanced-draw.cpp @@ -301,7 +301,7 @@ struct DrawIndexedInstancedTest : BaseDrawTest encoder->setVertexBuffer(0, vertexBuffer); encoder->setVertexBuffer(1, instanceBuffer); - encoder->setIndexBuffer(indexBuffer, Format::R32_UINT); + encoder->setIndexBuffer(indexBuffer, IndexFormat::UInt32); encoder->setPrimitiveTopology(PrimitiveTopology::TriangleList); encoder->drawIndexedInstanced(kIndexCount, kInstanceCount, startIndex, startVertex, startInstanceLocation); @@ -466,7 +466,7 @@ struct DrawIndexedIndirectTest : BaseDrawTest encoder->setVertexBuffer(0, vertexBuffer); encoder->setVertexBuffer(1, instanceBuffer); - encoder->setIndexBuffer(indexBuffer, Format::R32_UINT); + encoder->setIndexBuffer(indexBuffer, IndexFormat::UInt32); encoder->setPrimitiveTopology(PrimitiveTopology::TriangleList); uint32_t maxDrawCount = 1;