/** ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** * Copyright 2022 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ #include "edram.xesli" #include "host_depth_store.xesli" xesl_entry xesl_writeTypedStorageBuffer(xesl_uint4, xe_host_depth_store_dest, set=0, binding=0, u0, space0) xesl_entry_binding_next xesl_texture(xesl_texture2DMS, xe_host_depth_store_source, set=1, binding=0, t0, space0) xesl_entry_bindings_end_local_size(8, 8, 1) xesl_input_global_invocation_id xesl_entry_signature_end // 1 thread = 8 samples (4x0.5 pixels, resolve granularity is 8 pixels). // Group height can't cross resolve granularity, Y overflow check not needed. xesl_dont_flatten if ((xesl_GlobalInvocationID.x >> 1u) >= XeHostDepthStoreScaledWidthDiv8()) { return; } xesl_int2 pixel_index = xesl_int2(XeHostDepthStoreScaledOrigin() + xesl_uint2(xesl_GlobalInvocationID.x << 2u, xesl_GlobalInvocationID.y >> 1u)); // For simplicity, passing samples directly, not pixels, to XeEdramOffsetInts. uint edram_address_int4s = XeEdramOffsetInts( (xesl_uint2(pixel_index) << 1u) | (xesl_GlobalInvocationID.xy & 1u), 0u, XeHostDepthStorePitchTiles(), kXenosMsaaSamples_1X, false, 0u, 0u, XeHostDepthStoreResolutionScale()) >> 2u; // Render target horizontal sample in bit 0, vertical sample in bit 1. int source_sample_left = int((xesl_GlobalInvocationID.y & 1u) << 1u); int source_sample_right = source_sample_left + 1; xesl_writeTypedStorageBufferStore( xe_host_depth_store_dest, edram_address_int4s, xesl_floatBitsToUint(xesl_float4( xesl_texelFetch2DMS(xe_host_depth_store_source, pixel_index, source_sample_left).r, xesl_texelFetch2DMS(xe_host_depth_store_source, pixel_index, source_sample_right).r, xesl_texelFetch2DMS(xe_host_depth_store_source, pixel_index + xesl_int2(1, 0), source_sample_left).r, xesl_texelFetch2DMS(xe_host_depth_store_source, pixel_index + xesl_int2(1, 0), source_sample_right).r))); xesl_writeTypedStorageBufferStore( xe_host_depth_store_dest, edram_address_int4s + 1u, xesl_floatBitsToUint(xesl_float4( xesl_texelFetch2DMS(xe_host_depth_store_source, pixel_index + xesl_int2(2, 0), source_sample_left).r, xesl_texelFetch2DMS(xe_host_depth_store_source, pixel_index + xesl_int2(2, 0), source_sample_right).r, xesl_texelFetch2DMS(xe_host_depth_store_source, pixel_index + xesl_int2(3, 0), source_sample_left).r, xesl_texelFetch2DMS(xe_host_depth_store_source, pixel_index + xesl_int2(3, 0), source_sample_right).r))); xesl_entry_end