Implement CmdResolveImage

This commit is contained in:
baldurk committed 2016-02-07 18:41:17 +01:00
1 parent 84415a3f76
commit 9ebb7cec1f
5 files changed
+96 -6

No files matched your search

+1 -1
View File
@@ -215,12 +215,12 @@ enum VulkanChunkType
COPY_BUF,
COPY_IMG,
BLIT_IMG,
RESOLVE_IMG,
CLEAR_COLOR,
CLEAR_DEPTHSTENCIL,
CLEAR_COLOR_ATTACH,
CLEAR_DEPTHSTENCIL_ATTACH,
PIPELINE_BARRIER,
RESOLVE_IMAGE,
WRITE_TIMESTAMP,
DRAW,
DRAW_INDIRECT,
+7 -5
View File
@@ -117,12 +117,12 @@ const char *VkChunkNames[] =
"vkCmdCopyBuffer",
"vkCmdCopyImage",
"vkCmdBlitImage",
"vkCmdResolveImage",
"vkCmdClearColorImage",
"vkCmdClearDepthStencilImage",
"vkCmdClearColorAttachment",
"vkCmdClearDepthStencilAttachment",
"vkCmdPipelineBarrier",
"vkCmdResolveImage",
"vkCmdWriteTimestamp",
"vkCmdDraw",
"vkCmdDrawIndirect",
@@ -1039,6 +1039,12 @@ void WrappedVulkan::ProcessChunk(uint64_t offset, VulkanChunkType context)
case COPY_IMG:
Serialise_vkCmdCopyImage(VK_NULL_HANDLE, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, 0, NULL);
break;
case BLIT_IMG:
Serialise_vkCmdBlitImage(VK_NULL_HANDLE, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, 0, NULL, VK_TEX_FILTER_MAX_ENUM);
break;
case RESOLVE_IMG:
Serialise_vkCmdResolveImage(VK_NULL_HANDLE, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, 0, NULL);
break;
case COPY_BUF:
Serialise_vkCmdCopyBuffer(VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, 0, NULL);
break;
@@ -1057,10 +1063,6 @@ void WrappedVulkan::ProcessChunk(uint64_t offset, VulkanChunkType context)
case PIPELINE_BARRIER:
Serialise_vkCmdPipelineBarrier(VK_NULL_HANDLE, 0, 0, VK_FALSE, 0, NULL);
break;
case RESOLVE_IMAGE:
//VKTODOMED:
//Serialise_vkCmdResolveImage(VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, 0, NULL);
break;
case WRITE_TIMESTAMP:
//VKTODOMED:
//Serialise_vkCmdWriteTimestamp(VK_NULL_HANDLE, VK_TIMESTAMP_TYPE_MAX_ENUM, VK_NULL_HANDLE, 0);
+9
View File
@@ -965,6 +965,15 @@ public:
const VkImageBlit* pRegions,
VkTexFilter filter));
IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdResolveImage(
VkCmdBuffer cmdBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkImage destImage,
VkImageLayout destImageLayout,
uint32_t regionCount,
const VkImageResolve* pRegions));
IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdCopyBufferToImage(
VkCmdBuffer cmdBuffer,
VkBuffer srcBuffer,
@@ -128,6 +128,7 @@
HookInit(CmdCopyBuffer); \
HookInit(CmdCopyImage); \
HookInit(CmdBlitImage); \
HookInit(CmdResolveImage); \
HookInit(CmdClearColorImage); \
HookInit(CmdClearDepthStencilImage); \
HookInit(CmdClearColorAttachment); \
@@ -247,6 +248,7 @@
HookDefine5(void, vkCmdCopyBuffer, VkCmdBuffer, cmdBuffer, VkBuffer, srcBuffer, VkBuffer, destBuffer, uint32_t, regionCount, const VkBufferCopy*, pRegions); \
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); \
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); \
@@ -180,6 +180,83 @@ void WrappedVulkan::vkCmdBlitImage(
}
}
bool WrappedVulkan::Serialise_vkCmdResolveImage(
VkCmdBuffer cmdBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkImage destImage,
VkImageLayout destImageLayout,
uint32_t regionCount,
const VkImageResolve* pRegions)
{
SERIALISE_ELEMENT(ResourceId, cmdid, GetResID(cmdBuffer));
SERIALISE_ELEMENT(ResourceId, srcid, GetResID(srcImage));
SERIALISE_ELEMENT(VkImageLayout, srclayout, srcImageLayout);
SERIALISE_ELEMENT(ResourceId, dstid, GetResID(destImage));
SERIALISE_ELEMENT(VkImageLayout, dstlayout, destImageLayout);
if(m_State < WRITING)
m_LastCmdBufferID = cmdid;
SERIALISE_ELEMENT(uint32_t, count, regionCount);
SERIALISE_ELEMENT_ARR(VkImageResolve, regions, pRegions, count);
if(m_State == EXECUTING)
{
srcImage = GetResourceManager()->GetLiveHandle<VkImage>(srcid);
destImage = GetResourceManager()->GetLiveHandle<VkImage>(dstid);
if(IsPartialCmd(cmdid) && InPartialRange())
{
cmdBuffer = PartialCmdBuf();
ObjDisp(cmdBuffer)->CmdResolveImage(Unwrap(cmdBuffer), Unwrap(srcImage), srclayout, Unwrap(destImage), dstlayout, count, regions);
}
}
else if(m_State == READING)
{
cmdBuffer = GetResourceManager()->GetLiveHandle<VkCmdBuffer>(cmdid);
srcImage = GetResourceManager()->GetLiveHandle<VkImage>(srcid);
destImage = GetResourceManager()->GetLiveHandle<VkImage>(dstid);
ObjDisp(cmdBuffer)->CmdResolveImage(Unwrap(cmdBuffer), Unwrap(srcImage), srclayout, Unwrap(destImage), dstlayout, count, regions);
}
SAFE_DELETE_ARRAY(regions);
return true;
}
void WrappedVulkan::vkCmdResolveImage(
VkCmdBuffer cmdBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkImage destImage,
VkImageLayout destImageLayout,
uint32_t regionCount,
const VkImageResolve* pRegions)
{
ObjDisp(cmdBuffer)->CmdResolveImage(Unwrap(cmdBuffer), Unwrap(srcImage), srcImageLayout, Unwrap(destImage), destImageLayout, regionCount, pRegions);
if(m_State >= WRITING)
{
VkResourceRecord *record = GetRecord(cmdBuffer);
SCOPED_SERIALISE_CONTEXT(RESOLVE_IMG);
Serialise_vkCmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
record->AddChunk(scope.Get());
record->dirtied.insert(GetResID(destImage));
{
VkResourceRecord *im = GetRecord(destImage);
if(im->GetMemoryRecord())
record->dirtied.insert(im->GetMemoryRecord()->GetResourceID());
}
record->MarkResourceFrameReferenced(GetResID(srcImage), eFrameRef_Read);
record->MarkResourceFrameReferenced(GetResID(destImage), eFrameRef_Write);
}
}
bool WrappedVulkan::Serialise_vkCmdCopyImage(
VkCmdBuffer cmdBuffer,
VkImage srcImage,