Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

introduce IndexFormat #51

Merged
merged 1 commit into from
Sep 24, 2024
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
9 changes: 8 additions & 1 deletion include/slang-rhi.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion src/command-writer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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*>(buffer));
m_commands.push_back(
Expand Down
13 changes: 13 additions & 0 deletions src/d3d/d3d-util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions src/d3d/d3d-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/d3d11/d3d11-device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

Expand Down
2 changes: 1 addition & 1 deletion src/d3d11/d3d11-device.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions src/d3d12/d3d12-command-encoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion src/d3d12/d3d12-command-encoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/debug-layer/debug-command-encoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<DebugBuffer*>(buffer)->baseObject.get();
Expand Down
2 changes: 1 addition & 1 deletion src/debug-layer/debug-command-encoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ class DebugRenderCommandEncoder : public UnownedDebugObject<IRenderCommandEncode
virtual SLANG_NO_THROW void SLANG_MCALL
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 Result SLANG_MCALL draw(GfxCount vertexCount, GfxIndex startVertex = 0) override;
virtual SLANG_NO_THROW Result SLANG_MCALL
drawIndexed(GfxCount indexCount, GfxIndex startIndex = 0, GfxIndex baseVertex = 0) override;
Expand Down
4 changes: 2 additions & 2 deletions src/immediate-device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ class CommandBufferImpl : public ICommandBuffer, public ComObject
}

virtual SLANG_NO_THROW void SLANG_MCALL
setIndexBuffer(IBuffer* buffer, Format indexFormat, Offset offset) override
setIndexBuffer(IBuffer* buffer, IndexFormat indexFormat, Offset offset) override
{
m_writer->setIndexBuffer(buffer, indexFormat, offset);
}
Expand Down Expand Up @@ -591,7 +591,7 @@ class CommandBufferImpl : public ICommandBuffer, public ComObject
case CommandName::SetIndexBuffer:
m_device->setIndexBuffer(
m_writer.getObject<Buffer>(cmd.operands[0]),
(Format)cmd.operands[1],
(IndexFormat)cmd.operands[1],
(UInt)cmd.operands[2]
);
break;
Expand Down
4 changes: 2 additions & 2 deletions src/immediate-device.h
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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);
Expand Down
6 changes: 3 additions & 3 deletions src/metal/metal-command-encoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<BufferImpl*>(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:
Expand Down
2 changes: 1 addition & 1 deletion src/metal/metal-command-encoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
6 changes: 3 additions & 3 deletions src/vulkan/vk-command-encoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion src/vulkan/vk-command-encoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
4 changes: 2 additions & 2 deletions src/wgpu/wgpu-command-encoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<BufferImpl*>(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
);
Expand Down
2 changes: 1 addition & 1 deletion src/wgpu/wgpu-command-encoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
4 changes: 2 additions & 2 deletions tests/test-instanced-draw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down