diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 6518409fc..c6f2d46b7 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -143,8 +143,9 @@ void Serialiser::Serialise(const char *name, SigParameter &el) Serialise("", el.channelUsedMask); Serialise("", el.compCount); Serialise("", el.stream); + Serialise("", el.arrayIndex); - SIZE_CHECK(SigParameter, 56); + SIZE_CHECK(SigParameter, 60); } template<> @@ -754,6 +755,8 @@ template<> void Serialiser::Serialise(const char *name, VulkanPipelineState::ShaderStage &el) { Serialise("", el.Shader); + Serialise("", el.entryPoint); + Serialise("", el.ShaderName); Serialise("", el.customName); Serialise("", el.BindpointMapping); @@ -762,7 +765,7 @@ void Serialiser::Serialise(const char *name, VulkanPipelineState::ShaderStage &e if(m_Mode == READING) el.ShaderDetails = NULL; - SIZE_CHECK(VulkanPipelineState::ShaderStage, 64); + SIZE_CHECK(VulkanPipelineState::ShaderStage, 72); } template<> @@ -882,7 +885,7 @@ void Serialiser::Serialise(const char *name, VulkanPipelineState &el) Serialise("", el.DS); Serialise("", el.Pass); - SIZE_CHECK(VulkanPipelineState, 792); + SIZE_CHECK(VulkanPipelineState, 840); } #pragma endregion Vulkan pipeline state diff --git a/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp b/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp index c15798b0b..94b8029c6 100644 --- a/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp @@ -67,7 +67,7 @@ bool WrappedID3D11DeviceContext::Serialise_UpdateSubresource1(ID3D11Resource *pD if(WrappedID3D11Buffer::IsAlloc(DestResource)) { - srcLength = record->Length; + srcLength = (size_t)record->Length; if(HasDestBox) srcLength = RDCMIN((uint32_t)srcLength, pDstBox->right - pDstBox->left); @@ -82,7 +82,7 @@ bool WrappedID3D11DeviceContext::Serialise_UpdateSubresource1(ID3D11Resource *pD if(tex1) { - srcLength = record->Length; + srcLength = (size_t)record->Length; if(HasDestBox) srcLength = RDCMIN((uint32_t)srcLength, pDstBox->right - pDstBox->left); diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index f5b0b8925..e5a8f9aaf 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -1060,7 +1060,7 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) void *barrier = (void *)&srcimBarrier; - for (int si = 0; si < layout->subresourceStates.size(); si++) + for (size_t si = 0; si < layout->subresourceStates.size(); si++) { srcimBarrier.oldLayout = layout->subresourceStates[si].newLayout; ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -1074,7 +1074,7 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) srcimBarrier.srcAccessMask = 0; srcimBarrier.dstAccessMask = 0; - for (int si = 0; si < layout->subresourceStates.size(); si++) + for (size_t si = 0; si < layout->subresourceStates.size(); si++) { srcimBarrier.newLayout = layout->subresourceStates[si].newLayout; ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -1112,7 +1112,7 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) VkDeviceMemory datamem = ToHandle(res); VkDeviceSize datasize = record->Length; - RDCASSERT(datamem); + RDCASSERT(datamem != VK_NULL_HANDLE); RDCASSERT(record->Length > 0); VkDeviceSize memsize = record->Length; @@ -1797,7 +1797,7 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager void *barrierptr = (void *)&barrier; - for (int si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) + for (size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) { barrier.oldLayout = m_ImageLayouts[id].subresourceStates[si].newLayout; ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrierptr); @@ -1814,7 +1814,7 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; barrier.dstAccessMask = VK_ACCESS_ALL_READ_BITS; - for (int si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) + for (size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) { barrier.newLayout = m_ImageLayouts[id].subresourceStates[si].newLayout; barrier.dstAccessMask |= MakeAccessMask(barrier.newLayout); @@ -1847,7 +1847,7 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager void *barrierptr = (void *)&barrier; - for (int si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) + for (size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) { barrier.oldLayout = m_ImageLayouts[id].subresourceStates[si].newLayout; ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrierptr); @@ -1864,7 +1864,7 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; barrier.dstAccessMask = VK_ACCESS_ALL_READ_BITS; - for (int si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) + for (size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) { barrier.newLayout = m_ImageLayouts[id].subresourceStates[si].newLayout; ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrierptr); @@ -1924,7 +1924,7 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager void *barrier = (void *)&dstimBarrier; - for (int si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) + for (size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) { dstimBarrier.oldLayout = m_ImageLayouts[id].subresourceStates[si].newLayout; ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -1942,7 +1942,7 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager dstimBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; dstimBarrier.dstAccessMask = VK_ACCESS_ALL_READ_BITS; - for (int si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) + for (size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) { dstimBarrier.newLayout = m_ImageLayouts[id].subresourceStates[si].newLayout; dstimBarrier.dstAccessMask |= MakeAccessMask(dstimBarrier.newLayout); diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 48753d621..427023cd4 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -1096,7 +1096,7 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn void *barrier = (void *)&srcimBarrier; - for (int si = 0; si < layouts.subresourceStates.size(); si++) + for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { srcimBarrier.oldLayout = layouts.subresourceStates[si].newLayout; vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -1128,7 +1128,7 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn vt->CmdEndRenderPass(Unwrap(cmd)); } - for (int si = 0; si < layouts.subresourceStates.size(); si++) + for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { srcimBarrier.newLayout = layouts.subresourceStates[si].newLayout; srcimBarrier.dstAccessMask = MakeAccessMask(srcimBarrier.newLayout); @@ -3442,7 +3442,7 @@ bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, void *barrier = (void *)&srcimBarrier; - for (int si = 0; si < layouts.subresourceStates.size(); si++) + for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { srcimBarrier.oldLayout = layouts.subresourceStates[si].newLayout; vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -3471,7 +3471,7 @@ bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, }; // image layout back to normal - for (int si = 0; si < layouts.subresourceStates.size(); si++) + for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { srcimBarrier.newLayout = layouts.subresourceStates[si].newLayout; srcimBarrier.dstAccessMask = MakeAccessMask(srcimBarrier.newLayout); @@ -3641,7 +3641,7 @@ bool VulkanReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t m void *barrier = (void *)&srcimBarrier; - for (int si = 0; si < layouts.subresourceStates.size(); si++) + for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { srcimBarrier.oldLayout = layouts.subresourceStates[si].newLayout; vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -3672,7 +3672,7 @@ bool VulkanReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t m }; // image layout back to normal - for (int si = 0; si < layouts.subresourceStates.size(); si++) + for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { srcimBarrier.newLayout = layouts.subresourceStates[si].newLayout; srcimBarrier.dstAccessMask = MakeAccessMask(srcimBarrier.newLayout); @@ -4013,7 +4013,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m void *barrier = (void *)&srcimBarrier; - for (int si = 0; si < layouts.subresourceStates.size(); si++) + for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { srcimBarrier.oldLayout = layouts.subresourceStates[si].newLayout; vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -4035,7 +4035,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m barrier = (void *)&srcimBarrier; // image layout back to normal - for (int si = 0; si < layouts.subresourceStates.size(); si++) + for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { srcimBarrier.newLayout = layouts.subresourceStates[si].newLayout; vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -4083,7 +4083,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m // before we go resolving srcimBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - for (int si = 0; si < layouts.subresourceStates.size(); si++) + for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { srcimBarrier.oldLayout = layouts.subresourceStates[si].newLayout; vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -4134,7 +4134,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m if(tmpImage == VK_NULL_HANDLE) { // image layout back to normal - for (int si = 0; si < layouts.subresourceStates.size(); si++) + for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { srcimBarrier.newLayout = layouts.subresourceStates[si].newLayout; vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 5842971e3..795099d59 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -90,6 +90,19 @@ struct RealVkRes template T *AsPtr() { return (T*)&handle; } }; +// this is defined in a custom modification to vulkan.h, where on 32-bit systems +// we gain type safety by using a C++ struct to wrap the uint64_t instead of using +// a naked uint64_t typedef +#ifdef VK_NON_DISPATCHABLE_WRAPPER_STRUCT + +#define NON_DISP_TO_UINT64(obj) obj.handle + +#else + +#define NON_DISP_TO_UINT64(obj) (uint64_t)obj + +#endif + // since handles can overlap (ie. handle 1 might be valid for many types // if the ICD is using indexing or state packing instead of true pointers) // when storing wrapper object <-> real object we have to store the type @@ -121,7 +134,7 @@ struct TypedRealHandle struct WrappedVkNonDispRes : public WrappedVkRes { - template WrappedVkNonDispRes(T obj, ResourceId objId) : real(obj), id(objId), record(NULL) {} + template WrappedVkNonDispRes(T obj, ResourceId objId) : real( NON_DISP_TO_UINT64(obj) ), id(objId), record(NULL) {} RealVkRes real; ResourceId id; @@ -391,14 +404,10 @@ template struct UnwrapHelper {}; typedef WrappedVkNonDispRes ParentType; \ typedef CONCAT(Wrapped, vulkantype) Outer; \ static TypedRealHandle ToTypedHandle(vulkantype real) \ - { TypedRealHandle h; h.type = (VkResourceType)Outer::TypeEnum; h.real = RealVkRes(real); return h; } \ - static Outer *FromHandle(vulkantype wrapped) { return (Outer *) (uintptr_t)wrapped; } \ + { TypedRealHandle h; h.type = (VkResourceType)Outer::TypeEnum; h.real = RealVkRes( NON_DISP_TO_UINT64(real) ); return h; } \ + static Outer *FromHandle(vulkantype wrapped) { return (Outer *) (uintptr_t) NON_DISP_TO_UINT64(wrapped); } \ }; -// VKTODOHIGH this no longer works on 32-bit since handles are no longer strongly typed. -// solution will *probably* be to modify vulkan.h to use a C++ class with appropriate overrides, -// constructors and operators to still be a 64-bit element but be strongly typed. - UNWRAP_HELPER(VkInstance) UNWRAP_HELPER(VkPhysicalDevice) UNWRAP_HELPER(VkDevice) diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index c35db90be..3d5bb3515 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -329,7 +329,7 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer( GetResourceManager()->WrapResource(Unwrap(device), cmd); } - m_PartialReplayData.resultPartialCmdPool = (VkCommandPool)GetResourceManager()->GetWrapper(ToTypedHandle(allocInfo.commandPool)); + m_PartialReplayData.resultPartialCmdPool = (VkCommandPool)uint64_t(GetResourceManager()->GetWrapper(ToTypedHandle(allocInfo.commandPool))); m_PartialReplayData.resultPartialCmdBuffer = cmd; m_PartialReplayData.partialDevice = device;