From c676a864c6a1e1641febb3fc45a6ef0395dca44f Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Thu, 31 Oct 2019 21:05:00 +0100 Subject: [PATCH] idImage::CopyFrameBuffer --- neo/renderer/RenderBackend.cpp | 3 +- neo/renderer/RenderBackend.h | 3 -- neo/renderer/Vulkan/Image_VK.cpp | 75 +++++++++++++++++++++++++++++++- 3 files changed, 76 insertions(+), 5 deletions(-) diff --git a/neo/renderer/RenderBackend.cpp b/neo/renderer/RenderBackend.cpp index 12c9bd57..085ad99c 100644 --- a/neo/renderer/RenderBackend.cpp +++ b/neo/renderer/RenderBackend.cpp @@ -3,8 +3,9 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. -Copyright (C) 2013-2015 Robert Beckebans Copyright (C) 2014 Carl Kenner +Copyright (C) 2016-2017 Dustin Land +Copyright (C) 2013-2019 Robert Beckebans This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). diff --git a/neo/renderer/RenderBackend.h b/neo/renderer/RenderBackend.h index 83b981e6..87838085 100644 --- a/neo/renderer/RenderBackend.h +++ b/neo/renderer/RenderBackend.h @@ -431,14 +431,11 @@ private: void DBG_ShowLights(); void DBG_ShowShadowMapLODs(); // RB void DBG_ShowPortals(); - void DBG_ShowDebugText(); void DBG_ShowDebugLines(); void DBG_ShowDebugPolygons(); - void DBG_ShowCenterOfProjection(); void DBG_ShowLines(); - void DBG_TestGamma(); void DBG_TestGammaBias(); void DBG_TestImage(); diff --git a/neo/renderer/Vulkan/Image_VK.cpp b/neo/renderer/Vulkan/Image_VK.cpp index a9129bfb..2a4c87bb 100644 --- a/neo/renderer/Vulkan/Image_VK.cpp +++ b/neo/renderer/Vulkan/Image_VK.cpp @@ -370,7 +370,80 @@ CopyFramebuffer */ void idImage::CopyFramebuffer( int x, int y, int imageWidth, int imageHeight ) { - +#if 0 + VkCommandBuffer commandBuffer = vkcontext.commandBuffer[ vkcontext.frameParity ]; + + vkCmdEndRenderPass( commandBuffer ); + + VkImageMemoryBarrier dstBarrier = {}; + dstBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + dstBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + dstBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + dstBarrier.image = GetImage(); + dstBarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + dstBarrier.subresourceRange.baseMipLevel = 0; + dstBarrier.subresourceRange.levelCount = 1; + dstBarrier.subresourceRange.baseArrayLayer = 0; + dstBarrier.subresourceRange.layerCount = 1; + + // Pre copy transitions + { + // Transition the color dst image so we can transfer to it. + dstBarrier.oldLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + dstBarrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + dstBarrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT; + dstBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + vkCmdPipelineBarrier( + commandBuffer, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + 0, 0, NULL, 0, NULL, 1, &dstBarrier ); + } + + // Perform the blit/copy + { + VkImageBlit region = {}; + region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.srcSubresource.baseArrayLayer = 0; + region.srcSubresource.mipLevel = 0; + region.srcSubresource.layerCount = 1; + region.srcOffsets[ 1 ] = { imageWidth, imageHeight, 1 }; + + region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.dstSubresource.baseArrayLayer = 0; + region.dstSubresource.mipLevel = 0; + region.dstSubresource.layerCount = 1; + region.dstOffsets[ 1 ] = { imageWidth, imageHeight, 1 }; + + vkCmdBlitImage( + commandBuffer, + vkcontext.swapchainImages[ vkcontext.currentSwapIndex ], VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + GetImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 1, ®ion, VK_FILTER_NEAREST ); + } + + // Post copy transitions + { + // Transition the color dst image so we can transfer to it. + dstBarrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + dstBarrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + dstBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + dstBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + vkCmdPipelineBarrier( + commandBuffer, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + 0, 0, NULL, 0, NULL, 1, &dstBarrier ); + } + + VkRenderPassBeginInfo renderPassBeginInfo = {}; + renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + renderPassBeginInfo.renderPass = vkcontext.renderPass; + renderPassBeginInfo.framebuffer = vkcontext.frameBuffers[ vkcontext.currentSwapIndex ]; + renderPassBeginInfo.renderArea.extent = vkcontext.swapchainExtent; + + vkCmdBeginRenderPass( commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE ); +#endif } /*