mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 04:29:15 +01:00
[dxvk] Add destination offset/extent to copyDepthStencilImageToPackedBuffer
Needed to support partial copies between buffers and depth-stencil images.
This commit is contained in:
parent
ba9d670157
commit
a14884c652
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -16,6 +16,8 @@ namespace dxvk {
|
||||
struct DxvkMetaPackArgs {
|
||||
VkOffset2D srcOffset;
|
||||
VkExtent2D srcExtent;
|
||||
VkOffset2D dstOffset;
|
||||
VkExtent2D dstExtent;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user