Skip to content

Commit 0cdf8ed

Browse files
committed
change transfer buffer allocation behavior
1 parent b7b35d5 commit 0cdf8ed

File tree

3 files changed

+29
-141
lines changed

3 files changed

+29
-141
lines changed

src/FNA3D_CommandBuffer.c

+24-68
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,12 @@
2929
#include <SDL.h>
3030

3131
#define STARTING_TRANSFER_BUFFER_SIZE 8000000 /* 8MB */
32-
#define FAST_TRANSFER_SIZE 64000000 /* 64MB */
3332

3433
typedef struct FNA3D_TransferBufferPool
3534
{
36-
FNA3D_TransferBuffer *fastTransferBuffer;
37-
uint8_t fastTransferBufferAvailable;
38-
39-
FNA3D_TransferBuffer **availableSlowTransferBuffers;
40-
uint32_t availableSlowTransferBufferCount;
41-
uint32_t availableSlowTransferBufferCapacity;
35+
FNA3D_TransferBuffer **availableTransferBuffers;
36+
uint32_t availableTransferBufferCount;
37+
uint32_t availableTransferBufferCapacity;
4238
} FNA3D_TransferBufferPool;
4339

4440
/* Command buffers have various resources associated with them
@@ -225,24 +221,17 @@ static void FNA3D_CommandBuffer_CleanContainer(
225221
transferBuffer = container->transferBuffers[i];
226222
transferBuffer->offset = 0;
227223

228-
if (transferBuffer == manager->transferBufferPool.fastTransferBuffer)
224+
if (manager->transferBufferPool.availableTransferBufferCount == manager->transferBufferPool.availableTransferBufferCapacity)
229225
{
230-
manager->transferBufferPool.fastTransferBufferAvailable = 1;
226+
manager->transferBufferPool.availableTransferBufferCapacity += 1;
227+
manager->transferBufferPool.availableTransferBuffers = SDL_realloc(
228+
manager->transferBufferPool.availableTransferBuffers,
229+
manager->transferBufferPool.availableTransferBufferCapacity * sizeof(FNA3D_TransferBuffer*)
230+
);
231231
}
232-
else
233-
{
234-
if (manager->transferBufferPool.availableSlowTransferBufferCount == manager->transferBufferPool.availableSlowTransferBufferCapacity)
235-
{
236-
manager->transferBufferPool.availableSlowTransferBufferCapacity += 1;
237-
manager->transferBufferPool.availableSlowTransferBuffers = SDL_realloc(
238-
manager->transferBufferPool.availableSlowTransferBuffers,
239-
manager->transferBufferPool.availableSlowTransferBufferCapacity * sizeof(FNA3D_TransferBuffer*)
240-
);
241-
}
242232

243-
manager->transferBufferPool.availableSlowTransferBuffers[manager->transferBufferPool.availableSlowTransferBufferCount] = transferBuffer;
244-
manager->transferBufferPool.availableSlowTransferBufferCount += 1;
245-
}
233+
manager->transferBufferPool.availableTransferBuffers[manager->transferBufferPool.availableTransferBufferCount] = transferBuffer;
234+
manager->transferBufferPool.availableTransferBufferCount += 1;
246235
}
247236
container->transferBufferCount = 0;
248237

@@ -315,21 +304,10 @@ FNA3D_CommandBufferManager* FNA3D_CreateCommandBufferManager(
315304
* Initialize buffer space
316305
*/
317306

318-
manager->transferBufferPool.fastTransferBuffer = (FNA3D_TransferBuffer*) SDL_malloc(
319-
sizeof(FNA3D_TransferBuffer)
320-
);
321-
manager->transferBufferPool.fastTransferBuffer->offset = 0;
322-
manager->transferBufferPool.fastTransferBuffer->buffer = manager->driver.CreateTransferBuffer(
323-
manager->driver.driverData,
324-
FAST_TRANSFER_SIZE,
325-
1
326-
);
327-
manager->transferBufferPool.fastTransferBufferAvailable = 1;
328-
329-
manager->transferBufferPool.availableSlowTransferBufferCapacity = 4;
330-
manager->transferBufferPool.availableSlowTransferBufferCount = 0;
331-
manager->transferBufferPool.availableSlowTransferBuffers = (FNA3D_TransferBuffer**) SDL_malloc(
332-
manager->transferBufferPool.availableSlowTransferBufferCapacity * sizeof(FNA3D_TransferBuffer*)
307+
manager->transferBufferPool.availableTransferBufferCapacity = 4;
308+
manager->transferBufferPool.availableTransferBufferCount = 0;
309+
manager->transferBufferPool.availableTransferBuffers = (FNA3D_TransferBuffer**) SDL_malloc(
310+
manager->transferBufferPool.availableTransferBufferCapacity * sizeof(FNA3D_TransferBuffer*)
333311
);
334312

335313
return manager;
@@ -382,22 +360,16 @@ void FNA3D_DestroyCommandBufferManager(
382360
SDL_free(commandBufferContainer);
383361
}
384362

385-
manager->driver.DestroyBuffer(
386-
manager->driver.driverData,
387-
manager->transferBufferPool.fastTransferBuffer->buffer
388-
);
389-
SDL_free(manager->transferBufferPool.fastTransferBuffer);
390-
391-
for (i = 0; i < manager->transferBufferPool.availableSlowTransferBufferCount; i += 1)
363+
for (i = 0; i < manager->transferBufferPool.availableTransferBufferCount; i += 1)
392364
{
393365
manager->driver.DestroyBuffer(
394366
manager->driver.driverData,
395-
manager->transferBufferPool.availableSlowTransferBuffers[i]->buffer
367+
manager->transferBufferPool.availableTransferBuffers[i]->buffer
396368
);
397369

398-
SDL_free(manager->transferBufferPool.availableSlowTransferBuffers[i]);
370+
SDL_free(manager->transferBufferPool.availableTransferBuffers[i]);
399371
}
400-
SDL_free(manager->transferBufferPool.availableSlowTransferBuffers);
372+
SDL_free(manager->transferBufferPool.availableTransferBuffers);
401373

402374
SDL_DestroyMutex(manager->commandLock);
403375
SDL_DestroyMutex(manager->transferLock);
@@ -759,24 +731,9 @@ FNA3D_TransferBuffer* FNA3D_CommandBuffer_AcquireTransferBuffer(
759731
);
760732
}
761733

762-
/* Is the fast transfer buffer available? */
763-
if ( manager->transferBufferPool.fastTransferBufferAvailable &&
764-
requiredSize < FAST_TRANSFER_SIZE )
765-
{
766-
transferBuffer = manager->transferBufferPool.fastTransferBuffer;
767-
manager->transferBufferPool.fastTransferBufferAvailable = 0;
768-
769-
commandBufferContainer->transferBuffers[commandBufferContainer->transferBufferCount] = transferBuffer;
770-
commandBufferContainer->transferBufferCount += 1;
771-
772-
/* If the fast transfer buffer is available, the offset is always zero */
773-
return transferBuffer;
774-
}
775-
776-
/* Nope, let's get a slow buffer */
777-
for (i = 0; i < manager->transferBufferPool.availableSlowTransferBufferCount; i += 1)
734+
for (i = 0; i < manager->transferBufferPool.availableTransferBufferCount; i += 1)
778735
{
779-
transferBuffer = manager->transferBufferPool.availableSlowTransferBuffers[i];
736+
transferBuffer = manager->transferBufferPool.availableTransferBuffers[i];
780737
parentBufferSize = manager->driver.GetBufferSize(
781738
manager->driver.driverData,
782739
transferBuffer->buffer
@@ -788,8 +745,8 @@ FNA3D_TransferBuffer* FNA3D_CommandBuffer_AcquireTransferBuffer(
788745
commandBufferContainer->transferBuffers[commandBufferContainer->transferBufferCount] = transferBuffer;
789746
commandBufferContainer->transferBufferCount += 1;
790747

791-
manager->transferBufferPool.availableSlowTransferBuffers[i] = manager->transferBufferPool.availableSlowTransferBuffers[manager->transferBufferPool.availableSlowTransferBufferCount - 1];
792-
manager->transferBufferPool.availableSlowTransferBufferCount -= 1;
748+
manager->transferBufferPool.availableTransferBuffers[i] = manager->transferBufferPool.availableTransferBuffers[manager->transferBufferPool.availableTransferBufferCount - 1];
749+
manager->transferBufferPool.availableTransferBufferCount -= 1;
793750

794751
transferBuffer->offset = offset;
795752
return transferBuffer;
@@ -809,8 +766,7 @@ FNA3D_TransferBuffer* FNA3D_CommandBuffer_AcquireTransferBuffer(
809766
transferBuffer->offset = 0;
810767
transferBuffer->buffer = manager->driver.CreateTransferBuffer(
811768
manager->driver.driverData,
812-
size,
813-
0
769+
size
814770
);
815771

816772
if (transferBuffer->buffer == NULL)

src/FNA3D_CommandBuffer.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,7 @@ typedef struct FNA3D_CommandBufferDriver
7474

7575
FNA3D_BufferHandle* (*CreateTransferBuffer)(
7676
FNA3D_Renderer *driverData,
77-
size_t size,
78-
uint8_t preferDeviceLocal
77+
size_t size
7978
);
8079

8180
void (*IncBufferRef)(

src/FNA3D_Driver_Vulkan.c

+4-71
Original file line numberDiff line numberDiff line change
@@ -1036,7 +1036,6 @@ struct VulkanBuffer
10361036
VulkanResourceAccessType resourceAccessType;
10371037
VkBufferCreateInfo bufferCreateInfo; /* used for resource copy */
10381038
VkBufferUsageFlags usage;
1039-
uint8_t preferDeviceLocal;
10401039
uint8_t isTransferBuffer;
10411040
SDL_atomic_t refcount;
10421041
};
@@ -2864,7 +2863,6 @@ static uint8_t VULKAN_INTERNAL_BindMemoryForBuffer(
28642863
VkBuffer buffer,
28652864
VulkanBuffer *bufferHandle,
28662865
VkDeviceSize size,
2867-
uint8_t preferDeviceLocal,
28682866
uint8_t isTransferBuffer,
28692867
FNA3D_MemoryUsedRegion** usedRegion
28702868
) {
@@ -2878,12 +2876,8 @@ static uint8_t VULKAN_INTERNAL_BindMemoryForBuffer(
28782876
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
28792877
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
28802878

2881-
if (preferDeviceLocal)
2882-
{
2883-
requiredMemoryPropertyFlags |=
2884-
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
2885-
}
2886-
ignoredMemoryPropertyFlags = 0;
2879+
/* since buffers are able to be memcpy'd directly, we never want them to be device-local */
2880+
ignoredMemoryPropertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
28872881

28882882
while (VULKAN_INTERNAL_FindBufferMemoryRequirements(
28892883
renderer,
@@ -2914,63 +2908,12 @@ static uint8_t VULKAN_INTERNAL_BindMemoryForBuffer(
29142908
{
29152909
break;
29162910
}
2917-
else /* Bind failed, try the next device-local heap */
2911+
else /* Bind failed, try the next heap */
29182912
{
29192913
memoryTypeIndex += 1;
29202914
}
29212915
}
29222916

2923-
/* Bind failed, try again if originally preferred device local */
2924-
if (bindResult != 1 && preferDeviceLocal)
2925-
{
2926-
memoryTypeIndex = 0;
2927-
requiredMemoryPropertyFlags =
2928-
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
2929-
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
2930-
2931-
/* Follow-up for the warning logged by FindMemoryType */
2932-
if (!renderer->unifiedMemoryWarning)
2933-
{
2934-
FNA3D_LogWarn("No unified memory found, falling back to host memory");
2935-
renderer->unifiedMemoryWarning = 1;
2936-
}
2937-
2938-
while (VULKAN_INTERNAL_FindBufferMemoryRequirements(
2939-
renderer,
2940-
buffer,
2941-
requiredMemoryPropertyFlags,
2942-
ignoredMemoryPropertyFlags,
2943-
&memoryRequirements,
2944-
&memoryTypeIndex
2945-
)) {
2946-
bindResult = FNA3D_Memory_BindResource(
2947-
renderer->allocator,
2948-
memoryTypeIndex,
2949-
memoryRequirements.size,
2950-
memoryRequirements.alignment,
2951-
(renderer->memoryProperties.memoryTypes[memoryTypeIndex].propertyFlags &
2952-
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0,
2953-
(renderer->memoryProperties.memoryTypes[memoryTypeIndex].propertyFlags &
2954-
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0,
2955-
isTransferBuffer,
2956-
size,
2957-
0,
2958-
(FNA3D_MemoryPlatformHandle) (size_t) buffer,
2959-
bufferHandle,
2960-
usedRegion
2961-
);
2962-
2963-
if (bindResult == 1)
2964-
{
2965-
break;
2966-
}
2967-
else /* Bind failed, try the next heap */
2968-
{
2969-
memoryTypeIndex += 1;
2970-
}
2971-
}
2972-
}
2973-
29742917
return bindResult;
29752918
}
29762919

@@ -3303,7 +3246,6 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer(
33033246
VkDeviceSize size,
33043247
VulkanResourceAccessType resourceAccessType,
33053248
VkBufferUsageFlags usage,
3306-
uint8_t preferDeviceLocal,
33073249
uint8_t isTransferBuffer
33083250
) {
33093251
VkBufferCreateInfo bufferCreateInfo;
@@ -3314,7 +3256,6 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer(
33143256
buffer->size = size;
33153257
buffer->resourceAccessType = resourceAccessType;
33163258
buffer->usage = usage | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
3317-
buffer->preferDeviceLocal = preferDeviceLocal;
33183259
buffer->isTransferBuffer = isTransferBuffer;
33193260
SDL_AtomicSet(&buffer->refcount, 0);
33203261

@@ -3342,7 +3283,6 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer(
33423283
buffer->buffer,
33433284
buffer,
33443285
buffer->size,
3345-
buffer->preferDeviceLocal,
33463286
buffer->isTransferBuffer,
33473287
&buffer->usedRegion
33483288
);
@@ -10382,7 +10322,6 @@ static uint8_t VULKAN_Memory_DefragBuffer(
1038210322
copyBuffer,
1038310323
vulkanBuffer,
1038410324
resourceSize,
10385-
vulkanBuffer->preferDeviceLocal,
1038610325
0,
1038710326
&newRegion
1038810327
) != 1)
@@ -10665,7 +10604,6 @@ static FNA3D_BufferHandle* VULKAN_Memory_CreateBufferHandle(
1066510604
isVertexData ?
1066610605
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT :
1066710606
VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
10668-
0,
1066910607
0
1067010608
);
1067110609
}
@@ -10681,7 +10619,6 @@ static FNA3D_BufferHandle* VULKAN_Memory_CloneBufferHandle(
1068110619
vulkanBuffer->size,
1068210620
vulkanBuffer->resourceAccessType,
1068310621
vulkanBuffer->usage,
10684-
vulkanBuffer->preferDeviceLocal,
1068510622
vulkanBuffer->isTransferBuffer
1068610623
);
1068710624
if (result != NULL)
@@ -10893,15 +10830,13 @@ static void VULKAN_CommandBuffer_WaitForFences(
1089310830

1089410831
static FNA3D_BufferHandle* VULKAN_CommandBuffer_CreateTransferBuffer(
1089510832
FNA3D_Renderer *driverData,
10896-
size_t size,
10897-
uint8_t preferDeviceLocal
10833+
size_t size
1089810834
) {
1089910835
return (FNA3D_BufferHandle*) VULKAN_INTERNAL_CreateBuffer(
1090010836
(VulkanRenderer*) driverData,
1090110837
size,
1090210838
RESOURCE_ACCESS_MEMORY_TRANSFER_READ_WRITE,
1090310839
VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
10904-
preferDeviceLocal,
1090510840
1
1090610841
);
1090710842
}
@@ -11777,7 +11712,6 @@ static FNA3D_Device* VULKAN_CreateDevice(
1177711712
1,
1177811713
RESOURCE_ACCESS_VERTEX_SHADER_READ_UNIFORM_BUFFER,
1177911714
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
11780-
0,
1178111715
0
1178211716
);
1178311717
SDL_memset(
@@ -11794,7 +11728,6 @@ static FNA3D_Device* VULKAN_CreateDevice(
1179411728
1,
1179511729
RESOURCE_ACCESS_FRAGMENT_SHADER_READ_UNIFORM_BUFFER,
1179611730
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
11797-
0,
1179811731
0
1179911732
);
1180011733
SDL_memset(

0 commit comments

Comments
 (0)