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(std::string, readback_resolve);
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_fast);
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)
.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",
"Enable CPU readback of shader memexport writes for guest memory "
"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));
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)) {
uint32_t written_address, written_length;
// 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 &&
written_address == kImportSkaterPreviewResolveAddress &&
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;
}
readback_mode = ReadbackResolveMode::kFull;

View file

@ -1,6 +1,30 @@
#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:
@ -15,7 +39,7 @@
// -------------------- ----- ------ -------- -------- ------- ------
// no Output
cs_5_1
dcl_globalFlags refactoringAllowed | allResourcesBound
dcl_globalFlags refactoringAllowed
dcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0
dcl_resource_raw T0[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
uge r0.x, vThreadGroupID.x, CB0[0][0].w
if_nz r0.x
ret
endif
ret
endif
imad r0.x, vThreadIDInGroup.y, l(32), vThreadIDInGroup.x
ishl r0.yz, l(0, 1, 1024, 0), CB0[0][0].zzzz
imul null, r0.w, CB0[0][0].y, CB0[0][0].x
ine r1.y, CB0[0][1].x, l(0)
ult r1.z, l(1), r0.w
and r1.y, r1.z, r1.y
if_nz r1.y
ushr r1.yz, CB0[0][0].xxyx, l(0, 1, 1, 0)
imad r1.y, r1.z, CB0[0][0].x, r1.y
else
mov r1.y, l(0)
endif
imul null, r1.xz, r0.wwyw, r0.zzxz
imul null, r0.w, r0.w, r1.z
imad r0.w, vThreadGroupID.x, r1.x, r0.w
imad r0.y, r1.y, r0.y, r0.w
ine r1.x, CB0[0][1].x, l(0)
ult r1.y, l(1), r0.w
and r1.x, r1.y, r1.x
if_nz r1.x
ushr r1.xy, CB0[0][0].xyxx, l(1, 1, 0, 0)
else
mov r1.xy, l(0,0,0,0)
endif
imul null, r0.y, r0.y, r0.x
imad r0.y, vThreadGroupID.x, r0.z, r0.y
ushr r0.z, r0.y, l(4)
and r1.z, r0.y, l(15)
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)
if_nz r0.w
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
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 r1.x, r0.x, l(2)
and r1.z, r0.x, l(3)
bfi r0.w, l(8), r1.w, r0.w, l(0)
if_z r1.z
store_structured g0.x, r1.x, l(0), r0.w
endif
endif
sync_g_t
if_nz r1.z
mov r1.y, l(0)
atomic_or g0, r1.xyxx, r0.w
endif
endif
sync_g_t
if_z r1.z
and r0.w, r0.x, l(1020)
imad r0.w, vThreadGroupID.x, l(1024), r0.w
ld_structured r1.x, r1.x, l(0), g0.xxxx
store_raw U0[0].x, r0.w, r1.x
endif
else
and r0.w, r0.y, l(-4)
endif
else
and r0.w, r0.z, l(-4)
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)
ushr r0.w, r0.w, r1.x
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)
if_z r1.z
store_structured g0.x, r1.x, l(0), r0.x
endif
endif
sync_g_t
if_nz r1.z
mov r1.y, l(0)
atomic_or g0, r1.xyxx, r0.x
endif
endif
sync_g_t
if_z r1.z
ishl r0.x, r1.x, l(2)
imad r0.x, vThreadGroupID.x, l(2048), r0.x
ld_structured r0.w, r1.x, l(0), g0.xxxx
store_raw U0[0].x, r0.x, r0.w
endif
endif
else
imad r0.z, vThreadGroupID.x, r0.z, r1.z
endif
endif
else
ieq r0.x, CB0[0][0].z, l(2)
if_nz r0.x
ld_raw r0.x, r0.y, T0[0].xxxx
store_raw U0[0].x, r0.z, r0.x
else
ld_raw r0.x, r0.z, T0[0].xxxx
store_raw U0[0].x, r0.y, r0.x
else
ieq r0.x, CB0[0][0].z, l(3)
if_nz r0.x
ld_raw r0.xy, r0.y, T0[0].xyxx
store_raw U0[0].xy, r0.z, r0.xyxx
endif
endif
endif
ret
// Approximately 0 instruction slots used
ld_raw r0.xz, r0.z, T0[0].xxyx
store_raw U0[0].xy, r0.y, r0.xzxx
endif
endif
endif
ret
// Approximately 94 instruction slots used
#endif
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,
76, 0, 0, 0, 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,
80, 8, 0, 0, 81, 0, 5, 0, 20, 2, 0, 0, 106, 8, 8, 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, 34, 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, 66, 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, 34, 0, 16, 0,
1, 0, 0, 0, 42, 0, 16, 0, 1, 0, 0, 0, 26, 0, 16, 0, 1, 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, 6, 129, 48, 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,
35, 0, 0, 11, 34, 0, 16, 0, 1, 0, 0, 0, 42, 0, 16, 0, 1, 0, 0, 0,
10, 128, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 16, 0,
1, 0, 0, 0, 18, 0, 0, 1, 54, 0, 0, 5, 34, 0, 16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 0, 0, 0, 0, 21, 0, 0, 1, 38, 0, 0, 8, 0, 208, 0, 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, 38, 0, 0, 8, 0, 208, 0, 0, 130, 0, 16, 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,
130, 0, 16, 0, 0, 0, 0, 0, 10, 16, 2, 0, 10, 0, 16, 0, 1, 0, 0, 0,
58, 0, 16, 0, 0, 0, 0, 0, 35, 0, 0, 9, 34, 0, 16, 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, 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, 26, 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, 86, 1, 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, 26, 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, 26, 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, 35, 0, 0, 8,
66, 0, 16, 0, 0, 0, 0, 0, 10, 16, 2, 0, 42, 0, 16, 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,
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, 26, 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, 42, 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, 50, 0, 16, 0,
0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 70, 112, 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,
42, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 21, 0, 0, 1,
21, 0, 0, 1, 21, 0, 0, 1, 62, 0, 0, 1};
const BYTE resolve_downscale_cs[] =
{
68, 88, 66, 67, 138, 22,
160, 35, 69, 243, 236, 133,
116, 189, 71, 210, 139, 14,
226, 43, 1, 0, 0, 0,
24, 13, 0, 0, 5, 0,
0, 0, 52, 0, 0, 0,
228, 2, 0, 0, 244, 2,
0, 0, 4, 3, 0, 0,
124, 12, 0, 0, 82, 68,
69, 70, 168, 2, 0, 0,
1, 0, 0, 0, 244, 0,
0, 0, 3, 0, 0, 0,
60, 0, 0, 0, 1, 5,
83, 67, 0, 133, 0, 0,
125, 2, 0, 0, 19, 19,
68, 37, 60, 0, 0, 0,
24, 0, 0, 0, 40, 0,
0, 0, 40, 0, 0, 0,
36, 0, 0, 0, 12, 0,
0, 0, 0, 0, 0, 0,
180, 0, 0, 0, 7, 0,
0, 0, 6, 0, 0, 0,
1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 198, 0,
0, 0, 8, 0, 0, 0,
6, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 214, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
120, 101, 95, 114, 101, 115,
111, 108, 118, 101, 95, 115,
111, 117, 114, 99, 101, 0,
120, 101, 95, 114, 101, 115,
111, 108, 118, 101, 95, 100,
101, 115, 116, 0, 88, 101,
82, 101, 115, 111, 108, 118,
101, 68, 111, 119, 110, 115,
99, 97, 108, 101, 67, 111,
110, 115, 116, 97, 110, 116,
115, 0, 171, 171, 214, 0,
0, 0, 5, 0, 0, 0,
12, 1, 0, 0, 32, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 212, 1,
0, 0, 0, 0, 0, 0,
4, 0, 0, 0, 2, 0,
0, 0, 240, 1, 0, 0,
0, 0, 0, 0, 255, 255,
255, 255, 0, 0, 0, 0,
255, 255, 255, 255, 0, 0,
0, 0, 20, 2, 0, 0,
4, 0, 0, 0, 4, 0,
0, 0, 2, 0, 0, 0,
240, 1, 0, 0, 0, 0,
0, 0, 255, 255, 255, 255,
0, 0, 0, 0, 255, 255,
255, 255, 0, 0, 0, 0,
41, 2, 0, 0, 8, 0,
0, 0, 4, 0, 0, 0,
2, 0, 0, 0, 240, 1,
0, 0, 0, 0, 0, 0,
255, 255, 255, 255, 0, 0,
0, 0, 255, 255, 255, 255,
0, 0, 0, 0, 70, 2,
0, 0, 12, 0, 0, 0,
4, 0, 0, 0, 2, 0,
0, 0, 240, 1, 0, 0,
0, 0, 0, 0, 255, 255,
255, 255, 0, 0, 0, 0,
255, 255, 255, 255, 0, 0,
0, 0, 94, 2, 0, 0,
16, 0, 0, 0, 4, 0,
0, 0, 2, 0, 0, 0,
240, 1, 0, 0, 0, 0,
0, 0, 255, 255, 255, 255,
0, 0, 0, 0, 255, 255,
255, 255, 0, 0, 0, 0,
120, 101, 95, 100, 111, 119,
110, 115, 99, 97, 108, 101,
95, 115, 99, 97, 108, 101,
95, 120, 0, 100, 119, 111,
114, 100, 0, 171, 0, 0,
19, 0, 1, 0, 1, 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,
233, 1, 0, 0, 120, 101,
95, 100, 111, 119, 110, 115,
99, 97, 108, 101, 95, 115,
99, 97, 108, 101, 95, 121,
0, 120, 101, 95, 100, 111,
119, 110, 115, 99, 97, 108,
101, 95, 112, 105, 120, 101,
108, 95, 115, 105, 122, 101,
95, 108, 111, 103, 50, 0,
120, 101, 95, 100, 111, 119,
110, 115, 99, 97, 108, 101,
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.
// 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.
// When xe_downscale_half_pixel_offset is set, samples from (scale/2, scale/2)
// within each block to compensate for the half-pixel offset becoming a
// full-pixel offset at higher resolutions.
// Scaled resolve buffer layout (established from the resolve write shaders,
// e.g. resolve_fast_32bpp_1x2xmsaa_scaled, and the scaled texture load
// shaders; they must agree, and both use this):
//
// 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;
@ -27,10 +55,7 @@ layout(push_constant) uniform ResolveDownscaleConstants {
uint xe_downscale_tile_count; // Number of 32x32 tiles to process
uint xe_downscale_source_offset_bytes; // Byte offset into source buffer
// When non-zero, apply half-pixel offset correction by sampling from
// (scale/2, scale/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.
// (scale_x/2, scale_y/2) within each scaled block instead of (0, 0).
uint xe_downscale_half_pixel_offset;
};
@ -62,32 +87,36 @@ void main() {
uint pixel_size = 1u << xe_downscale_pixel_size_log2;
uint tile_size_1x = 32u * 32u * pixel_size;
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.
// Without half-pixel correction: sample from (0, 0) = linear offset 0.
// With half-pixel correction: sample from (scale/2, scale/2) to compensate
// for the D3D9-style half-pixel offset shifting content by (N/2, N/2) pixels
// at Nx resolution.
uint block_sample_offset = 0u;
// Sub-position within each scale_x * scale_y block to sample from.
uint offset_x = 0u;
uint offset_y = 0u;
if (xe_downscale_half_pixel_offset != 0u && scale_xy > 1u) {
uint offset_x = xe_downscale_scale_x >> 1u;
uint offset_y = xe_downscale_scale_y >> 1u;
block_sample_offset = offset_x + offset_y * xe_downscale_scale_x;
offset_x = xe_downscale_scale_x >> 1u;
offset_y = xe_downscale_scale_y >> 1u;
}
// Source offset: base of the scaled block plus offset within block
// Add source_offset_bytes to handle buffer-relative addressing
// This must be done before division to preserve sub-dword byte position
// Guest-relative tiled byte address of this output pixel. Both the source
// range (scaled by scale_xy) and the destination range start at the same
// 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 +
tile_index * tile_size_scaled +
pixel_index * pixel_size * scale_xy +
block_sample_offset * pixel_size;
unit * (scale_xy << 4u) +
(sub_x * xe_downscale_scale_y + offset_y) * 16u +
(texel_in_scaled_unit << xe_downscale_pixel_size_log2);
uint src_offset = src_byte_offset >> 2u;
// Destination offset in 1x buffer
uint dst_byte_offset = tile_index * tile_size_1x +
pixel_index * pixel_size;
uint dst_byte_offset = guest_byte_offset;
uint dst_offset = dst_byte_offset >> 2u;
// Copy pixel based on size

View file

@ -11,10 +11,38 @@
// Operates on 32x32 tiled data format used by Xbox 360.
// 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.
// When xe_downscale_half_pixel_offset is set, samples from (scale/2, scale/2)
// within each block to compensate for the half-pixel offset becoming a
// full-pixel offset at higher resolutions.
// Scaled resolve buffer layout (established from the resolve write shaders,
// e.g. resolve_fast_32bpp_1x2xmsaa_scaled, and the scaled texture load
// shaders; they must agree, and both use this):
//
// 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) {
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_tile_count; // Number of 32x32 tiles to process
// When non-zero, apply half-pixel offset correction by sampling from
// (scale/2, scale/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.
// (scale_x/2, scale_y/2) within each scaled block instead of (0, 0).
uint xe_downscale_half_pixel_offset;
};
@ -33,7 +58,6 @@ ByteAddressBuffer xe_resolve_source : register(t0);
RWByteAddressBuffer xe_resolve_dest : register(u0);
// 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
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 tile_size_1x = 32 * 32 * pixel_size;
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.
// Without half-pixel correction: sample from (0, 0) = linear offset 0.
// With half-pixel correction: sample from (scale/2, scale/2) to compensate
// for the D3D9-style half-pixel offset shifting content by (N/2, N/2) pixels
// at Nx resolution.
uint block_sample_offset = 0u;
// Sub-position within each scale_x * scale_y block to sample from.
uint offset_x = 0u;
uint offset_y = 0u;
[branch] if (xe_downscale_half_pixel_offset != 0u && scale_xy > 1u) {
uint offset_x = xe_downscale_scale_x >> 1u;
uint offset_y = xe_downscale_scale_y >> 1u;
block_sample_offset = offset_x + offset_y * xe_downscale_scale_x;
offset_x = xe_downscale_scale_x >> 1u;
offset_y = xe_downscale_scale_y >> 1u;
}
// Source offset: base of the scaled block plus offset within block
uint src_offset = tile_index * tile_size_scaled +
pixel_index * pixel_size * scale_xy +
block_sample_offset * pixel_size;
// Guest-relative tiled byte address of this output pixel. Both the source
// range (scaled by scale_xy) and the destination range start at the same
// 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_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
uint dst_offset = tile_index * tile_size_1x +
pixel_index * pixel_size;
uint dst_offset = guest_byte_offset;
// Copy pixel based on size
[branch] switch (xe_downscale_pixel_size_log2) {

View file

@ -1,376 +1,238 @@
// Generated with `xb buildshaders`.
#if 0
; 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
// 1116.2.0
#pragma once
const uint32_t resolve_downscale_cs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x00006266, 0x00000000, 0x00020011, 0x00000001, 0x0006000B,
0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E, 0x00000000, 0x0003000E, 0x00000000, 0x00000001,
0x0007000F, 0x00000005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00000BEF, 0x00000DA3, 0x00060010,
0x0000161F, 0x00000011, 0x00000020, 0x00000020, 0x00000001, 0x00040047, 0x00000BEF, 0x0000000B,
0x0000001A, 0x00030047, 0x00000420, 0x00000002, 0x00050048, 0x00000420, 0x00000000, 0x00000023,
0x00000000, 0x00050048, 0x00000420, 0x00000001, 0x00000023, 0x00000004, 0x00050048, 0x00000420,
0x00000002, 0x00000023, 0x00000008, 0x00050048, 0x00000420, 0x00000003, 0x00000023, 0x0000000C,
0x00050048, 0x00000420, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000420, 0x00000005,
0x00000023, 0x00000014, 0x00040047, 0x00000DA3, 0x0000000B, 0x0000001B, 0x00040047, 0x000007D0,
0x00000006, 0x00000004, 0x00030047, 0x0000079C, 0x00000003, 0x00040048, 0x0000079C, 0x00000000,
0x00000018, 0x00050048, 0x0000079C, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000C50,
0x00000018, 0x00040047, 0x00000C50, 0x00000021, 0x00000000, 0x00040047, 0x00000C50, 0x00000022,
0x00000000, 0x00040047, 0x000007D1, 0x00000006, 0x00000004, 0x00030047, 0x0000079D, 0x00000003,
0x00040048, 0x0000079D, 0x00000000, 0x00000019, 0x00050048, 0x0000079D, 0x00000000, 0x00000023,
0x00000000, 0x00030047, 0x00001592, 0x00000019, 0x00040047, 0x00001592, 0x00000021, 0x00000001,
0x00040047, 0x00001592, 0x00000022, 0x00000000, 0x00040047, 0x000000FC, 0x0000000B, 0x00000019,
0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020,
0x00000000, 0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040020, 0x00000291, 0x00000001,
0x00000014, 0x0004003B, 0x00000291, 0x00000BEF, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A0A,
0x00000000, 0x00040020, 0x00000288, 0x00000001, 0x0000000B, 0x0008001E, 0x00000420, 0x0000000B,
0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x0000069D, 0x00000009,
0x00000420, 0x0004003B, 0x0000069D, 0x00001342, 0x00000009, 0x00040015, 0x0000000C, 0x00000020,
0x00000001, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x00040020, 0x00000289, 0x00000009,
0x0000000B, 0x00020014, 0x00000009, 0x0004003B, 0x00000291, 0x00000DA3, 0x00000001, 0x0004002B,
0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004002B,
0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A47, 0x00000400, 0x0004002B,
0x0000000C, 0x00000A0B, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,
0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,
0x0000000B, 0x00000A10, 0x00000002, 0x0003001D, 0x000007D0, 0x0000000B, 0x0003001E, 0x0000079C,
0x000007D0, 0x00040020, 0x00000A19, 0x00000002, 0x0000079C, 0x0004003B, 0x00000A19, 0x00000C50,
0x00000002, 0x00040020, 0x0000028A, 0x00000002, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A13,
0x00000003, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x00000144,
0x000000FF, 0x0004001C, 0x00000293, 0x0000000B, 0x00000A47, 0x00040020, 0x00000510, 0x00000004,
0x00000293, 0x0004003B, 0x00000510, 0x00000FB1, 0x00000004, 0x00040020, 0x0000028B, 0x00000004,
0x0000000B, 0x0004002B, 0x0000000B, 0x0000015F, 0x00000108, 0x0003001D, 0x000007D1, 0x0000000B,
0x0003001E, 0x0000079D, 0x000007D1, 0x00040020, 0x00000A1B, 0x00000002, 0x0000079D, 0x0004003B,
0x00000A1B, 0x00001592, 0x00000002, 0x0004002B, 0x0000000B, 0x00000147, 0x00000100, 0x0004002B,
0x0000000B, 0x000001C1, 0x0000FFFF, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B,
0x0000000B, 0x00000447, 0x00000200, 0x0006002C, 0x00000014, 0x000000FC, 0x00000A6A, 0x00000A6A,
0x00000A0D, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,
0x000300F7, 0x00003A37, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,
0x00050041, 0x00000288, 0x000056E5, 0x00000BEF, 0x00000A0A, 0x0004003D, 0x0000000B, 0x00003D0B,
0x000056E5, 0x00050041, 0x00000289, 0x000056D1, 0x00001342, 0x00000A14, 0x0004003D, 0x0000000B,
0x00001BAD, 0x000056D1, 0x000500AE, 0x00000009, 0x00001CED, 0x00003D0B, 0x00001BAD, 0x000300F7,
0x0000401D, 0x00000000, 0x000400FA, 0x00001CED, 0x000055E8, 0x0000401D, 0x000200F8, 0x000055E8,
0x000200F9, 0x00003A37, 0x000200F8, 0x0000401D, 0x00050041, 0x00000288, 0x00005098, 0x00000DA3,
0x00000A0D, 0x0004003D, 0x0000000B, 0x00003D0C, 0x00005098, 0x00050041, 0x00000288, 0x000053B3,
0x00000DA3, 0x00000A0A, 0x0004003D, 0x0000000B, 0x00002F3A, 0x000053B3, 0x00050084, 0x0000000B,
0x0000185A, 0x00003D0C, 0x00000A6A, 0x00050080, 0x0000000B, 0x000020A1, 0x0000185A, 0x00002F3A,
0x00050041, 0x00000289, 0x0000408D, 0x00001342, 0x00000A11, 0x0004003D, 0x0000000B, 0x00003367,
0x0000408D, 0x000500C4, 0x0000000B, 0x00003B4A, 0x00000A0D, 0x00003367, 0x00050084, 0x0000000B,
0x00005537, 0x00000A47, 0x00003B4A, 0x00050041, 0x00000289, 0x000032C8, 0x00001342, 0x00000A0B,
0x0004003D, 0x0000000B, 0x000048C4, 0x000032C8, 0x00050041, 0x00000289, 0x000053B4, 0x00001342,
0x00000A0E, 0x0004003D, 0x0000000B, 0x00002F86, 0x000053B4, 0x00050084, 0x0000000B, 0x00006025,
0x000048C4, 0x00002F86, 0x00050084, 0x0000000B, 0x0000359B, 0x00005537, 0x00006025, 0x00050041,
0x00000289, 0x00002195, 0x00001342, 0x00000A1A, 0x0004003D, 0x0000000B, 0x000053DE, 0x00002195,
0x000500AB, 0x00000009, 0x00005EF7, 0x000053DE, 0x00000A0A, 0x000500AC, 0x00000009, 0x00005C4D,
0x00006025, 0x00000A0D, 0x000500A7, 0x00000009, 0x00002B1D, 0x00005EF7, 0x00005C4D, 0x000300F7,
0x00005AE2, 0x00000000, 0x000400FA, 0x00002B1D, 0x00002C92, 0x00005AE2, 0x000200F8, 0x00002C92,
0x000500C2, 0x0000000B, 0x00004EC7, 0x000048C4, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000060CB,
0x00002F86, 0x00000A0D, 0x00050084, 0x0000000B, 0x00003E8A, 0x000060CB, 0x000048C4, 0x00050080,
0x0000000B, 0x00004B28, 0x00004EC7, 0x00003E8A, 0x000200F9, 0x00005AE2, 0x000200F8, 0x00005AE2,
0x000700F5, 0x0000000B, 0x00004D24, 0x00000A0A, 0x0000401D, 0x00004B28, 0x00002C92, 0x00050041,
0x00000289, 0x000061F2, 0x00001342, 0x00000A17, 0x0004003D, 0x0000000B, 0x00006265, 0x000061F2,
0x00050084, 0x0000000B, 0x00001D53, 0x00003D0B, 0x0000359B, 0x00050080, 0x0000000B, 0x0000431E,
0x00006265, 0x00001D53, 0x00050084, 0x0000000B, 0x00004CEC, 0x000020A1, 0x00003B4A, 0x00050084,
0x0000000B, 0x00003F6E, 0x00004CEC, 0x00006025, 0x00050080, 0x0000000B, 0x00001AD5, 0x0000431E,
0x00003F6E, 0x00050084, 0x0000000B, 0x00005486, 0x00004D24, 0x00003B4A, 0x00050080, 0x0000000B,
0x00004859, 0x00001AD5, 0x00005486, 0x000500C2, 0x0000000B, 0x00001D94, 0x00004859, 0x00000A10,
0x00050084, 0x0000000B, 0x00001B17, 0x00003D0B, 0x00005537, 0x00050080, 0x0000000B, 0x000025C1,
0x00001B17, 0x00004CEC, 0x000500C2, 0x0000000B, 0x0000237D, 0x000025C1, 0x00000A10, 0x000300F7,
0x00004667, 0x00000000, 0x000B00FB, 0x00003367, 0x00004667, 0x00000000, 0x00002E69, 0x00000001,
0x0000401E, 0x00000002, 0x0000401F, 0x00000003, 0x00001FDE, 0x000200F8, 0x00002E69, 0x00060041,
0x0000028A, 0x000060D7, 0x00000C50, 0x00000A0B, 0x00001D94, 0x0004003D, 0x0000000B, 0x00003241,
0x000060D7, 0x000500C7, 0x0000000B, 0x00002F59, 0x00004859, 0x00000A13, 0x00050084, 0x0000000B,
0x000036A3, 0x00002F59, 0x00000A22, 0x000500C2, 0x0000000B, 0x0000387D, 0x00003241, 0x000036A3,
0x000500C7, 0x0000000B, 0x00003CDC, 0x0000387D, 0x00000144, 0x000500C2, 0x0000000B, 0x00004D70,
0x000020A1, 0x00000A10, 0x000500C7, 0x0000000B, 0x00004B2B, 0x000020A1, 0x00000A13, 0x00050084,
0x0000000B, 0x00003722, 0x00004B2B, 0x00000A22, 0x000500C4, 0x0000000B, 0x00005A82, 0x00003CDC,
0x00003722, 0x000500AA, 0x00000009, 0x00003D0D, 0x00004B2B, 0x00000A0A, 0x000300F7, 0x00005193,
0x00000000, 0x000400FA, 0x00003D0D, 0x00002F74, 0x00005193, 0x000200F8, 0x00002F74, 0x00050041,
0x0000028B, 0x0000541D, 0x00000FB1, 0x00004D70, 0x0003003E, 0x0000541D, 0x00005A82, 0x000200F9,
0x00005193, 0x000200F8, 0x00005193, 0x000400E0, 0x00000A10, 0x00000A10, 0x0000015F, 0x000500AB,
0x00000009, 0x00003E3C, 0x00004B2B, 0x00000A0A, 0x000300F7, 0x00002386, 0x00000000, 0x000400FA,
0x00003E3C, 0x00003CBD, 0x00002386, 0x000200F8, 0x00003CBD, 0x00050041, 0x0000028B, 0x000025A5,
0x00000FB1, 0x00004D70, 0x000700F1, 0x0000000B, 0x0000189F, 0x000025A5, 0x00000A0D, 0x00000A0A,
0x00005A82, 0x000200F9, 0x00002386, 0x000200F8, 0x00002386, 0x000400E0, 0x00000A10, 0x00000A10,
0x0000015F, 0x000300F7, 0x00004665, 0x00000000, 0x000400FA, 0x00003D0D, 0x00005192, 0x00004665,
0x000200F8, 0x00005192, 0x00050084, 0x0000000B, 0x000029FB, 0x00003D0B, 0x00000147, 0x00050080,
0x0000000B, 0x0000376A, 0x000029FB, 0x00004D70, 0x00050041, 0x0000028B, 0x000036D4, 0x00000FB1,
0x00004D70, 0x0004003D, 0x0000000B, 0x00003C3D, 0x000036D4, 0x00060041, 0x0000028A, 0x00005BB5,
0x00001592, 0x00000A0B, 0x0000376A, 0x0003003E, 0x00005BB5, 0x00003C3D, 0x000200F9, 0x00004665,
0x000200F8, 0x00004665, 0x000200F9, 0x00004667, 0x000200F8, 0x0000401E, 0x00060041, 0x0000028A,
0x00005A8A, 0x00000C50, 0x00000A0B, 0x00001D94, 0x0004003D, 0x0000000B, 0x00003242, 0x00005A8A,
0x000500C7, 0x0000000B, 0x00002F5A, 0x00004859, 0x00000A10, 0x00050084, 0x0000000B, 0x000036A4,
0x00002F5A, 0x00000A22, 0x000500C2, 0x0000000B, 0x0000387E, 0x00003242, 0x000036A4, 0x000500C7,
0x0000000B, 0x00003CDD, 0x0000387E, 0x000001C1, 0x000500C2, 0x0000000B, 0x00004D71, 0x000020A1,
0x00000A0D, 0x000500C7, 0x0000000B, 0x00004B2C, 0x000020A1, 0x00000A0D, 0x00050084, 0x0000000B,
0x00003723, 0x00004B2C, 0x00000A3A, 0x000500C4, 0x0000000B, 0x00005A83, 0x00003CDD, 0x00003723,
0x000500AA, 0x00000009, 0x00003D0E, 0x00004B2C, 0x00000A0A, 0x000300F7, 0x00005194, 0x00000000,
0x000400FA, 0x00003D0E, 0x00002F75, 0x00005194, 0x000200F8, 0x00002F75, 0x00050041, 0x0000028B,
0x0000541E, 0x00000FB1, 0x00004D71, 0x0003003E, 0x0000541E, 0x00005A83, 0x000200F9, 0x00005194,
0x000200F8, 0x00005194, 0x000400E0, 0x00000A10, 0x00000A10, 0x0000015F, 0x000500AB, 0x00000009,
0x00003E3D, 0x00004B2C, 0x00000A0A, 0x000300F7, 0x00002387, 0x00000000, 0x000400FA, 0x00003E3D,
0x00003CBE, 0x00002387, 0x000200F8, 0x00003CBE, 0x00050041, 0x0000028B, 0x000025A6, 0x00000FB1,
0x00004D71, 0x000700F1, 0x0000000B, 0x000018A0, 0x000025A6, 0x00000A0D, 0x00000A0A, 0x00005A83,
0x000200F9, 0x00002387, 0x000200F8, 0x00002387, 0x000400E0, 0x00000A10, 0x00000A10, 0x0000015F,
0x000300F7, 0x00004666, 0x00000000, 0x000400FA, 0x00003D0E, 0x00005195, 0x00004666, 0x000200F8,
0x00005195, 0x00050084, 0x0000000B, 0x000029FC, 0x00003D0B, 0x00000447, 0x00050080, 0x0000000B,
0x0000376B, 0x000029FC, 0x00004D71, 0x00050041, 0x0000028B, 0x000036D5, 0x00000FB1, 0x00004D71,
0x0004003D, 0x0000000B, 0x00003C3E, 0x000036D5, 0x00060041, 0x0000028A, 0x00005BB6, 0x00001592,
0x00000A0B, 0x0000376B, 0x0003003E, 0x00005BB6, 0x00003C3E, 0x000200F9, 0x00004666, 0x000200F8,
0x00004666, 0x000200F9, 0x00004667, 0x000200F8, 0x0000401F, 0x00060041, 0x0000028A, 0x00005099,
0x00000C50, 0x00000A0B, 0x00001D94, 0x0004003D, 0x0000000B, 0x00003D1E, 0x00005099, 0x00060041,
0x0000028A, 0x00005BB7, 0x00001592, 0x00000A0B, 0x0000237D, 0x0003003E, 0x00005BB7, 0x00003D1E,
0x000200F9, 0x00004667, 0x000200F8, 0x00001FDE, 0x00060041, 0x0000028A, 0x0000509A, 0x00000C50,
0x00000A0B, 0x00001D94, 0x0004003D, 0x0000000B, 0x00003D1F, 0x0000509A, 0x00060041, 0x0000028A,
0x000052BA, 0x00001592, 0x00000A0B, 0x0000237D, 0x0003003E, 0x000052BA, 0x00003D1F, 0x00050080,
0x0000000B, 0x00004CE6, 0x0000237D, 0x00000A0D, 0x00050080, 0x0000000B, 0x00003448, 0x00001D94,
0x00000A0D, 0x00060041, 0x0000028A, 0x00002A3A, 0x00000C50, 0x00000A0B, 0x00003448, 0x0004003D,
0x0000000B, 0x00003C3F, 0x00002A3A, 0x00060041, 0x0000028A, 0x00005BB8, 0x00001592, 0x00000A0B,
0x00004CE6, 0x0003003E, 0x00005BB8, 0x00003C3F, 0x000200F9, 0x00004667, 0x000200F8, 0x00004667,
0x000200F9, 0x00003A37, 0x000200F8, 0x00003A37, 0x000100FD, 0x00010038,
0x07230203,0x00010000,0x0008000b,0x0000012a,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000b,0x0000001f,0x00060010,
0x00000004,0x00000011,0x00000020,0x00000020,0x00000001,0x00030003,0x00000002,0x000001cc,
0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,0x00000008,0x656c6974,0x646e695f,
0x00007865,0x00060005,0x0000000b,0x575f6c67,0x476b726f,0x70756f72,0x00004449,0x00090005,
0x00000011,0x6f736552,0x4465766c,0x736e776f,0x656c6163,0x736e6f43,0x746e6174,0x00000073,
0x00090006,0x00000011,0x00000000,0x645f6578,0x736e776f,0x656c6163,0x6163735f,0x785f656c,
0x00000000,0x00090006,0x00000011,0x00000001,0x645f6578,0x736e776f,0x656c6163,0x6163735f,
0x795f656c,0x00000000,0x000b0006,0x00000011,0x00000002,0x645f6578,0x736e776f,0x656c6163,
0x7869705f,0x735f6c65,0x5f657a69,0x32676f6c,0x00000000,0x00090006,0x00000011,0x00000003,
0x645f6578,0x736e776f,0x656c6163,0x6c69745f,0x6f635f65,0x00746e75,0x000c0006,0x00000011,
0x00000004,0x645f6578,0x736e776f,0x656c6163,0x756f735f,0x5f656372,0x7366666f,0x625f7465,
0x73657479,0x00000000,0x000b0006,0x00000011,0x00000005,0x645f6578,0x736e776f,0x656c6163,
0x6c61685f,0x69705f66,0x5f6c6578,0x7366666f,0x00007465,0x00030005,0x00000013,0x00000000,
0x00030005,0x0000001e,0x00776f72,0x00080005,0x0000001f,0x4c5f6c67,0x6c61636f,0x6f766e49,
0x69746163,0x44496e6f,0x00000000,0x00040005,0x00000023,0x756c6f63,0x00006e6d,0x00050005,
0x00000026,0x65786970,0x6e695f6c,0x00786564,0x00050005,0x0000002c,0x65786970,0x69735f6c,
0x0000657a,0x00060005,0x00000031,0x656c6974,0x7a69735f,0x78315f65,0x00000000,0x00050005,
0x00000035,0x6c616373,0x79785f65,0x00000000,0x00050005,0x0000003d,0x7366666f,0x785f7465,
0x00000000,0x00050005,0x0000003e,0x7366666f,0x795f7465,0x00000000,0x00070005,0x0000004e,
0x73657567,0x79625f74,0x6f5f6574,0x65736666,0x00000074,0x00040005,0x00000056,0x74696e75,
0x00000000,0x00060005,0x0000005a,0x65786574,0x6e695f6c,0x696e755f,0x00000074,0x00070005,
0x00000061,0x74696e75,0x7865745f,0x5f736c65,0x32676f6c,0x00000000,0x00030005,0x00000065,
0x00000071,0x00040005,0x0000006c,0x5f627573,0x00000078,0x00080005,0x00000070,0x65786574,
0x6e695f6c,0x6163735f,0x5f64656c,0x74696e75,0x00000000,0x00060005,0x00000076,0x5f637273,
0x65747962,0x66666f5f,0x00746573,0x00050005,0x0000008d,0x5f637273,0x7366666f,0x00007465,
0x00060005,0x00000091,0x5f747364,0x65747962,0x66666f5f,0x00746573,0x00050005,0x00000093,
0x5f747364,0x7366666f,0x00007465,0x00050005,0x0000009d,0x5f637273,0x64726f77,0x00000000,
0x00060005,0x0000009f,0x72756f53,0x75426563,0x72656666,0x00000000,0x00050006,0x0000009f,
0x00000000,0x61746164,0x00000000,0x00070005,0x000000a1,0x725f6578,0x6c6f7365,0x735f6576,
0x6372756f,0x00000065,0x00050005,0x000000a6,0x65747962,0x6c61765f,0x00000000,0x00050005,
0x000000b0,0x6b636170,0x646e695f,0x00007865,0x00050005,0x000000b3,0x65747962,0x736f705f,
0x00000000,0x00060005,0x000000b6,0x746e6f63,0x75626972,0x6e6f6974,0x00000000,0x00060005,
0x000000c1,0x745f7367,0x5f656c69,0x61746164,0x00000000,0x00050005,0x000000d4,0x74736544,
0x66667542,0x00007265,0x00050006,0x000000d4,0x00000000,0x61746164,0x00000000,0x00060005,
0x000000d6,0x725f6578,0x6c6f7365,0x645f6576,0x00747365,0x00050005,0x000000e1,0x5f637273,
0x64726f77,0x00000000,0x00050005,0x000000e5,0x726f6873,0x61765f74,0x0000006c,0x00050005,
0x000000ed,0x6b636170,0x646e695f,0x00007865,0x00050005,0x000000f0,0x726f6873,0x6f705f74,
0x00000073,0x00060005,0x000000f3,0x746e6f63,0x75626972,0x6e6f6974,0x00000000,0x00040047,
0x0000000b,0x0000000b,0x0000001a,0x00030047,0x00000011,0x00000002,0x00050048,0x00000011,
0x00000000,0x00000023,0x00000000,0x00050048,0x00000011,0x00000001,0x00000023,0x00000004,
0x00050048,0x00000011,0x00000002,0x00000023,0x00000008,0x00050048,0x00000011,0x00000003,
0x00000023,0x0000000c,0x00050048,0x00000011,0x00000004,0x00000023,0x00000010,0x00050048,
0x00000011,0x00000005,0x00000023,0x00000014,0x00040047,0x0000001f,0x0000000b,0x0000001b,
0x00040047,0x0000009e,0x00000006,0x00000004,0x00030047,0x0000009f,0x00000003,0x00040048,
0x0000009f,0x00000000,0x00000018,0x00050048,0x0000009f,0x00000000,0x00000023,0x00000000,
0x00030047,0x000000a1,0x00000018,0x00040047,0x000000a1,0x00000021,0x00000000,0x00040047,
0x000000a1,0x00000022,0x00000000,0x00040047,0x000000d3,0x00000006,0x00000004,0x00030047,
0x000000d4,0x00000003,0x00040048,0x000000d4,0x00000000,0x00000019,0x00050048,0x000000d4,
0x00000000,0x00000023,0x00000000,0x00030047,0x000000d6,0x00000019,0x00040047,0x000000d6,
0x00000021,0x00000001,0x00040047,0x000000d6,0x00000022,0x00000000,0x00040047,0x00000129,
0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,
0x00000006,0x00000020,0x00000000,0x00040020,0x00000007,0x00000007,0x00000006,0x00040017,
0x00000009,0x00000006,0x00000003,0x00040020,0x0000000a,0x00000001,0x00000009,0x0004003b,
0x0000000a,0x0000000b,0x00000001,0x0004002b,0x00000006,0x0000000c,0x00000000,0x00040020,
0x0000000d,0x00000001,0x00000006,0x0008001e,0x00000011,0x00000006,0x00000006,0x00000006,
0x00000006,0x00000006,0x00000006,0x00040020,0x00000012,0x00000009,0x00000011,0x0004003b,
0x00000012,0x00000013,0x00000009,0x00040015,0x00000014,0x00000020,0x00000001,0x0004002b,
0x00000014,0x00000015,0x00000003,0x00040020,0x00000016,0x00000009,0x00000006,0x00020014,
0x00000019,0x0004003b,0x0000000a,0x0000001f,0x00000001,0x0004002b,0x00000006,0x00000020,
0x00000001,0x0004002b,0x00000006,0x00000028,0x00000020,0x0004002b,0x00000014,0x0000002d,
0x00000002,0x0004002b,0x00000006,0x00000032,0x00000400,0x0004002b,0x00000014,0x00000036,
0x00000000,0x0004002b,0x00000014,0x00000039,0x00000001,0x0004002b,0x00000014,0x0000003f,
0x00000005,0x0004002b,0x00000006,0x00000058,0x00000004,0x0004002b,0x00000006,0x0000005c,
0x0000000f,0x0004002b,0x00000014,0x00000077,0x00000004,0x0004002b,0x00000006,0x00000085,
0x00000010,0x0004002b,0x00000006,0x0000008f,0x00000002,0x0003001d,0x0000009e,0x00000006,
0x0003001e,0x0000009f,0x0000009e,0x00040020,0x000000a0,0x00000002,0x0000009f,0x0004003b,
0x000000a0,0x000000a1,0x00000002,0x00040020,0x000000a3,0x00000002,0x00000006,0x0004002b,
0x00000006,0x000000a9,0x00000003,0x0004002b,0x00000006,0x000000ab,0x00000008,0x0004002b,
0x00000006,0x000000ae,0x000000ff,0x0004001c,0x000000bf,0x00000006,0x00000032,0x00040020,
0x000000c0,0x00000004,0x000000bf,0x0004003b,0x000000c0,0x000000c1,0x00000004,0x00040020,
0x000000c4,0x00000004,0x00000006,0x0004002b,0x00000006,0x000000c6,0x00000108,0x0003001d,
0x000000d3,0x00000006,0x0003001e,0x000000d4,0x000000d3,0x00040020,0x000000d5,0x00000002,
0x000000d4,0x0004003b,0x000000d5,0x000000d6,0x00000002,0x0004002b,0x00000006,0x000000d8,
0x00000100,0x0004002b,0x00000006,0x000000eb,0x0000ffff,0x0004002b,0x00000006,0x0000010c,
0x00000200,0x0006002c,0x00000009,0x00000129,0x00000028,0x00000028,0x00000020,0x00050036,
0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000007,
0x00000008,0x00000007,0x0004003b,0x00000007,0x0000001e,0x00000007,0x0004003b,0x00000007,
0x00000023,0x00000007,0x0004003b,0x00000007,0x00000026,0x00000007,0x0004003b,0x00000007,
0x0000002c,0x00000007,0x0004003b,0x00000007,0x00000031,0x00000007,0x0004003b,0x00000007,
0x00000035,0x00000007,0x0004003b,0x00000007,0x0000003d,0x00000007,0x0004003b,0x00000007,
0x0000003e,0x00000007,0x0004003b,0x00000007,0x0000004e,0x00000007,0x0004003b,0x00000007,
0x00000056,0x00000007,0x0004003b,0x00000007,0x0000005a,0x00000007,0x0004003b,0x00000007,
0x00000061,0x00000007,0x0004003b,0x00000007,0x00000065,0x00000007,0x0004003b,0x00000007,
0x0000006c,0x00000007,0x0004003b,0x00000007,0x00000070,0x00000007,0x0004003b,0x00000007,
0x00000076,0x00000007,0x0004003b,0x00000007,0x0000008d,0x00000007,0x0004003b,0x00000007,
0x00000091,0x00000007,0x0004003b,0x00000007,0x00000093,0x00000007,0x0004003b,0x00000007,
0x0000009d,0x00000007,0x0004003b,0x00000007,0x000000a6,0x00000007,0x0004003b,0x00000007,
0x000000b0,0x00000007,0x0004003b,0x00000007,0x000000b3,0x00000007,0x0004003b,0x00000007,
0x000000b6,0x00000007,0x0004003b,0x00000007,0x000000e1,0x00000007,0x0004003b,0x00000007,
0x000000e5,0x00000007,0x0004003b,0x00000007,0x000000ed,0x00000007,0x0004003b,0x00000007,
0x000000f0,0x00000007,0x0004003b,0x00000007,0x000000f3,0x00000007,0x00050041,0x0000000d,
0x0000000e,0x0000000b,0x0000000c,0x0004003d,0x00000006,0x0000000f,0x0000000e,0x0003003e,
0x00000008,0x0000000f,0x0004003d,0x00000006,0x00000010,0x00000008,0x00050041,0x00000016,
0x00000017,0x00000013,0x00000015,0x0004003d,0x00000006,0x00000018,0x00000017,0x000500ae,
0x00000019,0x0000001a,0x00000010,0x00000018,0x000300f7,0x0000001c,0x00000000,0x000400fa,
0x0000001a,0x0000001b,0x0000001c,0x000200f8,0x0000001b,0x000100fd,0x000200f8,0x0000001c,
0x00050041,0x0000000d,0x00000021,0x0000001f,0x00000020,0x0004003d,0x00000006,0x00000022,
0x00000021,0x0003003e,0x0000001e,0x00000022,0x00050041,0x0000000d,0x00000024,0x0000001f,
0x0000000c,0x0004003d,0x00000006,0x00000025,0x00000024,0x0003003e,0x00000023,0x00000025,
0x0004003d,0x00000006,0x00000027,0x0000001e,0x00050084,0x00000006,0x00000029,0x00000027,
0x00000028,0x0004003d,0x00000006,0x0000002a,0x00000023,0x00050080,0x00000006,0x0000002b,
0x00000029,0x0000002a,0x0003003e,0x00000026,0x0000002b,0x00050041,0x00000016,0x0000002e,
0x00000013,0x0000002d,0x0004003d,0x00000006,0x0000002f,0x0000002e,0x000500c4,0x00000006,
0x00000030,0x00000020,0x0000002f,0x0003003e,0x0000002c,0x00000030,0x0004003d,0x00000006,
0x00000033,0x0000002c,0x00050084,0x00000006,0x00000034,0x00000032,0x00000033,0x0003003e,
0x00000031,0x00000034,0x00050041,0x00000016,0x00000037,0x00000013,0x00000036,0x0004003d,
0x00000006,0x00000038,0x00000037,0x00050041,0x00000016,0x0000003a,0x00000013,0x00000039,
0x0004003d,0x00000006,0x0000003b,0x0000003a,0x00050084,0x00000006,0x0000003c,0x00000038,
0x0000003b,0x0003003e,0x00000035,0x0000003c,0x0003003e,0x0000003d,0x0000000c,0x0003003e,
0x0000003e,0x0000000c,0x00050041,0x00000016,0x00000040,0x00000013,0x0000003f,0x0004003d,
0x00000006,0x00000041,0x00000040,0x000500ab,0x00000019,0x00000042,0x00000041,0x0000000c,
0x0004003d,0x00000006,0x00000043,0x00000035,0x000500ac,0x00000019,0x00000044,0x00000043,
0x00000020,0x000500a7,0x00000019,0x00000045,0x00000042,0x00000044,0x000300f7,0x00000047,
0x00000000,0x000400fa,0x00000045,0x00000046,0x00000047,0x000200f8,0x00000046,0x00050041,
0x00000016,0x00000048,0x00000013,0x00000036,0x0004003d,0x00000006,0x00000049,0x00000048,
0x000500c2,0x00000006,0x0000004a,0x00000049,0x00000020,0x0003003e,0x0000003d,0x0000004a,
0x00050041,0x00000016,0x0000004b,0x00000013,0x00000039,0x0004003d,0x00000006,0x0000004c,
0x0000004b,0x000500c2,0x00000006,0x0000004d,0x0000004c,0x00000020,0x0003003e,0x0000003e,
0x0000004d,0x000200f9,0x00000047,0x000200f8,0x00000047,0x0004003d,0x00000006,0x0000004f,
0x00000008,0x0004003d,0x00000006,0x00000050,0x00000031,0x00050084,0x00000006,0x00000051,
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)),
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)) {
uint32_t written_address = 0;
uint32_t written_length = 0;
@ -5543,6 +5548,7 @@ bool VulkanCommandProcessor::IssueCopy_ReadbackResolvePath() {
kernel_state_);
bool force_scaled_resolve_sync_only = false;
bool force_scaled_resolve_cpu_copy = false;
bool force_window_cpu_copy = false;
if (readback_mode == ReadbackResolveMode::kDisabled) {
constexpr uint32_t kImportSkaterPreviewResolveAddress = UINT32_C(0x04911000);
constexpr uint32_t kImportSkaterPreviewResolveLength = UINT32_C(0x2D0000);
@ -5550,14 +5556,26 @@ bool VulkanCommandProcessor::IssueCopy_ReadbackResolvePath() {
!IsGameplayStateActive(kernel_state_) && is_scaled &&
written_address == kImportSkaterPreviewResolveAddress &&
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);
return true;
}
readback_mode = ReadbackResolveMode::kFull;
force_scaled_resolve_sync_only = true;
log_readback_decision("targeted-scaled-resolve-full", readback_mode, false, true,
kImportSkaterPreviewResolveLength);
log_readback_decision(
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);
@ -5842,7 +5860,8 @@ bool VulkanCommandProcessor::IssueCopy_ReadbackResolvePath() {
}
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);
log_readback_decision(should_copy ? "copy-guest-memory" : "cache-hit-skip", readback_mode,
is_cache_miss, should_copy, uint32_t(resolve_key));