GPU: Fix incorrect block size when D3D12 uniform buffer is rotated (#13469)

(cherry picked from commit 07af4b237b)
This commit is contained in:
Evan Hemsley
2025-07-29 15:34:08 -07:00
committed by Sam Lantinga
parent 46ec859bd1
commit a65fbb0211

View File

@@ -1194,7 +1194,6 @@ struct D3D12UniformBuffer
D3D12Buffer *buffer; D3D12Buffer *buffer;
Uint32 writeOffset; Uint32 writeOffset;
Uint32 drawOffset; Uint32 drawOffset;
Uint32 currentBlockSize;
}; };
// Forward function declarations // Forward function declarations
@@ -4498,7 +4497,6 @@ static D3D12UniformBuffer *D3D12_INTERNAL_AcquireUniformBufferFromPool(
SDL_UnlockMutex(renderer->acquireUniformBufferLock); SDL_UnlockMutex(renderer->acquireUniformBufferLock);
uniformBuffer->currentBlockSize = 0;
uniformBuffer->drawOffset = 0; uniformBuffer->drawOffset = 0;
uniformBuffer->writeOffset = 0; uniformBuffer->writeOffset = 0;
@@ -4537,6 +4535,7 @@ static void D3D12_INTERNAL_PushUniformData(
Uint32 length) Uint32 length)
{ {
D3D12UniformBuffer *uniformBuffer; D3D12UniformBuffer *uniformBuffer;
Uint32 blockSize;
if (shaderStage == SDL_GPU_SHADERSTAGE_VERTEX) { if (shaderStage == SDL_GPU_SHADERSTAGE_VERTEX) {
if (commandBuffer->vertexUniformBuffers[slotIndex] == NULL) { if (commandBuffer->vertexUniformBuffers[slotIndex] == NULL) {
@@ -4561,13 +4560,13 @@ static void D3D12_INTERNAL_PushUniformData(
return; return;
} }
uniformBuffer->currentBlockSize = blockSize =
D3D12_INTERNAL_Align( D3D12_INTERNAL_Align(
length, length,
256); 256);
// If there is no more room, acquire a new uniform buffer // If there is no more room, acquire a new uniform buffer
if (uniformBuffer->writeOffset + uniformBuffer->currentBlockSize >= UNIFORM_BUFFER_SIZE) { if (uniformBuffer->writeOffset + blockSize >= UNIFORM_BUFFER_SIZE) {
ID3D12Resource_Unmap( ID3D12Resource_Unmap(
uniformBuffer->buffer->handle, uniformBuffer->buffer->handle,
0, 0,
@@ -4597,7 +4596,7 @@ static void D3D12_INTERNAL_PushUniformData(
data, data,
length); length);
uniformBuffer->writeOffset += uniformBuffer->currentBlockSize; uniformBuffer->writeOffset += blockSize;
if (shaderStage == SDL_GPU_SHADERSTAGE_VERTEX) { if (shaderStage == SDL_GPU_SHADERSTAGE_VERTEX) {
commandBuffer->needVertexUniformBufferBind[slotIndex] = true; commandBuffer->needVertexUniformBufferBind[slotIndex] = true;