diff --git a/src/FNA3D_CommandBuffer.c b/src/FNA3D_CommandBuffer.c index 0a3a29c2..def799cc 100644 --- a/src/FNA3D_CommandBuffer.c +++ b/src/FNA3D_CommandBuffer.c @@ -29,16 +29,12 @@ #include #define STARTING_TRANSFER_BUFFER_SIZE 8000000 /* 8MB */ -#define FAST_TRANSFER_SIZE 64000000 /* 64MB */ typedef struct FNA3D_TransferBufferPool { - FNA3D_TransferBuffer *fastTransferBuffer; - uint8_t fastTransferBufferAvailable; - - FNA3D_TransferBuffer **availableSlowTransferBuffers; - uint32_t availableSlowTransferBufferCount; - uint32_t availableSlowTransferBufferCapacity; + FNA3D_TransferBuffer **availableTransferBuffers; + uint32_t availableTransferBufferCount; + uint32_t availableTransferBufferCapacity; } FNA3D_TransferBufferPool; /* Command buffers have various resources associated with them @@ -225,24 +221,17 @@ static void FNA3D_CommandBuffer_CleanContainer( transferBuffer = container->transferBuffers[i]; transferBuffer->offset = 0; - if (transferBuffer == manager->transferBufferPool.fastTransferBuffer) + if (manager->transferBufferPool.availableTransferBufferCount == manager->transferBufferPool.availableTransferBufferCapacity) { - manager->transferBufferPool.fastTransferBufferAvailable = 1; + manager->transferBufferPool.availableTransferBufferCapacity += 1; + manager->transferBufferPool.availableTransferBuffers = SDL_realloc( + manager->transferBufferPool.availableTransferBuffers, + manager->transferBufferPool.availableTransferBufferCapacity * sizeof(FNA3D_TransferBuffer*) + ); } - else - { - if (manager->transferBufferPool.availableSlowTransferBufferCount == manager->transferBufferPool.availableSlowTransferBufferCapacity) - { - manager->transferBufferPool.availableSlowTransferBufferCapacity += 1; - manager->transferBufferPool.availableSlowTransferBuffers = SDL_realloc( - manager->transferBufferPool.availableSlowTransferBuffers, - manager->transferBufferPool.availableSlowTransferBufferCapacity * sizeof(FNA3D_TransferBuffer*) - ); - } - manager->transferBufferPool.availableSlowTransferBuffers[manager->transferBufferPool.availableSlowTransferBufferCount] = transferBuffer; - manager->transferBufferPool.availableSlowTransferBufferCount += 1; - } + manager->transferBufferPool.availableTransferBuffers[manager->transferBufferPool.availableTransferBufferCount] = transferBuffer; + manager->transferBufferPool.availableTransferBufferCount += 1; } container->transferBufferCount = 0; @@ -315,21 +304,10 @@ FNA3D_CommandBufferManager* FNA3D_CreateCommandBufferManager( * Initialize buffer space */ - manager->transferBufferPool.fastTransferBuffer = (FNA3D_TransferBuffer*) SDL_malloc( - sizeof(FNA3D_TransferBuffer) - ); - manager->transferBufferPool.fastTransferBuffer->offset = 0; - manager->transferBufferPool.fastTransferBuffer->buffer = manager->driver.CreateTransferBuffer( - manager->driver.driverData, - FAST_TRANSFER_SIZE, - 1 - ); - manager->transferBufferPool.fastTransferBufferAvailable = 1; - - manager->transferBufferPool.availableSlowTransferBufferCapacity = 4; - manager->transferBufferPool.availableSlowTransferBufferCount = 0; - manager->transferBufferPool.availableSlowTransferBuffers = (FNA3D_TransferBuffer**) SDL_malloc( - manager->transferBufferPool.availableSlowTransferBufferCapacity * sizeof(FNA3D_TransferBuffer*) + manager->transferBufferPool.availableTransferBufferCapacity = 4; + manager->transferBufferPool.availableTransferBufferCount = 0; + manager->transferBufferPool.availableTransferBuffers = (FNA3D_TransferBuffer**) SDL_malloc( + manager->transferBufferPool.availableTransferBufferCapacity * sizeof(FNA3D_TransferBuffer*) ); return manager; @@ -382,22 +360,16 @@ void FNA3D_DestroyCommandBufferManager( SDL_free(commandBufferContainer); } - manager->driver.DestroyBuffer( - manager->driver.driverData, - manager->transferBufferPool.fastTransferBuffer->buffer - ); - SDL_free(manager->transferBufferPool.fastTransferBuffer); - - for (i = 0; i < manager->transferBufferPool.availableSlowTransferBufferCount; i += 1) + for (i = 0; i < manager->transferBufferPool.availableTransferBufferCount; i += 1) { manager->driver.DestroyBuffer( manager->driver.driverData, - manager->transferBufferPool.availableSlowTransferBuffers[i]->buffer + manager->transferBufferPool.availableTransferBuffers[i]->buffer ); - SDL_free(manager->transferBufferPool.availableSlowTransferBuffers[i]); + SDL_free(manager->transferBufferPool.availableTransferBuffers[i]); } - SDL_free(manager->transferBufferPool.availableSlowTransferBuffers); + SDL_free(manager->transferBufferPool.availableTransferBuffers); SDL_DestroyMutex(manager->commandLock); SDL_DestroyMutex(manager->transferLock); @@ -759,24 +731,9 @@ FNA3D_TransferBuffer* FNA3D_CommandBuffer_AcquireTransferBuffer( ); } - /* Is the fast transfer buffer available? */ - if ( manager->transferBufferPool.fastTransferBufferAvailable && - requiredSize < FAST_TRANSFER_SIZE ) - { - transferBuffer = manager->transferBufferPool.fastTransferBuffer; - manager->transferBufferPool.fastTransferBufferAvailable = 0; - - commandBufferContainer->transferBuffers[commandBufferContainer->transferBufferCount] = transferBuffer; - commandBufferContainer->transferBufferCount += 1; - - /* If the fast transfer buffer is available, the offset is always zero */ - return transferBuffer; - } - - /* Nope, let's get a slow buffer */ - for (i = 0; i < manager->transferBufferPool.availableSlowTransferBufferCount; i += 1) + for (i = 0; i < manager->transferBufferPool.availableTransferBufferCount; i += 1) { - transferBuffer = manager->transferBufferPool.availableSlowTransferBuffers[i]; + transferBuffer = manager->transferBufferPool.availableTransferBuffers[i]; parentBufferSize = manager->driver.GetBufferSize( manager->driver.driverData, transferBuffer->buffer @@ -788,8 +745,8 @@ FNA3D_TransferBuffer* FNA3D_CommandBuffer_AcquireTransferBuffer( commandBufferContainer->transferBuffers[commandBufferContainer->transferBufferCount] = transferBuffer; commandBufferContainer->transferBufferCount += 1; - manager->transferBufferPool.availableSlowTransferBuffers[i] = manager->transferBufferPool.availableSlowTransferBuffers[manager->transferBufferPool.availableSlowTransferBufferCount - 1]; - manager->transferBufferPool.availableSlowTransferBufferCount -= 1; + manager->transferBufferPool.availableTransferBuffers[i] = manager->transferBufferPool.availableTransferBuffers[manager->transferBufferPool.availableTransferBufferCount - 1]; + manager->transferBufferPool.availableTransferBufferCount -= 1; transferBuffer->offset = offset; return transferBuffer; @@ -809,8 +766,7 @@ FNA3D_TransferBuffer* FNA3D_CommandBuffer_AcquireTransferBuffer( transferBuffer->offset = 0; transferBuffer->buffer = manager->driver.CreateTransferBuffer( manager->driver.driverData, - size, - 0 + size ); if (transferBuffer->buffer == NULL) diff --git a/src/FNA3D_CommandBuffer.h b/src/FNA3D_CommandBuffer.h index a7aae42e..5aacbf69 100644 --- a/src/FNA3D_CommandBuffer.h +++ b/src/FNA3D_CommandBuffer.h @@ -74,8 +74,7 @@ typedef struct FNA3D_CommandBufferDriver FNA3D_BufferHandle* (*CreateTransferBuffer)( FNA3D_Renderer *driverData, - size_t size, - uint8_t preferDeviceLocal + size_t size ); void (*IncBufferRef)( diff --git a/src/FNA3D_Driver_Vulkan.c b/src/FNA3D_Driver_Vulkan.c index 8e0e8282..1930af80 100644 --- a/src/FNA3D_Driver_Vulkan.c +++ b/src/FNA3D_Driver_Vulkan.c @@ -1036,7 +1036,6 @@ struct VulkanBuffer VulkanResourceAccessType resourceAccessType; VkBufferCreateInfo bufferCreateInfo; /* used for resource copy */ VkBufferUsageFlags usage; - uint8_t preferDeviceLocal; uint8_t isTransferBuffer; SDL_atomic_t refcount; }; @@ -2060,7 +2059,6 @@ static uint8_t VULKAN_INTERNAL_FindMemoryType( VulkanRenderer *renderer, uint32_t typeFilter, VkMemoryPropertyFlags requiredProperties, - VkMemoryPropertyFlags ignoredProperties, uint32_t *memoryTypeIndex ) { uint32_t i; @@ -2068,8 +2066,7 @@ static uint8_t VULKAN_INTERNAL_FindMemoryType( for (i = *memoryTypeIndex; i < renderer->memoryProperties.memoryTypeCount; i += 1) { if ( (typeFilter & (1 << i)) && - (renderer->memoryProperties.memoryTypes[i].propertyFlags & requiredProperties) == requiredProperties && - (renderer->memoryProperties.memoryTypes[i].propertyFlags & ignoredProperties) == 0 ) + (renderer->memoryProperties.memoryTypes[i].propertyFlags & requiredProperties) == requiredProperties) { *memoryTypeIndex = i; return 1; @@ -2077,10 +2074,9 @@ static uint8_t VULKAN_INTERNAL_FindMemoryType( } FNA3D_LogWarn( - "Failed to find memory type %X, required %X, ignored %X", + "Failed to find memory type %X, required %X", typeFilter, - requiredProperties, - ignoredProperties + requiredProperties ); return 0; } @@ -2712,7 +2708,6 @@ static uint8_t VULKAN_INTERNAL_FindBufferMemoryRequirements( VulkanRenderer *renderer, VkBuffer buffer, VkMemoryPropertyFlags requiredMemoryProperties, - VkMemoryPropertyFlags ignoredMemoryProperties, VkMemoryRequirements *pMemoryRequirements, uint32_t *pMemoryTypeIndex ) { @@ -2726,7 +2721,6 @@ static uint8_t VULKAN_INTERNAL_FindBufferMemoryRequirements( renderer, pMemoryRequirements->memoryTypeBits, requiredMemoryProperties, - ignoredMemoryProperties, pMemoryTypeIndex ); } @@ -2735,7 +2729,6 @@ static uint8_t VULKAN_INTERNAL_FindImageMemoryRequirements( VulkanRenderer *renderer, VkImage image, VkMemoryPropertyFlags requiredMemoryPropertyFlags, - VkMemoryPropertyFlags ignoredMemoryPropertyFlags, VkMemoryRequirements *pMemoryRequirements, uint32_t *pMemoryTypeIndex ) { @@ -2749,7 +2742,6 @@ static uint8_t VULKAN_INTERNAL_FindImageMemoryRequirements( renderer, pMemoryRequirements->memoryTypeBits, requiredMemoryPropertyFlags, - ignoredMemoryPropertyFlags, pMemoryTypeIndex ); } @@ -2764,18 +2756,15 @@ static uint8_t VULKAN_INTERNAL_BindMemoryForImage( uint8_t bindResult = 0; uint32_t memoryTypeIndex = 0; VkMemoryPropertyFlags requiredMemoryPropertyFlags; - VkMemoryPropertyFlags ignoredMemoryPropertyFlags; VkMemoryRequirements memoryRequirements; /* Prefer GPU allocation */ requiredMemoryPropertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; - ignoredMemoryPropertyFlags = 0; while (VULKAN_INTERNAL_FindImageMemoryRequirements( renderer, image, requiredMemoryPropertyFlags, - ignoredMemoryPropertyFlags, &memoryRequirements, &memoryTypeIndex )) { @@ -2811,7 +2800,6 @@ static uint8_t VULKAN_INTERNAL_BindMemoryForImage( { memoryTypeIndex = 0; requiredMemoryPropertyFlags = 0; - ignoredMemoryPropertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; if (isRenderTarget) { @@ -2824,7 +2812,6 @@ static uint8_t VULKAN_INTERNAL_BindMemoryForImage( renderer, image, requiredMemoryPropertyFlags, - ignoredMemoryPropertyFlags, &memoryRequirements, &memoryTypeIndex )) { @@ -2864,32 +2851,23 @@ static uint8_t VULKAN_INTERNAL_BindMemoryForBuffer( VkBuffer buffer, VulkanBuffer *bufferHandle, VkDeviceSize size, - uint8_t preferDeviceLocal, uint8_t isTransferBuffer, FNA3D_MemoryUsedRegion** usedRegion ) { uint8_t bindResult = 0; uint32_t memoryTypeIndex = 0; VkMemoryPropertyFlags requiredMemoryPropertyFlags; - VkMemoryPropertyFlags ignoredMemoryPropertyFlags; VkMemoryRequirements memoryRequirements; requiredMemoryPropertyFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | - VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; - - if (preferDeviceLocal) - { - requiredMemoryPropertyFlags |= - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; - } - ignoredMemoryPropertyFlags = 0; + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | + VK_MEMORY_PROPERTY_HOST_CACHED_BIT; while (VULKAN_INTERNAL_FindBufferMemoryRequirements( renderer, buffer, requiredMemoryPropertyFlags, - ignoredMemoryPropertyFlags, &memoryRequirements, &memoryTypeIndex )) { @@ -2914,32 +2892,24 @@ static uint8_t VULKAN_INTERNAL_BindMemoryForBuffer( { break; } - else /* Bind failed, try the next device-local heap */ + else /* Bind failed, try the next heap */ { memoryTypeIndex += 1; } } - /* Bind failed, try again if originally preferred device local */ - if (bindResult != 1 && preferDeviceLocal) + /* Bind failed, try again without CACHED */ + if (bindResult != 1) { memoryTypeIndex = 0; requiredMemoryPropertyFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; - /* Follow-up for the warning logged by FindMemoryType */ - if (!renderer->unifiedMemoryWarning) - { - FNA3D_LogWarn("No unified memory found, falling back to host memory"); - renderer->unifiedMemoryWarning = 1; - } - while (VULKAN_INTERNAL_FindBufferMemoryRequirements( renderer, buffer, requiredMemoryPropertyFlags, - ignoredMemoryPropertyFlags, &memoryRequirements, &memoryTypeIndex )) { @@ -3303,7 +3273,6 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer( VkDeviceSize size, VulkanResourceAccessType resourceAccessType, VkBufferUsageFlags usage, - uint8_t preferDeviceLocal, uint8_t isTransferBuffer ) { VkBufferCreateInfo bufferCreateInfo; @@ -3314,7 +3283,6 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer( buffer->size = size; buffer->resourceAccessType = resourceAccessType; buffer->usage = usage | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; - buffer->preferDeviceLocal = preferDeviceLocal; buffer->isTransferBuffer = isTransferBuffer; SDL_AtomicSet(&buffer->refcount, 0); @@ -3342,7 +3310,6 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer( buffer->buffer, buffer, buffer->size, - buffer->preferDeviceLocal, buffer->isTransferBuffer, &buffer->usedRegion ); @@ -10382,7 +10349,6 @@ static uint8_t VULKAN_Memory_DefragBuffer( copyBuffer, vulkanBuffer, resourceSize, - vulkanBuffer->preferDeviceLocal, 0, &newRegion ) != 1) @@ -10665,7 +10631,6 @@ static FNA3D_BufferHandle* VULKAN_Memory_CreateBufferHandle( isVertexData ? VK_BUFFER_USAGE_VERTEX_BUFFER_BIT : VK_BUFFER_USAGE_INDEX_BUFFER_BIT, - 0, 0 ); } @@ -10681,7 +10646,6 @@ static FNA3D_BufferHandle* VULKAN_Memory_CloneBufferHandle( vulkanBuffer->size, vulkanBuffer->resourceAccessType, vulkanBuffer->usage, - vulkanBuffer->preferDeviceLocal, vulkanBuffer->isTransferBuffer ); if (result != NULL) @@ -10893,15 +10857,13 @@ static void VULKAN_CommandBuffer_WaitForFences( static FNA3D_BufferHandle* VULKAN_CommandBuffer_CreateTransferBuffer( FNA3D_Renderer *driverData, - size_t size, - uint8_t preferDeviceLocal + size_t size ) { return (FNA3D_BufferHandle*) VULKAN_INTERNAL_CreateBuffer( (VulkanRenderer*) driverData, size, RESOURCE_ACCESS_MEMORY_TRANSFER_READ_WRITE, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, - preferDeviceLocal, 1 ); } @@ -11777,7 +11739,6 @@ static FNA3D_Device* VULKAN_CreateDevice( 1, RESOURCE_ACCESS_VERTEX_SHADER_READ_UNIFORM_BUFFER, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - 0, 0 ); SDL_memset( @@ -11794,7 +11755,6 @@ static FNA3D_Device* VULKAN_CreateDevice( 1, RESOURCE_ACCESS_FRAGMENT_SHADER_READ_UNIFORM_BUFFER, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - 0, 0 ); SDL_memset(