diff --git a/src/renderers/vulkan/vk.c b/src/renderers/vulkan/vk.c index 3d17262cf..9df5ff05a 100644 --- a/src/renderers/vulkan/vk.c +++ b/src/renderers/vulkan/vk.c @@ -198,10 +198,6 @@ static void vk_restart_swapchain( const char *funcname, VkResult res ) qvkResetCommandBuffer( vk.tess[i].command_buffer, 0 ); } -#ifdef USE_UPLOAD_QUEUE - qvkResetCommandBuffer( vk.staging_command_buffer, 0 ); -#endif - vk_destroy_pipelines( qfalse ); vk_destroy_framebuffers(); vk_destroy_render_passes(); @@ -666,20 +662,6 @@ void vk_initialize( void ) SET_OBJECT_NAME( vk.command_pool, "command pool", VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT ); } -#ifdef USE_UPLOAD_QUEUE - { - VkCommandBufferAllocateInfo alloc_info; - - alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - alloc_info.pNext = NULL; - alloc_info.commandPool = vk.command_pool; - alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - alloc_info.commandBufferCount = 1; - - VK_CHECK( qvkAllocateCommandBuffers( vk.device, &alloc_info, &vk.staging_command_buffer ) ); - } -#endif - // // Command buffers and color attachments. // @@ -1789,10 +1771,6 @@ void vk_begin_frame( void ) vk.temporal.preparedThisFrame = qfalse; vk.uiOverlayActive = qfalse; -#ifdef USE_UPLOAD_QUEUE - vk_flush_staging_buffer( qtrue ); -#endif - vk.cmd = &vk.tess[ vk.cmd_index ]; if ( vk.cmd->waitForFence ) { @@ -1973,12 +1951,7 @@ static void vk_resize_geometry_buffer( void ) void vk_end_frame( void ) { -#ifdef USE_UPLOAD_QUEUE - VkSemaphore waits[2], signals[2]; - const VkPipelineStageFlags wait_dst_stage_mask[2] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT}; -#else const VkPipelineStageFlags wait_dst_stage_mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; -#endif VkSubmitInfo submit_info; if ( vk.frame_count == 0 ) @@ -2045,46 +2018,11 @@ void vk_end_frame( void ) submit_info.commandBufferCount = 1; submit_info.pCommandBuffers = &vk.cmd->command_buffer; if ( !ri.CL_IsMinimized() ) { -#ifdef USE_UPLOAD_QUEUE - if ( vk.image_uploaded != VK_NULL_HANDLE ) { - waits[0] = vk.cmd->image_acquired; - waits[1] = vk.image_uploaded; - submit_info.waitSemaphoreCount = 2; - submit_info.pWaitSemaphores = &waits[0]; - submit_info.pWaitDstStageMask = &wait_dst_stage_mask[0]; - signals[0] = vk.swapchain_rendering_finished[ vk.cmd->swapchain_image_index ]; - signals[1] = vk.cmd->rendering_finished2; - submit_info.signalSemaphoreCount = 2; - submit_info.pSignalSemaphores = &signals[0]; - - vk.rendering_finished = vk.cmd->rendering_finished2; - vk.image_uploaded = VK_NULL_HANDLE; - } else if ( vk.rendering_finished != VK_NULL_HANDLE ) { - waits[0] = vk.cmd->image_acquired; - waits[1] = vk.rendering_finished; - submit_info.waitSemaphoreCount = 2; - submit_info.pWaitSemaphores = &waits[0]; - submit_info.pWaitDstStageMask = &wait_dst_stage_mask[0]; - signals[0] = vk.swapchain_rendering_finished[ vk.cmd->swapchain_image_index ]; - signals[1] = vk.cmd->rendering_finished2; - submit_info.signalSemaphoreCount = 2; - submit_info.pSignalSemaphores = &signals[0]; - - vk.rendering_finished = vk.cmd->rendering_finished2; - } else { - submit_info.waitSemaphoreCount = 1; - submit_info.pWaitSemaphores = &vk.cmd->image_acquired; - submit_info.pWaitDstStageMask = &wait_dst_stage_mask[0]; - submit_info.signalSemaphoreCount = 1; - submit_info.pSignalSemaphores = &vk.swapchain_rendering_finished[ vk.cmd->swapchain_image_index ]; - } -#else submit_info.waitSemaphoreCount = 1; submit_info.pWaitSemaphores = &vk.cmd->image_acquired; submit_info.pWaitDstStageMask = &wait_dst_stage_mask; submit_info.signalSemaphoreCount = 1; submit_info.pSignalSemaphores = &vk.swapchain_rendering_finished[ vk.cmd->swapchain_image_index ]; -#endif } else { submit_info.waitSemaphoreCount = 0; submit_info.pWaitSemaphores = NULL; diff --git a/src/renderers/vulkan/vk_cmd.c b/src/renderers/vulkan/vk_cmd.c index ea4f69bf6..c0da2ac74 100644 --- a/src/renderers/vulkan/vk_cmd.c +++ b/src/renderers/vulkan/vk_cmd.c @@ -36,10 +36,6 @@ VkCommandBuffer vk_begin_command_buffer( void ) void vk_end_command_buffer( VkCommandBuffer command_buffer, const char *location ) { (void)location; -#ifdef USE_UPLOAD_QUEUE - const VkPipelineStageFlags wait_dst_stage_mask = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT}; - VkSemaphore waits; -#endif VkSubmitInfo submit_info; VkCommandBuffer cmdbuf[1]; @@ -49,20 +45,9 @@ void vk_end_command_buffer( VkCommandBuffer command_buffer, const char *location submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submit_info.pNext = NULL; -#ifdef USE_UPLOAD_QUEUE - if ( vk.rendering_finished != VK_NULL_HANDLE ) { - waits = vk.rendering_finished; - vk.rendering_finished = VK_NULL_HANDLE; - submit_info.waitSemaphoreCount = 1; - submit_info.pWaitSemaphores = &waits; - submit_info.pWaitDstStageMask = &wait_dst_stage_mask; - } else -#endif - { - submit_info.waitSemaphoreCount = 0; - submit_info.pWaitSemaphores = NULL; - submit_info.pWaitDstStageMask = NULL; - } + submit_info.waitSemaphoreCount = 0; + submit_info.pWaitSemaphores = NULL; + submit_info.pWaitDstStageMask = NULL; submit_info.commandBufferCount = 1; submit_info.pCommandBuffers = cmdbuf; diff --git a/src/renderers/vulkan/vk_staging.c b/src/renderers/vulkan/vk_staging.c index 9a3d53dfe..c57dc199e 100644 --- a/src/renderers/vulkan/vk_staging.c +++ b/src/renderers/vulkan/vk_staging.c @@ -29,112 +29,9 @@ void vk_clean_staging_buffer( void ) vk.staging_buffer.ptr = NULL; vk.staging_buffer.size = 0; -#ifdef USE_UPLOAD_QUEUE - vk.staging_buffer.offset = 0; -#endif } -#ifdef USE_UPLOAD_QUEUE -qboolean vk_wait_staging_buffer( void ) -{ - if ( vk.device_lost ) { - return qfalse; - } - if ( vk.aux_fence_wait ) { - VkResult res = qvkWaitForFences( vk.device, 1, &vk.aux_fence, VK_TRUE, 5 * 1000000000ULL ); - if ( res != VK_SUCCESS ) { - if ( res == VK_ERROR_DEVICE_LOST ) { - vk.device_lost = qtrue; - } - ri.Error( ERR_FATAL, "vkWaitForFences() failed with %s at %s", vk_result_string( res ), __FUNCTION__ ); - } - VK_CHECK( qvkResetFences( vk.device, 1, &vk.aux_fence ) ); - VK_CHECK( qvkResetCommandBuffer( vk.staging_command_buffer, 0 ) ); - vk.staging_buffer.offset = 0; /* reset: command buffer cleared, staging starts at 0 */ - vk.aux_fence_wait = qfalse; - return qtrue; - } else { - return qfalse; - } -} - - -void vk_flush_staging_buffer( qboolean final ) -{ - VkPipelineStageFlags wait_dst_stage_mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - VkSemaphore waits; - VkSubmitInfo submit_info; - VkResult res; - - if ( vk.device_lost ) { - return; - } - if ( vk.staging_buffer.offset == 0 ) { - return; - } - - vk.staging_buffer.offset = 0; - - VK_CHECK( qvkEndCommandBuffer( vk.staging_command_buffer ) ); - - submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submit_info.pNext = NULL; - - if ( vk.rendering_finished != VK_NULL_HANDLE ) { - waits = vk.rendering_finished; - vk.rendering_finished = VK_NULL_HANDLE; - submit_info.waitSemaphoreCount = 1; - submit_info.pWaitSemaphores = &waits; - submit_info.pWaitDstStageMask = &wait_dst_stage_mask; - } else { - submit_info.waitSemaphoreCount = 0; - submit_info.pWaitSemaphores = NULL; - submit_info.pWaitDstStageMask = NULL; - } - - submit_info.commandBufferCount = 1; - submit_info.pCommandBuffers = &vk.staging_command_buffer; - - if ( vk.image_uploaded != VK_NULL_HANDLE ) { - ri.Error( ERR_FATAL, "Vulkan: incorrect state during image upload" ); - } - if ( final ) { - submit_info.signalSemaphoreCount = 1; - submit_info.pSignalSemaphores = &vk.image_uploaded2; - vk.image_uploaded = vk.image_uploaded2; - res = qvkQueueSubmit( vk.queue, 1, &submit_info, vk.aux_fence ); - if ( res != VK_SUCCESS ) { - if ( res == VK_ERROR_DEVICE_LOST ) { - vk.device_lost = qtrue; - } - ri.Error( ERR_FATAL, "Vulkan: qvkQueueSubmit (staging) returned %s", vk_result_string( res ) ); - } - vk.aux_fence_wait = qtrue; - } else { - submit_info.signalSemaphoreCount = 0; - submit_info.pSignalSemaphores = NULL; - res = qvkQueueSubmit( vk.queue, 1, &submit_info, vk.aux_fence ); - if ( res != VK_SUCCESS ) { - if ( res == VK_ERROR_DEVICE_LOST ) { - vk.device_lost = qtrue; - } - ri.Error( ERR_FATAL, "Vulkan: qvkQueueSubmit (staging) returned %s", vk_result_string( res ) ); - } - res = qvkWaitForFences( vk.device, 1, &vk.aux_fence, VK_TRUE, 5 * 1000000000ULL ); - if ( res != VK_SUCCESS ) { - if ( res == VK_ERROR_DEVICE_LOST ) { - vk.device_lost = qtrue; - } - ri.Error( ERR_FATAL, "vkWaitForFences() failed with %s at %s", vk_result_string( res ), __FUNCTION__ ); - } - VK_CHECK( qvkResetFences( vk.device, 1, &vk.aux_fence ) ); - VK_CHECK( qvkResetCommandBuffer( vk.staging_command_buffer, 0 ) ); - } -} -#endif /* USE_UPLOAD_QUEUE */ - - void vk_alloc_staging_buffer( VkDeviceSize size ) { VkBufferCreateInfo buffer_desc; @@ -172,9 +69,6 @@ void vk_alloc_staging_buffer( VkDeviceSize size ) VK_CHECK(qvkMapMemory(vk.device, vk.staging_buffer.memory, 0, VK_WHOLE_SIZE, 0, &data)); vk.staging_buffer.ptr = (byte*)data; -#ifdef USE_UPLOAD_QUEUE - vk.staging_buffer.offset = 0; -#endif vk_set_object_name( (uint64_t)vk.staging_buffer.handle, "staging buffer", VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT ); vk_set_object_name( (uint64_t)vk.staging_buffer.memory, "staging buffer memory", VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT ); } diff --git a/src/renderers/vulkan/vk_staging.h b/src/renderers/vulkan/vk_staging.h index c685b3224..f2e73eb46 100644 --- a/src/renderers/vulkan/vk_staging.h +++ b/src/renderers/vulkan/vk_staging.h @@ -19,11 +19,6 @@ extern "C" { void vk_clean_staging_buffer( void ); void vk_alloc_staging_buffer( VkDeviceSize size ); -#ifdef USE_UPLOAD_QUEUE -qboolean vk_wait_staging_buffer( void ); -void vk_flush_staging_buffer( qboolean final ); -#endif - #ifdef __cplusplus } #endif diff --git a/src/renderers/vulkan/vk_sync.c b/src/renderers/vulkan/vk_sync.c index e505021b3..14fcd12ea 100644 --- a/src/renderers/vulkan/vk_sync.c +++ b/src/renderers/vulkan/vk_sync.c @@ -40,10 +40,6 @@ void vk_destroy_sync_primitives( void ) if ( vk.device == VK_NULL_HANDLE ) return; -#ifdef USE_UPLOAD_QUEUE - qvkDestroySemaphore( vk.device, vk.image_uploaded2, NULL ); -#endif - for ( i = 0; i < NUM_COMMAND_BUFFERS; i++ ) { qvkDestroySemaphore( vk.device, vk.tess[i].image_acquired, NULL ); qvkDestroyFence( vk.device, vk.tess[i].rendering_finished_fence, NULL ); diff --git a/src/renderers/vulkan/vk_texture_image.c b/src/renderers/vulkan/vk_texture_image.c index c25c57da9..c1c0503b4 100644 --- a/src/renderers/vulkan/vk_texture_image.c +++ b/src/renderers/vulkan/vk_texture_image.c @@ -216,52 +216,6 @@ void vk_upload_image_data( image_t *image, int x, int y, int width, int height, if (height < 1) height = 1; } -#ifdef USE_UPLOAD_QUEUE - if ( vk_wait_staging_buffer() ) { - // wait for vkQueueSubmit() completion before new upload - } - - if ( vk.staging_buffer.size - vk.staging_buffer.offset < buffer_size ) { - // try to flush staging buffer and reset offset - vk_flush_staging_buffer( qfalse ); - } - - if ( vk.staging_buffer.size /* - vk_world.staging_buffer_offset */ < buffer_size ) { - // if still not enough - reallocate staging buffer - vk_alloc_staging_buffer( buffer_size ); - } - - for ( n = 0; n < num_regions; n++ ) { - regions[n].bufferOffset += vk.staging_buffer.offset; - } - - Com_Memcpy( vk.staging_buffer.ptr + vk.staging_buffer.offset, buf, buffer_size ); - - if ( vk.staging_buffer.offset == 0 ) { - VkCommandBufferBeginInfo begin_info; - begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - begin_info.pNext = NULL; - begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - begin_info.pInheritanceInfo = NULL; - VK_CHECK( qvkBeginCommandBuffer( vk.staging_command_buffer, &begin_info ) ); - } - - //ri.Printf( PRINT_WARNING, "batch @%6i + %i %s \n", (int)vk_world.staging_buffer_offset, (int)buffer_size, image->imgName ); - vk.staging_buffer.offset += buffer_size; - - command_buffer = vk.staging_command_buffer; - - if ( update ) { - record_image_layout_transition( command_buffer, image->handle, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, 0 ); - } else { - record_image_layout_transition( command_buffer, image->handle, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_HOST_BIT, 0 ); - } - - qvkCmdCopyBufferToImage( command_buffer, vk.staging_buffer.handle, image->handle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, num_regions, regions ); - - // final transition after upload comleted - record_image_layout_transition( command_buffer, image->handle, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 0, 0 ); -#else if ( vk.staging_buffer.size < (VkDeviceSize) buffer_size ) { vk_alloc_staging_buffer( buffer_size ); } @@ -278,7 +232,6 @@ void vk_upload_image_data( image_t *image, int x, int y, int width, int height, qvkCmdCopyBufferToImage( command_buffer, vk.staging_buffer.handle, image->handle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, num_regions, regions ); record_image_layout_transition( command_buffer, image->handle, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 0, 0 ); vk_end_command_buffer( command_buffer, __func__ ); -#endif if ( buf != pixels ) { ri.Hunk_FreeTempMemory( buf ); @@ -336,43 +289,12 @@ void vk_upload_cubemap_mip_data( image_t *image, int face_size, int miplevels, c return; } -#ifdef USE_UPLOAD_QUEUE - if ( vk_wait_staging_buffer() ) { - } - - if ( vk.staging_buffer.size - vk.staging_buffer.offset < (VkDeviceSize)buffer_size ) { - vk_flush_staging_buffer( qfalse ); - } - - if ( vk.staging_buffer.size < (VkDeviceSize)buffer_size ) { - vk_alloc_staging_buffer( buffer_size ); - } - - for ( mip = 0; mip < num_regions; mip++ ) { - regions[mip].bufferOffset += vk.staging_buffer.offset; - } - - Com_Memcpy( vk.staging_buffer.ptr + vk.staging_buffer.offset, pixels, buffer_size ); - - if ( vk.staging_buffer.offset == 0 ) { - VkCommandBufferBeginInfo begin_info; - begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - begin_info.pNext = NULL; - begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - begin_info.pInheritanceInfo = NULL; - VK_CHECK( qvkBeginCommandBuffer( vk.staging_command_buffer, &begin_info ) ); - } - - vk.staging_buffer.offset += buffer_size; - command_buffer = vk.staging_command_buffer; -#else if ( vk.staging_buffer.size < (VkDeviceSize)buffer_size ) { vk_alloc_staging_buffer( buffer_size ); } Com_Memcpy( vk.staging_buffer.ptr, pixels, buffer_size ); command_buffer = vk_begin_command_buffer(); -#endif if ( update ) { record_image_layout_transition( command_buffer, image->handle, VK_IMAGE_ASPECT_COLOR_BIT, @@ -387,9 +309,7 @@ void vk_upload_cubemap_mip_data( image_t *image, int face_size, int miplevels, c record_image_layout_transition( command_buffer, image->handle, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 0, 0 ); -#ifndef USE_UPLOAD_QUEUE vk_end_command_buffer( command_buffer, __func__ ); -#endif } /* @@ -435,37 +355,11 @@ void vk_upload_compressed_image_data( image_t *image, int width, int height, int break; } -#ifdef USE_UPLOAD_QUEUE - if ( vk_wait_staging_buffer() ) { - vk_flush_staging_buffer( qfalse ); - } - if ( vk.staging_buffer.size - vk.staging_buffer.offset < (VkDeviceSize)size ) { - vk_flush_staging_buffer( qfalse ); - } - if ( vk.staging_buffer.size < (VkDeviceSize)size ) { - vk_alloc_staging_buffer( size ); - } - for ( n = 0; n < num_regions; n++ ) { - regions[n].bufferOffset += vk.staging_buffer.offset; - } - Com_Memcpy( vk.staging_buffer.ptr + vk.staging_buffer.offset, pixels, size ); - if ( vk.staging_buffer.offset == 0 ) { - VkCommandBufferBeginInfo begin_info; - begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - begin_info.pNext = NULL; - begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - begin_info.pInheritanceInfo = NULL; - VK_CHECK( qvkBeginCommandBuffer( vk.staging_command_buffer, &begin_info ) ); - } - vk.staging_buffer.offset += size; - command_buffer = vk.staging_command_buffer; -#else if ( vk.staging_buffer.size < (VkDeviceSize)size ) { vk_alloc_staging_buffer( size ); } Com_Memcpy( vk.staging_buffer.ptr, pixels, size ); command_buffer = vk_begin_command_buffer(); -#endif if ( update ) { record_image_layout_transition( command_buffer, image->handle, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, 0 ); @@ -475,9 +369,7 @@ void vk_upload_compressed_image_data( image_t *image, int width, int height, int qvkCmdCopyBufferToImage( command_buffer, vk.staging_buffer.handle, image->handle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, num_regions, regions ); record_image_layout_transition( command_buffer, image->handle, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 0, 0 ); -#ifndef USE_UPLOAD_QUEUE vk_end_command_buffer( command_buffer, __func__ ); -#endif } void vk_update_descriptor_set( image_t *image, qboolean mipmap ) { diff --git a/src/renderers/vulkan/vk_vbo.c b/src/renderers/vulkan/vk_vbo.c index acfb1fa4a..021b58639 100644 --- a/src/renderers/vulkan/vk_vbo.c +++ b/src/renderers/vulkan/vk_vbo.c @@ -23,7 +23,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "tr_local.h" #include "vk.h" #include "vk_cmd.h" -#include "vk_staging.h" #include "vk_util.h" #ifdef USE_VBO @@ -76,9 +75,6 @@ qboolean vk_alloc_vbo( const byte *vbo_data, int vbo_size ) VK_CHECK( qvkAllocateMemory( vk.device, &alloc_info, NULL, &vk.vbo.buffer_memory ) ); qvkBindBufferMemory( vk.device, vk.vbo.vertex_buffer, vk.vbo.buffer_memory, vertex_buffer_offset ); -#ifdef USE_UPLOAD_QUEUE - vk_flush_staging_buffer( qfalse ); -#endif uploadDone = 0; while ( uploadDone < (VkDeviceSize) vbo_size ) { VkDeviceSize uploadSize = vk.staging_buffer.size;