diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index d540eb283..54f15a6a3 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1688,7 +1688,9 @@ namespace dxvk { passInfo.renderArea = scissor; // Set up push constants - DxvkMetaBlitPushConstants pushConstants; + DxvkMetaBlitPushConstants pushConstants = { }; + pushConstants.srcCoord0 = { 0.0f, 0.0f, 0.0f }; + pushConstants.srcCoord1 = { 1.0f, 1.0f, 1.0f }; pushConstants.layerCount = passExtent.depth; m_cmd->cmdBeginRenderPass(&passInfo, VK_SUBPASS_CONTENTS_INLINE); diff --git a/src/dxvk/dxvk_meta_blit.h b/src/dxvk/dxvk_meta_blit.h index 3782a02cc..405072681 100644 --- a/src/dxvk/dxvk_meta_blit.h +++ b/src/dxvk/dxvk_meta_blit.h @@ -9,12 +9,22 @@ #include "dxvk_image.h" namespace dxvk { + + /** + * \brief Texture coordinates + */ + struct DxvkMetaBlitOffset { + float x, y, z; + }; /** * \brief Push constant data */ struct DxvkMetaBlitPushConstants { - uint32_t layerCount; + DxvkMetaBlitOffset srcCoord0; + uint32_t pad1; + DxvkMetaBlitOffset srcCoord1; + uint32_t layerCount; }; /** diff --git a/src/dxvk/shaders/dxvk_blit_frag_1d.frag b/src/dxvk/shaders/dxvk_blit_frag_1d.frag index 2f4901c48..2311c57c5 100644 --- a/src/dxvk/shaders/dxvk_blit_frag_1d.frag +++ b/src/dxvk/shaders/dxvk_blit_frag_1d.frag @@ -6,6 +6,14 @@ uniform sampler1DArray s_texture; layout(location = 0) in vec2 i_pos; layout(location = 0) out vec4 o_color; +layout(push_constant) +uniform push_block { + vec3 p_src_coord0; + vec3 p_src_coord1; + uint p_layer_count; +}; + void main() { - o_color = texture(s_texture, vec2(i_pos.x, gl_Layer)); + float coord = mix(p_src_coord0.x, p_src_coord1.x, i_pos.x); + o_color = texture(s_texture, vec2(coord, gl_Layer)); } \ No newline at end of file diff --git a/src/dxvk/shaders/dxvk_blit_frag_2d.frag b/src/dxvk/shaders/dxvk_blit_frag_2d.frag index c6885ed70..b177c5ee3 100644 --- a/src/dxvk/shaders/dxvk_blit_frag_2d.frag +++ b/src/dxvk/shaders/dxvk_blit_frag_2d.frag @@ -6,6 +6,14 @@ uniform sampler2DArray s_texture; layout(location = 0) in vec2 i_pos; layout(location = 0) out vec4 o_color; +layout(push_constant) +uniform push_block { + vec3 p_src_coord0; + vec3 p_src_coord1; + uint p_layer_count; +}; + void main() { - o_color = texture(s_texture, vec3(i_pos, gl_Layer)); + vec2 coord = mix(p_src_coord0.xy, p_src_coord1.xy, i_pos); + o_color = texture(s_texture, vec3(coord, gl_Layer)); } \ No newline at end of file diff --git a/src/dxvk/shaders/dxvk_blit_frag_3d.frag b/src/dxvk/shaders/dxvk_blit_frag_3d.frag index 12ceef34c..856855c62 100644 --- a/src/dxvk/shaders/dxvk_blit_frag_3d.frag +++ b/src/dxvk/shaders/dxvk_blit_frag_3d.frag @@ -8,10 +8,13 @@ layout(location = 0) out vec4 o_color; layout(push_constant) uniform push_block { + vec3 p_src_coord0; + vec3 p_src_coord1; uint p_layer_count; }; void main() { - o_color = texture(s_texture, vec3(i_pos, - (float(gl_Layer) + 0.5f) / float(p_layer_count))); + vec3 coord = mix(p_src_coord0, p_src_coord1, + vec3(i_pos, (float(gl_Layer) + 0.5f) / float(p_layer_count))); + o_color = texture(s_texture, coord); } \ No newline at end of file