diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index be6b188af..b587db428 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -628,7 +628,10 @@ bool WrappedVulkan::Serialise_BeginCaptureFrame(bool applyInitialState) vector imgTransitions; - GetResourceManager()->SerialiseImageStates(m_ImageInfo, imgTransitions); + { + SCOPED_LOCK(m_ImageLayoutsLock); // not needed on replay, but harmless also + GetResourceManager()->SerialiseImageStates(m_ImageLayouts, imgTransitions); + } if(applyInitialState && !imgTransitions.empty()) { @@ -1369,7 +1372,7 @@ void WrappedVulkan::ReplayLog(uint32_t frameID, uint32_t startEventID, uint32_t vkr = ObjDisp(cmd)->BeginCommandBuffer(Unwrap(cmd), &beginInfo); RDCASSERT(vkr == VK_SUCCESS); - ImgState &st = m_ImageInfo[GetResourceManager()->GetLiveID(m_FakeBBImgId)]; + ImageLayouts &st = m_ImageLayouts[GetResourceManager()->GetLiveID(m_FakeBBImgId)]; RDCASSERT(st.subresourceStates.size() == 1); VkImageMemoryBarrier t; diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 54cc4742b..9ee668c6f 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -373,7 +373,10 @@ private: map m_CurrentMaps; Threading::CriticalSection m_CurrentMapsLock; - map m_ImageInfo; + // used both on capture and replay side to track image layouts. Only locked + // in capture + map m_ImageLayouts; + Threading::CriticalSection m_ImageLayoutsLock; // below are replay-side data only, doesn't have to be thread protected diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index 557076406..141dd75f2 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -253,6 +253,32 @@ void VulkanCreationInfo::BufferView::Init(const VkBufferViewCreateInfo* pCreateI size = pCreateInfo->range; } +void VulkanCreationInfo::Image::Init(const VkImageCreateInfo* pCreateInfo) +{ + view = VK_NULL_HANDLE; + + type = pCreateInfo->imageType; + format = pCreateInfo->format; + extent = pCreateInfo->extent; + arraySize = pCreateInfo->arraySize; + mipLevels = pCreateInfo->mipLevels; + samples = pCreateInfo->samples; + + creationFlags = 0; + + if(pCreateInfo->usage & VK_IMAGE_USAGE_SAMPLED_BIT) + creationFlags |= eTextureCreate_SRV; + if(pCreateInfo->usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT)) + creationFlags |= eTextureCreate_RTV; + if(pCreateInfo->usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) + creationFlags |= eTextureCreate_DSV; + if(pCreateInfo->usage & VK_IMAGE_USAGE_STORAGE_BIT) + creationFlags |= eTextureCreate_UAV; + + if(pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) + cube = true; +} + void VulkanCreationInfo::ImageView::Init(const VkImageViewCreateInfo* pCreateInfo) { image = VKMGR()->GetNonDispWrapper(pCreateInfo->image)->id; @@ -274,4 +300,4 @@ void VulkanCreationInfo::Shader::Init(const VkShaderCreateInfo* pCreateInfo, Vul refl.DebugInfo.entryFunc = pCreateInfo->pName; // VKTODOLOW set this properly refl.DebugInfo.entryFile = 0; -} +} \ No newline at end of file diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index f092618e5..a5e8a9ad1 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -187,6 +187,22 @@ struct VulkanCreationInfo uint64_t size; }; map m_BufferView; + + struct Image + { + void Init(const VkImageCreateInfo* pCreateInfo); + + VkImageView view; + + VkImageType type; + VkFormat format; + VkExtent3D extent; + int arraySize, mipLevels, samples; + + bool cube; + uint32_t creationFlags; + }; + map m_Image; struct ImageView { diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index a64025223..5ccfdf559 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -134,12 +134,6 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) { VULKANNOTIMP("image initial states not implemented"); - if(m_ImageInfo.find(id) == m_ImageInfo.end()) - { - RDCERR("Couldn't find image info"); - return false; - } - // VKTODOHIGH: need to copy off contents to memory somewhere else return true; @@ -401,16 +395,16 @@ void WrappedVulkan::Create_InitialState(ResourceId id, WrappedVkRes *live, bool ResourceId liveid = GetResourceManager()->GetLiveID(id); - if(m_ImageInfo.find(liveid) == m_ImageInfo.end()) + if(m_ImageLayouts.find(liveid) == m_ImageLayouts.end()) { RDCERR("Couldn't find image info for %llu", id); GetResourceManager()->SetInitialContents(id, VulkanResourceManager::InitialContentData(NULL, eInitialContents_ClearColorImage, NULL)); return; } - ImgState &img = m_ImageInfo[liveid]; + ImageLayouts &layouts = m_ImageLayouts[liveid]; - if(img.subresourceStates[0].range.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) + if(layouts.subresourceStates[0].range.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) GetResourceManager()->SetInitialContents(id, VulkanResourceManager::InitialContentData(NULL, eInitialContents_ClearColorImage, NULL)); else GetResourceManager()->SetInitialContents(id, VulkanResourceManager::InitialContentData(NULL, eInitialContents_ClearDepthStencilImage, NULL)); diff --git a/renderdoc/driver/vulkan/vk_manager.cpp b/renderdoc/driver/vulkan/vk_manager.cpp index 5060903ab..d8a36cb7e 100644 --- a/renderdoc/driver/vulkan/vk_manager.cpp +++ b/renderdoc/driver/vulkan/vk_manager.cpp @@ -51,7 +51,7 @@ bool VulkanResourceManager::SerialisableResource(ResourceId id, VkResourceRecord #define TRDBG(...) #endif -void VulkanResourceManager::RecordTransitions(vector< pair > &trans, map &states, +void VulkanResourceManager::RecordTransitions(vector< pair > &trans, map &states, uint32_t numTransitions, const VkImageMemoryBarrier *transitions) { TRDBG("Recording %u transitions", numTransitions); @@ -205,7 +205,7 @@ void VulkanResourceManager::RecordTransitions(vector< pair &states, vector &transitions) +void VulkanResourceManager::SerialiseImageStates(map &states, vector &transitions) { Serialiser *localSerialiser = m_pSerialiser; @@ -270,7 +270,7 @@ void VulkanResourceManager::SerialiseImageStates(map &stat } } -void VulkanResourceManager::ApplyTransitions(vector< pair > &trans, map &states) +void VulkanResourceManager::ApplyTransitions(vector< pair > &trans, map &states) { TRDBG("Applying %u transitions", (uint32_t)trans.size()); diff --git a/renderdoc/driver/vulkan/vk_manager.h b/renderdoc/driver/vulkan/vk_manager.h index 7b95cda2b..610252d6c 100644 --- a/renderdoc/driver/vulkan/vk_manager.h +++ b/renderdoc/driver/vulkan/vk_manager.h @@ -89,12 +89,12 @@ class VulkanResourceManager : public ResourceManager > &trans, map &states, + void RecordTransitions(vector< pair > &trans, map &states, uint32_t numTransitions, const VkImageMemoryBarrier *transitions); - void ApplyTransitions(vector< pair > &trans, map &states); + void ApplyTransitions(vector< pair > &trans, map &states); - void SerialiseImageStates(map &states, vector &transitions); + void SerialiseImageStates(map &states, vector &transitions); ResourceId GetID(WrappedVkRes *res) { diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 066b8b732..9ddcad2e0 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -510,7 +510,7 @@ vector VulkanReplay::GetTextures() { vector texs; - for(auto it = m_pDriver->m_ImageInfo.begin(); it != m_pDriver->m_ImageInfo.end(); ++it) + for(auto it = m_pDriver->m_ImageLayouts.begin(); it != m_pDriver->m_ImageLayouts.end(); ++it) { // skip textures that aren't from the capture if(m_pDriver->GetResourceManager()->GetOriginalID(it->first) == it->first) @@ -671,11 +671,12 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn VkCmdBuffer cmd = m_pDriver->GetNextCmd(); const VkLayerDispatchTable *vt = ObjDisp(dev); - ImgState &iminfo = m_pDriver->m_ImageInfo[cfg.texid]; + ImageLayouts &layouts = m_pDriver->m_ImageLayouts[cfg.texid]; + VulkanCreationInfo::Image &iminfo = m_pDriver->m_CreationInfo.m_Image[m_pDriver->GetResourceManager()->GetOriginalID(cfg.texid)]; VkImage liveIm = m_pDriver->GetResourceManager()->GetCurrentHandle(cfg.texid); // VKTODOMED handle multiple subresources with different layouts etc - VkImageLayout origLayout = iminfo.subresourceStates[0].state; + VkImageLayout origLayout = layouts.subresourceStates[0].state; VkImageView liveImView = iminfo.view; if(liveImView == VK_NULL_HANDLE) @@ -1293,10 +1294,11 @@ void VulkanReplay::FileChanged() FetchTexture VulkanReplay::GetTexture(ResourceId id) { - const ImgState &iminfo = m_pDriver->m_ImageInfo[id]; - FetchTexture ret; ret.ID = m_pDriver->GetResourceManager()->GetOriginalID(id); + + VulkanCreationInfo::Image &iminfo = m_pDriver->m_CreationInfo.m_Image[ret.ID]; + ret.arraysize = iminfo.arraySize; ret.creationFlags = iminfo.creationFlags; ret.cubemap = iminfo.cube; diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index b2bc4baab..ff13a7332 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -693,26 +693,12 @@ struct VkResourceRecord : public ResourceRecord VkResourceRecord *memory; }; -struct ImgState +struct ImageLayouts { - ImgState() - : view(VK_NULL_HANDLE), arraySize(0), mipLevels(0), samples(0), cube(false), creationFlags(0) - { - type = VK_IMAGE_TYPE_MAX_ENUM; - format = VK_FORMAT_UNDEFINED; - extent.width = extent.height = extent.depth = 0; - } + ImageLayouts() : arraySize(1), mipLevels(1) {} - VkImageView view; vector subresourceStates; - - VkImageType type; - VkFormat format; - VkExtent3D extent; - int arraySize, mipLevels, samples; - - bool cube; - uint32_t creationFlags; + int arraySize, mipLevels; }; bool IsBlockFormat(VkFormat f); diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 24c1a22e4..6e8e95495 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -1434,7 +1434,7 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier( ObjDisp(cmdBuffer)->CmdPipelineBarrier(Unwrap(cmdBuffer), src, dest, region, (uint32_t)mems.size(), (const void **)&mems[0]); ResourceId cmd = GetResID(PartialCmdBuf()); - GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); + GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageLayouts, (uint32_t)imTrans.size(), &imTrans[0]); } } else if(m_State == READING) @@ -1444,7 +1444,7 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier( ObjDisp(cmdBuffer)->CmdPipelineBarrier(Unwrap(cmdBuffer), src, dest, region, (uint32_t)mems.size(), (const void **)&mems[0]); ResourceId cmd = GetResID(cmdBuffer); - GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); + GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageLayouts, (uint32_t)imTrans.size(), &imTrans[0]); } for(size_t i=0; i < mems.size(); i++) @@ -1527,7 +1527,10 @@ void WrappedVulkan::vkCmdPipelineBarrier( } ResourceId cmd = GetResID(cmdBuffer); - GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); + { + SCOPED_LOCK(m_ImageLayoutsLock); + GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageLayouts, (uint32_t)imTrans.size(), &imTrans[0]); + } // VKTODOMED do we need to mark frame referenced the resources in the barrier? if they're not referenced // elsewhere, perhaps they can be dropped diff --git a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp index c3ebeb247..094653d1e 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp @@ -31,7 +31,6 @@ #define DESTROY_IMPL(type, func) \ void WrappedVulkan::vk ## func(VkDevice device, type obj) \ { \ - if(m_ImageInfo.find(GetResID(obj)) != m_ImageInfo.end()) m_ImageInfo.erase(GetResID(obj)); \ type unwrappedObj = Unwrap(obj); \ if(GetResourceManager()->HasWrapper(ToTypedHandle(unwrappedObj))) GetResourceManager()->ReleaseWrappedResource(obj, true); \ ObjDisp(device)->func(Unwrap(device), unwrappedObj); \ @@ -39,7 +38,6 @@ DESTROY_IMPL(VkBuffer, DestroyBuffer) DESTROY_IMPL(VkBufferView, DestroyBufferView) -DESTROY_IMPL(VkImage, DestroyImage) DESTROY_IMPL(VkImageView, DestroyImageView) DESTROY_IMPL(VkShader, DestroyShader) DESTROY_IMPL(VkShaderModule, DestroyShaderModule) @@ -62,12 +60,20 @@ DESTROY_IMPL(VkRenderPass, DestroyRenderPass) // needs to be separate because it returns VkResult still VkResult WrappedVulkan::vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR obj) { - if(m_ImageInfo.find(GetResID(obj)) != m_ImageInfo.end()) m_ImageInfo.erase(GetResID(obj)); VkSwapchainKHR unwrappedObj = Unwrap(obj); if(GetResourceManager()->HasWrapper(ToTypedHandle(unwrappedObj))) GetResourceManager()->ReleaseWrappedResource(obj, true); return ObjDisp(device)->DestroySwapchainKHR(Unwrap(device), unwrappedObj); } +// needs to be separate so we don't erase from m_ImageLayouts in other destroy functions +void WrappedVulkan::vkDestroyImage(VkDevice device, VkImage obj) +{ + m_ImageLayouts.erase(GetResID(obj)); + VkImage unwrappedObj = Unwrap(obj); + if(GetResourceManager()->HasWrapper(ToTypedHandle(unwrappedObj))) GetResourceManager()->ReleaseWrappedResource(obj, true); + return ObjDisp(device)->DestroyImage(Unwrap(device), unwrappedObj); +} + // needs to be separate since it's dispatchable void WrappedVulkan::vkDestroyCommandBuffer(VkDevice device, VkCmdBuffer obj) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index c96dbb97a..708ea48ac 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -164,7 +164,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( for(uint32_t i=0; i < numCmds; i++) { ResourceId cmd = GetResourceManager()->GetLiveID(cmdIds[i]); - GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo); + GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageLayouts); } AddEvent(QUEUE_SUBMIT, desc); @@ -275,7 +275,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( for(uint32_t i=0; i < numCmds; i++) { ResourceId cmd = trimmedCmdIds[i]; - GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo); + GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageLayouts); } } else @@ -285,7 +285,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( for(uint32_t i=0; i < numCmds; i++) { ResourceId cmd = GetResourceManager()->GetLiveID(cmdIds[i]); - GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo); + GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageLayouts); } } } @@ -329,7 +329,11 @@ VkResult WrappedVulkan::vkQueueSubmit( for(uint32_t i=0; i < cmdBufferCount; i++) { ResourceId cmd = GetResID(pCmdBuffers[i]); - GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo); + + { + SCOPED_LOCK(m_ImageLayoutsLock); + GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageLayouts); + } VkResourceRecord *record = GetRecord(pCmdBuffers[i]); diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 4d708c39a..bad2e00e0 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -769,7 +769,7 @@ bool WrappedVulkan::Serialise_vkCreateImage( device = GetResourceManager()->GetLiveHandle(devId); VkImage img = VK_NULL_HANDLE; - VkImageUsageFlags origFlags = info.usage; + m_CreationInfo.m_Image[id].Init(&info); // ensure we can always display and copy from textures info.usage |= VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT; @@ -785,26 +785,6 @@ bool WrappedVulkan::Serialise_vkCreateImage( ResourceId live = GetResourceManager()->WrapResource(Unwrap(device), img); GetResourceManager()->AddLiveResource(id, img); - ImgState &iminfo = m_ImageInfo[live]; - - iminfo.type = info.imageType; - iminfo.format = info.format; - iminfo.extent = info.extent; - iminfo.mipLevels = info.mipLevels; - iminfo.arraySize = info.arraySize; - iminfo.samples = info.samples; - - if(origFlags & VK_IMAGE_USAGE_SAMPLED_BIT) - iminfo.creationFlags |= eTextureCreate_SRV; - if(origFlags & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT)) - iminfo.creationFlags |= eTextureCreate_RTV; - if(origFlags & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) - iminfo.creationFlags |= eTextureCreate_DSV; - if(origFlags & VK_IMAGE_USAGE_STORAGE_BIT) - iminfo.creationFlags |= eTextureCreate_UAV; - - if(info.flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) - iminfo.cube = true; VkImageSubresourceRange range; range.baseMipLevel = range.baseArrayLayer = 0; @@ -812,17 +792,18 @@ bool WrappedVulkan::Serialise_vkCreateImage( range.arraySize = info.arraySize; if(info.imageType == VK_IMAGE_TYPE_3D) range.arraySize = info.extent.depth; - - iminfo.subresourceStates.clear(); + + ImageLayouts &layouts = m_ImageLayouts[live]; + layouts.subresourceStates.clear(); if(!IsDepthStencilFormat(info.format)) { - range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; iminfo.subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); + range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; layouts.subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); } else { - range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; iminfo.subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); - range.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;iminfo.subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); + range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; layouts.subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); + range.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;layouts.subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); } } } @@ -861,12 +842,6 @@ VkResult WrappedVulkan::vkCreateImage( { GetResourceManager()->AddLiveResource(id, *pImage); } - - m_ImageInfo[id].type = pCreateInfo->imageType; - m_ImageInfo[id].format = pCreateInfo->format; - m_ImageInfo[id].extent = pCreateInfo->extent; - m_ImageInfo[id].mipLevels = pCreateInfo->mipLevels; - m_ImageInfo[id].arraySize = pCreateInfo->arraySize; VkImageSubresourceRange range; range.baseMipLevel = range.baseArrayLayer = 0; @@ -875,16 +850,18 @@ VkResult WrappedVulkan::vkCreateImage( if(pCreateInfo->imageType == VK_IMAGE_TYPE_3D) range.arraySize = pCreateInfo->extent.depth; - m_ImageInfo[id].subresourceStates.clear(); - - if(!IsDepthStencilFormat(pCreateInfo->format)) { - range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; m_ImageInfo[id].subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); - } - else - { - range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; m_ImageInfo[id].subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); - range.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;m_ImageInfo[id].subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); + SCOPED_LOCK(m_ImageLayoutsLock); + m_ImageLayouts[id].subresourceStates.clear(); + if(!IsDepthStencilFormat(pCreateInfo->format)) + { + range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; m_ImageLayouts[id].subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); + } + else + { + range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; m_ImageLayouts[id].subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); + range.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;m_ImageLayouts[id].subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); + } } } diff --git a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp index 87ad77561..8ee734d5d 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp @@ -702,7 +702,7 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents( ObjDisp(cmdBuffer)->CmdWaitEvents(Unwrap(cmdBuffer), evcount, &events[0], src, dest, (uint32_t)mems.size(), (const void **)&mems[0]); ResourceId cmd = GetResID(PartialCmdBuf()); - GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); + GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageLayouts, (uint32_t)imTrans.size(), &imTrans[0]); } } else if(m_State == READING) @@ -712,7 +712,7 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents( ObjDisp(cmdBuffer)->CmdWaitEvents(Unwrap(cmdBuffer), evcount, &events[0], src, dest, (uint32_t)mems.size(), (const void **)&mems[0]); ResourceId cmd = GetResID(cmdBuffer); - GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); + GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageLayouts, (uint32_t)imTrans.size(), &imTrans[0]); } for(size_t i=0; i < mems.size(); i++) @@ -797,7 +797,10 @@ void WrappedVulkan::vkCmdWaitEvents( } ResourceId cmd = GetResID(cmdBuffer); - GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); + { + SCOPED_LOCK(m_ImageLayoutsLock); + GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageLayouts, (uint32_t)imTrans.size(), &imTrans[0]); + } record->AddChunk(scope.Get()); for(uint32_t i=0; i < eventCount; i++) diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index 351fa6d4d..f16eb6412 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -92,6 +92,8 @@ bool WrappedVulkan::Serialise_vkGetSwapchainImagesKHR( // VKTODOLOW what if num images is less than on capture? RDCASSERT(idx < m_CreationInfo.m_SwapChain[swapId].images.size()); GetResourceManager()->AddLiveResource(id, m_CreationInfo.m_SwapChain[swapId].images[idx].im); + + m_CreationInfo.m_Image[id] = m_CreationInfo.m_Image[swapId]; } return true; @@ -277,14 +279,17 @@ bool WrappedVulkan::Serialise_vkCreateSwapchainKHR( swapinfo.images[i].im = im; // fill out image info so we track resource state transitions - m_ImageInfo[liveId].type = VK_IMAGE_TYPE_2D; - m_ImageInfo[liveId].format = info.imageFormat; - m_ImageInfo[liveId].extent.width = info.imageExtent.width; - m_ImageInfo[liveId].extent.height = info.imageExtent.height; - m_ImageInfo[liveId].extent.depth = 1; - m_ImageInfo[liveId].mipLevels = 1; - m_ImageInfo[liveId].arraySize = info.imageArraySize; - m_ImageInfo[liveId].creationFlags = eTextureCreate_SRV|eTextureCreate_RTV|eTextureCreate_SwapBuffer; + VulkanCreationInfo::Image &iminfo = m_CreationInfo.m_Image[id]; + iminfo.type = VK_IMAGE_TYPE_2D; + iminfo.format = info.imageFormat; + iminfo.extent.width = info.imageExtent.width; + iminfo.extent.height = info.imageExtent.height; + iminfo.extent.depth = 1; + iminfo.mipLevels = 1; + iminfo.arraySize = info.imageArraySize; + iminfo.creationFlags = eTextureCreate_SRV|eTextureCreate_RTV|eTextureCreate_SwapBuffer; + iminfo.cube = false; + iminfo.samples = 1; m_CreationInfo.m_Names[liveId] = StringFormat::Fmt("Presentable Image %u", i); @@ -294,8 +299,8 @@ bool WrappedVulkan::Serialise_vkCreateSwapchainKHR( range.arraySize = info.imageArraySize; range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - m_ImageInfo[liveId].subresourceStates.clear(); - m_ImageInfo[liveId].subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); + m_ImageLayouts[liveId].subresourceStates.clear(); + m_ImageLayouts[liveId].subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); } } @@ -409,23 +414,18 @@ VkResult WrappedVulkan::vkCreateSwapchainKHR( ResourceId imid = GetResID(images[i]); - // fill out image info so we track resource state transitions - m_ImageInfo[imid].type = VK_IMAGE_TYPE_2D; - m_ImageInfo[imid].format = pCreateInfo->imageFormat; - m_ImageInfo[imid].extent.width = pCreateInfo->imageExtent.width; - m_ImageInfo[imid].extent.height = pCreateInfo->imageExtent.height; - m_ImageInfo[imid].extent.depth = 1; - m_ImageInfo[imid].mipLevels = 1; - m_ImageInfo[imid].arraySize = pCreateInfo->imageArraySize; - VkImageSubresourceRange range; range.baseMipLevel = range.baseArrayLayer = 0; range.mipLevels = 1; range.arraySize = pCreateInfo->imageArraySize; range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - - m_ImageInfo[imid].subresourceStates.clear(); - m_ImageInfo[imid].subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); + + // fill out image info so we track resource state transitions + { + SCOPED_LOCK(m_ImageLayoutsLock); + m_ImageLayouts[imid].subresourceStates.clear(); + m_ImageLayouts[imid].subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); + } { VkImageViewCreateInfo info = {