Implement vkCmdUpdateBuffer wrapping

This commit is contained in:
baldurk committed 2016-02-07 18:42:36 +01:00
1 parent 40bb7ce0d9
commit fe99dcdbe7
5 files changed
+84

No files matched your search

+1
View File
@@ -219,6 +219,7 @@ enum VulkanChunkType
COPY_IMG,
BLIT_IMG,
RESOLVE_IMG,
UPDATE_BUF,
CLEAR_COLOR,
CLEAR_DEPTHSTENCIL,
CLEAR_COLOR_ATTACH,
+4
View File
@@ -120,6 +120,7 @@ const char *VkChunkNames[] =
"vkCmdCopyImage",
"vkCmdBlitImage",
"vkCmdResolveImage",
"vkCmdUpdateBuffer",
"vkCmdClearColorImage",
"vkCmdClearDepthStencilImage",
"vkCmdClearColorAttachment",
@@ -1110,6 +1111,9 @@ void WrappedVulkan::ProcessChunk(uint64_t offset, VulkanChunkType context)
case COPY_BUF:
Serialise_vkCmdCopyBuffer(GetMainSerialiser(), VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, 0, NULL);
break;
case UPDATE_BUF:
Serialise_vkCmdUpdateBuffer(GetMainSerialiser(), VK_NULL_HANDLE, VK_NULL_HANDLE, 0, 0, NULL);
break;
case CLEAR_COLOR:
Serialise_vkCmdClearColorImage(GetMainSerialiser(), VK_NULL_HANDLE, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, NULL, 0, NULL);
break;
+7
View File
@@ -1062,6 +1062,13 @@ public:
uint32_t regionCount,
const VkBufferImageCopy* pRegions);
IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdUpdateBuffer,
VkCmdBuffer cmdBuffer,
VkBuffer destBuffer,
VkDeviceSize destOffset,
VkDeviceSize dataSize,
const uint32_t* pData);
IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdClearColorImage,
VkCmdBuffer cmdBuffer,
VkImage image,
@@ -132,6 +132,7 @@
HookInit(CmdCopyImage); \
HookInit(CmdBlitImage); \
HookInit(CmdResolveImage); \
HookInit(CmdUpdateBuffer); \
HookInit(CmdClearColorImage); \
HookInit(CmdClearDepthStencilImage); \
HookInit(CmdClearColorAttachment); \
@@ -258,6 +259,7 @@
HookDefine7(void, vkCmdCopyImage, VkCmdBuffer, cmdBuffer, VkImage, srcImage, VkImageLayout, srcImageLayout, VkImage, destImage, VkImageLayout, destImageLayout, uint32_t, regionCount, const VkImageCopy*, pRegions); \
HookDefine8(void, vkCmdBlitImage, VkCmdBuffer, cmdBuffer, VkImage, srcImage, VkImageLayout, srcImageLayout, VkImage, destImage, VkImageLayout, destImageLayout, uint32_t, regionCount, const VkImageBlit*, pRegions, VkTexFilter, filter); \
HookDefine7(void, vkCmdResolveImage, VkCmdBuffer, cmdBuffer, VkImage, srcImage, VkImageLayout, srcImageLayout, VkImage, destImage, VkImageLayout, destImageLayout, uint32_t, regionCount, const VkImageResolve*, pRegions); \
HookDefine5(void, vkCmdUpdateBuffer, VkCmdBuffer, cmdBuffer, VkBuffer, destBuffer, VkDeviceSize, destOffset, VkDeviceSize, dataSize, const uint32_t*, pData); \
HookDefine6(void, vkCmdClearColorImage, VkCmdBuffer, cmdBuffer, VkImage, image, VkImageLayout, imageLayout, const VkClearColorValue*, pColor, uint32_t, rangeCount, const VkImageSubresourceRange*, pRanges); \
HookDefine7(void, vkCmdClearDepthStencilImage, VkCmdBuffer, cmdBuffer, VkImage, image, VkImageLayout, imageLayout, float, depth, uint32_t, stencil, uint32_t, rangeCount, const VkImageSubresourceRange*, pRanges); \
HookDefine6(void, vkCmdClearColorAttachment, VkCmdBuffer, cmdBuffer, uint32_t, colorAttachment, VkImageLayout, imageLayout, const VkClearColorValue*, pColor, uint32_t, rectCount, const VkRect3D*, pRects); \
@@ -1213,6 +1213,76 @@ void WrappedVulkan::vkCmdBindIndexBuffer(
}
}
bool WrappedVulkan::Serialise_vkCmdUpdateBuffer(
Serialiser* localSerialiser,
VkCmdBuffer cmdBuffer,
VkBuffer destBuffer,
VkDeviceSize destOffset,
VkDeviceSize dataSize,
const uint32_t* pData)
{
SERIALISE_ELEMENT(ResourceId, cmdid, GetResID(cmdBuffer));
SERIALISE_ELEMENT(ResourceId, bufid, GetResID(destBuffer));
SERIALISE_ELEMENT(VkDeviceSize, offs, destOffset);
SERIALISE_ELEMENT(VkDeviceSize, sz, dataSize);
SERIALISE_ELEMENT_BUF(byte *, bufdata, (byte *)pData, (size_t)dataSize);
if(m_State < WRITING)
m_LastCmdBufferID = cmdid;
if(m_State == EXECUTING)
{
destBuffer = GetResourceManager()->GetLiveHandle<VkBuffer>(bufid);
if(IsPartialCmd(cmdid) && InPartialRange())
{
cmdBuffer = PartialCmdBuf();
ObjDisp(cmdBuffer)->CmdUpdateBuffer(Unwrap(cmdBuffer), Unwrap(destBuffer), offs, sz, (uint32_t *)bufdata);
}
}
else if(m_State == READING)
{
cmdBuffer = GetResourceManager()->GetLiveHandle<VkCmdBuffer>(cmdid);
destBuffer = GetResourceManager()->GetLiveHandle<VkBuffer>(bufid);
ObjDisp(cmdBuffer)->CmdUpdateBuffer(Unwrap(cmdBuffer), Unwrap(destBuffer), offs, sz, (uint32_t *)bufdata);
}
SAFE_DELETE_ARRAY(bufdata);
return true;
}
void WrappedVulkan::vkCmdUpdateBuffer(
VkCmdBuffer cmdBuffer,
VkBuffer destBuffer,
VkDeviceSize destOffset,
VkDeviceSize dataSize,
const uint32_t* pData)
{
ObjDisp(cmdBuffer)->CmdUpdateBuffer(Unwrap(cmdBuffer), Unwrap(destBuffer), destOffset, dataSize, pData);
if(m_State >= WRITING)
{
VkResourceRecord *record = GetRecord(cmdBuffer);
CACHE_THREAD_SERIALISER();
SCOPED_SERIALISE_CONTEXT(UPDATE_BUF);
Serialise_vkCmdUpdateBuffer(localSerialiser, cmdBuffer, destBuffer, destOffset, dataSize, pData);
record->AddChunk(scope.Get());
record->MarkResourceFrameReferenced(GetResID(destBuffer), eFrameRef_Write);
// Don't dirty the buffer, just the memory behind it.
{
VkResourceRecord *buf = GetRecord(destBuffer);
if(buf->GetMemoryRecord())
record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID());
}
}
}
bool WrappedVulkan::Serialise_vkCmdPipelineBarrier(
Serialiser* localSerialiser,
VkCmdBuffer cmdBuffer,