diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 4c9cd026..236c411f 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -1249,7 +1249,10 @@ namespace dxvk { VkOffset2D { cDstOffset.x, cDstOffset.y }, VkExtent2D { cDstExtent.width, cDstExtent.height }, cStagingSlice.buffer(), - cStagingSlice.offset(), cPackedFormat); + cStagingSlice.offset(), + VkOffset2D { 0, 0 }, + VkExtent2D { cDstExtent.width, cDstExtent.height }, + cPackedFormat); } }); diff --git a/src/d3d11/d3d11_context_def.cpp b/src/d3d11/d3d11_context_def.cpp index ff2b440f..36f11884 100644 --- a/src/d3d11/d3d11_context_def.cpp +++ b/src/d3d11/d3d11_context_def.cpp @@ -370,7 +370,10 @@ namespace dxvk { VkOffset2D { dstOffset.x, dstOffset.y }, VkExtent2D { dstExtent.width, dstExtent.height }, cStagingSlice.buffer(), - cStagingSlice.offset(), cPackedFormat); + cStagingSlice.offset(), + VkOffset2D { dstOffset.x, dstOffset.y }, + VkExtent2D { dstExtent.width, dstExtent.height }, + cPackedFormat); } }); diff --git a/src/d3d11/d3d11_context_imm.cpp b/src/d3d11/d3d11_context_imm.cpp index 43517c53..5e22c5c8 100644 --- a/src/d3d11/d3d11_context_imm.cpp +++ b/src/d3d11/d3d11_context_imm.cpp @@ -529,7 +529,10 @@ namespace dxvk { cDstImage, cDstLayers, VkOffset2D { 0, 0 }, VkExtent2D { cDstLevelExtent.width, cDstLevelExtent.height }, - cSrcBuffer, 0, cPackedFormat); + cSrcBuffer, 0, + VkOffset2D { 0, 0 }, + VkExtent2D { cDstLevelExtent.width, cDstLevelExtent.height }, + cPackedFormat); } }); } diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 767c06ef..54cbace5 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1239,7 +1239,9 @@ namespace dxvk { VkOffset2D dstOffset, VkExtent2D dstExtent, const Rc& srcBuffer, - VkDeviceSize srcOffset, + VkDeviceSize srcBufferOffset, + VkOffset2D srcOffset, + VkExtent2D srcExtent, VkFormat format) { this->spillRenderPass(true); this->prepareImage(m_execBarriers, dstImage, vk::makeSubresourceRange(dstSubresource)); @@ -1311,15 +1313,17 @@ namespace dxvk { DxvkMetaUnpackDescriptors descriptors; descriptors.dstDepth = tmpBufferViewD->handle(); descriptors.dstStencil = tmpBufferViewS->handle(); - descriptors.srcBuffer = srcBuffer->getDescriptor(srcOffset, VK_WHOLE_SIZE).buffer; + descriptors.srcBuffer = srcBuffer->getDescriptor(srcBufferOffset, VK_WHOLE_SIZE).buffer; VkDescriptorSet dset = allocateDescriptorSet(pipeInfo.dsetLayout); m_cmd->updateDescriptorSetWithTemplate(dset, pipeInfo.dsetTemplate, &descriptors); // Unpack the source buffer to temporary buffers - DxvkMetaUnpackArgs args; + DxvkMetaPackArgs args; + args.srcOffset = srcOffset; + args.srcExtent = srcExtent; + args.dstOffset = VkOffset2D { 0, 0 }; args.dstExtent = dstExtent; - args.srcExtent = dstExtent; m_cmd->cmdBindPipeline( VK_PIPELINE_BIND_POINT_COMPUTE, @@ -2293,7 +2297,8 @@ namespace dxvk { copyPackedBufferToDepthStencilImage( image, subresources, imageOffset, imageExtent, - tmpBuffer, 0, format); + tmpBuffer, 0, VkOffset2D { 0, 0 }, imageExtent, + format); } diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 95880a94..1a57f979 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -487,7 +487,9 @@ namespace dxvk { * \param [in] dstOffset Image area offset * \param [in] dstExtent Image area size * \param [in] srcBuffer Packed data buffer - * \param [in] srcOffset Packed data offset + * \param [in] srcBufferOffset Buffer offset of source image + * \param [in] srcOffset Offset into the source image + * \param [in] srcExtent Total size of the source image * \param [in] format Packed data format */ void copyPackedBufferToDepthStencilImage( @@ -496,7 +498,9 @@ namespace dxvk { VkOffset2D dstOffset, VkExtent2D dstExtent, const Rc& srcBuffer, - VkDeviceSize srcOffset, + VkDeviceSize srcBufferOffset, + VkOffset2D srcOffset, + VkExtent2D srcExtent, VkFormat format); /** diff --git a/src/dxvk/dxvk_meta_pack.cpp b/src/dxvk/dxvk_meta_pack.cpp index f1453776..dbf4999b 100644 --- a/src/dxvk/dxvk_meta_pack.cpp +++ b/src/dxvk/dxvk_meta_pack.cpp @@ -16,7 +16,7 @@ namespace dxvk { m_dsetLayoutPack (createPackDescriptorSetLayout()), m_dsetLayoutUnpack(createUnpackDescriptorSetLayout()), m_pipeLayoutPack (createPipelineLayout(m_dsetLayoutPack, sizeof(DxvkMetaPackArgs))), - m_pipeLayoutUnpack(createPipelineLayout(m_dsetLayoutUnpack, sizeof(DxvkMetaUnpackArgs))), + m_pipeLayoutUnpack(createPipelineLayout(m_dsetLayoutUnpack, sizeof(DxvkMetaPackArgs))), m_templatePack (createPackDescriptorUpdateTemplate()), m_templateUnpack (createUnpackDescriptorUpdateTemplate()), m_pipePackD24S8 (createPipeline(m_pipeLayoutPack, dxvk_pack_d24s8)), diff --git a/src/dxvk/dxvk_meta_pack.h b/src/dxvk/dxvk_meta_pack.h index 8b6c4568..7c69d8c3 100644 --- a/src/dxvk/dxvk_meta_pack.h +++ b/src/dxvk/dxvk_meta_pack.h @@ -21,18 +21,6 @@ namespace dxvk { }; - /** - * \brief Unpacking arguments - * - * Passed in as push constants - * to the compute shader. - */ - struct DxvkMetaUnpackArgs { - VkExtent2D dstExtent; - VkExtent2D srcExtent; - }; - - /** * \brief Packing pipeline * diff --git a/src/dxvk/shaders/dxvk_unpack_d24s8.comp b/src/dxvk/shaders/dxvk_unpack_d24s8.comp index c02714e9..6b7a8557 100644 --- a/src/dxvk/shaders/dxvk_unpack_d24s8.comp +++ b/src/dxvk/shaders/dxvk_unpack_d24s8.comp @@ -15,19 +15,24 @@ readonly buffer s_buffer_t { layout(push_constant) uniform u_info_t { - uvec2 dst_extent; + uvec2 src_offset; uvec2 src_extent; + uvec2 dst_offset; + uvec2 dst_extent; } u_info; void main() { if (all(lessThan(gl_GlobalInvocationID.xy, u_info.dst_extent))) { - uint src_index = gl_GlobalInvocationID.x - + gl_GlobalInvocationID.y * u_info.src_extent.x - + gl_GlobalInvocationID.z * u_info.src_extent.y; + uvec3 src_coord = uvec3( + gl_GlobalInvocationID.xy + u_info.src_offset, + gl_GlobalInvocationID.z); + + uvec3 dst_coord = uvec3( + gl_GlobalInvocationID.xy + u_info.dst_offset, + gl_GlobalInvocationID.z); - uint dst_index = gl_GlobalInvocationID.x - + gl_GlobalInvocationID.y * u_info.dst_extent.x - + gl_GlobalInvocationID.z * u_info.dst_extent.y; + uint src_index = src_coord.x + u_info.src_extent.x * (src_coord.y + u_info.src_extent.y * src_coord.z); + uint dst_index = dst_coord.x + u_info.dst_extent.x * (dst_coord.y + u_info.dst_extent.y * dst_coord.z); uint src_data = s_buffer.data[src_index]; imageStore(u_depth, int(dst_index), uvec4(src_data & 0xFFFFFF)); diff --git a/src/dxvk/shaders/dxvk_unpack_d24s8_as_d32s8.comp b/src/dxvk/shaders/dxvk_unpack_d24s8_as_d32s8.comp index 83aa6f54..4c87fbba 100644 --- a/src/dxvk/shaders/dxvk_unpack_d24s8_as_d32s8.comp +++ b/src/dxvk/shaders/dxvk_unpack_d24s8_as_d32s8.comp @@ -15,20 +15,25 @@ readonly buffer s_buffer_t { layout(push_constant) uniform u_info_t { - uvec2 dst_extent; + uvec2 src_offset; uvec2 src_extent; + uvec2 dst_offset; + uvec2 dst_extent; } u_info; void main() { if (all(lessThan(gl_GlobalInvocationID.xy, u_info.dst_extent))) { - uint src_index = gl_GlobalInvocationID.x - + gl_GlobalInvocationID.y * u_info.src_extent.x - + gl_GlobalInvocationID.z * u_info.src_extent.y; - - uint dst_index = gl_GlobalInvocationID.x - + gl_GlobalInvocationID.y * u_info.dst_extent.x - + gl_GlobalInvocationID.z * u_info.dst_extent.y; + uvec3 src_coord = uvec3( + gl_GlobalInvocationID.xy + u_info.src_offset, + gl_GlobalInvocationID.z); + + uvec3 dst_coord = uvec3( + gl_GlobalInvocationID.xy + u_info.dst_offset, + gl_GlobalInvocationID.z); + uint src_index = src_coord.x + u_info.src_extent.x * (src_coord.y + u_info.src_extent.y * src_coord.z); + uint dst_index = dst_coord.x + u_info.dst_extent.x * (dst_coord.y + u_info.dst_extent.y * dst_coord.z); + uint src_data = s_buffer.data[src_index]; imageStore(u_depth, int(dst_index), vec4(float(src_data & 0xFFFFFF) / float(0xFFFFFF))); imageStore(u_stencil, int(dst_index), uvec4(src_data >> 24)); diff --git a/src/dxvk/shaders/dxvk_unpack_d32s8.comp b/src/dxvk/shaders/dxvk_unpack_d32s8.comp index 6b3054e1..dd114746 100644 --- a/src/dxvk/shaders/dxvk_unpack_d32s8.comp +++ b/src/dxvk/shaders/dxvk_unpack_d32s8.comp @@ -20,19 +20,24 @@ readonly buffer s_buffer_t { layout(push_constant) uniform u_info_t { - uvec2 dst_extent; + uvec2 src_offset; uvec2 src_extent; + uvec2 dst_offset; + uvec2 dst_extent; } u_info; void main() { if (all(lessThan(gl_GlobalInvocationID.xy, u_info.dst_extent))) { - uint src_index = gl_GlobalInvocationID.x - + gl_GlobalInvocationID.y * u_info.src_extent.x - + gl_GlobalInvocationID.z * u_info.src_extent.y; + uvec3 src_coord = uvec3( + gl_GlobalInvocationID.xy + u_info.src_offset, + gl_GlobalInvocationID.z); + + uvec3 dst_coord = uvec3( + gl_GlobalInvocationID.xy + u_info.dst_offset, + gl_GlobalInvocationID.z); - uint dst_index = gl_GlobalInvocationID.x - + gl_GlobalInvocationID.y * u_info.dst_extent.x - + gl_GlobalInvocationID.z * u_info.dst_extent.y; + uint src_index = src_coord.x + u_info.src_extent.x * (src_coord.y + u_info.src_extent.y * src_coord.z); + uint dst_index = dst_coord.x + u_info.dst_extent.x * (dst_coord.y + u_info.dst_extent.y * dst_coord.z); d32s8_t src_data = s_buffer.data[src_index]; imageStore(u_depth, int(dst_index), vec4(src_data.d32));