[dxvk] Add destination offset/extent to copyDepthStencilImageToPackedBuffer

Needed to support partial copies between buffers and depth-stencil images.
This commit is contained in:
Philip Rebohle 2021-06-23 19:39:11 +02:00
parent ba9d670157
commit a14884c652
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
7 changed files with 42 additions and 24 deletions

View File

@ -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);

View File

@ -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);

View File

@ -953,7 +953,9 @@ namespace dxvk {
void DxvkContext::copyDepthStencilImageToPackedBuffer(
const Rc<DxvkBuffer>& dstBuffer,
VkDeviceSize dstOffset,
VkDeviceSize dstBufferOffset,
VkOffset2D dstOffset,
VkExtent2D dstExtent,
const Rc<DxvkImage>& 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,

View File

@ -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<DxvkBuffer>& dstBuffer,
VkDeviceSize dstOffset,
VkDeviceSize dstBufferOffset,
VkOffset2D dstOffset,
VkExtent2D dstExtent,
const Rc<DxvkImage>& srcImage,
VkImageSubresourceLayers srcSubresource,
VkOffset2D srcOffset,

View File

@ -16,6 +16,8 @@ namespace dxvk {
struct DxvkMetaPackArgs {
VkOffset2D srcOffset;
VkExtent2D srcExtent;
VkOffset2D dstOffset;
VkExtent2D dstExtent;
};

View File

@ -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);
}
}

View File

@ -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;
}
}