mirror of
https://github.com/opus-tango/IntroductionToVulkan.git
synced 2026-03-20 03:55:26 +00:00
Added flush for modified (mapped) buffer's memory and removed unnecessary CommitMemoryChanges() function in Tutorial04.
This commit is contained in:
@@ -146,6 +146,7 @@ VK_DEVICE_LEVEL_FUNCTION( vkGetBufferMemoryRequirements )
|
||||
VK_DEVICE_LEVEL_FUNCTION( vkAllocateMemory )
|
||||
VK_DEVICE_LEVEL_FUNCTION( vkBindBufferMemory )
|
||||
VK_DEVICE_LEVEL_FUNCTION( vkMapMemory )
|
||||
VK_DEVICE_LEVEL_FUNCTION( vkFlushMappedMemoryRanges )
|
||||
VK_DEVICE_LEVEL_FUNCTION( vkUnmapMemory )
|
||||
VK_DEVICE_LEVEL_FUNCTION( vkCmdSetViewport )
|
||||
VK_DEVICE_LEVEL_FUNCTION( vkCmdSetScissor )
|
||||
|
||||
@@ -441,12 +441,16 @@ namespace ApiWithoutSecrets {
|
||||
|
||||
memcpy( vertex_buffer_memory_pointer, vertex_data, Vulkan.VertexBuffer.Size );
|
||||
|
||||
vkUnmapMemory( GetDevice(), Vulkan.VertexBuffer.Memory );
|
||||
VkMappedMemoryRange flush_range = {
|
||||
VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // VkStructureType sType
|
||||
nullptr, // const void *pNext
|
||||
Vulkan.VertexBuffer.Memory, // VkDeviceMemory memory
|
||||
0, // VkDeviceSize offset
|
||||
VK_WHOLE_SIZE // VkDeviceSize size
|
||||
};
|
||||
vkFlushMappedMemoryRanges( GetDevice(), 1, &flush_range );
|
||||
|
||||
if( !CommitMemoryChanges( Vulkan.VertexBuffer.Handle, Vulkan.VertexBuffer.Size ) ) {
|
||||
std::cout << "Could not setup a barrier for a vertex buffer!" << std::endl;
|
||||
return false;
|
||||
}
|
||||
vkUnmapMemory( GetDevice(), Vulkan.VertexBuffer.Memory );
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -477,58 +481,7 @@ namespace ApiWithoutSecrets {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Tutorial04::CommitMemoryChanges( VkBuffer buffer, VkDeviceSize size ) {
|
||||
VkCommandBufferBeginInfo command_buffer_begin_info = {
|
||||
VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType
|
||||
nullptr, // const void *pNext
|
||||
VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags
|
||||
nullptr // const VkCommandBufferInheritanceInfo *pInheritanceInfo
|
||||
};
|
||||
|
||||
VkBufferMemoryBarrier barrier_from_host_write_to_attribute_read = {
|
||||
VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType
|
||||
nullptr, // const void *pNext
|
||||
VK_ACCESS_HOST_WRITE_BIT, // VkAccessFlags srcAccessMask
|
||||
VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, // VkAccessFlags dstAccessMask
|
||||
GetGraphicsQueue().FamilyIndex, // uint32_t srcQueueFamilyIndex
|
||||
GetGraphicsQueue().FamilyIndex, // uint32_t dstQueueFamilyIndex
|
||||
buffer, // VkBuffer buffer
|
||||
0, // VkDeviceSize offset
|
||||
size // VkDeviceSize size
|
||||
};
|
||||
|
||||
vkBeginCommandBuffer( Vulkan.RenderingResources[0].CommandBuffer, &command_buffer_begin_info );
|
||||
|
||||
vkCmdPipelineBarrier( Vulkan.RenderingResources[0].CommandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 1, &barrier_from_host_write_to_attribute_read, 0, nullptr );
|
||||
|
||||
if( vkEndCommandBuffer( Vulkan.RenderingResources[0].CommandBuffer ) != VK_SUCCESS ) {
|
||||
std::cout << "Could not record command with buffer barrier!" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
VkSubmitInfo submit_rendering_info = {
|
||||
VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType
|
||||
nullptr, // const void *pNext
|
||||
0, // uint32_t waitSemaphoreCount
|
||||
nullptr, // const VkSemaphore *pWaitSemaphores
|
||||
nullptr, // const VkPipelineStageFlags *pWaitDstStageMask;
|
||||
1, // uint32_t commandBufferCount
|
||||
&Vulkan.RenderingResources[0].CommandBuffer, // const VkCommandBuffer *pCommandBuffers
|
||||
0, // uint32_t signalSemaphoreCount
|
||||
nullptr // const VkSemaphore *pSignalSemaphores
|
||||
};
|
||||
|
||||
if( vkQueueSubmit( GetGraphicsQueue().Handle, 1, &submit_rendering_info, VK_NULL_HANDLE ) != VK_SUCCESS ) {
|
||||
std::cout << "Error occurred during submission of command buffer with vertex buffer barrier!!" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
vkDeviceWaitIdle( GetDevice() );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Tutorial04::RecordCommandBuffer( VkCommandBuffer command_buffer, const ImageParameters &image_parameters, VkFramebuffer &framebuffer ) {
|
||||
bool Tutorial04::PrepareFrame( VkCommandBuffer command_buffer, const ImageParameters &image_parameters, VkFramebuffer &framebuffer ) {
|
||||
if( !CreateFramebuffer( framebuffer, image_parameters.ImageView ) ) {
|
||||
return false;
|
||||
}
|
||||
@@ -696,7 +649,7 @@ namespace ApiWithoutSecrets {
|
||||
return false;
|
||||
}
|
||||
|
||||
if( !RecordCommandBuffer( current_rendering_resource.CommandBuffer, GetSwapChain().Images[image_index], current_rendering_resource.Framebuffer ) ) {
|
||||
if( !PrepareFrame( current_rendering_resource.CommandBuffer, GetSwapChain( ).Images[image_index], current_rendering_resource.Framebuffer ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -115,8 +115,7 @@ namespace ApiWithoutSecrets {
|
||||
bool CreateSemaphores();
|
||||
bool CreateFences();
|
||||
bool AllocateBufferMemory( VkBuffer buffer, VkDeviceMemory *memory );
|
||||
bool CommitMemoryChanges( VkBuffer buffer, VkDeviceSize size );
|
||||
bool RecordCommandBuffer( VkCommandBuffer command_buffer, const ImageParameters &image_parameters, VkFramebuffer &framebuffer );
|
||||
bool PrepareFrame( VkCommandBuffer command_buffer, const ImageParameters &image_parameters, VkFramebuffer &framebuffer );
|
||||
bool CreateFramebuffer( VkFramebuffer &framebuffer, VkImageView image_view );
|
||||
|
||||
void ChildClear() override;
|
||||
|
||||
Reference in New Issue
Block a user