GPU: app-armed forced small-resolve readback window (Skate 3 photo grab)

This commit is contained in:
mchughalex 2026-07-15 04:19:39 +01:00
parent 9d9504aa02
commit 0585bf885a
8 changed files with 1035 additions and 585 deletions

View file

@ -35,6 +35,7 @@ REXCVAR_DECLARE(bool, scaled_resolve_texture_loads_update_guest_memory);
REXCVAR_DECLARE(int32_t, scaled_resolve_small_texture_readback_max_length); REXCVAR_DECLARE(int32_t, scaled_resolve_small_texture_readback_max_length);
REXCVAR_DECLARE(std::string, readback_resolve); REXCVAR_DECLARE(std::string, readback_resolve);
REXCVAR_DECLARE(bool, readback_resolve_half_pixel_offset); REXCVAR_DECLARE(bool, readback_resolve_half_pixel_offset);
REXCVAR_DECLARE(int32_t, native_render_force_resolve_readback_max_length);
REXCVAR_DECLARE(bool, readback_memexport); REXCVAR_DECLARE(bool, readback_memexport);
REXCVAR_DECLARE(bool, readback_memexport_fast); REXCVAR_DECLARE(bool, readback_memexport_fast);
REXCVAR_DECLARE(bool, occlusion_query_enable); REXCVAR_DECLARE(bool, occlusion_query_enable);

View file

@ -89,6 +89,18 @@ REXCVAR_DEFINE_INT32(scaled_resolve_small_texture_readback_max_length, 0x2D0000,
.range(0, 16 * 1024 * 1024) .range(0, 16 * 1024 * 1024)
.lifecycle(rex::cvar::Lifecycle::kHotReload); .lifecycle(rex::cvar::Lifecycle::kHotReload);
REXCVAR_DEFINE_INT32(native_render_force_resolve_readback_max_length, 0, "GPU",
"When > 0, render-to-texture resolves up to this unscaled byte length are "
"read back synchronously into CPU-visible guest memory even when "
"readback_resolve is disabled and regardless of gameplay state. Intended "
"to be ARMED TEMPORARILY by the app layer around flows where the game "
"reads resolved pixels on the CPU (Skate 3 photo grab: "
"ScreenshotBackEnd::GrabScreenshot JPEG-encodes a 1152x640 PostFX "
"screenshot target from guest memory; without readback the saved photo "
"is black). 0 disables (default).")
.range(0, 16 * 1024 * 1024)
.lifecycle(rex::cvar::Lifecycle::kHotReload);
REXCVAR_DEFINE_BOOL(readback_memexport, false, "GPU", REXCVAR_DEFINE_BOOL(readback_memexport, false, "GPU",
"Enable CPU readback of shader memexport writes for guest memory " "Enable CPU readback of shader memexport writes for guest memory "
"coherency (can reduce correctness issues, but may add GPU/CPU sync cost)") "coherency (can reduce correctness issues, but may add GPU/CPU sync cost)")

View file

@ -3665,7 +3665,12 @@ bool D3D12CommandProcessor::IssueCopy() {
} }
ReadbackResolveMode readback_mode = GetReadbackResolveMode(REXCVAR_GET(d3d12_readback_resolve)); ReadbackResolveMode readback_mode = GetReadbackResolveMode(REXCVAR_GET(d3d12_readback_resolve));
const bool gameplay_state_active = IsGameplayStateActive(kernel_state_); const bool gameplay_state_active = IsGameplayStateActive(kernel_state_);
if (readback_mode == ReadbackResolveMode::kDisabled && // The app layer arms this around CPU screenshot grabs (Skate 3 photo flow);
// resolves within its length bound must take the readback path regardless
// of gameplay/scaling state.
const bool force_readback_window =
REXCVAR_GET(native_render_force_resolve_readback_max_length) > 0;
if (readback_mode == ReadbackResolveMode::kDisabled && !force_readback_window &&
(!texture_cache_->IsDrawResolutionScaled() || gameplay_state_active)) { (!texture_cache_->IsDrawResolutionScaled() || gameplay_state_active)) {
uint32_t written_address, written_length; uint32_t written_address, written_length;
// Time the whole resolve (render target dump, copy and clear) for the GPU // Time the whole resolve (render target dump, copy and clear) for the GPU
@ -3706,7 +3711,17 @@ bool D3D12CommandProcessor::IssueCopy_ReadbackResolvePath() {
!IsGameplayStateActive(kernel_state_) && is_scaled && !IsGameplayStateActive(kernel_state_) && is_scaled &&
written_address == kImportSkaterPreviewResolveAddress && written_address == kImportSkaterPreviewResolveAddress &&
written_length == kImportSkaterPreviewResolveLength; written_length == kImportSkaterPreviewResolveLength;
if (!force_scaled_resolve_cpu_copy) { // App-armed readback window (Skate 3 photo grab): the game CPU-reads the
// resolved 1152x640 PostFX screenshot target (also 0x04911000) while the
// gameplay presence context is still 1 (photo missions), so the targeted
// Import-Skater branch above never fires there. Bounded by length so
// framebuffer-sized resolves stay excluded.
const int32_t force_readback_max_length =
REXCVAR_GET(native_render_force_resolve_readback_max_length);
const bool force_window_cpu_copy =
force_readback_max_length > 0 &&
written_length <= uint32_t(force_readback_max_length);
if (!force_scaled_resolve_cpu_copy && !force_window_cpu_copy) {
return true; return true;
} }
readback_mode = ReadbackResolveMode::kFull; readback_mode = ReadbackResolveMode::kFull;

View file

@ -1,6 +1,30 @@
#if 0 #if 0
// //
// Generated by Microsoft (R) D3D Shader Disassembler // Generated by Microsoft (R) HLSL Shader Compiler 10.1
//
//
// Buffer Definitions:
//
// cbuffer XeResolveDownscaleConstants
// {
//
// uint xe_downscale_scale_x; // Offset: 0 Size: 4
// uint xe_downscale_scale_y; // Offset: 4 Size: 4
// uint xe_downscale_pixel_size_log2; // Offset: 8 Size: 4
// uint xe_downscale_tile_count; // Offset: 12 Size: 4
// uint xe_downscale_half_pixel_offset;// Offset: 16 Size: 4
//
// }
//
//
// Resource Bindings:
//
// Name Type Format Dim ID HLSL Bind Count
// ------------------------------ ---------- ------- ----------- ------- -------------- ------
// xe_resolve_source texture byte r/o T0 t0 1
// xe_resolve_dest UAV byte r/w U0 u0 1
// XeResolveDownscaleConstants cbuffer NA NA CB0 cb0 1
//
// //
// //
// Input signature: // Input signature:
@ -15,7 +39,7 @@
// -------------------- ----- ------ -------- -------- ------- ------ // -------------------- ----- ------ -------- -------- ------- ------
// no Output // no Output
cs_5_1 cs_5_1
dcl_globalFlags refactoringAllowed | allResourcesBound dcl_globalFlags refactoringAllowed
dcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0 dcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0
dcl_resource_raw T0[0:0], space=0 dcl_resource_raw T0[0:0], space=0
dcl_uav_raw U0[0:0], space=0 dcl_uav_raw U0[0:0], space=0
@ -26,53 +50,62 @@ dcl_tgsm_structured g0, 4, 1024
dcl_thread_group 32, 32, 1 dcl_thread_group 32, 32, 1
uge r0.x, vThreadGroupID.x, CB0[0][0].w uge r0.x, vThreadGroupID.x, CB0[0][0].w
if_nz r0.x if_nz r0.x
ret ret
endif endif
imad r0.x, vThreadIDInGroup.y, l(32), vThreadIDInGroup.x imad r0.x, vThreadIDInGroup.y, l(32), vThreadIDInGroup.x
ishl r0.yz, l(0, 1, 1024, 0), CB0[0][0].zzzz ishl r0.yz, l(0, 1, 1024, 0), CB0[0][0].zzzz
imul null, r0.w, CB0[0][0].y, CB0[0][0].x imul null, r0.w, CB0[0][0].y, CB0[0][0].x
ine r1.y, CB0[0][1].x, l(0) ine r1.x, CB0[0][1].x, l(0)
ult r1.z, l(1), r0.w ult r1.y, l(1), r0.w
and r1.y, r1.z, r1.y and r1.x, r1.y, r1.x
if_nz r1.y if_nz r1.x
ushr r1.yz, CB0[0][0].xxyx, l(0, 1, 1, 0) ushr r1.xy, CB0[0][0].xyxx, l(1, 1, 0, 0)
imad r1.y, r1.z, CB0[0][0].x, r1.y else
else mov r1.xy, l(0,0,0,0)
mov r1.y, l(0) endif
endif imul null, r0.y, r0.y, r0.x
imul null, r1.xz, r0.wwyw, r0.zzxz imad r0.y, vThreadGroupID.x, r0.z, r0.y
imul null, r0.w, r0.w, r1.z ushr r0.z, r0.y, l(4)
imad r0.w, vThreadGroupID.x, r1.x, r0.w and r1.z, r0.y, l(15)
imad r0.y, r1.y, r0.y, r0.w ushr r1.z, r1.z, CB0[0][0].z
iadd r1.w, -CB0[0][0].z, l(4)
imad r1.x, CB0[0][0].x, r1.z, r1.x
ushr r1.z, r1.x, r1.w
ishl r0.w, r0.w, l(4)
imad r1.y, r1.z, CB0[0][0].y, r1.y
ishl r1.y, r1.y, l(4)
imad r0.z, r0.z, r0.w, r1.y
bfi r0.w, r1.w, CB0[0][0].z, r1.x, l(0)
iadd r0.z, r0.w, r0.z
ult r0.w, CB0[0][0].z, l(2) ult r0.w, CB0[0][0].z, l(2)
if_nz r0.w if_nz r0.w
if_z CB0[0][0].z if_z CB0[0][0].z
and r0.w, r0.y, l(-4) and r0.w, r0.z, l(-4)
ld_raw r0.w, r0.w, T0[0].xxxx ld_raw r0.w, r0.w, T0[0].xxxx
bfi r1.xw, l(2, 0, 0, 2), l(3, 0, 0, 3), r0.yyyx, l(0, 0, 0, 0) bfi r1.xw, l(2, 0, 0, 2), l(3, 0, 0, 3), r0.zzzx, l(0, 0, 0, 0)
ushr r0.w, r0.w, r1.x ushr r0.w, r0.w, r1.x
ushr r1.x, r0.x, l(2) ushr r1.x, r0.x, l(2)
and r1.z, r0.x, l(3) and r1.z, r0.x, l(3)
bfi r0.w, l(8), r1.w, r0.w, l(0) bfi r0.w, l(8), r1.w, r0.w, l(0)
if_z r1.z if_z r1.z
store_structured g0.x, r1.x, l(0), r0.w store_structured g0.x, r1.x, l(0), r0.w
endif endif
sync_g_t sync_g_t
if_nz r1.z if_nz r1.z
mov r1.y, l(0) mov r1.y, l(0)
atomic_or g0, r1.xyxx, r0.w atomic_or g0, r1.xyxx, r0.w
endif endif
sync_g_t sync_g_t
if_z r1.z if_z r1.z
and r0.w, r0.x, l(1020) and r0.w, r0.x, l(1020)
imad r0.w, vThreadGroupID.x, l(1024), r0.w imad r0.w, vThreadGroupID.x, l(1024), r0.w
ld_structured r1.x, r1.x, l(0), g0.xxxx ld_structured r1.x, r1.x, l(0), g0.xxxx
store_raw U0[0].x, r0.w, r1.x store_raw U0[0].x, r0.w, r1.x
endif endif
else else
and r0.w, r0.y, l(-4) and r0.w, r0.z, l(-4)
ld_raw r0.w, r0.w, T0[0].xxxx ld_raw r0.w, r0.w, T0[0].xxxx
ishl r1.x, r0.y, l(3) ishl r1.x, r0.z, l(3)
and r1.x, r1.x, l(16) and r1.x, r1.x, l(16)
ushr r0.w, r0.w, r1.x ushr r0.w, r0.w, r1.x
ushr r1.x, r0.x, l(1) ushr r1.x, r0.x, l(1)
@ -81,147 +114,596 @@ if_nz r0.w
bfi r0.x, l(16), r0.x, r0.w, l(0) bfi r0.x, l(16), r0.x, r0.w, l(0)
if_z r1.z if_z r1.z
store_structured g0.x, r1.x, l(0), r0.x store_structured g0.x, r1.x, l(0), r0.x
endif endif
sync_g_t sync_g_t
if_nz r1.z if_nz r1.z
mov r1.y, l(0) mov r1.y, l(0)
atomic_or g0, r1.xyxx, r0.x atomic_or g0, r1.xyxx, r0.x
endif endif
sync_g_t sync_g_t
if_z r1.z if_z r1.z
ishl r0.x, r1.x, l(2) ishl r0.x, r1.x, l(2)
imad r0.x, vThreadGroupID.x, l(2048), r0.x imad r0.x, vThreadGroupID.x, l(2048), r0.x
ld_structured r0.w, r1.x, l(0), g0.xxxx ld_structured r0.w, r1.x, l(0), g0.xxxx
store_raw U0[0].x, r0.x, r0.w store_raw U0[0].x, r0.x, r0.w
endif endif
endif endif
else else
imad r0.z, vThreadGroupID.x, r0.z, r1.z
ieq r0.x, CB0[0][0].z, l(2) ieq r0.x, CB0[0][0].z, l(2)
if_nz r0.x if_nz r0.x
ld_raw r0.x, r0.y, T0[0].xxxx ld_raw r0.x, r0.z, T0[0].xxxx
store_raw U0[0].x, r0.z, r0.x store_raw U0[0].x, r0.y, r0.x
else else
ieq r0.x, CB0[0][0].z, l(3) ieq r0.x, CB0[0][0].z, l(3)
if_nz r0.x if_nz r0.x
ld_raw r0.xy, r0.y, T0[0].xyxx ld_raw r0.xz, r0.z, T0[0].xxyx
store_raw U0[0].xy, r0.z, r0.xyxx store_raw U0[0].xy, r0.y, r0.xzxx
endif endif
endif endif
endif endif
ret ret
// Approximately 0 instruction slots used // Approximately 94 instruction slots used
#endif #endif
const BYTE resolve_downscale_cs[] = { const BYTE resolve_downscale_cs[] =
68, 88, 66, 67, 235, 139, 102, 94, 189, 150, 220, 235, 94, 229, 59, 205, 74, 78, 159, 167, {
1, 0, 0, 0, 164, 8, 0, 0, 3, 0, 0, 0, 44, 0, 0, 0, 60, 0, 0, 0, 68, 88, 66, 67, 138, 22,
76, 0, 0, 0, 73, 83, 71, 78, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 160, 35, 69, 243, 236, 133,
79, 83, 71, 78, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 83, 72, 69, 88, 116, 189, 71, 210, 139, 14,
80, 8, 0, 0, 81, 0, 5, 0, 20, 2, 0, 0, 106, 8, 8, 1, 89, 0, 0, 7, 226, 43, 1, 0, 0, 0,
70, 142, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 24, 13, 0, 0, 5, 0,
0, 0, 0, 0, 161, 0, 0, 6, 70, 126, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 157, 0, 0, 6, 70, 238, 49, 0, 0, 0, 0, 0, 228, 2, 0, 0, 244, 2,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 2, 18, 16, 2, 0, 0, 0, 4, 3, 0, 0,
95, 0, 0, 2, 50, 32, 2, 0, 104, 0, 0, 2, 2, 0, 0, 0, 160, 0, 0, 5, 124, 12, 0, 0, 82, 68,
0, 240, 17, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 155, 0, 0, 4, 69, 70, 168, 2, 0, 0,
32, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 8, 18, 0, 16, 0, 1, 0, 0, 0, 244, 0,
0, 0, 0, 0, 10, 16, 2, 0, 58, 128, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
0, 0, 0, 0, 31, 0, 4, 3, 10, 0, 16, 0, 0, 0, 0, 0, 62, 0, 0, 1, 60, 0, 0, 0, 1, 5,
21, 0, 0, 1, 35, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 26, 32, 2, 0, 83, 67, 0, 133, 0, 0,
1, 64, 0, 0, 32, 0, 0, 0, 10, 32, 2, 0, 41, 0, 0, 12, 98, 0, 16, 0, 125, 2, 0, 0, 19, 19,
0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 0, 68, 37, 60, 0, 0, 0,
0, 0, 0, 0, 166, 138, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 40, 0,
38, 0, 0, 12, 0, 208, 0, 0, 130, 0, 16, 0, 0, 0, 0, 0, 26, 128, 48, 0, 0, 0, 40, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 128, 48, 0, 0, 0, 0, 0, 36, 0, 0, 0, 12, 0,
0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 9, 34, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10, 128, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 64, 0, 0, 180, 0, 0, 0, 7, 0,
0, 0, 0, 0, 79, 0, 0, 7, 66, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 6, 0, 0, 0,
1, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 1, 0, 0, 7, 34, 0, 16, 0, 1, 0, 0, 0, 0, 0,
1, 0, 0, 0, 42, 0, 16, 0, 1, 0, 0, 0, 26, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
31, 0, 4, 3, 26, 0, 16, 0, 1, 0, 0, 0, 85, 0, 0, 12, 98, 0, 16, 0, 1, 0, 0, 0, 0, 0,
1, 0, 0, 0, 6, 129, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2, 64, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0,
35, 0, 0, 11, 34, 0, 16, 0, 1, 0, 0, 0, 42, 0, 16, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0,
10, 128, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 16, 0, 6, 0, 0, 0, 1, 0,
1, 0, 0, 0, 18, 0, 0, 1, 54, 0, 0, 5, 34, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 64, 0, 0, 0, 0, 0, 0, 21, 0, 0, 1, 38, 0, 0, 8, 0, 208, 0, 0, 0, 0, 0, 0, 1, 0,
82, 0, 16, 0, 1, 0, 0, 0, 246, 13, 16, 0, 0, 0, 0, 0, 166, 8, 16, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 38, 0, 0, 8, 0, 208, 0, 0, 130, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58, 0, 16, 0, 0, 0, 0, 0, 42, 0, 16, 0, 1, 0, 0, 0, 35, 0, 0, 8, 0, 0, 214, 0, 0, 0,
130, 0, 16, 0, 0, 0, 0, 0, 10, 16, 2, 0, 10, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58, 0, 16, 0, 0, 0, 0, 0, 35, 0, 0, 9, 34, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
26, 0, 16, 0, 1, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 79, 0, 0, 9, 130, 0, 16, 0, 0, 0, 0, 0, 42, 128, 48, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0,
31, 0, 4, 3, 58, 0, 16, 0, 0, 0, 0, 0, 31, 0, 0, 5, 42, 128, 48, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 7, 130, 0, 16, 0, 120, 101, 95, 114, 101, 115,
0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 252, 255, 255, 255, 111, 108, 118, 101, 95, 115,
165, 0, 0, 8, 130, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 111, 117, 114, 99, 101, 0,
6, 112, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 0, 0, 20, 146, 0, 16, 0, 120, 101, 95, 114, 101, 115,
1, 0, 0, 0, 2, 64, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 108, 118, 101, 95, 100,
2, 0, 0, 0, 2, 64, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 115, 116, 0, 88, 101,
3, 0, 0, 0, 86, 1, 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 82, 101, 115, 111, 108, 118,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 7, 130, 0, 16, 0, 101, 68, 111, 119, 110, 115,
0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 99, 97, 108, 101, 67, 111,
85, 0, 0, 7, 18, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 110, 115, 116, 97, 110, 116,
1, 64, 0, 0, 2, 0, 0, 0, 1, 0, 0, 7, 66, 0, 16, 0, 1, 0, 0, 0, 115, 0, 171, 171, 214, 0,
10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 3, 0, 0, 0, 140, 0, 0, 11, 0, 0, 5, 0, 0, 0,
130, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 8, 0, 0, 0, 58, 0, 16, 0, 12, 1, 0, 0, 32, 0,
1, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
31, 0, 0, 3, 42, 0, 16, 0, 1, 0, 0, 0, 168, 0, 0, 9, 18, 240, 17, 0, 0, 0, 0, 0, 212, 1,
0, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58, 0, 16, 0, 0, 0, 0, 0, 21, 0, 0, 1, 190, 24, 0, 1, 31, 0, 4, 3, 4, 0, 0, 0, 2, 0,
42, 0, 16, 0, 1, 0, 0, 0, 54, 0, 0, 5, 34, 0, 16, 0, 1, 0, 0, 0, 0, 0, 240, 1, 0, 0,
1, 64, 0, 0, 0, 0, 0, 0, 170, 0, 0, 7, 0, 240, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255,
70, 0, 16, 0, 1, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 21, 0, 0, 1, 255, 255, 0, 0, 0, 0,
190, 24, 0, 1, 31, 0, 0, 3, 42, 0, 16, 0, 1, 0, 0, 0, 1, 0, 0, 7, 255, 255, 255, 255, 0, 0,
130, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 20, 2, 0, 0,
252, 3, 0, 0, 35, 0, 0, 8, 130, 0, 16, 0, 0, 0, 0, 0, 10, 16, 2, 0, 4, 0, 0, 0, 4, 0,
1, 64, 0, 0, 0, 4, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 167, 0, 0, 9, 0, 0, 2, 0, 0, 0,
18, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 240, 1, 0, 0, 0, 0,
0, 0, 0, 0, 6, 240, 17, 0, 0, 0, 0, 0, 166, 0, 0, 8, 18, 224, 33, 0, 0, 0, 255, 255, 255, 255,
0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 255, 255,
1, 0, 0, 0, 21, 0, 0, 1, 18, 0, 0, 1, 1, 0, 0, 7, 130, 0, 16, 0, 255, 255, 0, 0, 0, 0,
0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 252, 255, 255, 255, 41, 2, 0, 0, 8, 0,
165, 0, 0, 8, 130, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
6, 112, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 7, 18, 0, 16, 0, 2, 0, 0, 0, 240, 1,
1, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 7, 18, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 255, 255, 255, 255, 0, 0,
1, 64, 0, 0, 16, 0, 0, 0, 85, 0, 0, 7, 130, 0, 16, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255,
58, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 85, 0, 0, 7, 0, 0, 0, 0, 70, 2,
18, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 12, 0, 0, 0,
1, 0, 0, 0, 1, 0, 0, 7, 66, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 4, 0, 0, 0, 2, 0,
0, 0, 0, 0, 1, 64, 0, 0, 1, 0, 0, 0, 140, 0, 0, 11, 18, 0, 16, 0, 0, 0, 240, 1, 0, 0,
0, 0, 0, 0, 1, 64, 0, 0, 1, 0, 0, 0, 1, 64, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 255, 255,
10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 140, 0, 0, 11, 255, 255, 0, 0, 0, 0,
18, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 16, 0, 0, 0, 10, 0, 16, 0, 255, 255, 255, 255, 0, 0,
0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 94, 2, 0, 0,
31, 0, 0, 3, 42, 0, 16, 0, 1, 0, 0, 0, 168, 0, 0, 9, 18, 240, 17, 0, 16, 0, 0, 0, 4, 0,
0, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
10, 0, 16, 0, 0, 0, 0, 0, 21, 0, 0, 1, 190, 24, 0, 1, 31, 0, 4, 3, 240, 1, 0, 0, 0, 0,
42, 0, 16, 0, 1, 0, 0, 0, 54, 0, 0, 5, 34, 0, 16, 0, 1, 0, 0, 0, 0, 0, 255, 255, 255, 255,
1, 64, 0, 0, 0, 0, 0, 0, 170, 0, 0, 7, 0, 240, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255,
70, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 21, 0, 0, 1, 255, 255, 0, 0, 0, 0,
190, 24, 0, 1, 31, 0, 0, 3, 42, 0, 16, 0, 1, 0, 0, 0, 41, 0, 0, 7, 120, 101, 95, 100, 111, 119,
18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 110, 115, 99, 97, 108, 101,
2, 0, 0, 0, 35, 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, 0, 10, 16, 2, 0, 95, 115, 99, 97, 108, 101,
1, 64, 0, 0, 0, 8, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 167, 0, 0, 9, 95, 120, 0, 100, 119, 111,
130, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 114, 100, 0, 171, 0, 0,
0, 0, 0, 0, 6, 240, 17, 0, 0, 0, 0, 0, 166, 0, 0, 8, 18, 224, 33, 0, 19, 0, 1, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 21, 0, 0, 1, 21, 0, 0, 1, 18, 0, 0, 1, 35, 0, 0, 8, 0, 0, 0, 0, 0, 0,
66, 0, 16, 0, 0, 0, 0, 0, 10, 16, 2, 0, 42, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
42, 0, 16, 0, 1, 0, 0, 0, 32, 0, 0, 9, 18, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
42, 128, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 233, 1, 0, 0, 120, 101,
2, 0, 0, 0, 31, 0, 4, 3, 10, 0, 16, 0, 0, 0, 0, 0, 165, 0, 0, 8, 95, 100, 111, 119, 110, 115,
18, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 6, 112, 32, 0, 99, 97, 108, 101, 95, 115,
0, 0, 0, 0, 0, 0, 0, 0, 166, 0, 0, 8, 18, 224, 33, 0, 0, 0, 0, 0, 99, 97, 108, 101, 95, 121,
0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 0, 120, 101, 95, 100, 111,
18, 0, 0, 1, 32, 0, 0, 9, 18, 0, 16, 0, 0, 0, 0, 0, 42, 128, 48, 0, 119, 110, 115, 99, 97, 108,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 3, 0, 0, 0, 101, 95, 112, 105, 120, 101,
31, 0, 4, 3, 10, 0, 16, 0, 0, 0, 0, 0, 165, 0, 0, 8, 50, 0, 16, 0, 108, 95, 115, 105, 122, 101,
0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 70, 112, 32, 0, 0, 0, 0, 0, 95, 108, 111, 103, 50, 0,
0, 0, 0, 0, 166, 0, 0, 8, 50, 224, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 101, 95, 100, 111, 119,
42, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 21, 0, 0, 1, 110, 115, 99, 97, 108, 101,
21, 0, 0, 1, 21, 0, 0, 1, 62, 0, 0, 1}; 95, 116, 105, 108, 101, 95,
99, 111, 117, 110, 116, 0,
120, 101, 95, 100, 111, 119,
110, 115, 99, 97, 108, 101,
95, 104, 97, 108, 102, 95,
112, 105, 120, 101, 108, 95,
111, 102, 102, 115, 101, 116,
0, 77, 105, 99, 114, 111,
115, 111, 102, 116, 32, 40,
82, 41, 32, 72, 76, 83,
76, 32, 83, 104, 97, 100,
101, 114, 32, 67, 111, 109,
112, 105, 108, 101, 114, 32,
49, 48, 46, 49, 0, 171,
171, 171, 73, 83, 71, 78,
8, 0, 0, 0, 0, 0,
0, 0, 8, 0, 0, 0,
79, 83, 71, 78, 8, 0,
0, 0, 0, 0, 0, 0,
8, 0, 0, 0, 83, 72,
69, 88, 112, 9, 0, 0,
81, 0, 5, 0, 92, 2,
0, 0, 106, 8, 0, 1,
89, 0, 0, 7, 70, 142,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 2, 0, 0, 0,
0, 0, 0, 0, 161, 0,
0, 6, 70, 126, 48, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 157, 0,
0, 6, 70, 238, 49, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 95, 0,
0, 2, 18, 16, 2, 0,
95, 0, 0, 2, 50, 32,
2, 0, 104, 0, 0, 2,
2, 0, 0, 0, 160, 0,
0, 5, 0, 240, 17, 0,
0, 0, 0, 0, 4, 0,
0, 0, 0, 4, 0, 0,
155, 0, 0, 4, 32, 0,
0, 0, 32, 0, 0, 0,
1, 0, 0, 0, 80, 0,
0, 8, 18, 0, 16, 0,
0, 0, 0, 0, 10, 16,
2, 0, 58, 128, 48, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
31, 0, 4, 3, 10, 0,
16, 0, 0, 0, 0, 0,
62, 0, 0, 1, 21, 0,
0, 1, 35, 0, 0, 7,
18, 0, 16, 0, 0, 0,
0, 0, 26, 32, 2, 0,
1, 64, 0, 0, 32, 0,
0, 0, 10, 32, 2, 0,
41, 0, 0, 12, 98, 0,
16, 0, 0, 0, 0, 0,
2, 64, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0,
0, 4, 0, 0, 0, 0,
0, 0, 166, 138, 48, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
38, 0, 0, 12, 0, 208,
0, 0, 130, 0, 16, 0,
0, 0, 0, 0, 26, 128,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 10, 128, 48, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
39, 0, 0, 9, 18, 0,
16, 0, 1, 0, 0, 0,
10, 128, 48, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
79, 0, 0, 7, 34, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 1, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 1, 0,
0, 7, 18, 0, 16, 0,
1, 0, 0, 0, 26, 0,
16, 0, 1, 0, 0, 0,
10, 0, 16, 0, 1, 0,
0, 0, 31, 0, 4, 3,
10, 0, 16, 0, 1, 0,
0, 0, 85, 0, 0, 12,
50, 0, 16, 0, 1, 0,
0, 0, 70, 128, 48, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
2, 64, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 18, 0, 0, 1,
54, 0, 0, 8, 50, 0,
16, 0, 1, 0, 0, 0,
2, 64, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 21, 0, 0, 1,
38, 0, 0, 8, 0, 208,
0, 0, 34, 0, 16, 0,
0, 0, 0, 0, 26, 0,
16, 0, 0, 0, 0, 0,
10, 0, 16, 0, 0, 0,
0, 0, 35, 0, 0, 8,
34, 0, 16, 0, 0, 0,
0, 0, 10, 16, 2, 0,
42, 0, 16, 0, 0, 0,
0, 0, 26, 0, 16, 0,
0, 0, 0, 0, 85, 0,
0, 7, 66, 0, 16, 0,
0, 0, 0, 0, 26, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 4, 0,
0, 0, 1, 0, 0, 7,
66, 0, 16, 0, 1, 0,
0, 0, 26, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 15, 0, 0, 0,
85, 0, 0, 9, 66, 0,
16, 0, 1, 0, 0, 0,
42, 0, 16, 0, 1, 0,
0, 0, 42, 128, 48, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
30, 0, 0, 10, 130, 0,
16, 0, 1, 0, 0, 0,
42, 128, 48, 128, 65, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 1, 64, 0, 0,
4, 0, 0, 0, 35, 0,
0, 11, 18, 0, 16, 0,
1, 0, 0, 0, 10, 128,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 42, 0, 16, 0,
1, 0, 0, 0, 10, 0,
16, 0, 1, 0, 0, 0,
85, 0, 0, 7, 66, 0,
16, 0, 1, 0, 0, 0,
10, 0, 16, 0, 1, 0,
0, 0, 58, 0, 16, 0,
1, 0, 0, 0, 41, 0,
0, 7, 130, 0, 16, 0,
0, 0, 0, 0, 58, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 4, 0,
0, 0, 35, 0, 0, 11,
34, 0, 16, 0, 1, 0,
0, 0, 42, 0, 16, 0,
1, 0, 0, 0, 26, 128,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 26, 0, 16, 0,
1, 0, 0, 0, 41, 0,
0, 7, 34, 0, 16, 0,
1, 0, 0, 0, 26, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 4, 0,
0, 0, 35, 0, 0, 9,
66, 0, 16, 0, 0, 0,
0, 0, 42, 0, 16, 0,
0, 0, 0, 0, 58, 0,
16, 0, 0, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 140, 0, 0, 13,
130, 0, 16, 0, 0, 0,
0, 0, 58, 0, 16, 0,
1, 0, 0, 0, 42, 128,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 10, 0, 16, 0,
1, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
30, 0, 0, 7, 66, 0,
16, 0, 0, 0, 0, 0,
58, 0, 16, 0, 0, 0,
0, 0, 42, 0, 16, 0,
0, 0, 0, 0, 79, 0,
0, 9, 130, 0, 16, 0,
0, 0, 0, 0, 42, 128,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 1, 64, 0, 0,
2, 0, 0, 0, 31, 0,
4, 3, 58, 0, 16, 0,
0, 0, 0, 0, 31, 0,
0, 5, 42, 128, 48, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 0, 0, 7, 130, 0,
16, 0, 0, 0, 0, 0,
42, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
252, 255, 255, 255, 165, 0,
0, 8, 130, 0, 16, 0,
0, 0, 0, 0, 58, 0,
16, 0, 0, 0, 0, 0,
6, 112, 32, 0, 0, 0,
0, 0, 0, 0, 0, 0,
140, 0, 0, 20, 146, 0,
16, 0, 1, 0, 0, 0,
2, 64, 0, 0, 2, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2, 0,
0, 0, 2, 64, 0, 0,
3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 166, 2,
16, 0, 0, 0, 0, 0,
2, 64, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 85, 0, 0, 7,
130, 0, 16, 0, 0, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 10, 0,
16, 0, 1, 0, 0, 0,
85, 0, 0, 7, 18, 0,
16, 0, 1, 0, 0, 0,
10, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
2, 0, 0, 0, 1, 0,
0, 7, 66, 0, 16, 0,
1, 0, 0, 0, 10, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 3, 0,
0, 0, 140, 0, 0, 11,
130, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
8, 0, 0, 0, 58, 0,
16, 0, 1, 0, 0, 0,
58, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
0, 0, 0, 0, 31, 0,
0, 3, 42, 0, 16, 0,
1, 0, 0, 0, 168, 0,
0, 9, 18, 240, 17, 0,
0, 0, 0, 0, 10, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 0, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 21, 0,
0, 1, 190, 24, 0, 1,
31, 0, 4, 3, 42, 0,
16, 0, 1, 0, 0, 0,
54, 0, 0, 5, 34, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 0, 0,
0, 0, 170, 0, 0, 7,
0, 240, 17, 0, 0, 0,
0, 0, 70, 0, 16, 0,
1, 0, 0, 0, 58, 0,
16, 0, 0, 0, 0, 0,
21, 0, 0, 1, 190, 24,
0, 1, 31, 0, 0, 3,
42, 0, 16, 0, 1, 0,
0, 0, 1, 0, 0, 7,
130, 0, 16, 0, 0, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 252, 3, 0, 0,
35, 0, 0, 8, 130, 0,
16, 0, 0, 0, 0, 0,
10, 16, 2, 0, 1, 64,
0, 0, 0, 4, 0, 0,
58, 0, 16, 0, 0, 0,
0, 0, 167, 0, 0, 9,
18, 0, 16, 0, 1, 0,
0, 0, 10, 0, 16, 0,
1, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
6, 240, 17, 0, 0, 0,
0, 0, 166, 0, 0, 8,
18, 224, 33, 0, 0, 0,
0, 0, 0, 0, 0, 0,
58, 0, 16, 0, 0, 0,
0, 0, 10, 0, 16, 0,
1, 0, 0, 0, 21, 0,
0, 1, 18, 0, 0, 1,
1, 0, 0, 7, 130, 0,
16, 0, 0, 0, 0, 0,
42, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
252, 255, 255, 255, 165, 0,
0, 8, 130, 0, 16, 0,
0, 0, 0, 0, 58, 0,
16, 0, 0, 0, 0, 0,
6, 112, 32, 0, 0, 0,
0, 0, 0, 0, 0, 0,
41, 0, 0, 7, 18, 0,
16, 0, 1, 0, 0, 0,
42, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
3, 0, 0, 0, 1, 0,
0, 7, 18, 0, 16, 0,
1, 0, 0, 0, 10, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 16, 0,
0, 0, 85, 0, 0, 7,
130, 0, 16, 0, 0, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 10, 0,
16, 0, 1, 0, 0, 0,
85, 0, 0, 7, 18, 0,
16, 0, 1, 0, 0, 0,
10, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
1, 0, 0, 0, 1, 0,
0, 7, 66, 0, 16, 0,
1, 0, 0, 0, 10, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 1, 0,
0, 0, 140, 0, 0, 11,
18, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
1, 0, 0, 0, 1, 64,
0, 0, 4, 0, 0, 0,
10, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
0, 0, 0, 0, 140, 0,
0, 11, 18, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 16, 0, 0, 0,
10, 0, 16, 0, 0, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
31, 0, 0, 3, 42, 0,
16, 0, 1, 0, 0, 0,
168, 0, 0, 9, 18, 240,
17, 0, 0, 0, 0, 0,
10, 0, 16, 0, 1, 0,
0, 0, 1, 64, 0, 0,
0, 0, 0, 0, 10, 0,
16, 0, 0, 0, 0, 0,
21, 0, 0, 1, 190, 24,
0, 1, 31, 0, 4, 3,
42, 0, 16, 0, 1, 0,
0, 0, 54, 0, 0, 5,
34, 0, 16, 0, 1, 0,
0, 0, 1, 64, 0, 0,
0, 0, 0, 0, 170, 0,
0, 7, 0, 240, 17, 0,
0, 0, 0, 0, 70, 0,
16, 0, 1, 0, 0, 0,
10, 0, 16, 0, 0, 0,
0, 0, 21, 0, 0, 1,
190, 24, 0, 1, 31, 0,
0, 3, 42, 0, 16, 0,
1, 0, 0, 0, 41, 0,
0, 7, 18, 0, 16, 0,
0, 0, 0, 0, 10, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 2, 0,
0, 0, 35, 0, 0, 8,
18, 0, 16, 0, 0, 0,
0, 0, 10, 16, 2, 0,
1, 64, 0, 0, 0, 8,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 167, 0,
0, 9, 130, 0, 16, 0,
0, 0, 0, 0, 10, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 0, 0,
0, 0, 6, 240, 17, 0,
0, 0, 0, 0, 166, 0,
0, 8, 18, 224, 33, 0,
0, 0, 0, 0, 0, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 58, 0,
16, 0, 0, 0, 0, 0,
21, 0, 0, 1, 21, 0,
0, 1, 18, 0, 0, 1,
32, 0, 0, 9, 18, 0,
16, 0, 0, 0, 0, 0,
42, 128, 48, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 64,
0, 0, 2, 0, 0, 0,
31, 0, 4, 3, 10, 0,
16, 0, 0, 0, 0, 0,
165, 0, 0, 8, 18, 0,
16, 0, 0, 0, 0, 0,
42, 0, 16, 0, 0, 0,
0, 0, 6, 112, 32, 0,
0, 0, 0, 0, 0, 0,
0, 0, 166, 0, 0, 8,
18, 224, 33, 0, 0, 0,
0, 0, 0, 0, 0, 0,
26, 0, 16, 0, 0, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 18, 0,
0, 1, 32, 0, 0, 9,
18, 0, 16, 0, 0, 0,
0, 0, 42, 128, 48, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 64, 0, 0, 3, 0,
0, 0, 31, 0, 4, 3,
10, 0, 16, 0, 0, 0,
0, 0, 165, 0, 0, 8,
82, 0, 16, 0, 0, 0,
0, 0, 42, 0, 16, 0,
0, 0, 0, 0, 6, 113,
32, 0, 0, 0, 0, 0,
0, 0, 0, 0, 166, 0,
0, 8, 50, 224, 33, 0,
0, 0, 0, 0, 0, 0,
0, 0, 26, 0, 16, 0,
0, 0, 0, 0, 134, 0,
16, 0, 0, 0, 0, 0,
21, 0, 0, 1, 21, 0,
0, 1, 21, 0, 0, 1,
62, 0, 0, 1, 83, 84,
65, 84, 148, 0, 0, 0,
94, 0, 0, 0, 2, 0,
0, 0, 0, 0, 0, 0,
2, 0, 0, 0, 0, 0,
0, 0, 19, 0, 0, 0,
19, 0, 0, 0, 7, 0,
0, 0, 11, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
4, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 3, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 4, 0,
0, 0, 2, 0, 0, 0,
4, 0, 0, 0
};

View file

@ -13,10 +13,38 @@
// Operates on 32x32 tiled data format used by Xbox 360. // Operates on 32x32 tiled data format used by Xbox 360.
// Each thread handles one output pixel (one 32x32 tile = 1024 threads). // Each thread handles one output pixel (one 32x32 tile = 1024 threads).
// //
// By default, picks the top-left pixel of each scale_x * scale_y block. // Scaled resolve buffer layout (established from the resolve write shaders,
// When xe_downscale_half_pixel_offset is set, samples from (scale/2, scale/2) // e.g. resolve_fast_32bpp_1x2xmsaa_scaled, and the scaled texture load
// within each block to compensate for the half-pixel offset becoming a // shaders; they must agree, and both use this):
// full-pixel offset at higher resolutions. //
// scaled_byte_address = guest_unit_byte_address * (scale_x * scale_y)
// + (sub_x * scale_y + sub_y) * 16
// + byte_within_scaled_unit
//
// where a "unit" is a 16-byte span of the guest tiled layout, holding
// W = 16 >> pixel_size_log2 texels that are consecutive along X for
// 16/32/64bpp (a property of the Xbox 360 tiled address function's low
// 4 bits); sub_x selects among the scale_x duplicated 16-byte blocks the
// unit expands to along X of the SCALED image, and sub_y among the scale_y
// duplicated rows. Note the (x-major, y-minor) sub ordering and the 16-BYTE
// duplication granularity: the scaled image texel for guest texel t of a
// unit, at sub-position (ox, oy) within its scale_x * scale_y block, is
//
// q = scale_x * t + ox; sub_x = q / W; texel_in_scaled_unit = q % W.
//
// (The previous version of this shader assumed per-PIXEL contiguous
// duplication with y-major sub ordering, which sampled alternating wrong
// rows/columns and produced a sawtooth weave in every readback, visible in
// e.g. the Skate 3 photo grab.)
//
// For 8bpp the guest 16-byte unit is not purely consecutive along X (it
// spans an extra Y bit), so the X mapping below is approximate for half of
// the bytes there; no current readback consumer uses 8bpp surfaces.
//
// By default, picks the top-left host pixel of each scale_x * scale_y block.
// When xe_downscale_half_pixel_offset is set, samples from
// (scale_x/2, scale_y/2) within each block to compensate for the D3D9-style
// half-pixel offset becoming a multi-pixel offset at higher resolutions.
layout(local_size_x = 32, local_size_y = 32, local_size_z = 1) in; layout(local_size_x = 32, local_size_y = 32, local_size_z = 1) in;
@ -27,10 +55,7 @@ layout(push_constant) uniform ResolveDownscaleConstants {
uint xe_downscale_tile_count; // Number of 32x32 tiles to process uint xe_downscale_tile_count; // Number of 32x32 tiles to process
uint xe_downscale_source_offset_bytes; // Byte offset into source buffer uint xe_downscale_source_offset_bytes; // Byte offset into source buffer
// When non-zero, apply half-pixel offset correction by sampling from // When non-zero, apply half-pixel offset correction by sampling from
// (scale/2, scale/2) within each scaled block instead of (0, 0). // (scale_x/2, scale_y/2) within each scaled block instead of (0, 0).
// This compensates for the D3D9-style half-pixel offset used by Xbox 360
// games, which at Nx resolution scaling shifts rendered content by
// (N/2, N/2) host pixels.
uint xe_downscale_half_pixel_offset; uint xe_downscale_half_pixel_offset;
}; };
@ -62,32 +87,36 @@ void main() {
uint pixel_size = 1u << xe_downscale_pixel_size_log2; uint pixel_size = 1u << xe_downscale_pixel_size_log2;
uint tile_size_1x = 32u * 32u * pixel_size; uint tile_size_1x = 32u * 32u * pixel_size;
uint scale_xy = xe_downscale_scale_x * xe_downscale_scale_y; uint scale_xy = xe_downscale_scale_x * xe_downscale_scale_y;
uint tile_size_scaled = tile_size_1x * scale_xy;
// Compute offset within each scaled block to sample from. // Sub-position within each scale_x * scale_y block to sample from.
// Without half-pixel correction: sample from (0, 0) = linear offset 0. uint offset_x = 0u;
// With half-pixel correction: sample from (scale/2, scale/2) to compensate uint offset_y = 0u;
// for the D3D9-style half-pixel offset shifting content by (N/2, N/2) pixels
// at Nx resolution.
uint block_sample_offset = 0u;
if (xe_downscale_half_pixel_offset != 0u && scale_xy > 1u) { if (xe_downscale_half_pixel_offset != 0u && scale_xy > 1u) {
uint offset_x = xe_downscale_scale_x >> 1u; offset_x = xe_downscale_scale_x >> 1u;
uint offset_y = xe_downscale_scale_y >> 1u; offset_y = xe_downscale_scale_y >> 1u;
block_sample_offset = offset_x + offset_y * xe_downscale_scale_x;
} }
// Source offset: base of the scaled block plus offset within block // Guest-relative tiled byte address of this output pixel. Both the source
// Add source_offset_bytes to handle buffer-relative addressing // range (scaled by scale_xy) and the destination range start at the same
// This must be done before division to preserve sub-dword byte position // guest address, so all addressing below is range-relative.
uint guest_byte_offset = tile_index * tile_size_1x + pixel_index * pixel_size;
// Its 16-byte unit and texel index within the unit.
uint unit = guest_byte_offset >> 4u;
uint texel_in_unit = (guest_byte_offset & 15u) >> xe_downscale_pixel_size_log2;
// Representative scaled texel within the unit's (W * scale_x)-texel span.
uint unit_texels_log2 = 4u - xe_downscale_pixel_size_log2; // W = 16 / pixel_size
uint q = xe_downscale_scale_x * texel_in_unit + offset_x;
uint sub_x = q >> unit_texels_log2;
uint texel_in_scaled_unit = q & ((1u << unit_texels_log2) - 1u);
uint src_byte_offset = xe_downscale_source_offset_bytes + uint src_byte_offset = xe_downscale_source_offset_bytes +
tile_index * tile_size_scaled + unit * (scale_xy << 4u) +
pixel_index * pixel_size * scale_xy + (sub_x * xe_downscale_scale_y + offset_y) * 16u +
block_sample_offset * pixel_size; (texel_in_scaled_unit << xe_downscale_pixel_size_log2);
uint src_offset = src_byte_offset >> 2u; uint src_offset = src_byte_offset >> 2u;
// Destination offset in 1x buffer // Destination offset in 1x buffer
uint dst_byte_offset = tile_index * tile_size_1x + uint dst_byte_offset = guest_byte_offset;
pixel_index * pixel_size;
uint dst_offset = dst_byte_offset >> 2u; uint dst_offset = dst_byte_offset >> 2u;
// Copy pixel based on size // Copy pixel based on size

View file

@ -11,10 +11,38 @@
// Operates on 32x32 tiled data format used by Xbox 360. // Operates on 32x32 tiled data format used by Xbox 360.
// Each thread handles one output pixel (one 32x32 tile = 1024 threads). // Each thread handles one output pixel (one 32x32 tile = 1024 threads).
// //
// By default, picks the top-left pixel of each scale_x * scale_y block. // Scaled resolve buffer layout (established from the resolve write shaders,
// When xe_downscale_half_pixel_offset is set, samples from (scale/2, scale/2) // e.g. resolve_fast_32bpp_1x2xmsaa_scaled, and the scaled texture load
// within each block to compensate for the half-pixel offset becoming a // shaders; they must agree, and both use this):
// full-pixel offset at higher resolutions. //
// scaled_byte_address = guest_unit_byte_address * (scale_x * scale_y)
// + (sub_x * scale_y + sub_y) * 16
// + byte_within_scaled_unit
//
// where a "unit" is a 16-byte span of the guest tiled layout, holding
// W = 16 >> pixel_size_log2 texels that are consecutive along X for
// 16/32/64bpp (a property of the Xbox 360 tiled address function's low
// 4 bits); sub_x selects among the scale_x duplicated 16-byte blocks the
// unit expands to along X of the SCALED image, and sub_y among the scale_y
// duplicated rows. Note the (x-major, y-minor) sub ordering and the 16-BYTE
// duplication granularity: the scaled image texel for guest texel t of a
// unit, at sub-position (ox, oy) within its scale_x * scale_y block, is
//
// q = scale_x * t + ox; sub_x = q / W; texel_in_scaled_unit = q % W.
//
// (The previous version of this shader assumed per-PIXEL contiguous
// duplication with y-major sub ordering, which sampled alternating wrong
// rows/columns and produced a sawtooth weave in every readback, visible in
// e.g. the Skate 3 photo grab.)
//
// For 8bpp the guest 16-byte unit is not purely consecutive along X (it
// spans an extra Y bit), so the X mapping below is approximate for half of
// the bytes there; no current readback consumer uses 8bpp surfaces.
//
// By default, picks the top-left host pixel of each scale_x * scale_y block.
// When xe_downscale_half_pixel_offset is set, samples from
// (scale_x/2, scale_y/2) within each block to compensate for the D3D9-style
// half-pixel offset becoming a multi-pixel offset at higher resolutions.
cbuffer XeResolveDownscaleConstants : register(b0) { cbuffer XeResolveDownscaleConstants : register(b0) {
uint xe_downscale_scale_x; // 1 to kMaxDrawResolutionScaleAlongAxis uint xe_downscale_scale_x; // 1 to kMaxDrawResolutionScaleAlongAxis
@ -22,10 +50,7 @@ cbuffer XeResolveDownscaleConstants : register(b0) {
uint xe_downscale_pixel_size_log2; // 0=8bit, 1=16bit, 2=32bit, 3=64bit uint xe_downscale_pixel_size_log2; // 0=8bit, 1=16bit, 2=32bit, 3=64bit
uint xe_downscale_tile_count; // Number of 32x32 tiles to process uint xe_downscale_tile_count; // Number of 32x32 tiles to process
// When non-zero, apply half-pixel offset correction by sampling from // When non-zero, apply half-pixel offset correction by sampling from
// (scale/2, scale/2) within each scaled block instead of (0, 0). // (scale_x/2, scale_y/2) within each scaled block instead of (0, 0).
// This compensates for the D3D9-style half-pixel offset used by Xbox 360
// games, which at Nx resolution scaling shifts rendered content by
// (N/2, N/2) host pixels.
uint xe_downscale_half_pixel_offset; uint xe_downscale_half_pixel_offset;
}; };
@ -33,7 +58,6 @@ ByteAddressBuffer xe_resolve_source : register(t0);
RWByteAddressBuffer xe_resolve_dest : register(u0); RWByteAddressBuffer xe_resolve_dest : register(u0);
// Groupshared memory for coalescing sub-32-bit writes // Groupshared memory for coalescing sub-32-bit writes
// Max tile size at 1x is 32*32*8 bytes = 8KB for 64-bit pixels
// We only need this for 8-bit and 16-bit where we coalesce to 32-bit stores // We only need this for 8-bit and 16-bit where we coalesce to 32-bit stores
groupshared uint gs_tile_data[32 * 32]; groupshared uint gs_tile_data[32 * 32];
@ -56,28 +80,34 @@ void main(uint3 xe_group_id : SV_GroupID,
uint pixel_size = 1u << xe_downscale_pixel_size_log2; uint pixel_size = 1u << xe_downscale_pixel_size_log2;
uint tile_size_1x = 32 * 32 * pixel_size; uint tile_size_1x = 32 * 32 * pixel_size;
uint scale_xy = xe_downscale_scale_x * xe_downscale_scale_y; uint scale_xy = xe_downscale_scale_x * xe_downscale_scale_y;
uint tile_size_scaled = tile_size_1x * scale_xy;
// Compute offset within each scaled block to sample from. // Sub-position within each scale_x * scale_y block to sample from.
// Without half-pixel correction: sample from (0, 0) = linear offset 0. uint offset_x = 0u;
// With half-pixel correction: sample from (scale/2, scale/2) to compensate uint offset_y = 0u;
// for the D3D9-style half-pixel offset shifting content by (N/2, N/2) pixels
// at Nx resolution.
uint block_sample_offset = 0u;
[branch] if (xe_downscale_half_pixel_offset != 0u && scale_xy > 1u) { [branch] if (xe_downscale_half_pixel_offset != 0u && scale_xy > 1u) {
uint offset_x = xe_downscale_scale_x >> 1u; offset_x = xe_downscale_scale_x >> 1u;
uint offset_y = xe_downscale_scale_y >> 1u; offset_y = xe_downscale_scale_y >> 1u;
block_sample_offset = offset_x + offset_y * xe_downscale_scale_x;
} }
// Source offset: base of the scaled block plus offset within block // Guest-relative tiled byte address of this output pixel. Both the source
uint src_offset = tile_index * tile_size_scaled + // range (scaled by scale_xy) and the destination range start at the same
pixel_index * pixel_size * scale_xy + // guest address, so all addressing below is range-relative.
block_sample_offset * pixel_size; uint guest_byte_offset = tile_index * tile_size_1x + pixel_index * pixel_size;
// Its 16-byte unit and texel index within the unit.
uint unit = guest_byte_offset >> 4u;
uint texel_in_unit = (guest_byte_offset & 15u) >> xe_downscale_pixel_size_log2;
// Representative scaled texel within the unit's (W * scale_x)-texel span.
uint unit_texels_log2 = 4u - xe_downscale_pixel_size_log2; // W = 16 / pixel_size
uint q = xe_downscale_scale_x * texel_in_unit + offset_x;
uint sub_x = q >> unit_texels_log2;
uint texel_in_scaled_unit = q & ((1u << unit_texels_log2) - 1u);
uint src_offset = unit * (scale_xy << 4u) +
(sub_x * xe_downscale_scale_y + offset_y) * 16u +
(texel_in_scaled_unit << xe_downscale_pixel_size_log2);
// Destination offset in 1x buffer // Destination offset in 1x buffer
uint dst_offset = tile_index * tile_size_1x + uint dst_offset = guest_byte_offset;
pixel_index * pixel_size;
// Copy pixel based on size // Copy pixel based on size
[branch] switch (xe_downscale_pixel_size_log2) { [branch] switch (xe_downscale_pixel_size_log2) {

View file

@ -1,376 +1,238 @@
// Generated with `xb buildshaders`. // 1116.2.0
#if 0 #pragma once
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 25190
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %5663 "main" %gl_WorkGroupID %gl_LocalInvocationID
OpExecutionMode %5663 LocalSize 32 32 1
OpDecorate %gl_WorkGroupID BuiltIn WorkgroupId
OpDecorate %_struct_1056 Block
OpMemberDecorate %_struct_1056 0 Offset 0
OpMemberDecorate %_struct_1056 1 Offset 4
OpMemberDecorate %_struct_1056 2 Offset 8
OpMemberDecorate %_struct_1056 3 Offset 12
OpMemberDecorate %_struct_1056 4 Offset 16
OpMemberDecorate %_struct_1056 5 Offset 20
OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
OpDecorate %_runtimearr_uint ArrayStride 4
OpDecorate %_struct_1948 BufferBlock
OpMemberDecorate %_struct_1948 0 NonWritable
OpMemberDecorate %_struct_1948 0 Offset 0
OpDecorate %3152 NonWritable
OpDecorate %3152 Binding 0
OpDecorate %3152 DescriptorSet 0
OpDecorate %_runtimearr_uint_0 ArrayStride 4
OpDecorate %_struct_1949 BufferBlock
OpMemberDecorate %_struct_1949 0 NonReadable
OpMemberDecorate %_struct_1949 0 Offset 0
OpDecorate %5522 NonReadable
OpDecorate %5522 Binding 1
OpDecorate %5522 DescriptorSet 0
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v3uint = OpTypeVector %uint 3
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_WorkGroupID = OpVariable %_ptr_Input_v3uint Input
%uint_0 = OpConstant %uint 0
%_ptr_Input_uint = OpTypePointer Input %uint
%_struct_1056 = OpTypeStruct %uint %uint %uint %uint %uint %uint
%_ptr_PushConstant__struct_1056 = OpTypePointer PushConstant %_struct_1056
%4930 = OpVariable %_ptr_PushConstant__struct_1056 PushConstant
%int = OpTypeInt 32 1
%int_3 = OpConstant %int 3
%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint
%bool = OpTypeBool
%gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input
%uint_1 = OpConstant %uint 1
%uint_32 = OpConstant %uint 32
%int_2 = OpConstant %int 2
%uint_1024 = OpConstant %uint 1024
%int_0 = OpConstant %int 0
%int_1 = OpConstant %int 1
%int_5 = OpConstant %int 5
%int_4 = OpConstant %int 4
%uint_2 = OpConstant %uint 2
%_runtimearr_uint = OpTypeRuntimeArray %uint
%_struct_1948 = OpTypeStruct %_runtimearr_uint
%_ptr_Uniform__struct_1948 = OpTypePointer Uniform %_struct_1948
%3152 = OpVariable %_ptr_Uniform__struct_1948 Uniform
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%uint_3 = OpConstant %uint 3
%uint_8 = OpConstant %uint 8
%uint_255 = OpConstant %uint 255
%_arr_uint_uint_1024 = OpTypeArray %uint %uint_1024
%_ptr_Workgroup__arr_uint_uint_1024 = OpTypePointer Workgroup %_arr_uint_uint_1024
%4017 = OpVariable %_ptr_Workgroup__arr_uint_uint_1024 Workgroup
%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint
%uint_264 = OpConstant %uint 264
%_runtimearr_uint_0 = OpTypeRuntimeArray %uint
%_struct_1949 = OpTypeStruct %_runtimearr_uint_0
%_ptr_Uniform__struct_1949 = OpTypePointer Uniform %_struct_1949
%5522 = OpVariable %_ptr_Uniform__struct_1949 Uniform
%uint_256 = OpConstant %uint 256
%uint_65535 = OpConstant %uint 65535
%uint_16 = OpConstant %uint 16
%uint_512 = OpConstant %uint 512
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_32 %uint_32 %uint_1
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %14903 None
OpSwitch %uint_0 %11880
%11880 = OpLabel
%22245 = OpAccessChain %_ptr_Input_uint %gl_WorkGroupID %uint_0
%15627 = OpLoad %uint %22245
%22225 = OpAccessChain %_ptr_PushConstant_uint %4930 %int_3
%7085 = OpLoad %uint %22225
%7405 = OpUGreaterThanEqual %bool %15627 %7085
OpSelectionMerge %16413 None
OpBranchConditional %7405 %21992 %16413
%21992 = OpLabel
OpBranch %14903
%16413 = OpLabel
%20632 = OpAccessChain %_ptr_Input_uint %gl_LocalInvocationID %uint_1
%15628 = OpLoad %uint %20632
%21427 = OpAccessChain %_ptr_Input_uint %gl_LocalInvocationID %uint_0
%12090 = OpLoad %uint %21427
%6234 = OpIMul %uint %15628 %uint_32
%8353 = OpIAdd %uint %6234 %12090
%16525 = OpAccessChain %_ptr_PushConstant_uint %4930 %int_2
%13159 = OpLoad %uint %16525
%15178 = OpShiftLeftLogical %uint %uint_1 %13159
%21815 = OpIMul %uint %uint_1024 %15178
%13000 = OpAccessChain %_ptr_PushConstant_uint %4930 %int_0
%18628 = OpLoad %uint %13000
%21428 = OpAccessChain %_ptr_PushConstant_uint %4930 %int_1
%12166 = OpLoad %uint %21428
%24613 = OpIMul %uint %18628 %12166
%13723 = OpIMul %uint %21815 %24613
%8597 = OpAccessChain %_ptr_PushConstant_uint %4930 %int_5
%21470 = OpLoad %uint %8597
%24311 = OpINotEqual %bool %21470 %uint_0
%23629 = OpUGreaterThan %bool %24613 %uint_1
%11037 = OpLogicalAnd %bool %24311 %23629
OpSelectionMerge %23266 None
OpBranchConditional %11037 %11410 %23266
%11410 = OpLabel
%20167 = OpShiftRightLogical %uint %18628 %uint_1
%24779 = OpShiftRightLogical %uint %12166 %uint_1
%16010 = OpIMul %uint %24779 %18628
%19240 = OpIAdd %uint %20167 %16010
OpBranch %23266
%23266 = OpLabel
%19748 = OpPhi %uint %uint_0 %16413 %19240 %11410
%25074 = OpAccessChain %_ptr_PushConstant_uint %4930 %int_4
%25189 = OpLoad %uint %25074
%7507 = OpIMul %uint %15627 %13723
%17182 = OpIAdd %uint %25189 %7507
%19692 = OpIMul %uint %8353 %15178
%16238 = OpIMul %uint %19692 %24613
%6869 = OpIAdd %uint %17182 %16238
%21638 = OpIMul %uint %19748 %15178
%18521 = OpIAdd %uint %6869 %21638
%7572 = OpShiftRightLogical %uint %18521 %uint_2
%6935 = OpIMul %uint %15627 %21815
%9665 = OpIAdd %uint %6935 %19692
%9085 = OpShiftRightLogical %uint %9665 %uint_2
OpSelectionMerge %18023 None
OpSwitch %13159 %18023 0 %11881 1 %16414 2 %16415 3 %8158
%11881 = OpLabel
%24791 = OpAccessChain %_ptr_Uniform_uint %3152 %int_0 %7572
%12865 = OpLoad %uint %24791
%12121 = OpBitwiseAnd %uint %18521 %uint_3
%13987 = OpIMul %uint %12121 %uint_8
%14461 = OpShiftRightLogical %uint %12865 %13987
%15580 = OpBitwiseAnd %uint %14461 %uint_255
%19824 = OpShiftRightLogical %uint %8353 %uint_2
%19243 = OpBitwiseAnd %uint %8353 %uint_3
%14114 = OpIMul %uint %19243 %uint_8
%23170 = OpShiftLeftLogical %uint %15580 %14114
%15629 = OpIEqual %bool %19243 %uint_0
OpSelectionMerge %20883 None
OpBranchConditional %15629 %12148 %20883
%12148 = OpLabel
%21533 = OpAccessChain %_ptr_Workgroup_uint %4017 %19824
OpStore %21533 %23170
OpBranch %20883
%20883 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
%15932 = OpINotEqual %bool %19243 %uint_0
OpSelectionMerge %9094 None
OpBranchConditional %15932 %15549 %9094
%15549 = OpLabel
%9637 = OpAccessChain %_ptr_Workgroup_uint %4017 %19824
%6303 = OpAtomicOr %uint %9637 %uint_1 %uint_0 %23170
OpBranch %9094
%9094 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
OpSelectionMerge %18021 None
OpBranchConditional %15629 %20882 %18021
%20882 = OpLabel
%10747 = OpIMul %uint %15627 %uint_256
%14186 = OpIAdd %uint %10747 %19824
%14036 = OpAccessChain %_ptr_Workgroup_uint %4017 %19824
%15421 = OpLoad %uint %14036
%23477 = OpAccessChain %_ptr_Uniform_uint %5522 %int_0 %14186
OpStore %23477 %15421
OpBranch %18021
%18021 = OpLabel
OpBranch %18023
%16414 = OpLabel
%23178 = OpAccessChain %_ptr_Uniform_uint %3152 %int_0 %7572
%12866 = OpLoad %uint %23178
%12122 = OpBitwiseAnd %uint %18521 %uint_2
%13988 = OpIMul %uint %12122 %uint_8
%14462 = OpShiftRightLogical %uint %12866 %13988
%15581 = OpBitwiseAnd %uint %14462 %uint_65535
%19825 = OpShiftRightLogical %uint %8353 %uint_1
%19244 = OpBitwiseAnd %uint %8353 %uint_1
%14115 = OpIMul %uint %19244 %uint_16
%23171 = OpShiftLeftLogical %uint %15581 %14115
%15630 = OpIEqual %bool %19244 %uint_0
OpSelectionMerge %20884 None
OpBranchConditional %15630 %12149 %20884
%12149 = OpLabel
%21534 = OpAccessChain %_ptr_Workgroup_uint %4017 %19825
OpStore %21534 %23171
OpBranch %20884
%20884 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
%15933 = OpINotEqual %bool %19244 %uint_0
OpSelectionMerge %9095 None
OpBranchConditional %15933 %15550 %9095
%15550 = OpLabel
%9638 = OpAccessChain %_ptr_Workgroup_uint %4017 %19825
%6304 = OpAtomicOr %uint %9638 %uint_1 %uint_0 %23171
OpBranch %9095
%9095 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
OpSelectionMerge %18022 None
OpBranchConditional %15630 %20885 %18022
%20885 = OpLabel
%10748 = OpIMul %uint %15627 %uint_512
%14187 = OpIAdd %uint %10748 %19825
%14037 = OpAccessChain %_ptr_Workgroup_uint %4017 %19825
%15422 = OpLoad %uint %14037
%23478 = OpAccessChain %_ptr_Uniform_uint %5522 %int_0 %14187
OpStore %23478 %15422
OpBranch %18022
%18022 = OpLabel
OpBranch %18023
%16415 = OpLabel
%20633 = OpAccessChain %_ptr_Uniform_uint %3152 %int_0 %7572
%15646 = OpLoad %uint %20633
%23479 = OpAccessChain %_ptr_Uniform_uint %5522 %int_0 %9085
OpStore %23479 %15646
OpBranch %18023
%8158 = OpLabel
%20634 = OpAccessChain %_ptr_Uniform_uint %3152 %int_0 %7572
%15647 = OpLoad %uint %20634
%21178 = OpAccessChain %_ptr_Uniform_uint %5522 %int_0 %9085
OpStore %21178 %15647
%19686 = OpIAdd %uint %9085 %uint_1
%13384 = OpIAdd %uint %7572 %uint_1
%10810 = OpAccessChain %_ptr_Uniform_uint %3152 %int_0 %13384
%15423 = OpLoad %uint %10810
%23480 = OpAccessChain %_ptr_Uniform_uint %5522 %int_0 %19686
OpStore %23480 %15423
OpBranch %18023
%18023 = OpLabel
OpBranch %14903
%14903 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t resolve_downscale_cs[] = { const uint32_t resolve_downscale_cs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x00006266, 0x00000000, 0x00020011, 0x00000001, 0x0006000B, 0x07230203,0x00010000,0x0008000b,0x0000012a,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E, 0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000F, 0x00000005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00000BEF, 0x00000DA3, 0x00060010, 0x0007000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000b,0x0000001f,0x00060010,
0x0000161F, 0x00000011, 0x00000020, 0x00000020, 0x00000001, 0x00040047, 0x00000BEF, 0x0000000B, 0x00000004,0x00000011,0x00000020,0x00000020,0x00000001,0x00030003,0x00000002,0x000001cc,
0x0000001A, 0x00030047, 0x00000420, 0x00000002, 0x00050048, 0x00000420, 0x00000000, 0x00000023, 0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,0x00000008,0x656c6974,0x646e695f,
0x00000000, 0x00050048, 0x00000420, 0x00000001, 0x00000023, 0x00000004, 0x00050048, 0x00000420, 0x00007865,0x00060005,0x0000000b,0x575f6c67,0x476b726f,0x70756f72,0x00004449,0x00090005,
0x00000002, 0x00000023, 0x00000008, 0x00050048, 0x00000420, 0x00000003, 0x00000023, 0x0000000C, 0x00000011,0x6f736552,0x4465766c,0x736e776f,0x656c6163,0x736e6f43,0x746e6174,0x00000073,
0x00050048, 0x00000420, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000420, 0x00000005, 0x00090006,0x00000011,0x00000000,0x645f6578,0x736e776f,0x656c6163,0x6163735f,0x785f656c,
0x00000023, 0x00000014, 0x00040047, 0x00000DA3, 0x0000000B, 0x0000001B, 0x00040047, 0x000007D0, 0x00000000,0x00090006,0x00000011,0x00000001,0x645f6578,0x736e776f,0x656c6163,0x6163735f,
0x00000006, 0x00000004, 0x00030047, 0x0000079C, 0x00000003, 0x00040048, 0x0000079C, 0x00000000, 0x795f656c,0x00000000,0x000b0006,0x00000011,0x00000002,0x645f6578,0x736e776f,0x656c6163,
0x00000018, 0x00050048, 0x0000079C, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000C50, 0x7869705f,0x735f6c65,0x5f657a69,0x32676f6c,0x00000000,0x00090006,0x00000011,0x00000003,
0x00000018, 0x00040047, 0x00000C50, 0x00000021, 0x00000000, 0x00040047, 0x00000C50, 0x00000022, 0x645f6578,0x736e776f,0x656c6163,0x6c69745f,0x6f635f65,0x00746e75,0x000c0006,0x00000011,
0x00000000, 0x00040047, 0x000007D1, 0x00000006, 0x00000004, 0x00030047, 0x0000079D, 0x00000003, 0x00000004,0x645f6578,0x736e776f,0x656c6163,0x756f735f,0x5f656372,0x7366666f,0x625f7465,
0x00040048, 0x0000079D, 0x00000000, 0x00000019, 0x00050048, 0x0000079D, 0x00000000, 0x00000023, 0x73657479,0x00000000,0x000b0006,0x00000011,0x00000005,0x645f6578,0x736e776f,0x656c6163,
0x00000000, 0x00030047, 0x00001592, 0x00000019, 0x00040047, 0x00001592, 0x00000021, 0x00000001, 0x6c61685f,0x69705f66,0x5f6c6578,0x7366666f,0x00007465,0x00030005,0x00000013,0x00000000,
0x00040047, 0x00001592, 0x00000022, 0x00000000, 0x00040047, 0x000000FC, 0x0000000B, 0x00000019, 0x00030005,0x0000001e,0x00776f72,0x00080005,0x0000001f,0x4c5f6c67,0x6c61636f,0x6f766e49,
0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x69746163,0x44496e6f,0x00000000,0x00040005,0x00000023,0x756c6f63,0x00006e6d,0x00050005,
0x00000000, 0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040020, 0x00000291, 0x00000001, 0x00000026,0x65786970,0x6e695f6c,0x00786564,0x00050005,0x0000002c,0x65786970,0x69735f6c,
0x00000014, 0x0004003B, 0x00000291, 0x00000BEF, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A0A, 0x0000657a,0x00060005,0x00000031,0x656c6974,0x7a69735f,0x78315f65,0x00000000,0x00050005,
0x00000000, 0x00040020, 0x00000288, 0x00000001, 0x0000000B, 0x0008001E, 0x00000420, 0x0000000B, 0x00000035,0x6c616373,0x79785f65,0x00000000,0x00050005,0x0000003d,0x7366666f,0x785f7465,
0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x0000069D, 0x00000009, 0x00000000,0x00050005,0x0000003e,0x7366666f,0x795f7465,0x00000000,0x00070005,0x0000004e,
0x00000420, 0x0004003B, 0x0000069D, 0x00001342, 0x00000009, 0x00040015, 0x0000000C, 0x00000020, 0x73657567,0x79625f74,0x6f5f6574,0x65736666,0x00000074,0x00040005,0x00000056,0x74696e75,
0x00000001, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x00040020, 0x00000289, 0x00000009, 0x00000000,0x00060005,0x0000005a,0x65786574,0x6e695f6c,0x696e755f,0x00000074,0x00070005,
0x0000000B, 0x00020014, 0x00000009, 0x0004003B, 0x00000291, 0x00000DA3, 0x00000001, 0x0004002B, 0x00000061,0x74696e75,0x7865745f,0x5f736c65,0x32676f6c,0x00000000,0x00030005,0x00000065,
0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004002B, 0x00000071,0x00040005,0x0000006c,0x5f627573,0x00000078,0x00080005,0x00000070,0x65786574,
0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A47, 0x00000400, 0x0004002B, 0x6e695f6c,0x6163735f,0x5f64656c,0x74696e75,0x00000000,0x00060005,0x00000076,0x5f637273,
0x0000000C, 0x00000A0B, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x65747962,0x66666f5f,0x00746573,0x00050005,0x0000008d,0x5f637273,0x7366666f,0x00007465,
0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x00060005,0x00000091,0x5f747364,0x65747962,0x66666f5f,0x00746573,0x00050005,0x00000093,
0x0000000B, 0x00000A10, 0x00000002, 0x0003001D, 0x000007D0, 0x0000000B, 0x0003001E, 0x0000079C, 0x5f747364,0x7366666f,0x00007465,0x00050005,0x0000009d,0x5f637273,0x64726f77,0x00000000,
0x000007D0, 0x00040020, 0x00000A19, 0x00000002, 0x0000079C, 0x0004003B, 0x00000A19, 0x00000C50, 0x00060005,0x0000009f,0x72756f53,0x75426563,0x72656666,0x00000000,0x00050006,0x0000009f,
0x00000002, 0x00040020, 0x0000028A, 0x00000002, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000000,0x61746164,0x00000000,0x00070005,0x000000a1,0x725f6578,0x6c6f7365,0x735f6576,
0x00000003, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x00000144, 0x6372756f,0x00000065,0x00050005,0x000000a6,0x65747962,0x6c61765f,0x00000000,0x00050005,
0x000000FF, 0x0004001C, 0x00000293, 0x0000000B, 0x00000A47, 0x00040020, 0x00000510, 0x00000004, 0x000000b0,0x6b636170,0x646e695f,0x00007865,0x00050005,0x000000b3,0x65747962,0x736f705f,
0x00000293, 0x0004003B, 0x00000510, 0x00000FB1, 0x00000004, 0x00040020, 0x0000028B, 0x00000004, 0x00000000,0x00060005,0x000000b6,0x746e6f63,0x75626972,0x6e6f6974,0x00000000,0x00060005,
0x0000000B, 0x0004002B, 0x0000000B, 0x0000015F, 0x00000108, 0x0003001D, 0x000007D1, 0x0000000B, 0x000000c1,0x745f7367,0x5f656c69,0x61746164,0x00000000,0x00050005,0x000000d4,0x74736544,
0x0003001E, 0x0000079D, 0x000007D1, 0x00040020, 0x00000A1B, 0x00000002, 0x0000079D, 0x0004003B, 0x66667542,0x00007265,0x00050006,0x000000d4,0x00000000,0x61746164,0x00000000,0x00060005,
0x00000A1B, 0x00001592, 0x00000002, 0x0004002B, 0x0000000B, 0x00000147, 0x00000100, 0x0004002B, 0x000000d6,0x725f6578,0x6c6f7365,0x645f6576,0x00747365,0x00050005,0x000000e1,0x5f637273,
0x0000000B, 0x000001C1, 0x0000FFFF, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x64726f77,0x00000000,0x00050005,0x000000e5,0x726f6873,0x61765f74,0x0000006c,0x00050005,
0x0000000B, 0x00000447, 0x00000200, 0x0006002C, 0x00000014, 0x000000FC, 0x00000A6A, 0x00000A6A, 0x000000ed,0x6b636170,0x646e695f,0x00007865,0x00050005,0x000000f0,0x726f6873,0x6f705f74,
0x00000A0D, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x00000073,0x00060005,0x000000f3,0x746e6f63,0x75626972,0x6e6f6974,0x00000000,0x00040047,
0x000300F7, 0x00003A37, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x0000000b,0x0000000b,0x0000001a,0x00030047,0x00000011,0x00000002,0x00050048,0x00000011,
0x00050041, 0x00000288, 0x000056E5, 0x00000BEF, 0x00000A0A, 0x0004003D, 0x0000000B, 0x00003D0B, 0x00000000,0x00000023,0x00000000,0x00050048,0x00000011,0x00000001,0x00000023,0x00000004,
0x000056E5, 0x00050041, 0x00000289, 0x000056D1, 0x00001342, 0x00000A14, 0x0004003D, 0x0000000B, 0x00050048,0x00000011,0x00000002,0x00000023,0x00000008,0x00050048,0x00000011,0x00000003,
0x00001BAD, 0x000056D1, 0x000500AE, 0x00000009, 0x00001CED, 0x00003D0B, 0x00001BAD, 0x000300F7, 0x00000023,0x0000000c,0x00050048,0x00000011,0x00000004,0x00000023,0x00000010,0x00050048,
0x0000401D, 0x00000000, 0x000400FA, 0x00001CED, 0x000055E8, 0x0000401D, 0x000200F8, 0x000055E8, 0x00000011,0x00000005,0x00000023,0x00000014,0x00040047,0x0000001f,0x0000000b,0x0000001b,
0x000200F9, 0x00003A37, 0x000200F8, 0x0000401D, 0x00050041, 0x00000288, 0x00005098, 0x00000DA3, 0x00040047,0x0000009e,0x00000006,0x00000004,0x00030047,0x0000009f,0x00000003,0x00040048,
0x00000A0D, 0x0004003D, 0x0000000B, 0x00003D0C, 0x00005098, 0x00050041, 0x00000288, 0x000053B3, 0x0000009f,0x00000000,0x00000018,0x00050048,0x0000009f,0x00000000,0x00000023,0x00000000,
0x00000DA3, 0x00000A0A, 0x0004003D, 0x0000000B, 0x00002F3A, 0x000053B3, 0x00050084, 0x0000000B, 0x00030047,0x000000a1,0x00000018,0x00040047,0x000000a1,0x00000021,0x00000000,0x00040047,
0x0000185A, 0x00003D0C, 0x00000A6A, 0x00050080, 0x0000000B, 0x000020A1, 0x0000185A, 0x00002F3A, 0x000000a1,0x00000022,0x00000000,0x00040047,0x000000d3,0x00000006,0x00000004,0x00030047,
0x00050041, 0x00000289, 0x0000408D, 0x00001342, 0x00000A11, 0x0004003D, 0x0000000B, 0x00003367, 0x000000d4,0x00000003,0x00040048,0x000000d4,0x00000000,0x00000019,0x00050048,0x000000d4,
0x0000408D, 0x000500C4, 0x0000000B, 0x00003B4A, 0x00000A0D, 0x00003367, 0x00050084, 0x0000000B, 0x00000000,0x00000023,0x00000000,0x00030047,0x000000d6,0x00000019,0x00040047,0x000000d6,
0x00005537, 0x00000A47, 0x00003B4A, 0x00050041, 0x00000289, 0x000032C8, 0x00001342, 0x00000A0B, 0x00000021,0x00000001,0x00040047,0x000000d6,0x00000022,0x00000000,0x00040047,0x00000129,
0x0004003D, 0x0000000B, 0x000048C4, 0x000032C8, 0x00050041, 0x00000289, 0x000053B4, 0x00001342, 0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,
0x00000A0E, 0x0004003D, 0x0000000B, 0x00002F86, 0x000053B4, 0x00050084, 0x0000000B, 0x00006025, 0x00000006,0x00000020,0x00000000,0x00040020,0x00000007,0x00000007,0x00000006,0x00040017,
0x000048C4, 0x00002F86, 0x00050084, 0x0000000B, 0x0000359B, 0x00005537, 0x00006025, 0x00050041, 0x00000009,0x00000006,0x00000003,0x00040020,0x0000000a,0x00000001,0x00000009,0x0004003b,
0x00000289, 0x00002195, 0x00001342, 0x00000A1A, 0x0004003D, 0x0000000B, 0x000053DE, 0x00002195, 0x0000000a,0x0000000b,0x00000001,0x0004002b,0x00000006,0x0000000c,0x00000000,0x00040020,
0x000500AB, 0x00000009, 0x00005EF7, 0x000053DE, 0x00000A0A, 0x000500AC, 0x00000009, 0x00005C4D, 0x0000000d,0x00000001,0x00000006,0x0008001e,0x00000011,0x00000006,0x00000006,0x00000006,
0x00006025, 0x00000A0D, 0x000500A7, 0x00000009, 0x00002B1D, 0x00005EF7, 0x00005C4D, 0x000300F7, 0x00000006,0x00000006,0x00000006,0x00040020,0x00000012,0x00000009,0x00000011,0x0004003b,
0x00005AE2, 0x00000000, 0x000400FA, 0x00002B1D, 0x00002C92, 0x00005AE2, 0x000200F8, 0x00002C92, 0x00000012,0x00000013,0x00000009,0x00040015,0x00000014,0x00000020,0x00000001,0x0004002b,
0x000500C2, 0x0000000B, 0x00004EC7, 0x000048C4, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000060CB, 0x00000014,0x00000015,0x00000003,0x00040020,0x00000016,0x00000009,0x00000006,0x00020014,
0x00002F86, 0x00000A0D, 0x00050084, 0x0000000B, 0x00003E8A, 0x000060CB, 0x000048C4, 0x00050080, 0x00000019,0x0004003b,0x0000000a,0x0000001f,0x00000001,0x0004002b,0x00000006,0x00000020,
0x0000000B, 0x00004B28, 0x00004EC7, 0x00003E8A, 0x000200F9, 0x00005AE2, 0x000200F8, 0x00005AE2, 0x00000001,0x0004002b,0x00000006,0x00000028,0x00000020,0x0004002b,0x00000014,0x0000002d,
0x000700F5, 0x0000000B, 0x00004D24, 0x00000A0A, 0x0000401D, 0x00004B28, 0x00002C92, 0x00050041, 0x00000002,0x0004002b,0x00000006,0x00000032,0x00000400,0x0004002b,0x00000014,0x00000036,
0x00000289, 0x000061F2, 0x00001342, 0x00000A17, 0x0004003D, 0x0000000B, 0x00006265, 0x000061F2, 0x00000000,0x0004002b,0x00000014,0x00000039,0x00000001,0x0004002b,0x00000014,0x0000003f,
0x00050084, 0x0000000B, 0x00001D53, 0x00003D0B, 0x0000359B, 0x00050080, 0x0000000B, 0x0000431E, 0x00000005,0x0004002b,0x00000006,0x00000058,0x00000004,0x0004002b,0x00000006,0x0000005c,
0x00006265, 0x00001D53, 0x00050084, 0x0000000B, 0x00004CEC, 0x000020A1, 0x00003B4A, 0x00050084, 0x0000000f,0x0004002b,0x00000014,0x00000077,0x00000004,0x0004002b,0x00000006,0x00000085,
0x0000000B, 0x00003F6E, 0x00004CEC, 0x00006025, 0x00050080, 0x0000000B, 0x00001AD5, 0x0000431E, 0x00000010,0x0004002b,0x00000006,0x0000008f,0x00000002,0x0003001d,0x0000009e,0x00000006,
0x00003F6E, 0x00050084, 0x0000000B, 0x00005486, 0x00004D24, 0x00003B4A, 0x00050080, 0x0000000B, 0x0003001e,0x0000009f,0x0000009e,0x00040020,0x000000a0,0x00000002,0x0000009f,0x0004003b,
0x00004859, 0x00001AD5, 0x00005486, 0x000500C2, 0x0000000B, 0x00001D94, 0x00004859, 0x00000A10, 0x000000a0,0x000000a1,0x00000002,0x00040020,0x000000a3,0x00000002,0x00000006,0x0004002b,
0x00050084, 0x0000000B, 0x00001B17, 0x00003D0B, 0x00005537, 0x00050080, 0x0000000B, 0x000025C1, 0x00000006,0x000000a9,0x00000003,0x0004002b,0x00000006,0x000000ab,0x00000008,0x0004002b,
0x00001B17, 0x00004CEC, 0x000500C2, 0x0000000B, 0x0000237D, 0x000025C1, 0x00000A10, 0x000300F7, 0x00000006,0x000000ae,0x000000ff,0x0004001c,0x000000bf,0x00000006,0x00000032,0x00040020,
0x00004667, 0x00000000, 0x000B00FB, 0x00003367, 0x00004667, 0x00000000, 0x00002E69, 0x00000001, 0x000000c0,0x00000004,0x000000bf,0x0004003b,0x000000c0,0x000000c1,0x00000004,0x00040020,
0x0000401E, 0x00000002, 0x0000401F, 0x00000003, 0x00001FDE, 0x000200F8, 0x00002E69, 0x00060041, 0x000000c4,0x00000004,0x00000006,0x0004002b,0x00000006,0x000000c6,0x00000108,0x0003001d,
0x0000028A, 0x000060D7, 0x00000C50, 0x00000A0B, 0x00001D94, 0x0004003D, 0x0000000B, 0x00003241, 0x000000d3,0x00000006,0x0003001e,0x000000d4,0x000000d3,0x00040020,0x000000d5,0x00000002,
0x000060D7, 0x000500C7, 0x0000000B, 0x00002F59, 0x00004859, 0x00000A13, 0x00050084, 0x0000000B, 0x000000d4,0x0004003b,0x000000d5,0x000000d6,0x00000002,0x0004002b,0x00000006,0x000000d8,
0x000036A3, 0x00002F59, 0x00000A22, 0x000500C2, 0x0000000B, 0x0000387D, 0x00003241, 0x000036A3, 0x00000100,0x0004002b,0x00000006,0x000000eb,0x0000ffff,0x0004002b,0x00000006,0x0000010c,
0x000500C7, 0x0000000B, 0x00003CDC, 0x0000387D, 0x00000144, 0x000500C2, 0x0000000B, 0x00004D70, 0x00000200,0x0006002c,0x00000009,0x00000129,0x00000028,0x00000028,0x00000020,0x00050036,
0x000020A1, 0x00000A10, 0x000500C7, 0x0000000B, 0x00004B2B, 0x000020A1, 0x00000A13, 0x00050084, 0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000007,
0x0000000B, 0x00003722, 0x00004B2B, 0x00000A22, 0x000500C4, 0x0000000B, 0x00005A82, 0x00003CDC, 0x00000008,0x00000007,0x0004003b,0x00000007,0x0000001e,0x00000007,0x0004003b,0x00000007,
0x00003722, 0x000500AA, 0x00000009, 0x00003D0D, 0x00004B2B, 0x00000A0A, 0x000300F7, 0x00005193, 0x00000023,0x00000007,0x0004003b,0x00000007,0x00000026,0x00000007,0x0004003b,0x00000007,
0x00000000, 0x000400FA, 0x00003D0D, 0x00002F74, 0x00005193, 0x000200F8, 0x00002F74, 0x00050041, 0x0000002c,0x00000007,0x0004003b,0x00000007,0x00000031,0x00000007,0x0004003b,0x00000007,
0x0000028B, 0x0000541D, 0x00000FB1, 0x00004D70, 0x0003003E, 0x0000541D, 0x00005A82, 0x000200F9, 0x00000035,0x00000007,0x0004003b,0x00000007,0x0000003d,0x00000007,0x0004003b,0x00000007,
0x00005193, 0x000200F8, 0x00005193, 0x000400E0, 0x00000A10, 0x00000A10, 0x0000015F, 0x000500AB, 0x0000003e,0x00000007,0x0004003b,0x00000007,0x0000004e,0x00000007,0x0004003b,0x00000007,
0x00000009, 0x00003E3C, 0x00004B2B, 0x00000A0A, 0x000300F7, 0x00002386, 0x00000000, 0x000400FA, 0x00000056,0x00000007,0x0004003b,0x00000007,0x0000005a,0x00000007,0x0004003b,0x00000007,
0x00003E3C, 0x00003CBD, 0x00002386, 0x000200F8, 0x00003CBD, 0x00050041, 0x0000028B, 0x000025A5, 0x00000061,0x00000007,0x0004003b,0x00000007,0x00000065,0x00000007,0x0004003b,0x00000007,
0x00000FB1, 0x00004D70, 0x000700F1, 0x0000000B, 0x0000189F, 0x000025A5, 0x00000A0D, 0x00000A0A, 0x0000006c,0x00000007,0x0004003b,0x00000007,0x00000070,0x00000007,0x0004003b,0x00000007,
0x00005A82, 0x000200F9, 0x00002386, 0x000200F8, 0x00002386, 0x000400E0, 0x00000A10, 0x00000A10, 0x00000076,0x00000007,0x0004003b,0x00000007,0x0000008d,0x00000007,0x0004003b,0x00000007,
0x0000015F, 0x000300F7, 0x00004665, 0x00000000, 0x000400FA, 0x00003D0D, 0x00005192, 0x00004665, 0x00000091,0x00000007,0x0004003b,0x00000007,0x00000093,0x00000007,0x0004003b,0x00000007,
0x000200F8, 0x00005192, 0x00050084, 0x0000000B, 0x000029FB, 0x00003D0B, 0x00000147, 0x00050080, 0x0000009d,0x00000007,0x0004003b,0x00000007,0x000000a6,0x00000007,0x0004003b,0x00000007,
0x0000000B, 0x0000376A, 0x000029FB, 0x00004D70, 0x00050041, 0x0000028B, 0x000036D4, 0x00000FB1, 0x000000b0,0x00000007,0x0004003b,0x00000007,0x000000b3,0x00000007,0x0004003b,0x00000007,
0x00004D70, 0x0004003D, 0x0000000B, 0x00003C3D, 0x000036D4, 0x00060041, 0x0000028A, 0x00005BB5, 0x000000b6,0x00000007,0x0004003b,0x00000007,0x000000e1,0x00000007,0x0004003b,0x00000007,
0x00001592, 0x00000A0B, 0x0000376A, 0x0003003E, 0x00005BB5, 0x00003C3D, 0x000200F9, 0x00004665, 0x000000e5,0x00000007,0x0004003b,0x00000007,0x000000ed,0x00000007,0x0004003b,0x00000007,
0x000200F8, 0x00004665, 0x000200F9, 0x00004667, 0x000200F8, 0x0000401E, 0x00060041, 0x0000028A, 0x000000f0,0x00000007,0x0004003b,0x00000007,0x000000f3,0x00000007,0x00050041,0x0000000d,
0x00005A8A, 0x00000C50, 0x00000A0B, 0x00001D94, 0x0004003D, 0x0000000B, 0x00003242, 0x00005A8A, 0x0000000e,0x0000000b,0x0000000c,0x0004003d,0x00000006,0x0000000f,0x0000000e,0x0003003e,
0x000500C7, 0x0000000B, 0x00002F5A, 0x00004859, 0x00000A10, 0x00050084, 0x0000000B, 0x000036A4, 0x00000008,0x0000000f,0x0004003d,0x00000006,0x00000010,0x00000008,0x00050041,0x00000016,
0x00002F5A, 0x00000A22, 0x000500C2, 0x0000000B, 0x0000387E, 0x00003242, 0x000036A4, 0x000500C7, 0x00000017,0x00000013,0x00000015,0x0004003d,0x00000006,0x00000018,0x00000017,0x000500ae,
0x0000000B, 0x00003CDD, 0x0000387E, 0x000001C1, 0x000500C2, 0x0000000B, 0x00004D71, 0x000020A1, 0x00000019,0x0000001a,0x00000010,0x00000018,0x000300f7,0x0000001c,0x00000000,0x000400fa,
0x00000A0D, 0x000500C7, 0x0000000B, 0x00004B2C, 0x000020A1, 0x00000A0D, 0x00050084, 0x0000000B, 0x0000001a,0x0000001b,0x0000001c,0x000200f8,0x0000001b,0x000100fd,0x000200f8,0x0000001c,
0x00003723, 0x00004B2C, 0x00000A3A, 0x000500C4, 0x0000000B, 0x00005A83, 0x00003CDD, 0x00003723, 0x00050041,0x0000000d,0x00000021,0x0000001f,0x00000020,0x0004003d,0x00000006,0x00000022,
0x000500AA, 0x00000009, 0x00003D0E, 0x00004B2C, 0x00000A0A, 0x000300F7, 0x00005194, 0x00000000, 0x00000021,0x0003003e,0x0000001e,0x00000022,0x00050041,0x0000000d,0x00000024,0x0000001f,
0x000400FA, 0x00003D0E, 0x00002F75, 0x00005194, 0x000200F8, 0x00002F75, 0x00050041, 0x0000028B, 0x0000000c,0x0004003d,0x00000006,0x00000025,0x00000024,0x0003003e,0x00000023,0x00000025,
0x0000541E, 0x00000FB1, 0x00004D71, 0x0003003E, 0x0000541E, 0x00005A83, 0x000200F9, 0x00005194, 0x0004003d,0x00000006,0x00000027,0x0000001e,0x00050084,0x00000006,0x00000029,0x00000027,
0x000200F8, 0x00005194, 0x000400E0, 0x00000A10, 0x00000A10, 0x0000015F, 0x000500AB, 0x00000009, 0x00000028,0x0004003d,0x00000006,0x0000002a,0x00000023,0x00050080,0x00000006,0x0000002b,
0x00003E3D, 0x00004B2C, 0x00000A0A, 0x000300F7, 0x00002387, 0x00000000, 0x000400FA, 0x00003E3D, 0x00000029,0x0000002a,0x0003003e,0x00000026,0x0000002b,0x00050041,0x00000016,0x0000002e,
0x00003CBE, 0x00002387, 0x000200F8, 0x00003CBE, 0x00050041, 0x0000028B, 0x000025A6, 0x00000FB1, 0x00000013,0x0000002d,0x0004003d,0x00000006,0x0000002f,0x0000002e,0x000500c4,0x00000006,
0x00004D71, 0x000700F1, 0x0000000B, 0x000018A0, 0x000025A6, 0x00000A0D, 0x00000A0A, 0x00005A83, 0x00000030,0x00000020,0x0000002f,0x0003003e,0x0000002c,0x00000030,0x0004003d,0x00000006,
0x000200F9, 0x00002387, 0x000200F8, 0x00002387, 0x000400E0, 0x00000A10, 0x00000A10, 0x0000015F, 0x00000033,0x0000002c,0x00050084,0x00000006,0x00000034,0x00000032,0x00000033,0x0003003e,
0x000300F7, 0x00004666, 0x00000000, 0x000400FA, 0x00003D0E, 0x00005195, 0x00004666, 0x000200F8, 0x00000031,0x00000034,0x00050041,0x00000016,0x00000037,0x00000013,0x00000036,0x0004003d,
0x00005195, 0x00050084, 0x0000000B, 0x000029FC, 0x00003D0B, 0x00000447, 0x00050080, 0x0000000B, 0x00000006,0x00000038,0x00000037,0x00050041,0x00000016,0x0000003a,0x00000013,0x00000039,
0x0000376B, 0x000029FC, 0x00004D71, 0x00050041, 0x0000028B, 0x000036D5, 0x00000FB1, 0x00004D71, 0x0004003d,0x00000006,0x0000003b,0x0000003a,0x00050084,0x00000006,0x0000003c,0x00000038,
0x0004003D, 0x0000000B, 0x00003C3E, 0x000036D5, 0x00060041, 0x0000028A, 0x00005BB6, 0x00001592, 0x0000003b,0x0003003e,0x00000035,0x0000003c,0x0003003e,0x0000003d,0x0000000c,0x0003003e,
0x00000A0B, 0x0000376B, 0x0003003E, 0x00005BB6, 0x00003C3E, 0x000200F9, 0x00004666, 0x000200F8, 0x0000003e,0x0000000c,0x00050041,0x00000016,0x00000040,0x00000013,0x0000003f,0x0004003d,
0x00004666, 0x000200F9, 0x00004667, 0x000200F8, 0x0000401F, 0x00060041, 0x0000028A, 0x00005099, 0x00000006,0x00000041,0x00000040,0x000500ab,0x00000019,0x00000042,0x00000041,0x0000000c,
0x00000C50, 0x00000A0B, 0x00001D94, 0x0004003D, 0x0000000B, 0x00003D1E, 0x00005099, 0x00060041, 0x0004003d,0x00000006,0x00000043,0x00000035,0x000500ac,0x00000019,0x00000044,0x00000043,
0x0000028A, 0x00005BB7, 0x00001592, 0x00000A0B, 0x0000237D, 0x0003003E, 0x00005BB7, 0x00003D1E, 0x00000020,0x000500a7,0x00000019,0x00000045,0x00000042,0x00000044,0x000300f7,0x00000047,
0x000200F9, 0x00004667, 0x000200F8, 0x00001FDE, 0x00060041, 0x0000028A, 0x0000509A, 0x00000C50, 0x00000000,0x000400fa,0x00000045,0x00000046,0x00000047,0x000200f8,0x00000046,0x00050041,
0x00000A0B, 0x00001D94, 0x0004003D, 0x0000000B, 0x00003D1F, 0x0000509A, 0x00060041, 0x0000028A, 0x00000016,0x00000048,0x00000013,0x00000036,0x0004003d,0x00000006,0x00000049,0x00000048,
0x000052BA, 0x00001592, 0x00000A0B, 0x0000237D, 0x0003003E, 0x000052BA, 0x00003D1F, 0x00050080, 0x000500c2,0x00000006,0x0000004a,0x00000049,0x00000020,0x0003003e,0x0000003d,0x0000004a,
0x0000000B, 0x00004CE6, 0x0000237D, 0x00000A0D, 0x00050080, 0x0000000B, 0x00003448, 0x00001D94, 0x00050041,0x00000016,0x0000004b,0x00000013,0x00000039,0x0004003d,0x00000006,0x0000004c,
0x00000A0D, 0x00060041, 0x0000028A, 0x00002A3A, 0x00000C50, 0x00000A0B, 0x00003448, 0x0004003D, 0x0000004b,0x000500c2,0x00000006,0x0000004d,0x0000004c,0x00000020,0x0003003e,0x0000003e,
0x0000000B, 0x00003C3F, 0x00002A3A, 0x00060041, 0x0000028A, 0x00005BB8, 0x00001592, 0x00000A0B, 0x0000004d,0x000200f9,0x00000047,0x000200f8,0x00000047,0x0004003d,0x00000006,0x0000004f,
0x00004CE6, 0x0003003E, 0x00005BB8, 0x00003C3F, 0x000200F9, 0x00004667, 0x000200F8, 0x00004667, 0x00000008,0x0004003d,0x00000006,0x00000050,0x00000031,0x00050084,0x00000006,0x00000051,
0x000200F9, 0x00003A37, 0x000200F8, 0x00003A37, 0x000100FD, 0x00010038, 0x0000004f,0x00000050,0x0004003d,0x00000006,0x00000052,0x00000026,0x0004003d,0x00000006,
0x00000053,0x0000002c,0x00050084,0x00000006,0x00000054,0x00000052,0x00000053,0x00050080,
0x00000006,0x00000055,0x00000051,0x00000054,0x0003003e,0x0000004e,0x00000055,0x0004003d,
0x00000006,0x00000057,0x0000004e,0x000500c2,0x00000006,0x00000059,0x00000057,0x00000058,
0x0003003e,0x00000056,0x00000059,0x0004003d,0x00000006,0x0000005b,0x0000004e,0x000500c7,
0x00000006,0x0000005d,0x0000005b,0x0000005c,0x00050041,0x00000016,0x0000005e,0x00000013,
0x0000002d,0x0004003d,0x00000006,0x0000005f,0x0000005e,0x000500c2,0x00000006,0x00000060,
0x0000005d,0x0000005f,0x0003003e,0x0000005a,0x00000060,0x00050041,0x00000016,0x00000062,
0x00000013,0x0000002d,0x0004003d,0x00000006,0x00000063,0x00000062,0x00050082,0x00000006,
0x00000064,0x00000058,0x00000063,0x0003003e,0x00000061,0x00000064,0x00050041,0x00000016,
0x00000066,0x00000013,0x00000036,0x0004003d,0x00000006,0x00000067,0x00000066,0x0004003d,
0x00000006,0x00000068,0x0000005a,0x00050084,0x00000006,0x00000069,0x00000067,0x00000068,
0x0004003d,0x00000006,0x0000006a,0x0000003d,0x00050080,0x00000006,0x0000006b,0x00000069,
0x0000006a,0x0003003e,0x00000065,0x0000006b,0x0004003d,0x00000006,0x0000006d,0x00000065,
0x0004003d,0x00000006,0x0000006e,0x00000061,0x000500c2,0x00000006,0x0000006f,0x0000006d,
0x0000006e,0x0003003e,0x0000006c,0x0000006f,0x0004003d,0x00000006,0x00000071,0x00000065,
0x0004003d,0x00000006,0x00000072,0x00000061,0x000500c4,0x00000006,0x00000073,0x00000020,
0x00000072,0x00050082,0x00000006,0x00000074,0x00000073,0x00000020,0x000500c7,0x00000006,
0x00000075,0x00000071,0x00000074,0x0003003e,0x00000070,0x00000075,0x00050041,0x00000016,
0x00000078,0x00000013,0x00000077,0x0004003d,0x00000006,0x00000079,0x00000078,0x0004003d,
0x00000006,0x0000007a,0x00000056,0x0004003d,0x00000006,0x0000007b,0x00000035,0x000500c4,
0x00000006,0x0000007c,0x0000007b,0x00000058,0x00050084,0x00000006,0x0000007d,0x0000007a,
0x0000007c,0x00050080,0x00000006,0x0000007e,0x00000079,0x0000007d,0x0004003d,0x00000006,
0x0000007f,0x0000006c,0x00050041,0x00000016,0x00000080,0x00000013,0x00000039,0x0004003d,
0x00000006,0x00000081,0x00000080,0x00050084,0x00000006,0x00000082,0x0000007f,0x00000081,
0x0004003d,0x00000006,0x00000083,0x0000003e,0x00050080,0x00000006,0x00000084,0x00000082,
0x00000083,0x00050084,0x00000006,0x00000086,0x00000084,0x00000085,0x00050080,0x00000006,
0x00000087,0x0000007e,0x00000086,0x0004003d,0x00000006,0x00000088,0x00000070,0x00050041,
0x00000016,0x00000089,0x00000013,0x0000002d,0x0004003d,0x00000006,0x0000008a,0x00000089,
0x000500c4,0x00000006,0x0000008b,0x00000088,0x0000008a,0x00050080,0x00000006,0x0000008c,
0x00000087,0x0000008b,0x0003003e,0x00000076,0x0000008c,0x0004003d,0x00000006,0x0000008e,
0x00000076,0x000500c2,0x00000006,0x00000090,0x0000008e,0x0000008f,0x0003003e,0x0000008d,
0x00000090,0x0004003d,0x00000006,0x00000092,0x0000004e,0x0003003e,0x00000091,0x00000092,
0x0004003d,0x00000006,0x00000094,0x00000091,0x000500c2,0x00000006,0x00000095,0x00000094,
0x0000008f,0x0003003e,0x00000093,0x00000095,0x00050041,0x00000016,0x00000096,0x00000013,
0x0000002d,0x0004003d,0x00000006,0x00000097,0x00000096,0x000300f7,0x0000009c,0x00000000,
0x000b00fb,0x00000097,0x0000009c,0x00000000,0x00000098,0x00000001,0x00000099,0x00000002,
0x0000009a,0x00000003,0x0000009b,0x000200f8,0x00000098,0x0004003d,0x00000006,0x000000a2,
0x0000008d,0x00060041,0x000000a3,0x000000a4,0x000000a1,0x00000036,0x000000a2,0x0004003d,
0x00000006,0x000000a5,0x000000a4,0x0003003e,0x0000009d,0x000000a5,0x0004003d,0x00000006,
0x000000a7,0x0000009d,0x0004003d,0x00000006,0x000000a8,0x00000076,0x000500c7,0x00000006,
0x000000aa,0x000000a8,0x000000a9,0x00050084,0x00000006,0x000000ac,0x000000aa,0x000000ab,
0x000500c2,0x00000006,0x000000ad,0x000000a7,0x000000ac,0x000500c7,0x00000006,0x000000af,
0x000000ad,0x000000ae,0x0003003e,0x000000a6,0x000000af,0x0004003d,0x00000006,0x000000b1,
0x00000026,0x000500c2,0x00000006,0x000000b2,0x000000b1,0x0000008f,0x0003003e,0x000000b0,
0x000000b2,0x0004003d,0x00000006,0x000000b4,0x00000026,0x000500c7,0x00000006,0x000000b5,
0x000000b4,0x000000a9,0x0003003e,0x000000b3,0x000000b5,0x0004003d,0x00000006,0x000000b7,
0x000000a6,0x0004003d,0x00000006,0x000000b8,0x000000b3,0x00050084,0x00000006,0x000000b9,
0x000000b8,0x000000ab,0x000500c4,0x00000006,0x000000ba,0x000000b7,0x000000b9,0x0003003e,
0x000000b6,0x000000ba,0x0004003d,0x00000006,0x000000bb,0x000000b3,0x000500aa,0x00000019,
0x000000bc,0x000000bb,0x0000000c,0x000300f7,0x000000be,0x00000000,0x000400fa,0x000000bc,
0x000000bd,0x000000be,0x000200f8,0x000000bd,0x0004003d,0x00000006,0x000000c2,0x000000b0,
0x0004003d,0x00000006,0x000000c3,0x000000b6,0x00050041,0x000000c4,0x000000c5,0x000000c1,
0x000000c2,0x0003003e,0x000000c5,0x000000c3,0x000200f9,0x000000be,0x000200f8,0x000000be,
0x000400e0,0x0000008f,0x0000008f,0x000000c6,0x0004003d,0x00000006,0x000000c7,0x000000b3,
0x000500ab,0x00000019,0x000000c8,0x000000c7,0x0000000c,0x000300f7,0x000000ca,0x00000000,
0x000400fa,0x000000c8,0x000000c9,0x000000ca,0x000200f8,0x000000c9,0x0004003d,0x00000006,
0x000000cb,0x000000b0,0x00050041,0x000000c4,0x000000cc,0x000000c1,0x000000cb,0x0004003d,
0x00000006,0x000000cd,0x000000b6,0x000700f1,0x00000006,0x000000ce,0x000000cc,0x00000020,
0x0000000c,0x000000cd,0x000200f9,0x000000ca,0x000200f8,0x000000ca,0x000400e0,0x0000008f,
0x0000008f,0x000000c6,0x0004003d,0x00000006,0x000000cf,0x000000b3,0x000500aa,0x00000019,
0x000000d0,0x000000cf,0x0000000c,0x000300f7,0x000000d2,0x00000000,0x000400fa,0x000000d0,
0x000000d1,0x000000d2,0x000200f8,0x000000d1,0x0004003d,0x00000006,0x000000d7,0x00000008,
0x00050084,0x00000006,0x000000d9,0x000000d7,0x000000d8,0x0004003d,0x00000006,0x000000da,
0x000000b0,0x00050080,0x00000006,0x000000db,0x000000d9,0x000000da,0x0004003d,0x00000006,
0x000000dc,0x000000b0,0x00050041,0x000000c4,0x000000dd,0x000000c1,0x000000dc,0x0004003d,
0x00000006,0x000000de,0x000000dd,0x00060041,0x000000a3,0x000000df,0x000000d6,0x00000036,
0x000000db,0x0003003e,0x000000df,0x000000de,0x000200f9,0x000000d2,0x000200f8,0x000000d2,
0x000200f9,0x0000009c,0x000200f8,0x00000099,0x0004003d,0x00000006,0x000000e2,0x0000008d,
0x00060041,0x000000a3,0x000000e3,0x000000a1,0x00000036,0x000000e2,0x0004003d,0x00000006,
0x000000e4,0x000000e3,0x0003003e,0x000000e1,0x000000e4,0x0004003d,0x00000006,0x000000e6,
0x000000e1,0x0004003d,0x00000006,0x000000e7,0x00000076,0x000500c7,0x00000006,0x000000e8,
0x000000e7,0x0000008f,0x00050084,0x00000006,0x000000e9,0x000000e8,0x000000ab,0x000500c2,
0x00000006,0x000000ea,0x000000e6,0x000000e9,0x000500c7,0x00000006,0x000000ec,0x000000ea,
0x000000eb,0x0003003e,0x000000e5,0x000000ec,0x0004003d,0x00000006,0x000000ee,0x00000026,
0x000500c2,0x00000006,0x000000ef,0x000000ee,0x00000020,0x0003003e,0x000000ed,0x000000ef,
0x0004003d,0x00000006,0x000000f1,0x00000026,0x000500c7,0x00000006,0x000000f2,0x000000f1,
0x00000020,0x0003003e,0x000000f0,0x000000f2,0x0004003d,0x00000006,0x000000f4,0x000000e5,
0x0004003d,0x00000006,0x000000f5,0x000000f0,0x00050084,0x00000006,0x000000f6,0x000000f5,
0x00000085,0x000500c4,0x00000006,0x000000f7,0x000000f4,0x000000f6,0x0003003e,0x000000f3,
0x000000f7,0x0004003d,0x00000006,0x000000f8,0x000000f0,0x000500aa,0x00000019,0x000000f9,
0x000000f8,0x0000000c,0x000300f7,0x000000fb,0x00000000,0x000400fa,0x000000f9,0x000000fa,
0x000000fb,0x000200f8,0x000000fa,0x0004003d,0x00000006,0x000000fc,0x000000ed,0x0004003d,
0x00000006,0x000000fd,0x000000f3,0x00050041,0x000000c4,0x000000fe,0x000000c1,0x000000fc,
0x0003003e,0x000000fe,0x000000fd,0x000200f9,0x000000fb,0x000200f8,0x000000fb,0x000400e0,
0x0000008f,0x0000008f,0x000000c6,0x0004003d,0x00000006,0x000000ff,0x000000f0,0x000500ab,
0x00000019,0x00000100,0x000000ff,0x0000000c,0x000300f7,0x00000102,0x00000000,0x000400fa,
0x00000100,0x00000101,0x00000102,0x000200f8,0x00000101,0x0004003d,0x00000006,0x00000103,
0x000000ed,0x00050041,0x000000c4,0x00000104,0x000000c1,0x00000103,0x0004003d,0x00000006,
0x00000105,0x000000f3,0x000700f1,0x00000006,0x00000106,0x00000104,0x00000020,0x0000000c,
0x00000105,0x000200f9,0x00000102,0x000200f8,0x00000102,0x000400e0,0x0000008f,0x0000008f,
0x000000c6,0x0004003d,0x00000006,0x00000107,0x000000f0,0x000500aa,0x00000019,0x00000108,
0x00000107,0x0000000c,0x000300f7,0x0000010a,0x00000000,0x000400fa,0x00000108,0x00000109,
0x0000010a,0x000200f8,0x00000109,0x0004003d,0x00000006,0x0000010b,0x00000008,0x00050084,
0x00000006,0x0000010d,0x0000010b,0x0000010c,0x0004003d,0x00000006,0x0000010e,0x000000ed,
0x00050080,0x00000006,0x0000010f,0x0000010d,0x0000010e,0x0004003d,0x00000006,0x00000110,
0x000000ed,0x00050041,0x000000c4,0x00000111,0x000000c1,0x00000110,0x0004003d,0x00000006,
0x00000112,0x00000111,0x00060041,0x000000a3,0x00000113,0x000000d6,0x00000036,0x0000010f,
0x0003003e,0x00000113,0x00000112,0x000200f9,0x0000010a,0x000200f8,0x0000010a,0x000200f9,
0x0000009c,0x000200f8,0x0000009a,0x0004003d,0x00000006,0x00000115,0x00000093,0x0004003d,
0x00000006,0x00000116,0x0000008d,0x00060041,0x000000a3,0x00000117,0x000000a1,0x00000036,
0x00000116,0x0004003d,0x00000006,0x00000118,0x00000117,0x00060041,0x000000a3,0x00000119,
0x000000d6,0x00000036,0x00000115,0x0003003e,0x00000119,0x00000118,0x000200f9,0x0000009c,
0x000200f8,0x0000009b,0x0004003d,0x00000006,0x0000011b,0x00000093,0x0004003d,0x00000006,
0x0000011c,0x0000008d,0x00060041,0x000000a3,0x0000011d,0x000000a1,0x00000036,0x0000011c,
0x0004003d,0x00000006,0x0000011e,0x0000011d,0x00060041,0x000000a3,0x0000011f,0x000000d6,
0x00000036,0x0000011b,0x0003003e,0x0000011f,0x0000011e,0x0004003d,0x00000006,0x00000120,
0x00000093,0x00050080,0x00000006,0x00000121,0x00000120,0x00000020,0x0004003d,0x00000006,
0x00000122,0x0000008d,0x00050080,0x00000006,0x00000123,0x00000122,0x00000020,0x00060041,
0x000000a3,0x00000124,0x000000a1,0x00000036,0x00000123,0x0004003d,0x00000006,0x00000125,
0x00000124,0x00060041,0x000000a3,0x00000126,0x000000d6,0x00000036,0x00000121,0x0003003e,
0x00000126,0x00000125,0x000200f9,0x0000009c,0x000200f8,0x0000009c,0x000100fd,0x00010038
}; };

View file

@ -5214,7 +5214,12 @@ bool VulkanCommandProcessor::IssueCopy() {
ResolveAutoReadbackMode(GetReadbackResolveMode(REXCVAR_GET(vulkan_readback_resolve)), ResolveAutoReadbackMode(GetReadbackResolveMode(REXCVAR_GET(vulkan_readback_resolve)),
kernel_state_); kernel_state_);
const bool gameplay_state_active = IsGameplayStateActive(kernel_state_); const bool gameplay_state_active = IsGameplayStateActive(kernel_state_);
if (readback_mode == ReadbackResolveMode::kDisabled && // The app layer arms this around CPU screenshot grabs (Skate 3 photo flow);
// resolves within its length bound must take the readback path regardless
// of gameplay/scaling state.
const bool force_readback_window =
REXCVAR_GET(native_render_force_resolve_readback_max_length) > 0;
if (readback_mode == ReadbackResolveMode::kDisabled && !force_readback_window &&
(!texture_cache_->IsDrawResolutionScaled() || gameplay_state_active)) { (!texture_cache_->IsDrawResolutionScaled() || gameplay_state_active)) {
uint32_t written_address = 0; uint32_t written_address = 0;
uint32_t written_length = 0; uint32_t written_length = 0;
@ -5543,6 +5548,7 @@ bool VulkanCommandProcessor::IssueCopy_ReadbackResolvePath() {
kernel_state_); kernel_state_);
bool force_scaled_resolve_sync_only = false; bool force_scaled_resolve_sync_only = false;
bool force_scaled_resolve_cpu_copy = false; bool force_scaled_resolve_cpu_copy = false;
bool force_window_cpu_copy = false;
if (readback_mode == ReadbackResolveMode::kDisabled) { if (readback_mode == ReadbackResolveMode::kDisabled) {
constexpr uint32_t kImportSkaterPreviewResolveAddress = UINT32_C(0x04911000); constexpr uint32_t kImportSkaterPreviewResolveAddress = UINT32_C(0x04911000);
constexpr uint32_t kImportSkaterPreviewResolveLength = UINT32_C(0x2D0000); constexpr uint32_t kImportSkaterPreviewResolveLength = UINT32_C(0x2D0000);
@ -5550,14 +5556,26 @@ bool VulkanCommandProcessor::IssueCopy_ReadbackResolvePath() {
!IsGameplayStateActive(kernel_state_) && is_scaled && !IsGameplayStateActive(kernel_state_) && is_scaled &&
written_address == kImportSkaterPreviewResolveAddress && written_address == kImportSkaterPreviewResolveAddress &&
written_length == kImportSkaterPreviewResolveLength; written_length == kImportSkaterPreviewResolveLength;
if (!force_scaled_resolve_cpu_copy) { // App-armed readback window (Skate 3 photo grab): the game CPU-reads the
// resolved 1152x640 PostFX screenshot target (also 0x04911000) while the
// gameplay presence context is still 1 (photo missions), so the targeted
// Import-Skater branch above never fires there. Bounded by length so
// framebuffer-sized resolves stay excluded.
const int32_t force_readback_max_length =
REXCVAR_GET(native_render_force_resolve_readback_max_length);
force_window_cpu_copy = force_readback_max_length > 0 &&
written_length <= uint32_t(force_readback_max_length);
if (!force_scaled_resolve_cpu_copy && !force_window_cpu_copy) {
log_readback_decision("disabled-after-resolve", readback_mode); log_readback_decision("disabled-after-resolve", readback_mode);
return true; return true;
} }
readback_mode = ReadbackResolveMode::kFull; readback_mode = ReadbackResolveMode::kFull;
force_scaled_resolve_sync_only = true; force_scaled_resolve_sync_only = true;
log_readback_decision("targeted-scaled-resolve-full", readback_mode, false, true, log_readback_decision(
kImportSkaterPreviewResolveLength); force_scaled_resolve_cpu_copy ? "targeted-scaled-resolve-full" : "forced-window-full",
readback_mode, false, true,
force_scaled_resolve_cpu_copy ? kImportSkaterPreviewResolveLength
: uint32_t(force_readback_max_length));
} }
const int32_t max_readback_length = REXCVAR_GET(vulkan_readback_resolve_max_length); const int32_t max_readback_length = REXCVAR_GET(vulkan_readback_resolve_max_length);
@ -5842,7 +5860,8 @@ bool VulkanCommandProcessor::IssueCopy_ReadbackResolvePath() {
} }
bool should_copy = bool should_copy =
(!force_scaled_resolve_sync_only || force_scaled_resolve_cpu_copy) && (!force_scaled_resolve_sync_only || force_scaled_resolve_cpu_copy ||
force_window_cpu_copy) &&
((readback_mode == ReadbackResolveMode::kSome) ? is_cache_miss : true); ((readback_mode == ReadbackResolveMode::kSome) ? is_cache_miss : true);
log_readback_decision(should_copy ? "copy-guest-memory" : "cache-hit-skip", readback_mode, log_readback_decision(should_copy ? "copy-guest-memory" : "cache-hit-skip", readback_mode,
is_cache_miss, should_copy, uint32_t(resolve_key)); is_cache_miss, should_copy, uint32_t(resolve_key));