vulkan: move temporary pointer to its own field to prevent a bad dereference.

Reference Issue #11075.
This commit is contained in:
Katelyn Gadd
2025-01-20 22:25:16 -05:00
committed by Ryan C. Gordon
parent 3e530c6db1
commit 6b7dad7d82

View File

@@ -479,6 +479,7 @@ static VkSamplerAddressMode SDLToVK_SamplerAddressMode[] = {
typedef struct VulkanMemoryAllocation VulkanMemoryAllocation;
typedef struct VulkanBuffer VulkanBuffer;
typedef struct VulkanBufferContainer VulkanBufferContainer;
typedef struct VulkanUniformBuffer VulkanUniformBuffer;
typedef struct VulkanTexture VulkanTexture;
typedef struct VulkanTextureContainer VulkanTextureContainer;
@@ -573,6 +574,7 @@ struct VulkanBuffer
SDL_AtomicInt referenceCount;
bool transitioned;
bool markedForDestroy; // so that defrag doesn't double-free
VulkanUniformBuffer *uniformBufferForDefrag;
};
struct VulkanBufferContainer
@@ -6811,7 +6813,7 @@ static VulkanUniformBuffer *VULKAN_INTERNAL_CreateUniformBuffer(
uniformBuffer->drawOffset = 0;
uniformBuffer->writeOffset = 0;
uniformBuffer->buffer->container = (VulkanBufferContainer *)uniformBuffer; // little hack for defrag
uniformBuffer->buffer->uniformBufferForDefrag = uniformBuffer;
return uniformBuffer;
}
@@ -10691,7 +10693,7 @@ static bool VULKAN_INTERNAL_DefragmentMemory(
newBuffer->container = currentRegion->vulkanBuffer->container;
newBuffer->containerIndex = currentRegion->vulkanBuffer->containerIndex;
if (newBuffer->type == VULKAN_BUFFER_TYPE_UNIFORM) {
((VulkanUniformBuffer *)newBuffer->container)->buffer = newBuffer;
currentRegion->vulkanBuffer->uniformBufferForDefrag->buffer = newBuffer;
} else {
newBuffer->container->buffers[newBuffer->containerIndex] = newBuffer;
if (newBuffer->container->activeBuffer == currentRegion->vulkanBuffer) {