diff --git a/src/xenia/gpu/vulkan/vulkan_render_target_cache.cc b/src/xenia/gpu/vulkan/vulkan_render_target_cache.cc index ecd4b7fd1..fc9a7bb79 100644 --- a/src/xenia/gpu/vulkan/vulkan_render_target_cache.cc +++ b/src/xenia/gpu/vulkan/vulkan_render_target_cache.cc @@ -3174,9 +3174,9 @@ VkShaderModule VulkanRenderTargetCache::GetTransferShader( source_stencil[0] != spv::NoResult) { // For the depth -> depth case, write the stencil directly to the output. assert_true(mode.output == TransferOutput::kDepth); - builder.createStore(builder.createUnaryOp(spv::OpBitcast, type_int, - source_stencil[0]), - output_fragment_stencil_ref); + builder.createStore( + builder.createUnaryOp(spv::OpBitcast, type_int, source_stencil[0]), + output_fragment_stencil_ref); } if (dest_is_64bpp) { @@ -4335,6 +4335,17 @@ VkShaderModule VulkanRenderTargetCache::GetTransferShader( builder.createOp(spv::OpPhi, type_float, id_vector_temp); } builder.createStore(fragment_depth32, output_fragment_depth); + // Unpack the stencil into the stencil reference output if needed and + // not already written. + if (!packed_only_depth && + output_fragment_stencil_ref != spv::NoResult) { + builder.createStore( + builder.createUnaryOp( + spv::OpBitcast, type_int, + builder.createBinOp(spv::OpBitwiseAnd, type_uint, packed, + builder.makeUintConstant(UINT8_MAX))), + output_fragment_stencil_ref); + } } } break; case TransferOutput::kStencilBit: {