Fix 32-bit compilation, assuming local modifications to vulkan.h

* When the final header is ready we'll roll it into the source directly
  rather than assuming the SDK is installed anywhere, and apply a local
  change to get type-safety on 32-bit (which only works on C++). Similar
  to the GL header's modification for a typed GLenum.
This commit is contained in:
baldurk
2016-02-07 18:49:10 +01:00
parent 9c9fa89a90
commit 1056b5411d
6 changed files with 44 additions and 32 deletions
+6 -3
View File
@@ -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
@@ -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);
+9 -9
View File
@@ -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<VkDeviceMemory>(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);
+10 -10
View File
@@ -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);
+16 -7
View File
@@ -90,6 +90,19 @@ struct RealVkRes
template<typename T> 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<typename T> WrappedVkNonDispRes(T obj, ResourceId objId) : real(obj), id(objId), record(NULL) {}
template<typename T> WrappedVkNonDispRes(T obj, ResourceId objId) : real( NON_DISP_TO_UINT64(obj) ), id(objId), record(NULL) {}
RealVkRes real;
ResourceId id;
@@ -391,14 +404,10 @@ template<typename inner> 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)
@@ -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;