From a14884c6526fdb6fdda0cb55a31fe05c15fef907 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 23 Jun 2021 19:39:11 +0200 Subject: [PATCH] [dxvk] Add destination offset/extent to copyDepthStencilImageToPackedBuffer Needed to support partial copies between buffers and depth-stencil images. --- src/d3d11/d3d11_context.cpp | 5 ++++- src/d3d9/d3d9_device.cpp | 5 ++++- src/dxvk/dxvk_context.cpp | 8 ++++++-- src/dxvk/dxvk_context.h | 8 ++++++-- src/dxvk/dxvk_meta_pack.h | 2 ++ src/dxvk/shaders/dxvk_pack_d24s8.comp | 19 ++++++++++--------- src/dxvk/shaders/dxvk_pack_d32s8.comp | 19 ++++++++++--------- 7 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 77a855db..4c9cd026 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -4057,7 +4057,10 @@ namespace dxvk { cLevelExtent); } else { ctx->copyDepthStencilImageToPackedBuffer( - cImageBuffer, 0, cImage, cSubresources, + cImageBuffer, 0, + VkOffset2D { 0, 0 }, + VkExtent2D { cLevelExtent.width, cLevelExtent.height }, + cImage, cSubresources, VkOffset2D { 0, 0 }, VkExtent2D { cLevelExtent.width, cLevelExtent.height }, cPackedFormat); diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index 72da14b0..fab39fe0 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -4171,7 +4171,10 @@ namespace dxvk { cLevelExtent); } else { ctx->copyDepthStencilImageToPackedBuffer( - cImageBuffer, 0, cImage, cSubresources, + cImageBuffer, 0, + VkOffset2D { 0, 0 }, + VkExtent2D { cLevelExtent.width, cLevelExtent.height }, + cImage, cSubresources, VkOffset2D { 0, 0 }, VkExtent2D { cLevelExtent.width, cLevelExtent.height }, cPackedFormat); diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index b59bfe3c..767c06ef 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -953,7 +953,9 @@ namespace dxvk { void DxvkContext::copyDepthStencilImageToPackedBuffer( const Rc& dstBuffer, - VkDeviceSize dstOffset, + VkDeviceSize dstBufferOffset, + VkOffset2D dstOffset, + VkExtent2D dstExtent, const Rc& srcImage, VkImageSubresourceLayers srcSubresource, VkOffset2D srcOffset, @@ -991,7 +993,7 @@ namespace dxvk { VkImageLayout layout = srcImage->pickLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL); DxvkMetaPackDescriptors descriptors; - descriptors.dstBuffer = dstBuffer->getDescriptor(dstOffset, VK_WHOLE_SIZE).buffer; + descriptors.dstBuffer = dstBuffer->getDescriptor(dstBufferOffset, VK_WHOLE_SIZE).buffer; descriptors.srcDepth = dView->getDescriptor(VK_IMAGE_VIEW_TYPE_2D_ARRAY, layout).image; descriptors.srcStencil = sView->getDescriptor(VK_IMAGE_VIEW_TYPE_2D_ARRAY, layout).image; @@ -1021,6 +1023,8 @@ namespace dxvk { DxvkMetaPackArgs args; args.srcOffset = srcOffset; args.srcExtent = srcExtent; + args.dstOffset = dstOffset; + args.dstExtent = dstExtent; m_cmd->cmdBindPipeline( VK_PIPELINE_BIND_POINT_COMPUTE, diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index f17e7dcf..95880a94 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -428,7 +428,9 @@ namespace dxvk { * - \c VK_FORMAT_D24_UNORM_S8_UINT: 0xssdddddd * - \c VK_FORMAT_D32_SFLOAT_S8_UINT: 0xdddddddd 0x000000ss * \param [in] dstBuffer Destination buffer - * \param [in] dstOffset Destination offset, in bytes + * \param [in] dstBufferOffset Destination offset, in bytes + * \param [in] dstOffset Destination image offset + * \param [in] dstSize Destination image size * \param [in] srcImage Source image * \param [in] srcSubresource Source subresource * \param [in] srcOffset Source area offset @@ -437,7 +439,9 @@ namespace dxvk { */ void copyDepthStencilImageToPackedBuffer( const Rc& dstBuffer, - VkDeviceSize dstOffset, + VkDeviceSize dstBufferOffset, + VkOffset2D dstOffset, + VkExtent2D dstExtent, const Rc& srcImage, VkImageSubresourceLayers srcSubresource, VkOffset2D srcOffset, diff --git a/src/dxvk/dxvk_meta_pack.h b/src/dxvk/dxvk_meta_pack.h index ff8963ce..8b6c4568 100644 --- a/src/dxvk/dxvk_meta_pack.h +++ b/src/dxvk/dxvk_meta_pack.h @@ -16,6 +16,8 @@ namespace dxvk { struct DxvkMetaPackArgs { VkOffset2D srcOffset; VkExtent2D srcExtent; + VkOffset2D dstOffset; + VkExtent2D dstExtent; }; diff --git a/src/dxvk/shaders/dxvk_pack_d24s8.comp b/src/dxvk/shaders/dxvk_pack_d24s8.comp index 8c54272d..c32fae58 100644 --- a/src/dxvk/shaders/dxvk_pack_d24s8.comp +++ b/src/dxvk/shaders/dxvk_pack_d24s8.comp @@ -17,24 +17,25 @@ layout(push_constant) uniform u_info_t { uvec2 src_offset; uvec2 src_extent; + uvec2 dst_offset; + uvec2 dst_extent; } u_info; void main() { if (all(lessThan(gl_GlobalInvocationID.xy, u_info.src_extent))) { - uvec3 src_offset = uvec3( + uvec3 src_coord = uvec3( gl_GlobalInvocationID.xy + u_info.src_offset, gl_GlobalInvocationID.z); - uvec2 dst_pitch = uvec2(u_info.src_extent.x, - u_info.src_extent.x * u_info.src_extent.y); + uvec3 dst_coord = uvec3( + gl_GlobalInvocationID.xy + u_info.dst_offset, + gl_GlobalInvocationID.z); - uint dst_offset = gl_GlobalInvocationID.x - + gl_GlobalInvocationID.y * dst_pitch.x - + gl_GlobalInvocationID.z * dst_pitch.y; + uint dst_index = dst_coord.x + u_info.dst_extent.x * (dst_coord.y + u_info.dst_extent.y * dst_coord.z); - float depth = texelFetch(u_depth, ivec3(src_offset), 0).r; - uint stencil = texelFetch(u_stencil, ivec3(src_offset), 0).r; + float depth = texelFetch(u_depth, ivec3(src_coord), 0).r; + uint stencil = texelFetch(u_stencil, ivec3(src_coord), 0).r; - s_buffer.data[dst_offset] = uint(mix(0.0f, float((1 << 24) - 1), depth)) | (stencil << 24); + s_buffer.data[dst_index] = uint(mix(0.0f, float((1 << 24) - 1), depth)) | (stencil << 24); } } \ No newline at end of file diff --git a/src/dxvk/shaders/dxvk_pack_d32s8.comp b/src/dxvk/shaders/dxvk_pack_d32s8.comp index 311af7d0..a0332f02 100644 --- a/src/dxvk/shaders/dxvk_pack_d32s8.comp +++ b/src/dxvk/shaders/dxvk_pack_d32s8.comp @@ -22,22 +22,23 @@ layout(push_constant) uniform u_info_t { uvec2 src_offset; uvec2 src_extent; + uvec2 dst_offset; + uvec2 dst_extent; } u_info; void main() { if (all(lessThan(gl_GlobalInvocationID.xy, u_info.src_extent))) { - uvec3 src_offset = uvec3( + uvec3 src_coord = uvec3( gl_GlobalInvocationID.xy + u_info.src_offset, gl_GlobalInvocationID.z); - uvec2 dst_pitch = uvec2(u_info.src_extent.x, - u_info.src_extent.x * u_info.src_extent.y); - - uint dst_offset = gl_GlobalInvocationID.x - + gl_GlobalInvocationID.y * dst_pitch.x - + gl_GlobalInvocationID.z * dst_pitch.y; + uvec3 dst_coord = uvec3( + gl_GlobalInvocationID.xy + u_info.dst_offset, + gl_GlobalInvocationID.z); - s_buffer.data[dst_offset].d32 = texelFetch(u_depth, ivec3(src_offset), 0).r; - s_buffer.data[dst_offset].s8 = texelFetch(u_stencil, ivec3(src_offset), 0).r; + uint dst_index = dst_coord.x + u_info.dst_extent.x * (dst_coord.y + u_info.dst_extent.y * dst_coord.z); + + s_buffer.data[dst_index].d32 = texelFetch(u_depth, ivec3(src_coord), 0).r; + s_buffer.data[dst_index].s8 = texelFetch(u_stencil, ivec3(src_coord), 0).r; } } \ No newline at end of file