GPU: Remove pitch parameters from indirect draw calls (#10803)

This commit is contained in:
Caleb Cornett
2024-09-12 01:30:14 -05:00
committed by GitHub
parent 3d7e8c9bb7
commit ddd5723e2e
8 changed files with 47 additions and 99 deletions

View File

@@ -1631,8 +1631,7 @@ void SDL_DrawGPUPrimitivesIndirect(
SDL_GPURenderPass *render_pass,
SDL_GPUBuffer *buffer,
Uint32 offset,
Uint32 draw_count,
Uint32 pitch)
Uint32 draw_count)
{
if (render_pass == NULL) {
SDL_InvalidParamError("render_pass");
@@ -1652,16 +1651,14 @@ void SDL_DrawGPUPrimitivesIndirect(
RENDERPASS_COMMAND_BUFFER,
buffer,
offset,
draw_count,
pitch);
draw_count);
}
void SDL_DrawGPUIndexedPrimitivesIndirect(
SDL_GPURenderPass *render_pass,
SDL_GPUBuffer *buffer,
Uint32 offset,
Uint32 draw_count,
Uint32 pitch)
Uint32 draw_count)
{
if (render_pass == NULL) {
SDL_InvalidParamError("render_pass");
@@ -1681,8 +1678,7 @@ void SDL_DrawGPUIndexedPrimitivesIndirect(
RENDERPASS_COMMAND_BUFFER,
buffer,
offset,
draw_count,
pitch);
draw_count);
}
void SDL_EndGPURenderPass(

View File

@@ -485,15 +485,13 @@ struct SDL_GPUDevice
SDL_GPUCommandBuffer *commandBuffer,
SDL_GPUBuffer *buffer,
Uint32 offset,
Uint32 drawCount,
Uint32 pitch);
Uint32 drawCount);
void (*DrawIndexedPrimitivesIndirect)(
SDL_GPUCommandBuffer *commandBuffer,
SDL_GPUBuffer *buffer,
Uint32 offset,
Uint32 drawCount,
Uint32 pitch);
Uint32 drawCount);
void (*EndRenderPass)(
SDL_GPUCommandBuffer *commandBuffer);

View File

@@ -4156,8 +4156,7 @@ static void D3D11_DrawPrimitivesIndirect(
SDL_GPUCommandBuffer *commandBuffer,
SDL_GPUBuffer *buffer,
Uint32 offset,
Uint32 drawCount,
Uint32 pitch)
Uint32 drawCount)
{
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer *)commandBuffer;
D3D11_INTERNAL_BindGraphicsResources(d3d11CommandBuffer);
@@ -4171,7 +4170,7 @@ static void D3D11_DrawPrimitivesIndirect(
ID3D11DeviceContext_DrawInstancedIndirect(
d3d11CommandBuffer->context,
d3d11Buffer->handle,
offset + (pitch * i));
offset + (sizeof(SDL_GPUIndirectDrawCommand) * i));
}
D3D11_INTERNAL_TrackBuffer(d3d11CommandBuffer, d3d11Buffer);
@@ -4181,8 +4180,7 @@ static void D3D11_DrawIndexedPrimitivesIndirect(
SDL_GPUCommandBuffer *commandBuffer,
SDL_GPUBuffer *buffer,
Uint32 offset,
Uint32 drawCount,
Uint32 pitch)
Uint32 drawCount)
{
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer *)commandBuffer;
D3D11_INTERNAL_BindGraphicsResources(d3d11CommandBuffer);
@@ -4196,7 +4194,7 @@ static void D3D11_DrawIndexedPrimitivesIndirect(
ID3D11DeviceContext_DrawIndexedInstancedIndirect(
d3d11CommandBuffer->context,
d3d11Buffer->handle,
offset + (pitch * i));
offset + (sizeof(SDL_GPUIndexedIndirectDrawCommand) * i));
}
D3D11_INTERNAL_TrackBuffer(d3d11CommandBuffer, d3d11Buffer);

View File

@@ -4722,80 +4722,42 @@ static void D3D12_DrawPrimitivesIndirect(
SDL_GPUCommandBuffer *commandBuffer,
SDL_GPUBuffer *buffer,
Uint32 offset,
Uint32 drawCount,
Uint32 pitch)
Uint32 drawCount)
{
D3D12CommandBuffer *d3d12CommandBuffer = (D3D12CommandBuffer *)commandBuffer;
D3D12Buffer *d3d12Buffer = ((D3D12BufferContainer *)buffer)->activeBuffer;
D3D12_INTERNAL_BindGraphicsResources(d3d12CommandBuffer);
if (pitch == sizeof(SDL_GPUIndirectDrawCommand)) {
// Real multi-draw!
ID3D12GraphicsCommandList_ExecuteIndirect(
d3d12CommandBuffer->graphicsCommandList,
d3d12CommandBuffer->renderer->indirectDrawCommandSignature,
drawCount,
d3d12Buffer->handle,
offset,
NULL,
0);
} else {
/* Fake multi-draw...
* FIXME: we could make this real multi-draw
* if we have a lookup to get command signature per pitch value
*/
for (Uint32 i = 0; i < drawCount; i += 1) {
ID3D12GraphicsCommandList_ExecuteIndirect(
d3d12CommandBuffer->graphicsCommandList,
d3d12CommandBuffer->renderer->indirectDrawCommandSignature,
1,
d3d12Buffer->handle,
offset + (pitch * i),
NULL,
0);
}
}
ID3D12GraphicsCommandList_ExecuteIndirect(
d3d12CommandBuffer->graphicsCommandList,
d3d12CommandBuffer->renderer->indirectDrawCommandSignature,
drawCount,
d3d12Buffer->handle,
offset,
NULL,
0);
}
static void D3D12_DrawIndexedPrimitivesIndirect(
SDL_GPUCommandBuffer *commandBuffer,
SDL_GPUBuffer *buffer,
Uint32 offset,
Uint32 drawCount,
Uint32 pitch)
Uint32 drawCount)
{
D3D12CommandBuffer *d3d12CommandBuffer = (D3D12CommandBuffer *)commandBuffer;
D3D12Buffer *d3d12Buffer = ((D3D12BufferContainer *)buffer)->activeBuffer;
D3D12_INTERNAL_BindGraphicsResources(d3d12CommandBuffer);
if (pitch == sizeof(SDL_GPUIndexedIndirectDrawCommand)) {
// Real multi-draw!
ID3D12GraphicsCommandList_ExecuteIndirect(
d3d12CommandBuffer->graphicsCommandList,
d3d12CommandBuffer->renderer->indirectIndexedDrawCommandSignature,
drawCount,
d3d12Buffer->handle,
offset,
NULL,
0);
} else {
/* Fake multi-draw...
* FIXME: we could make this real multi-draw
* if we have a lookup to get command signature per pitch value
*/
for (Uint32 i = 0; i < drawCount; i += 1) {
ID3D12GraphicsCommandList_ExecuteIndirect(
d3d12CommandBuffer->graphicsCommandList,
d3d12CommandBuffer->renderer->indirectIndexedDrawCommandSignature,
1,
d3d12Buffer->handle,
offset + (pitch * i),
NULL,
0);
}
}
ID3D12GraphicsCommandList_ExecuteIndirect(
d3d12CommandBuffer->graphicsCommandList,
d3d12CommandBuffer->renderer->indirectIndexedDrawCommandSignature,
drawCount,
d3d12Buffer->handle,
offset,
NULL,
0);
}
static void D3D12_EndRenderPass(

View File

@@ -2750,8 +2750,7 @@ static void METAL_DrawPrimitivesIndirect(
SDL_GPUCommandBuffer *commandBuffer,
SDL_GPUBuffer *buffer,
Uint32 offset,
Uint32 drawCount,
Uint32 pitch)
Uint32 drawCount)
{
@autoreleasepool {
MetalCommandBuffer *metalCommandBuffer = (MetalCommandBuffer *)commandBuffer;
@@ -2767,7 +2766,7 @@ static void METAL_DrawPrimitivesIndirect(
[metalCommandBuffer->renderEncoder
drawPrimitives:SDLToMetal_PrimitiveType[primitiveType]
indirectBuffer:metalBuffer->handle
indirectBufferOffset:offset + (pitch * i)];
indirectBufferOffset:offset + (sizeof(SDL_GPUIndirectDrawCommand) * i)];
}
METAL_INTERNAL_TrackBuffer(metalCommandBuffer, metalBuffer);
@@ -2778,8 +2777,7 @@ static void METAL_DrawIndexedPrimitivesIndirect(
SDL_GPUCommandBuffer *commandBuffer,
SDL_GPUBuffer *buffer,
Uint32 offset,
Uint32 drawCount,
Uint32 pitch)
Uint32 drawCount)
{
@autoreleasepool {
MetalCommandBuffer *metalCommandBuffer = (MetalCommandBuffer *)commandBuffer;
@@ -2795,7 +2793,7 @@ static void METAL_DrawIndexedPrimitivesIndirect(
indexBuffer:metalCommandBuffer->indexBuffer->handle
indexBufferOffset:metalCommandBuffer->indexBufferOffset
indirectBuffer:metalBuffer->handle
indirectBufferOffset:offset + (pitch * i)];
indirectBufferOffset:offset + (sizeof(SDL_GPUIndexedIndirectDrawCommand) * i)];
}
METAL_INTERNAL_TrackBuffer(metalCommandBuffer, metalBuffer);

View File

@@ -5357,12 +5357,12 @@ static void VULKAN_DrawPrimitivesIndirect(
SDL_GPUCommandBuffer *commandBuffer,
SDL_GPUBuffer *buffer,
Uint32 offset,
Uint32 drawCount,
Uint32 pitch)
Uint32 drawCount)
{
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer *)commandBuffer;
VulkanRenderer *renderer = (VulkanRenderer *)vulkanCommandBuffer->renderer;
VulkanBuffer *vulkanBuffer = ((VulkanBufferContainer *)buffer)->activeBufferHandle->vulkanBuffer;
Uint32 pitch = sizeof(SDL_GPUIndirectDrawCommand);
Uint32 i;
VULKAN_INTERNAL_BindGraphicsDescriptorSets(renderer, vulkanCommandBuffer);
@@ -5394,12 +5394,12 @@ static void VULKAN_DrawIndexedPrimitivesIndirect(
SDL_GPUCommandBuffer *commandBuffer,
SDL_GPUBuffer *buffer,
Uint32 offset,
Uint32 drawCount,
Uint32 pitch)
Uint32 drawCount)
{
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer *)commandBuffer;
VulkanRenderer *renderer = (VulkanRenderer *)vulkanCommandBuffer->renderer;
VulkanBuffer *vulkanBuffer = ((VulkanBufferContainer *)buffer)->activeBufferHandle->vulkanBuffer;
Uint32 pitch = sizeof(SDL_GPUIndexedIndirectDrawCommand);
Uint32 i;
VULKAN_INTERNAL_BindGraphicsDescriptorSets(renderer, vulkanCommandBuffer);