[Sparse #4] Serialise out sparse binding changes that happen mid-frame

* Also add stub calls to update in-memory tracked pages
This commit is contained in:
baldurk
2015-11-08 18:25:14 +01:00
parent 803e626e8d
commit 28f448ea6f
7 changed files with 174 additions and 13 deletions
+34
View File
@@ -912,6 +912,19 @@ string ToStrHelper<false, VkImageViewCreateFlagBits>::Get(const VkImageViewCreat
return ret;
}
template<>
string ToStrHelper<false, VkSparseMemoryBindFlagBits>::Get(const VkSparseMemoryBindFlagBits &el)
{
string ret;
if(el & VK_SPARSE_MEMORY_BIND_REPLICATE_64KIB_BLOCK_BIT) ret += " | VK_SPARSE_MEMORY_BIND_REPLICATE_64KIB_BLOCK_BIT";
if(!ret.empty())
ret = ret.substr(3);
return ret;
}
template<>
string ToStrHelper<false, VkCmdPoolCreateFlagBits>::Get(const VkCmdPoolCreateFlagBits &el)
{
@@ -2378,6 +2391,27 @@ void Serialiser::Serialise(const char *name, VkImageViewCreateInfo &el)
Serialise("flags", (VkImageViewCreateFlagBits &)el.flags);
}
template<>
void Serialiser::Serialise(const char *name, VkSparseImageMemoryBindInfo &el)
{
Serialise("subresource", el.subresource);
Serialise("offset", el.offset);
Serialise("extent", el.extent);
Serialise("memOffset", el.memOffset);
SerialiseObject(VkDeviceMemory, "mem", el.mem);
Serialise("flags", (VkSparseMemoryBindFlagBits &)el.flags);
}
template<>
void Serialiser::Serialise(const char *name, VkSparseMemoryBindInfo &el)
{
Serialise("rangeOffset", el.rangeOffset);
Serialise("rangeSize", el.rangeSize);
Serialise("memOffset", el.memOffset);
SerialiseObject(VkDeviceMemory, "mem", el.mem);
Serialise("flags", (VkSparseMemoryBindFlagBits &)el.flags);
}
template<>
void Serialiser::Serialise(const char *name, VkFramebufferCreateInfo &el)
{
+6
View File
@@ -84,6 +84,8 @@ template<> void Serialiser::Serialise(const char *name, VkBufferCreateInfo &el);
template<> void Serialiser::Serialise(const char *name, VkBufferViewCreateInfo &el);
template<> void Serialiser::Serialise(const char *name, VkImageCreateInfo &el);
template<> void Serialiser::Serialise(const char *name, VkImageViewCreateInfo &el);
template<> void Serialiser::Serialise(const char *name, VkSparseImageMemoryBindInfo &el);
template<> void Serialiser::Serialise(const char *name, VkSparseMemoryBindInfo &el);
template<> void Serialiser::Serialise(const char *name, VkFramebufferCreateInfo &el);
template<> void Serialiser::Serialise(const char *name, VkRenderPassCreateInfo &el);
template<> void Serialiser::Serialise(const char *name, VkRenderPassBeginInfo &el);
@@ -214,6 +216,10 @@ enum VulkanChunkType
BIND_BUFFER_MEM,
BIND_IMAGE_MEM,
BIND_SPARSE_BUF,
BIND_SPARSE_OPAQUE_IM,
BIND_SPARSE_IM,
BEGIN_RENDERPASS,
NEXT_SUBPASS,
EXEC_CMDS,
+14
View File
@@ -103,6 +103,10 @@ const char *VkChunkNames[] =
"vkQueueSubmit",
"vkBindBufferMemory",
"vkBindImageMemory",
"vkQueueBindSparseBufferMemory",
"vkQueueBindSparseImageOpaqueMemory",
"vkQueueBindSparseImageMemory",
"vkCmdBeginRenderPass",
"vkCmdNextSubpass",
@@ -1475,6 +1479,16 @@ void WrappedVulkan::ProcessChunk(uint64_t offset, VulkanChunkType context)
Serialise_vkBindImageMemory(GetMainSerialiser(), VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, 0);
break;
case BIND_SPARSE_BUF:
Serialise_vkQueueBindSparseBufferMemory(GetMainSerialiser(), VK_NULL_HANDLE, VK_NULL_HANDLE, 0, NULL);
break;
case BIND_SPARSE_OPAQUE_IM:
Serialise_vkQueueBindSparseImageOpaqueMemory(GetMainSerialiser(), VK_NULL_HANDLE, VK_NULL_HANDLE, 0, NULL);
break;
case BIND_SPARSE_IM:
Serialise_vkQueueBindSparseImageMemory(GetMainSerialiser(), VK_NULL_HANDLE, VK_NULL_HANDLE, 0, NULL);
break;
case BEGIN_RENDERPASS:
Serialise_vkCmdBeginRenderPass(GetMainSerialiser(), VK_NULL_HANDLE, NULL, VK_RENDER_PASS_CONTENTS_MAX_ENUM);
break;
+8
View File
@@ -508,3 +508,11 @@ VkResourceRecord::~VkResourceRecord()
SAFE_DELETE(sparseInfo);
}
}
void SparseMapping::Update(uint32_t numBindings, const VkSparseImageMemoryBindInfo *pBindings)
{
}
void SparseMapping::Update(uint32_t numBindings, const VkSparseMemoryBindInfo *pBindings)
{
}
+3
View File
@@ -596,6 +596,9 @@ struct SparseMapping
// pagetable per image aspect (some may be NULL)
// in order of width first, then height, then depth
pair<VkDeviceMemory, VkDeviceSize> *pages[VK_IMAGE_ASPECT_NUM];
void Update(uint32_t numBindings, const VkSparseImageMemoryBindInfo *pBindings);
void Update(uint32_t numBindings, const VkSparseMemoryBindInfo *pBindings);
};
struct CmdBufferRecordingInfo
@@ -595,7 +595,7 @@ bool WrappedVulkan::Serialise_vkQueueWaitIdle(Serialiser* localSerialiser, VkQue
{
SERIALISE_ELEMENT(ResourceId, id, GetResID(queue));
if(m_State < WRITING_CAPFRAME)
if(m_State < WRITING)
{
queue = GetResourceManager()->GetLiveHandle<VkQueue>(id);
ObjDisp(queue)->QueueWaitIdle(Unwrap(queue));
@@ -660,7 +660,22 @@ bool WrappedVulkan::Serialise_vkQueueBindSparseBufferMemory(
uint32_t numBindings,
const VkSparseMemoryBindInfo* pBindInfo)
{
// VKTODOHIGH stub function
SERIALISE_ELEMENT(ResourceId, qid, GetResID(queue));
SERIALISE_ELEMENT(ResourceId, bufid, GetResID(buffer));
SERIALISE_ELEMENT(uint32_t, num, numBindings);
SERIALISE_ELEMENT_ARR(VkSparseMemoryBindInfo, binds, pBindInfo, num);
if(m_State < WRITING && GetResourceManager()->HasLiveResource(bufid))
{
queue = GetResourceManager()->GetLiveHandle<VkQueue>(qid);
buffer = GetResourceManager()->GetLiveHandle<VkBuffer>(bufid);
ObjDisp(queue)->QueueBindSparseBufferMemory(Unwrap(queue), Unwrap(buffer), num, binds);
}
SAFE_DELETE_ARRAY(binds);
return true;
}
@@ -670,9 +685,26 @@ VkResult WrappedVulkan::vkQueueBindSparseBufferMemory(
uint32_t numBindings,
const VkSparseMemoryBindInfo* pBindInfo)
{
// VKTODOHIGH stub function
RDCWARN("Sparse memory operations are not yet implemented");
return ObjDisp(queue)->QueueBindSparseBufferMemory(Unwrap(queue), Unwrap(buffer), numBindings, pBindInfo);
if(m_State >= WRITING_CAPFRAME)
{
CACHE_THREAD_SERIALISER();
SCOPED_SERIALISE_CONTEXT(BIND_SPARSE_BUF);
Serialise_vkQueueBindSparseBufferMemory(localSerialiser, queue, buffer, numBindings, pBindInfo);
m_FrameCaptureRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(GetResID(queue), eFrameRef_Read);
// image isn't marked referenced. If the only ref is a memory bind, we just skip it
}
if(m_State >= WRITING)
GetRecord(buffer)->sparseInfo->Update(numBindings, pBindInfo);
VkSparseMemoryBindInfo *unwrappedBinds = GetTempArray<VkSparseMemoryBindInfo>(numBindings);
memcpy(unwrappedBinds, pBindInfo, sizeof(VkSparseMemoryBindInfo)*numBindings);
for(uint32_t i=0; i < numBindings; i++) unwrappedBinds[i].mem = Unwrap(unwrappedBinds[i].mem);
return ObjDisp(queue)->QueueBindSparseBufferMemory(Unwrap(queue), Unwrap(buffer), numBindings, unwrappedBinds);
}
bool WrappedVulkan::Serialise_vkQueueBindSparseImageOpaqueMemory(
@@ -682,7 +714,22 @@ bool WrappedVulkan::Serialise_vkQueueBindSparseImageOpaqueMemory(
uint32_t numBindings,
const VkSparseMemoryBindInfo* pBindInfo)
{
// VKTODOHIGH stub function
SERIALISE_ELEMENT(ResourceId, qid, GetResID(queue));
SERIALISE_ELEMENT(ResourceId, imid, GetResID(image));
SERIALISE_ELEMENT(uint32_t, num, numBindings);
SERIALISE_ELEMENT_ARR(VkSparseMemoryBindInfo, binds, pBindInfo, num);
if(m_State < WRITING && GetResourceManager()->HasLiveResource(imid))
{
queue = GetResourceManager()->GetLiveHandle<VkQueue>(qid);
image = GetResourceManager()->GetLiveHandle<VkImage>(imid);
ObjDisp(queue)->QueueBindSparseImageOpaqueMemory(Unwrap(queue), Unwrap(image), num, binds);
}
SAFE_DELETE_ARRAY(binds);
return true;
}
@@ -692,9 +739,26 @@ VkResult WrappedVulkan::vkQueueBindSparseImageOpaqueMemory(
uint32_t numBindings,
const VkSparseMemoryBindInfo* pBindInfo)
{
// VKTODOHIGH stub function
RDCWARN("Sparse memory operations are not yet implemented");
return ObjDisp(queue)->QueueBindSparseImageOpaqueMemory(Unwrap(queue), Unwrap(image), numBindings, pBindInfo);
if(m_State >= WRITING_CAPFRAME)
{
CACHE_THREAD_SERIALISER();
SCOPED_SERIALISE_CONTEXT(BIND_SPARSE_OPAQUE_IM);
Serialise_vkQueueBindSparseImageOpaqueMemory(localSerialiser, queue, image, numBindings, pBindInfo);
m_FrameCaptureRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(GetResID(queue), eFrameRef_Read);
// image isn't marked referenced. If the only ref is a memory bind, we just skip it
}
if(m_State >= WRITING)
GetRecord(image)->sparseInfo->Update(numBindings, pBindInfo);
VkSparseMemoryBindInfo *unwrappedBinds = GetTempArray<VkSparseMemoryBindInfo>(numBindings);
memcpy(unwrappedBinds, pBindInfo, sizeof(VkSparseMemoryBindInfo)*numBindings);
for(uint32_t i=0; i < numBindings; i++) unwrappedBinds[i].mem = Unwrap(unwrappedBinds[i].mem);
return ObjDisp(queue)->QueueBindSparseImageOpaqueMemory(Unwrap(queue), Unwrap(image), numBindings, unwrappedBinds);
}
bool WrappedVulkan::Serialise_vkQueueBindSparseImageMemory(
@@ -704,7 +768,22 @@ bool WrappedVulkan::Serialise_vkQueueBindSparseImageMemory(
uint32_t numBindings,
const VkSparseImageMemoryBindInfo* pBindInfo)
{
// VKTODOHIGH stub function
SERIALISE_ELEMENT(ResourceId, qid, GetResID(queue));
SERIALISE_ELEMENT(ResourceId, imid, GetResID(image));
SERIALISE_ELEMENT(uint32_t, num, numBindings);
SERIALISE_ELEMENT_ARR(VkSparseImageMemoryBindInfo, binds, pBindInfo, num);
if(m_State < WRITING && GetResourceManager()->HasLiveResource(imid))
{
queue = GetResourceManager()->GetLiveHandle<VkQueue>(qid);
image = GetResourceManager()->GetLiveHandle<VkImage>(imid);
ObjDisp(queue)->QueueBindSparseImageMemory(Unwrap(queue), Unwrap(image), num, binds);
}
SAFE_DELETE_ARRAY(binds);
return true;
}
@@ -714,9 +793,26 @@ VkResult WrappedVulkan::vkQueueBindSparseImageMemory(
uint32_t numBindings,
const VkSparseImageMemoryBindInfo* pBindInfo)
{
// VKTODOHIGH stub function
RDCWARN("Sparse memory operations are not yet implemented");
return ObjDisp(queue)->QueueBindSparseImageMemory(Unwrap(queue), Unwrap(image), numBindings, pBindInfo);
if(m_State >= WRITING_CAPFRAME)
{
CACHE_THREAD_SERIALISER();
SCOPED_SERIALISE_CONTEXT(BIND_SPARSE_IM);
Serialise_vkQueueBindSparseImageMemory(localSerialiser, queue, image, numBindings, pBindInfo);
m_FrameCaptureRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(GetResID(queue), eFrameRef_Read);
// image isn't marked referenced. If the only ref is a memory bind, we just skip it
}
if(m_State >= WRITING)
GetRecord(image)->sparseInfo->Update(numBindings, pBindInfo);
VkSparseImageMemoryBindInfo *unwrappedBinds = GetTempArray<VkSparseImageMemoryBindInfo>(numBindings);
memcpy(unwrappedBinds, pBindInfo, sizeof(VkSparseImageMemoryBindInfo)*numBindings);
for(uint32_t i=0; i < numBindings; i++) unwrappedBinds[i].mem = Unwrap(unwrappedBinds[i].mem);
return ObjDisp(queue)->QueueBindSparseImageMemory(Unwrap(queue), Unwrap(image), numBindings, unwrappedBinds);
}
bool WrappedVulkan::Serialise_vkCreateBuffer(