mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-15 07:29:17 +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);
|
cLevelExtent);
|
||||||
} else {
|
} else {
|
||||||
ctx->copyDepthStencilImageToPackedBuffer(
|
ctx->copyDepthStencilImageToPackedBuffer(
|
||||||
cImageBuffer, 0, cImage, cSubresources,
|
cImageBuffer, 0,
|
||||||
|
VkOffset2D { 0, 0 },
|
||||||
|
VkExtent2D { cLevelExtent.width, cLevelExtent.height },
|
||||||
|
cImage, cSubresources,
|
||||||
VkOffset2D { 0, 0 },
|
VkOffset2D { 0, 0 },
|
||||||
VkExtent2D { cLevelExtent.width, cLevelExtent.height },
|
VkExtent2D { cLevelExtent.width, cLevelExtent.height },
|
||||||
cPackedFormat);
|
cPackedFormat);
|
||||||
|
@ -4171,7 +4171,10 @@ namespace dxvk {
|
|||||||
cLevelExtent);
|
cLevelExtent);
|
||||||
} else {
|
} else {
|
||||||
ctx->copyDepthStencilImageToPackedBuffer(
|
ctx->copyDepthStencilImageToPackedBuffer(
|
||||||
cImageBuffer, 0, cImage, cSubresources,
|
cImageBuffer, 0,
|
||||||
|
VkOffset2D { 0, 0 },
|
||||||
|
VkExtent2D { cLevelExtent.width, cLevelExtent.height },
|
||||||
|
cImage, cSubresources,
|
||||||
VkOffset2D { 0, 0 },
|
VkOffset2D { 0, 0 },
|
||||||
VkExtent2D { cLevelExtent.width, cLevelExtent.height },
|
VkExtent2D { cLevelExtent.width, cLevelExtent.height },
|
||||||
cPackedFormat);
|
cPackedFormat);
|
||||||
|
@ -953,7 +953,9 @@ namespace dxvk {
|
|||||||
|
|
||||||
void DxvkContext::copyDepthStencilImageToPackedBuffer(
|
void DxvkContext::copyDepthStencilImageToPackedBuffer(
|
||||||
const Rc<DxvkBuffer>& dstBuffer,
|
const Rc<DxvkBuffer>& dstBuffer,
|
||||||
VkDeviceSize dstOffset,
|
VkDeviceSize dstBufferOffset,
|
||||||
|
VkOffset2D dstOffset,
|
||||||
|
VkExtent2D dstExtent,
|
||||||
const Rc<DxvkImage>& srcImage,
|
const Rc<DxvkImage>& srcImage,
|
||||||
VkImageSubresourceLayers srcSubresource,
|
VkImageSubresourceLayers srcSubresource,
|
||||||
VkOffset2D srcOffset,
|
VkOffset2D srcOffset,
|
||||||
@ -991,7 +993,7 @@ namespace dxvk {
|
|||||||
VkImageLayout layout = srcImage->pickLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL);
|
VkImageLayout layout = srcImage->pickLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL);
|
||||||
|
|
||||||
DxvkMetaPackDescriptors descriptors;
|
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.srcDepth = dView->getDescriptor(VK_IMAGE_VIEW_TYPE_2D_ARRAY, layout).image;
|
||||||
descriptors.srcStencil = sView->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;
|
DxvkMetaPackArgs args;
|
||||||
args.srcOffset = srcOffset;
|
args.srcOffset = srcOffset;
|
||||||
args.srcExtent = srcExtent;
|
args.srcExtent = srcExtent;
|
||||||
|
args.dstOffset = dstOffset;
|
||||||
|
args.dstExtent = dstExtent;
|
||||||
|
|
||||||
m_cmd->cmdBindPipeline(
|
m_cmd->cmdBindPipeline(
|
||||||
VK_PIPELINE_BIND_POINT_COMPUTE,
|
VK_PIPELINE_BIND_POINT_COMPUTE,
|
||||||
|
@ -428,7 +428,9 @@ namespace dxvk {
|
|||||||
* - \c VK_FORMAT_D24_UNORM_S8_UINT: 0xssdddddd
|
* - \c VK_FORMAT_D24_UNORM_S8_UINT: 0xssdddddd
|
||||||
* - \c VK_FORMAT_D32_SFLOAT_S8_UINT: 0xdddddddd 0x000000ss
|
* - \c VK_FORMAT_D32_SFLOAT_S8_UINT: 0xdddddddd 0x000000ss
|
||||||
* \param [in] dstBuffer Destination buffer
|
* \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] srcImage Source image
|
||||||
* \param [in] srcSubresource Source subresource
|
* \param [in] srcSubresource Source subresource
|
||||||
* \param [in] srcOffset Source area offset
|
* \param [in] srcOffset Source area offset
|
||||||
@ -437,7 +439,9 @@ namespace dxvk {
|
|||||||
*/
|
*/
|
||||||
void copyDepthStencilImageToPackedBuffer(
|
void copyDepthStencilImageToPackedBuffer(
|
||||||
const Rc<DxvkBuffer>& dstBuffer,
|
const Rc<DxvkBuffer>& dstBuffer,
|
||||||
VkDeviceSize dstOffset,
|
VkDeviceSize dstBufferOffset,
|
||||||
|
VkOffset2D dstOffset,
|
||||||
|
VkExtent2D dstExtent,
|
||||||
const Rc<DxvkImage>& srcImage,
|
const Rc<DxvkImage>& srcImage,
|
||||||
VkImageSubresourceLayers srcSubresource,
|
VkImageSubresourceLayers srcSubresource,
|
||||||
VkOffset2D srcOffset,
|
VkOffset2D srcOffset,
|
||||||
|
@ -16,6 +16,8 @@ namespace dxvk {
|
|||||||
struct DxvkMetaPackArgs {
|
struct DxvkMetaPackArgs {
|
||||||
VkOffset2D srcOffset;
|
VkOffset2D srcOffset;
|
||||||
VkExtent2D srcExtent;
|
VkExtent2D srcExtent;
|
||||||
|
VkOffset2D dstOffset;
|
||||||
|
VkExtent2D dstExtent;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,24 +17,25 @@ layout(push_constant)
|
|||||||
uniform u_info_t {
|
uniform u_info_t {
|
||||||
uvec2 src_offset;
|
uvec2 src_offset;
|
||||||
uvec2 src_extent;
|
uvec2 src_extent;
|
||||||
|
uvec2 dst_offset;
|
||||||
|
uvec2 dst_extent;
|
||||||
} u_info;
|
} u_info;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
if (all(lessThan(gl_GlobalInvocationID.xy, u_info.src_extent))) {
|
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.xy + u_info.src_offset,
|
||||||
gl_GlobalInvocationID.z);
|
gl_GlobalInvocationID.z);
|
||||||
|
|
||||||
uvec2 dst_pitch = uvec2(u_info.src_extent.x,
|
uvec3 dst_coord = uvec3(
|
||||||
u_info.src_extent.x * u_info.src_extent.y);
|
gl_GlobalInvocationID.xy + u_info.dst_offset,
|
||||||
|
gl_GlobalInvocationID.z);
|
||||||
|
|
||||||
uint dst_offset = gl_GlobalInvocationID.x
|
uint dst_index = dst_coord.x + u_info.dst_extent.x * (dst_coord.y + u_info.dst_extent.y * dst_coord.z);
|
||||||
+ gl_GlobalInvocationID.y * dst_pitch.x
|
|
||||||
+ gl_GlobalInvocationID.z * dst_pitch.y;
|
|
||||||
|
|
||||||
float depth = texelFetch(u_depth, ivec3(src_offset), 0).r;
|
float depth = texelFetch(u_depth, ivec3(src_coord), 0).r;
|
||||||
uint stencil = texelFetch(u_stencil, ivec3(src_offset), 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 {
|
uniform u_info_t {
|
||||||
uvec2 src_offset;
|
uvec2 src_offset;
|
||||||
uvec2 src_extent;
|
uvec2 src_extent;
|
||||||
|
uvec2 dst_offset;
|
||||||
|
uvec2 dst_extent;
|
||||||
} u_info;
|
} u_info;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
if (all(lessThan(gl_GlobalInvocationID.xy, u_info.src_extent))) {
|
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.xy + u_info.src_offset,
|
||||||
gl_GlobalInvocationID.z);
|
gl_GlobalInvocationID.z);
|
||||||
|
|
||||||
uvec2 dst_pitch = uvec2(u_info.src_extent.x,
|
uvec3 dst_coord = uvec3(
|
||||||
u_info.src_extent.x * u_info.src_extent.y);
|
gl_GlobalInvocationID.xy + u_info.dst_offset,
|
||||||
|
gl_GlobalInvocationID.z);
|
||||||
|
|
||||||
uint dst_offset = gl_GlobalInvocationID.x
|
uint dst_index = dst_coord.x + u_info.dst_extent.x * (dst_coord.y + u_info.dst_extent.y * dst_coord.z);
|
||||||
+ gl_GlobalInvocationID.y * dst_pitch.x
|
|
||||||
+ gl_GlobalInvocationID.z * dst_pitch.y;
|
|
||||||
|
|
||||||
s_buffer.data[dst_offset].d32 = texelFetch(u_depth, ivec3(src_offset), 0).r;
|
s_buffer.data[dst_index].d32 = texelFetch(u_depth, ivec3(src_coord), 0).r;
|
||||||
s_buffer.data[dst_offset].s8 = texelFetch(u_stencil, ivec3(src_offset), 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