mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-09-06 11:28:15 +00:00
GPU: Fix incorrect block size when D3D12 uniform buffer is rotated (#13469)
(cherry picked from commit 07af4b237b
)
This commit is contained in:

committed by
Sam Lantinga

parent
46ec859bd1
commit
a65fbb0211
@@ -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;
|
||||||
|
Reference in New Issue
Block a user