From 7ab5ccbbd9bbf8684386e07ca01697797c5d1647 Mon Sep 17 00:00:00 2001 From: Peter Wright Date: Tue, 3 May 2022 17:21:17 +0100 Subject: [PATCH 01/14] Add #include to fix build error on Linux. --- src/xenia/gpu/shader_interpreter.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/xenia/gpu/shader_interpreter.cc b/src/xenia/gpu/shader_interpreter.cc index 566bade43..9e1084397 100644 --- a/src/xenia/gpu/shader_interpreter.cc +++ b/src/xenia/gpu/shader_interpreter.cc @@ -9,6 +9,7 @@ #include "xenia/gpu/shader_interpreter.h" +#include #include #include From 0e0f04dc1d6bbee7ed9988d921b5f5d835736559 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Wed, 4 May 2022 13:20:45 +0300 Subject: [PATCH 02/14] [D3D12] Fix point size calculation + point code cleanup 6fcf9d21fe8d22528ac9d733ad97437a2cf28802 made per-vertex diameter vs. constant radius consistent, and with that commit the shader works with direct pixel to NDC conversion, however, the NDC conversion factor was outdated in that commit (still included the 0.5 factor for diameter to radius conversion, resulting in all points being 50% narrower along each axis than needed). Now, the diameter to radius conversion factor is used there properly, and also the multiplication of the per-vertex diameter by 0.5 has been removed from the shader since the constant already includes it now (the constant diameter is passed via the system constants instead of the radius also). --- .../gpu/d3d12/d3d12_command_processor.cc | 35 +- src/xenia/gpu/dxbc_shader_translator.cc | 4 +- src/xenia/gpu/dxbc_shader_translator.h | 11 +- .../bytecode/d3d12_5_1/continuous_quad_hs.h | 496 +++--- .../d3d12_5_1/continuous_triangle_hs.h | 464 +++--- .../bytecode/d3d12_5_1/discrete_quad_hs.h | 496 +++--- .../bytecode/d3d12_5_1/discrete_triangle_hs.h | 464 +++--- .../d3d12_5_1/primitive_point_list_gs.h | 1433 ++++++++--------- .../d3d12_5_1/tessellation_adaptive_vs.h | 475 +++--- .../d3d12_5_1/tessellation_indexed_vs.h | 503 +++--- .../gpu/shaders/primitive_point_list.gs.hlsl | 50 +- .../shaders/primitive_rectangle_list.gs.hlsl | 8 +- src/xenia/gpu/shaders/xenos_draw.hlsli | 6 +- 13 files changed, 2230 insertions(+), 2215 deletions(-) diff --git a/src/xenia/gpu/d3d12/d3d12_command_processor.cc b/src/xenia/gpu/d3d12/d3d12_command_processor.cc index fa0fd4ab6..9e4bdba44 100644 --- a/src/xenia/gpu/d3d12/d3d12_command_processor.cc +++ b/src/xenia/gpu/d3d12/d3d12_command_processor.cc @@ -3330,32 +3330,39 @@ void D3D12CommandProcessor::UpdateSystemConstantValues( float(pa_su_point_minmax.min_size) * (2.0f / 16.0f); float point_vertex_diameter_max = float(pa_su_point_minmax.max_size) * (2.0f / 16.0f); - float point_constant_radius_x = - float(pa_su_point_size.width) * (1.0f / 16.0f); - float point_constant_radius_y = - float(pa_su_point_size.height) * (1.0f / 16.0f); + float point_constant_diameter_x = + float(pa_su_point_size.width) * (2.0f / 16.0f); + float point_constant_diameter_y = + float(pa_su_point_size.height) * (2.0f / 16.0f); dirty |= system_constants_.point_vertex_diameter_min != point_vertex_diameter_min; dirty |= system_constants_.point_vertex_diameter_max != point_vertex_diameter_max; dirty |= - system_constants_.point_constant_radius[0] != point_constant_radius_x; + system_constants_.point_constant_diameter[0] != point_constant_diameter_x; dirty |= - system_constants_.point_constant_radius[1] != point_constant_radius_y; + system_constants_.point_constant_diameter[1] != point_constant_diameter_y; system_constants_.point_vertex_diameter_min = point_vertex_diameter_min; system_constants_.point_vertex_diameter_max = point_vertex_diameter_max; - system_constants_.point_constant_radius[0] = point_constant_radius_x; - system_constants_.point_constant_radius[1] = point_constant_radius_y; - float point_screen_to_ndc_x = + system_constants_.point_constant_diameter[0] = point_constant_diameter_x; + system_constants_.point_constant_diameter[1] = point_constant_diameter_y; + // 2 because 1 in the NDC is half of the viewport's axis, 0.5 for diameter to + // radius conversion to avoid multiplying the per-vertex diameter by an + // additional constant in the shader. + float point_screen_diameter_to_ndc_radius_x = (/* 0.5f * 2.0f * */ float(resolution_scale_x)) / std::max(viewport_info.xy_extent[0], uint32_t(1)); - float point_screen_to_ndc_y = + float point_screen_diameter_to_ndc_radius_y = (/* 0.5f * 2.0f * */ float(resolution_scale_y)) / std::max(viewport_info.xy_extent[1], uint32_t(1)); - dirty |= system_constants_.point_screen_to_ndc[0] != point_screen_to_ndc_x; - dirty |= system_constants_.point_screen_to_ndc[1] != point_screen_to_ndc_y; - system_constants_.point_screen_to_ndc[0] = point_screen_to_ndc_x; - system_constants_.point_screen_to_ndc[1] = point_screen_to_ndc_y; + dirty |= system_constants_.point_screen_diameter_to_ndc_radius[0] != + point_screen_diameter_to_ndc_radius_x; + dirty |= system_constants_.point_screen_diameter_to_ndc_radius[1] != + point_screen_diameter_to_ndc_radius_y; + system_constants_.point_screen_diameter_to_ndc_radius[0] = + point_screen_diameter_to_ndc_radius_x; + system_constants_.point_screen_diameter_to_ndc_radius[1] = + point_screen_diameter_to_ndc_radius_y; // Interpolator sampling pattern, centroid or center. uint32_t interpolator_sampling_pattern = diff --git a/src/xenia/gpu/dxbc_shader_translator.cc b/src/xenia/gpu/dxbc_shader_translator.cc index c2a4d8540..2736fe33a 100644 --- a/src/xenia/gpu/dxbc_shader_translator.cc +++ b/src/xenia/gpu/dxbc_shader_translator.cc @@ -2040,9 +2040,9 @@ const DxbcShaderTranslator::SystemConstantRdef {"xe_point_vertex_diameter_max", ShaderRdefTypeIndex::kFloat, sizeof(float)}, - {"xe_point_constant_radius", ShaderRdefTypeIndex::kFloat2, + {"xe_point_constant_diameter", ShaderRdefTypeIndex::kFloat2, sizeof(float) * 2}, - {"xe_point_screen_to_ndc", ShaderRdefTypeIndex::kFloat2, + {"xe_point_screen_diameter_to_ndc_radius", ShaderRdefTypeIndex::kFloat2, sizeof(float) * 2}, {"xe_interpolator_sampling_pattern", ShaderRdefTypeIndex::kUint, diff --git a/src/xenia/gpu/dxbc_shader_translator.h b/src/xenia/gpu/dxbc_shader_translator.h index f2fae6cc6..e8009c210 100644 --- a/src/xenia/gpu/dxbc_shader_translator.h +++ b/src/xenia/gpu/dxbc_shader_translator.h @@ -242,9 +242,10 @@ class DxbcShaderTranslator : public ShaderTranslator { float ndc_offset[3]; float point_vertex_diameter_max; - float point_constant_radius[2]; - // Screen point size * 2 (but not supersampled) -> size in NDC. - float point_screen_to_ndc[2]; + float point_constant_diameter[2]; + // Diameter in guest screen coordinates > radius (0.5 * diameter) in the NDC + // for the host viewport. + float point_screen_diameter_to_ndc_radius[2]; uint32_t interpolator_sampling_pattern; uint32_t ps_param_gen; @@ -356,8 +357,8 @@ class DxbcShaderTranslator : public ShaderTranslator { kNDCOffset, kPointVertexDiameterMax, - kPointConstantRadius, - kPointScreenToNDC, + kPointConstantDiameter, + kPointScreenDiameterToNDCRadius, kInterpolatorSamplingPattern, kPSParamGen, diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_quad_hs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_quad_hs.h index 18faf5d6a..6ad9c3f3e 100644 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_quad_hs.h +++ b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_quad_hs.h @@ -19,8 +19,8 @@ // float xe_point_vertex_diameter_min;// Offset: 140 Size: 4 [unused] // float3 xe_ndc_offset; // Offset: 144 Size: 12 [unused] // float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [unused] -// float2 xe_point_constant_radius; // Offset: 160 Size: 8 [unused] -// float2 xe_point_screen_to_ndc; // Offset: 168 Size: 8 [unused] +// float2 xe_point_constant_diameter; // Offset: 160 Size: 8 [unused] +// float2 xe_point_screen_diameter_to_ndc_radius;// Offset: 168 Size: 8 [unused] // uint xe_interpolator_sampling_pattern;// Offset: 176 Size: 4 [unused] // uint xe_ps_param_gen; // Offset: 180 Size: 4 [unused] // uint2 xe_sample_count_log2; // Offset: 184 Size: 8 [unused] @@ -121,21 +121,21 @@ ret const BYTE continuous_quad_hs[] = { - 68, 88, 66, 67, 41, 61, - 68, 236, 233, 38, 162, 138, - 209, 48, 160, 247, 155, 238, - 65, 82, 1, 0, 0, 0, - 12, 14, 0, 0, 6, 0, + 68, 88, 66, 67, 56, 101, + 228, 239, 192, 85, 186, 185, + 211, 32, 109, 84, 115, 240, + 153, 130, 1, 0, 0, 0, + 28, 14, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, - 216, 10, 0, 0, 12, 11, - 0, 0, 64, 11, 0, 0, - 4, 12, 0, 0, 112, 13, + 232, 10, 0, 0, 28, 11, + 0, 0, 80, 11, 0, 0, + 20, 12, 0, 0, 128, 13, 0, 0, 82, 68, 69, 70, - 152, 10, 0, 0, 1, 0, + 168, 10, 0, 0, 1, 0, 0, 0, 120, 0, 0, 0, 1, 0, 0, 0, 60, 0, 0, 0, 1, 5, 83, 72, - 0, 5, 0, 0, 110, 10, + 0, 5, 0, 0, 126, 10, 0, 0, 19, 19, 68, 37, 60, 0, 0, 0, 24, 0, 0, 0, 40, 0, 0, 0, @@ -235,137 +235,137 @@ const BYTE continuous_quad_hs[] = 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 156, 7, + 0, 0, 0, 0, 158, 7, 0, 0, 168, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 179, 7, 0, 0, + 0, 0, 197, 7, 0, 0, 176, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 212, 7, 0, 0, 180, 0, + 230, 7, 0, 0, 180, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 228, 7, + 0, 0, 0, 0, 246, 7, 0, 0, 184, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 116, 6, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 249, 7, 0, 0, + 0, 0, 11, 8, 0, 0, 192, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 28, 8, 0, 0, 0, 0, + 44, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 64, 8, 0, 0, 224, 0, + 80, 8, 0, 0, 224, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 85, 8, + 0, 0, 0, 0, 101, 8, 0, 0, 228, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 52, 7, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 109, 8, 0, 0, + 0, 0, 125, 8, 0, 0, 232, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 126, 8, 0, 0, 236, 0, + 142, 8, 0, 0, 236, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 166, 8, + 0, 0, 0, 0, 182, 8, 0, 0, 240, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 184, 8, 0, 0, + 0, 0, 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 220, 8, 0, 0, + 0, 0, 236, 8, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 247, 8, 0, 0, 8, 1, + 7, 9, 0, 0, 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 17, 9, + 0, 0, 0, 0, 33, 9, 0, 0, 16, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 51, 9, 0, 0, + 0, 0, 67, 9, 0, 0, 32, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 68, 9, 0, 0, 0, 0, + 84, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 104, 9, 0, 0, 64, 1, + 120, 9, 0, 0, 64, 1, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 136, 9, + 0, 0, 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 172, 9, + 0, 0, 0, 0, 188, 9, 0, 0, 80, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 136, 9, 0, 0, + 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 197, 9, 0, 0, + 0, 0, 213, 9, 0, 0, 96, 1, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, - 216, 9, 0, 0, 0, 0, + 232, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 252, 9, 0, 0, 160, 1, + 12, 10, 0, 0, 160, 1, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 20, 10, + 0, 0, 0, 0, 36, 10, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 56, 10, + 0, 0, 0, 0, 72, 10, 0, 0, 192, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 136, 9, 0, 0, + 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 86, 10, 0, 0, + 0, 0, 102, 10, 0, 0, 208, 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 184, 8, 0, 0, 0, 0, + 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, @@ -455,11 +455,14 @@ const BYTE continuous_quad_hs[] = 0, 120, 101, 95, 112, 111, 105, 110, 116, 95, 99, 111, 110, 115, 116, 97, 110, 116, - 95, 114, 97, 100, 105, 117, - 115, 0, 120, 101, 95, 112, - 111, 105, 110, 116, 95, 115, - 99, 114, 101, 101, 110, 95, - 116, 111, 95, 110, 100, 99, + 95, 100, 105, 97, 109, 101, + 116, 101, 114, 0, 120, 101, + 95, 112, 111, 105, 110, 116, + 95, 115, 99, 114, 101, 101, + 110, 95, 100, 105, 97, 109, + 101, 116, 101, 114, 95, 116, + 111, 95, 110, 100, 99, 95, + 114, 97, 100, 105, 117, 115, 0, 120, 101, 95, 105, 110, 116, 101, 114, 112, 111, 108, 97, 116, 111, 114, 95, 115, @@ -477,230 +480,230 @@ const BYTE continuous_quad_hs[] = 105, 122, 122, 108, 101, 100, 95, 115, 105, 103, 110, 115, 0, 117, 105, 110, 116, 52, - 0, 171, 171, 171, 1, 0, - 19, 0, 1, 0, 4, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 19, 8, 0, 0, 120, 101, - 95, 116, 101, 120, 116, 117, - 114, 101, 115, 95, 114, 101, - 115, 111, 108, 118, 101, 100, - 0, 120, 101, 95, 97, 108, - 112, 104, 97, 95, 116, 101, - 115, 116, 95, 114, 101, 102, - 101, 114, 101, 110, 99, 101, - 0, 120, 101, 95, 97, 108, - 112, 104, 97, 95, 116, 111, - 95, 109, 97, 115, 107, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 51, 50, 98, - 112, 112, 95, 116, 105, 108, - 101, 95, 112, 105, 116, 99, - 104, 95, 100, 119, 111, 114, - 100, 115, 95, 115, 99, 97, - 108, 101, 100, 0, 120, 101, - 95, 99, 111, 108, 111, 114, - 95, 101, 120, 112, 95, 98, - 105, 97, 115, 0, 1, 0, - 3, 0, 1, 0, 4, 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, - 172, 6, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 112, 111, 108, 121, 95, - 111, 102, 102, 115, 101, 116, - 95, 102, 114, 111, 110, 116, - 0, 120, 101, 95, 101, 100, - 114, 97, 109, 95, 112, 111, - 108, 121, 95, 111, 102, 102, - 115, 101, 116, 95, 98, 97, - 99, 107, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 100, 101, 112, 116, 104, 95, - 98, 97, 115, 101, 95, 100, - 119, 111, 114, 100, 115, 95, - 115, 99, 97, 108, 101, 100, - 0, 120, 101, 95, 101, 100, - 114, 97, 109, 95, 115, 116, - 101, 110, 99, 105, 108, 0, - 1, 0, 19, 0, 1, 0, - 4, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 19, 8, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, - 98, 97, 115, 101, 95, 100, - 119, 111, 114, 100, 115, 95, - 115, 99, 97, 108, 101, 100, 0, 171, 1, 0, 19, 0, + 1, 0, 4, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 37, 8, + 0, 0, 120, 101, 95, 116, + 101, 120, 116, 117, 114, 101, + 115, 95, 114, 101, 115, 111, + 108, 118, 101, 100, 0, 120, + 101, 95, 97, 108, 112, 104, + 97, 95, 116, 101, 115, 116, + 95, 114, 101, 102, 101, 114, + 101, 110, 99, 101, 0, 120, + 101, 95, 97, 108, 112, 104, + 97, 95, 116, 111, 95, 109, + 97, 115, 107, 0, 120, 101, + 95, 101, 100, 114, 97, 109, + 95, 51, 50, 98, 112, 112, + 95, 116, 105, 108, 101, 95, + 112, 105, 116, 99, 104, 95, + 100, 119, 111, 114, 100, 115, + 95, 115, 99, 97, 108, 101, + 100, 0, 120, 101, 95, 99, + 111, 108, 111, 114, 95, 101, + 120, 112, 95, 98, 105, 97, + 115, 0, 1, 0, 3, 0, 1, 0, 4, 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, 19, 8, + 0, 0, 0, 0, 172, 6, 0, 0, 120, 101, 95, 101, - 100, 114, 97, 109, 95, 114, - 116, 95, 102, 111, 114, 109, - 97, 116, 95, 102, 108, 97, - 103, 115, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 114, 116, 95, 99, 108, 97, - 109, 112, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 172, 6, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 107, 101, - 101, 112, 95, 109, 97, 115, - 107, 0, 171, 171, 1, 0, + 100, 114, 97, 109, 95, 112, + 111, 108, 121, 95, 111, 102, + 102, 115, 101, 116, 95, 102, + 114, 111, 110, 116, 0, 120, + 101, 95, 101, 100, 114, 97, + 109, 95, 112, 111, 108, 121, + 95, 111, 102, 102, 115, 101, + 116, 95, 98, 97, 99, 107, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 100, 101, + 112, 116, 104, 95, 98, 97, + 115, 101, 95, 100, 119, 111, + 114, 100, 115, 95, 115, 99, + 97, 108, 101, 100, 0, 120, + 101, 95, 101, 100, 114, 97, + 109, 95, 115, 116, 101, 110, + 99, 105, 108, 0, 1, 0, 19, 0, 1, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 8, 0, 0, 120, 101, + 37, 8, 0, 0, 120, 101, 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 98, 108, - 101, 110, 100, 95, 102, 97, - 99, 116, 111, 114, 115, 95, - 111, 112, 115, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 98, 108, 101, 110, 100, - 95, 99, 111, 110, 115, 116, - 97, 110, 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, 73, 83, - 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, + 95, 114, 116, 95, 98, 97, + 115, 101, 95, 100, 119, 111, + 114, 100, 115, 95, 115, 99, + 97, 108, 101, 100, 0, 171, + 1, 0, 19, 0, 1, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 1, 1, - 0, 0, 88, 69, 86, 69, - 82, 84, 69, 88, 73, 68, - 0, 171, 79, 83, 71, 78, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 37, 8, 0, 0, + 120, 101, 95, 101, 100, 114, + 97, 109, 95, 114, 116, 95, + 102, 111, 114, 109, 97, 116, + 95, 102, 108, 97, 103, 115, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 114, 116, + 95, 99, 108, 97, 109, 112, + 0, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 4, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 172, 6, + 0, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 114, + 116, 95, 107, 101, 101, 112, + 95, 109, 97, 115, 107, 0, + 171, 171, 1, 0, 19, 0, + 1, 0, 4, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 37, 8, + 0, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 114, + 116, 95, 98, 108, 101, 110, + 100, 95, 102, 97, 99, 116, + 111, 114, 115, 95, 111, 112, + 115, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 98, + 108, 101, 110, 100, 95, 99, + 111, 110, 115, 116, 97, 110, + 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, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 1, 14, 0, 0, + 0, 0, 1, 1, 0, 0, 88, 69, 86, 69, 82, 84, 69, 88, 73, 68, 0, 171, - 80, 67, 83, 71, 188, 0, - 0, 0, 6, 0, 0, 0, - 8, 0, 0, 0, 152, 0, - 0, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 1, 14, 0, 0, 152, 0, + 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, - 11, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 1, 14, 0, 0, 152, 0, - 0, 0, 2, 0, 0, 0, - 11, 0, 0, 0, 3, 0, - 0, 0, 2, 0, 0, 0, - 1, 14, 0, 0, 152, 0, + 8, 0, 0, 0, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 1, 14, 0, 0, 88, 69, + 86, 69, 82, 84, 69, 88, + 73, 68, 0, 171, 80, 67, + 83, 71, 188, 0, 0, 0, + 6, 0, 0, 0, 8, 0, + 0, 0, 152, 0, 0, 0, + 0, 0, 0, 0, 11, 0, 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 1, 14, + 0, 0, 152, 0, 0, 0, + 1, 0, 0, 0, 11, 0, 0, 0, 3, 0, 0, 0, - 1, 14, 0, 0, 166, 0, - 0, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 1, 14, 0, 0, 166, 0, - 0, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 3, 0, - 0, 0, 5, 0, 0, 0, - 1, 14, 0, 0, 83, 86, - 95, 84, 101, 115, 115, 70, - 97, 99, 116, 111, 114, 0, - 83, 86, 95, 73, 110, 115, - 105, 100, 101, 84, 101, 115, - 115, 70, 97, 99, 116, 111, - 114, 0, 171, 171, 83, 72, - 69, 88, 100, 1, 0, 0, - 81, 0, 3, 0, 89, 0, - 0, 0, 113, 0, 0, 1, - 147, 32, 0, 1, 148, 32, - 0, 1, 149, 24, 0, 1, - 150, 32, 0, 1, 151, 24, - 0, 1, 106, 8, 0, 1, - 89, 0, 0, 7, 70, 142, - 48, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 115, 0, - 0, 1, 153, 0, 0, 2, - 4, 0, 0, 0, 95, 0, - 0, 2, 0, 112, 1, 0, - 103, 0, 0, 4, 18, 32, - 16, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 103, 0, - 0, 4, 18, 32, 16, 0, + 1, 0, 0, 0, 1, 14, + 0, 0, 152, 0, 0, 0, + 2, 0, 0, 0, 11, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 1, 14, + 0, 0, 152, 0, 0, 0, + 3, 0, 0, 0, 11, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 1, 14, + 0, 0, 166, 0, 0, 0, + 0, 0, 0, 0, 12, 0, + 0, 0, 3, 0, 0, 0, + 4, 0, 0, 0, 1, 14, + 0, 0, 166, 0, 0, 0, 1, 0, 0, 0, 12, 0, - 0, 0, 103, 0, 0, 4, - 18, 32, 16, 0, 2, 0, - 0, 0, 13, 0, 0, 0, - 103, 0, 0, 4, 18, 32, - 16, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 104, 0, - 0, 2, 1, 0, 0, 0, - 91, 0, 0, 4, 18, 32, - 16, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 4, 18, 0, 16, 0, - 0, 0, 0, 0, 10, 112, - 1, 0, 54, 0, 0, 8, - 18, 32, 144, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 42, 128, 48, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 5, 0, 0, 0, 1, 14, + 0, 0, 83, 86, 95, 84, + 101, 115, 115, 70, 97, 99, + 116, 111, 114, 0, 83, 86, + 95, 73, 110, 115, 105, 100, + 101, 84, 101, 115, 115, 70, + 97, 99, 116, 111, 114, 0, + 171, 171, 83, 72, 69, 88, + 100, 1, 0, 0, 81, 0, + 3, 0, 89, 0, 0, 0, + 113, 0, 0, 1, 147, 32, + 0, 1, 148, 32, 0, 1, + 149, 24, 0, 1, 150, 32, + 0, 1, 151, 24, 0, 1, + 106, 8, 0, 1, 89, 0, + 0, 7, 70, 142, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 0, - 0, 1, 115, 0, 0, 1, - 153, 0, 0, 2, 2, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 115, 0, 0, 1, + 153, 0, 0, 2, 4, 0, 0, 0, 95, 0, 0, 2, 0, 112, 1, 0, 103, 0, 0, 4, 18, 32, 16, 0, - 4, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 11, 0, 0, 0, 103, 0, 0, 4, - 18, 32, 16, 0, 5, 0, - 0, 0, 16, 0, 0, 0, - 104, 0, 0, 2, 1, 0, - 0, 0, 91, 0, 0, 4, + 18, 32, 16, 0, 1, 0, + 0, 0, 12, 0, 0, 0, + 103, 0, 0, 4, 18, 32, + 16, 0, 2, 0, 0, 0, + 13, 0, 0, 0, 103, 0, + 0, 4, 18, 32, 16, 0, + 3, 0, 0, 0, 14, 0, + 0, 0, 104, 0, 0, 2, + 1, 0, 0, 0, 91, 0, + 0, 4, 18, 32, 16, 0, + 0, 0, 0, 0, 4, 0, + 0, 0, 54, 0, 0, 4, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 112, 1, 0, + 54, 0, 0, 8, 18, 32, + 144, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 42, 128, + 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 62, 0, 0, 1, + 115, 0, 0, 1, 153, 0, + 0, 2, 2, 0, 0, 0, + 95, 0, 0, 2, 0, 112, + 1, 0, 103, 0, 0, 4, 18, 32, 16, 0, 4, 0, - 0, 0, 2, 0, 0, 0, - 54, 0, 0, 4, 18, 0, - 16, 0, 0, 0, 0, 0, - 10, 112, 1, 0, 54, 0, - 0, 9, 18, 32, 208, 0, - 4, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 42, 128, 48, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 103, 0, 0, 4, 18, 32, + 16, 0, 5, 0, 0, 0, + 16, 0, 0, 0, 104, 0, + 0, 2, 1, 0, 0, 0, + 91, 0, 0, 4, 18, 32, + 16, 0, 4, 0, 0, 0, + 2, 0, 0, 0, 54, 0, + 0, 4, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 112, + 1, 0, 54, 0, 0, 9, + 18, 32, 208, 0, 4, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 42, 128, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 0, - 0, 1, 83, 84, 65, 84, - 148, 0, 0, 0, 6, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 5, 0, + 0, 0, 62, 0, 0, 1, + 83, 84, 65, 84, 148, 0, + 0, 0, 6, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -708,17 +711,16 @@ const BYTE continuous_quad_hs[] = 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, 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, - 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, + 3, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, - 4, 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 }; diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_triangle_hs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_triangle_hs.h index a77c56ffc..bf8d8ac4b 100644 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_triangle_hs.h +++ b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_triangle_hs.h @@ -19,8 +19,8 @@ // float xe_point_vertex_diameter_min;// Offset: 140 Size: 4 [unused] // float3 xe_ndc_offset; // Offset: 144 Size: 12 [unused] // float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [unused] -// float2 xe_point_constant_radius; // Offset: 160 Size: 8 [unused] -// float2 xe_point_screen_to_ndc; // Offset: 168 Size: 8 [unused] +// float2 xe_point_constant_diameter; // Offset: 160 Size: 8 [unused] +// float2 xe_point_screen_diameter_to_ndc_radius;// Offset: 168 Size: 8 [unused] // uint xe_interpolator_sampling_pattern;// Offset: 176 Size: 4 [unused] // uint xe_ps_param_gen; // Offset: 180 Size: 4 [unused] // uint2 xe_sample_count_log2; // Offset: 184 Size: 8 [unused] @@ -112,21 +112,21 @@ ret const BYTE continuous_triangle_hs[] = { - 68, 88, 66, 67, 186, 50, - 224, 20, 247, 162, 237, 207, - 151, 21, 132, 253, 255, 73, - 27, 33, 1, 0, 0, 0, - 124, 13, 0, 0, 6, 0, + 68, 88, 66, 67, 157, 238, + 46, 85, 189, 214, 238, 189, + 170, 130, 106, 213, 101, 223, + 102, 58, 1, 0, 0, 0, + 140, 13, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, - 216, 10, 0, 0, 12, 11, - 0, 0, 64, 11, 0, 0, - 212, 11, 0, 0, 224, 12, + 232, 10, 0, 0, 28, 11, + 0, 0, 80, 11, 0, 0, + 228, 11, 0, 0, 240, 12, 0, 0, 82, 68, 69, 70, - 152, 10, 0, 0, 1, 0, + 168, 10, 0, 0, 1, 0, 0, 0, 120, 0, 0, 0, 1, 0, 0, 0, 60, 0, 0, 0, 1, 5, 83, 72, - 0, 5, 0, 0, 110, 10, + 0, 5, 0, 0, 126, 10, 0, 0, 19, 19, 68, 37, 60, 0, 0, 0, 24, 0, 0, 0, 40, 0, 0, 0, @@ -226,137 +226,137 @@ const BYTE continuous_triangle_hs[] = 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 156, 7, + 0, 0, 0, 0, 158, 7, 0, 0, 168, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 179, 7, 0, 0, + 0, 0, 197, 7, 0, 0, 176, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 212, 7, 0, 0, 180, 0, + 230, 7, 0, 0, 180, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 228, 7, + 0, 0, 0, 0, 246, 7, 0, 0, 184, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 116, 6, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 249, 7, 0, 0, + 0, 0, 11, 8, 0, 0, 192, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 28, 8, 0, 0, 0, 0, + 44, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 64, 8, 0, 0, 224, 0, + 80, 8, 0, 0, 224, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 85, 8, + 0, 0, 0, 0, 101, 8, 0, 0, 228, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 52, 7, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 109, 8, 0, 0, + 0, 0, 125, 8, 0, 0, 232, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 126, 8, 0, 0, 236, 0, + 142, 8, 0, 0, 236, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 166, 8, + 0, 0, 0, 0, 182, 8, 0, 0, 240, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 184, 8, 0, 0, + 0, 0, 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 220, 8, 0, 0, + 0, 0, 236, 8, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 247, 8, 0, 0, 8, 1, + 7, 9, 0, 0, 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 17, 9, + 0, 0, 0, 0, 33, 9, 0, 0, 16, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 51, 9, 0, 0, + 0, 0, 67, 9, 0, 0, 32, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 68, 9, 0, 0, 0, 0, + 84, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 104, 9, 0, 0, 64, 1, + 120, 9, 0, 0, 64, 1, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 136, 9, + 0, 0, 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 172, 9, + 0, 0, 0, 0, 188, 9, 0, 0, 80, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 136, 9, 0, 0, + 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 197, 9, 0, 0, + 0, 0, 213, 9, 0, 0, 96, 1, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, - 216, 9, 0, 0, 0, 0, + 232, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 252, 9, 0, 0, 160, 1, + 12, 10, 0, 0, 160, 1, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 20, 10, + 0, 0, 0, 0, 36, 10, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 56, 10, + 0, 0, 0, 0, 72, 10, 0, 0, 192, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 136, 9, 0, 0, + 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 86, 10, 0, 0, + 0, 0, 102, 10, 0, 0, 208, 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 184, 8, 0, 0, 0, 0, + 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, @@ -446,11 +446,14 @@ const BYTE continuous_triangle_hs[] = 0, 120, 101, 95, 112, 111, 105, 110, 116, 95, 99, 111, 110, 115, 116, 97, 110, 116, - 95, 114, 97, 100, 105, 117, - 115, 0, 120, 101, 95, 112, - 111, 105, 110, 116, 95, 115, - 99, 114, 101, 101, 110, 95, - 116, 111, 95, 110, 100, 99, + 95, 100, 105, 97, 109, 101, + 116, 101, 114, 0, 120, 101, + 95, 112, 111, 105, 110, 116, + 95, 115, 99, 114, 101, 101, + 110, 95, 100, 105, 97, 109, + 101, 116, 101, 114, 95, 116, + 111, 95, 110, 100, 99, 95, + 114, 97, 100, 105, 117, 115, 0, 120, 101, 95, 105, 110, 116, 101, 114, 112, 111, 108, 97, 116, 111, 114, 95, 115, @@ -468,224 +471,223 @@ const BYTE continuous_triangle_hs[] = 105, 122, 122, 108, 101, 100, 95, 115, 105, 103, 110, 115, 0, 117, 105, 110, 116, 52, - 0, 171, 171, 171, 1, 0, - 19, 0, 1, 0, 4, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 19, 8, 0, 0, 120, 101, - 95, 116, 101, 120, 116, 117, - 114, 101, 115, 95, 114, 101, - 115, 111, 108, 118, 101, 100, - 0, 120, 101, 95, 97, 108, - 112, 104, 97, 95, 116, 101, - 115, 116, 95, 114, 101, 102, - 101, 114, 101, 110, 99, 101, - 0, 120, 101, 95, 97, 108, - 112, 104, 97, 95, 116, 111, - 95, 109, 97, 115, 107, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 51, 50, 98, - 112, 112, 95, 116, 105, 108, - 101, 95, 112, 105, 116, 99, - 104, 95, 100, 119, 111, 114, - 100, 115, 95, 115, 99, 97, - 108, 101, 100, 0, 120, 101, - 95, 99, 111, 108, 111, 114, - 95, 101, 120, 112, 95, 98, - 105, 97, 115, 0, 1, 0, - 3, 0, 1, 0, 4, 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, - 172, 6, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 112, 111, 108, 121, 95, - 111, 102, 102, 115, 101, 116, - 95, 102, 114, 111, 110, 116, - 0, 120, 101, 95, 101, 100, - 114, 97, 109, 95, 112, 111, - 108, 121, 95, 111, 102, 102, - 115, 101, 116, 95, 98, 97, - 99, 107, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 100, 101, 112, 116, 104, 95, - 98, 97, 115, 101, 95, 100, - 119, 111, 114, 100, 115, 95, - 115, 99, 97, 108, 101, 100, - 0, 120, 101, 95, 101, 100, - 114, 97, 109, 95, 115, 116, - 101, 110, 99, 105, 108, 0, - 1, 0, 19, 0, 1, 0, - 4, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 19, 8, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, - 98, 97, 115, 101, 95, 100, - 119, 111, 114, 100, 115, 95, - 115, 99, 97, 108, 101, 100, 0, 171, 1, 0, 19, 0, + 1, 0, 4, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 37, 8, + 0, 0, 120, 101, 95, 116, + 101, 120, 116, 117, 114, 101, + 115, 95, 114, 101, 115, 111, + 108, 118, 101, 100, 0, 120, + 101, 95, 97, 108, 112, 104, + 97, 95, 116, 101, 115, 116, + 95, 114, 101, 102, 101, 114, + 101, 110, 99, 101, 0, 120, + 101, 95, 97, 108, 112, 104, + 97, 95, 116, 111, 95, 109, + 97, 115, 107, 0, 120, 101, + 95, 101, 100, 114, 97, 109, + 95, 51, 50, 98, 112, 112, + 95, 116, 105, 108, 101, 95, + 112, 105, 116, 99, 104, 95, + 100, 119, 111, 114, 100, 115, + 95, 115, 99, 97, 108, 101, + 100, 0, 120, 101, 95, 99, + 111, 108, 111, 114, 95, 101, + 120, 112, 95, 98, 105, 97, + 115, 0, 1, 0, 3, 0, 1, 0, 4, 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, 19, 8, + 0, 0, 0, 0, 172, 6, 0, 0, 120, 101, 95, 101, - 100, 114, 97, 109, 95, 114, - 116, 95, 102, 111, 114, 109, - 97, 116, 95, 102, 108, 97, - 103, 115, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 114, 116, 95, 99, 108, 97, - 109, 112, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 172, 6, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 107, 101, - 101, 112, 95, 109, 97, 115, - 107, 0, 171, 171, 1, 0, + 100, 114, 97, 109, 95, 112, + 111, 108, 121, 95, 111, 102, + 102, 115, 101, 116, 95, 102, + 114, 111, 110, 116, 0, 120, + 101, 95, 101, 100, 114, 97, + 109, 95, 112, 111, 108, 121, + 95, 111, 102, 102, 115, 101, + 116, 95, 98, 97, 99, 107, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 100, 101, + 112, 116, 104, 95, 98, 97, + 115, 101, 95, 100, 119, 111, + 114, 100, 115, 95, 115, 99, + 97, 108, 101, 100, 0, 120, + 101, 95, 101, 100, 114, 97, + 109, 95, 115, 116, 101, 110, + 99, 105, 108, 0, 1, 0, 19, 0, 1, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 8, 0, 0, 120, 101, + 37, 8, 0, 0, 120, 101, 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 98, 108, - 101, 110, 100, 95, 102, 97, - 99, 116, 111, 114, 115, 95, - 111, 112, 115, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 98, 108, 101, 110, 100, - 95, 99, 111, 110, 115, 116, - 97, 110, 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, 73, 83, - 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, + 95, 114, 116, 95, 98, 97, + 115, 101, 95, 100, 119, 111, + 114, 100, 115, 95, 115, 99, + 97, 108, 101, 100, 0, 171, + 1, 0, 19, 0, 1, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 1, 1, - 0, 0, 88, 69, 86, 69, - 82, 84, 69, 88, 73, 68, - 0, 171, 79, 83, 71, 78, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 37, 8, 0, 0, + 120, 101, 95, 101, 100, 114, + 97, 109, 95, 114, 116, 95, + 102, 111, 114, 109, 97, 116, + 95, 102, 108, 97, 103, 115, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 114, 116, + 95, 99, 108, 97, 109, 112, + 0, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 4, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 172, 6, + 0, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 114, + 116, 95, 107, 101, 101, 112, + 95, 109, 97, 115, 107, 0, + 171, 171, 1, 0, 19, 0, + 1, 0, 4, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 37, 8, + 0, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 114, + 116, 95, 98, 108, 101, 110, + 100, 95, 102, 97, 99, 116, + 111, 114, 115, 95, 111, 112, + 115, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 98, + 108, 101, 110, 100, 95, 99, + 111, 110, 115, 116, 97, 110, + 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, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 1, 14, 0, 0, + 0, 0, 1, 1, 0, 0, 88, 69, 86, 69, 82, 84, 69, 88, 73, 68, 0, 171, - 80, 67, 83, 71, 140, 0, - 0, 0, 4, 0, 0, 0, - 8, 0, 0, 0, 104, 0, - 0, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 1, 14, 0, 0, 104, 0, + 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 1, 14, 0, 0, 104, 0, - 0, 0, 2, 0, 0, 0, - 13, 0, 0, 0, 3, 0, - 0, 0, 2, 0, 0, 0, - 1, 14, 0, 0, 118, 0, + 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 1, 14, 0, 0, 88, 69, + 86, 69, 82, 84, 69, 88, + 73, 68, 0, 171, 80, 67, + 83, 71, 140, 0, 0, 0, + 4, 0, 0, 0, 8, 0, + 0, 0, 104, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 3, 0, 0, 0, - 1, 14, 0, 0, 83, 86, - 95, 84, 101, 115, 115, 70, + 0, 0, 0, 0, 1, 14, + 0, 0, 104, 0, 0, 0, + 1, 0, 0, 0, 13, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 1, 14, + 0, 0, 104, 0, 0, 0, + 2, 0, 0, 0, 13, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 1, 14, + 0, 0, 118, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 1, 14, + 0, 0, 83, 86, 95, 84, + 101, 115, 115, 70, 97, 99, + 116, 111, 114, 0, 83, 86, + 95, 73, 110, 115, 105, 100, + 101, 84, 101, 115, 115, 70, 97, 99, 116, 111, 114, 0, - 83, 86, 95, 73, 110, 115, - 105, 100, 101, 84, 101, 115, - 115, 70, 97, 99, 116, 111, - 114, 0, 171, 171, 83, 72, - 69, 88, 4, 1, 0, 0, - 81, 0, 3, 0, 65, 0, - 0, 0, 113, 0, 0, 1, - 147, 24, 0, 1, 148, 24, - 0, 1, 149, 16, 0, 1, - 150, 32, 0, 1, 151, 24, - 0, 1, 106, 8, 0, 1, - 89, 0, 0, 7, 70, 142, - 48, 0, 0, 0, 0, 0, + 171, 171, 83, 72, 69, 88, + 4, 1, 0, 0, 81, 0, + 3, 0, 65, 0, 0, 0, + 113, 0, 0, 1, 147, 24, + 0, 1, 148, 24, 0, 1, + 149, 16, 0, 1, 150, 32, + 0, 1, 151, 24, 0, 1, + 106, 8, 0, 1, 89, 0, + 0, 7, 70, 142, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 115, 0, - 0, 1, 153, 0, 0, 2, - 3, 0, 0, 0, 95, 0, - 0, 2, 0, 112, 1, 0, - 103, 0, 0, 4, 18, 32, - 16, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 103, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 115, 0, 0, 1, + 153, 0, 0, 2, 3, 0, + 0, 0, 95, 0, 0, 2, + 0, 112, 1, 0, 103, 0, 0, 4, 18, 32, 16, 0, - 1, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 103, 0, 0, 4, - 18, 32, 16, 0, 2, 0, - 0, 0, 19, 0, 0, 0, - 104, 0, 0, 2, 1, 0, - 0, 0, 91, 0, 0, 4, - 18, 32, 16, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 54, 0, 0, 4, 18, 0, + 18, 32, 16, 0, 1, 0, + 0, 0, 18, 0, 0, 0, + 103, 0, 0, 4, 18, 32, + 16, 0, 2, 0, 0, 0, + 19, 0, 0, 0, 104, 0, + 0, 2, 1, 0, 0, 0, + 91, 0, 0, 4, 18, 32, + 16, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 54, 0, + 0, 4, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 112, + 1, 0, 54, 0, 0, 8, + 18, 32, 144, 0, 10, 0, 16, 0, 0, 0, 0, 0, - 10, 112, 1, 0, 54, 0, - 0, 8, 18, 32, 144, 0, - 10, 0, 16, 0, 0, 0, - 0, 0, 42, 128, 48, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 62, 0, 0, 1, 115, 0, - 0, 1, 103, 0, 0, 4, - 18, 32, 16, 0, 3, 0, - 0, 0, 20, 0, 0, 0, - 54, 0, 0, 7, 18, 32, - 16, 0, 3, 0, 0, 0, 42, 128, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, - 0, 1, 83, 84, 65, 84, - 148, 0, 0, 0, 5, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, + 0, 1, 115, 0, 0, 1, + 103, 0, 0, 4, 18, 32, + 16, 0, 3, 0, 0, 0, + 20, 0, 0, 0, 54, 0, + 0, 7, 18, 32, 16, 0, + 3, 0, 0, 0, 42, 128, + 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 62, 0, 0, 1, + 83, 84, 65, 84, 148, 0, + 0, 0, 5, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 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, + 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 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, 3, 0, 0, 0, + 3, 0, 0, 0, 4, 0, 0, 0, 2, 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, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 10, 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, 3, 0, - 0, 0, 3, 0, 0, 0, - 4, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0 + 0, 0, 0, 0, 0, 0 }; diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_quad_hs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_quad_hs.h index 4a5b81c9c..dfc49e9d2 100644 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_quad_hs.h +++ b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_quad_hs.h @@ -19,8 +19,8 @@ // float xe_point_vertex_diameter_min;// Offset: 140 Size: 4 [unused] // float3 xe_ndc_offset; // Offset: 144 Size: 12 [unused] // float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [unused] -// float2 xe_point_constant_radius; // Offset: 160 Size: 8 [unused] -// float2 xe_point_screen_to_ndc; // Offset: 168 Size: 8 [unused] +// float2 xe_point_constant_diameter; // Offset: 160 Size: 8 [unused] +// float2 xe_point_screen_diameter_to_ndc_radius;// Offset: 168 Size: 8 [unused] // uint xe_interpolator_sampling_pattern;// Offset: 176 Size: 4 [unused] // uint xe_ps_param_gen; // Offset: 180 Size: 4 [unused] // uint2 xe_sample_count_log2; // Offset: 184 Size: 8 [unused] @@ -121,21 +121,21 @@ ret const BYTE discrete_quad_hs[] = { - 68, 88, 66, 67, 228, 206, - 50, 86, 18, 2, 56, 90, - 135, 194, 252, 60, 37, 181, - 95, 80, 1, 0, 0, 0, - 12, 14, 0, 0, 6, 0, + 68, 88, 66, 67, 12, 3, + 52, 62, 60, 171, 174, 248, + 249, 81, 162, 162, 255, 59, + 137, 143, 1, 0, 0, 0, + 28, 14, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, - 216, 10, 0, 0, 12, 11, - 0, 0, 64, 11, 0, 0, - 4, 12, 0, 0, 112, 13, + 232, 10, 0, 0, 28, 11, + 0, 0, 80, 11, 0, 0, + 20, 12, 0, 0, 128, 13, 0, 0, 82, 68, 69, 70, - 152, 10, 0, 0, 1, 0, + 168, 10, 0, 0, 1, 0, 0, 0, 120, 0, 0, 0, 1, 0, 0, 0, 60, 0, 0, 0, 1, 5, 83, 72, - 0, 5, 0, 0, 110, 10, + 0, 5, 0, 0, 126, 10, 0, 0, 19, 19, 68, 37, 60, 0, 0, 0, 24, 0, 0, 0, 40, 0, 0, 0, @@ -235,137 +235,137 @@ const BYTE discrete_quad_hs[] = 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 156, 7, + 0, 0, 0, 0, 158, 7, 0, 0, 168, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 179, 7, 0, 0, + 0, 0, 197, 7, 0, 0, 176, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 212, 7, 0, 0, 180, 0, + 230, 7, 0, 0, 180, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 228, 7, + 0, 0, 0, 0, 246, 7, 0, 0, 184, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 116, 6, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 249, 7, 0, 0, + 0, 0, 11, 8, 0, 0, 192, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 28, 8, 0, 0, 0, 0, + 44, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 64, 8, 0, 0, 224, 0, + 80, 8, 0, 0, 224, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 85, 8, + 0, 0, 0, 0, 101, 8, 0, 0, 228, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 52, 7, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 109, 8, 0, 0, + 0, 0, 125, 8, 0, 0, 232, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 126, 8, 0, 0, 236, 0, + 142, 8, 0, 0, 236, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 166, 8, + 0, 0, 0, 0, 182, 8, 0, 0, 240, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 184, 8, 0, 0, + 0, 0, 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 220, 8, 0, 0, + 0, 0, 236, 8, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 247, 8, 0, 0, 8, 1, + 7, 9, 0, 0, 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 17, 9, + 0, 0, 0, 0, 33, 9, 0, 0, 16, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 51, 9, 0, 0, + 0, 0, 67, 9, 0, 0, 32, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 68, 9, 0, 0, 0, 0, + 84, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 104, 9, 0, 0, 64, 1, + 120, 9, 0, 0, 64, 1, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 136, 9, + 0, 0, 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 172, 9, + 0, 0, 0, 0, 188, 9, 0, 0, 80, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 136, 9, 0, 0, + 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 197, 9, 0, 0, + 0, 0, 213, 9, 0, 0, 96, 1, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, - 216, 9, 0, 0, 0, 0, + 232, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 252, 9, 0, 0, 160, 1, + 12, 10, 0, 0, 160, 1, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 20, 10, + 0, 0, 0, 0, 36, 10, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 56, 10, + 0, 0, 0, 0, 72, 10, 0, 0, 192, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 136, 9, 0, 0, + 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 86, 10, 0, 0, + 0, 0, 102, 10, 0, 0, 208, 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 184, 8, 0, 0, 0, 0, + 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, @@ -455,11 +455,14 @@ const BYTE discrete_quad_hs[] = 0, 120, 101, 95, 112, 111, 105, 110, 116, 95, 99, 111, 110, 115, 116, 97, 110, 116, - 95, 114, 97, 100, 105, 117, - 115, 0, 120, 101, 95, 112, - 111, 105, 110, 116, 95, 115, - 99, 114, 101, 101, 110, 95, - 116, 111, 95, 110, 100, 99, + 95, 100, 105, 97, 109, 101, + 116, 101, 114, 0, 120, 101, + 95, 112, 111, 105, 110, 116, + 95, 115, 99, 114, 101, 101, + 110, 95, 100, 105, 97, 109, + 101, 116, 101, 114, 95, 116, + 111, 95, 110, 100, 99, 95, + 114, 97, 100, 105, 117, 115, 0, 120, 101, 95, 105, 110, 116, 101, 114, 112, 111, 108, 97, 116, 111, 114, 95, 115, @@ -477,230 +480,230 @@ const BYTE discrete_quad_hs[] = 105, 122, 122, 108, 101, 100, 95, 115, 105, 103, 110, 115, 0, 117, 105, 110, 116, 52, - 0, 171, 171, 171, 1, 0, - 19, 0, 1, 0, 4, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 19, 8, 0, 0, 120, 101, - 95, 116, 101, 120, 116, 117, - 114, 101, 115, 95, 114, 101, - 115, 111, 108, 118, 101, 100, - 0, 120, 101, 95, 97, 108, - 112, 104, 97, 95, 116, 101, - 115, 116, 95, 114, 101, 102, - 101, 114, 101, 110, 99, 101, - 0, 120, 101, 95, 97, 108, - 112, 104, 97, 95, 116, 111, - 95, 109, 97, 115, 107, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 51, 50, 98, - 112, 112, 95, 116, 105, 108, - 101, 95, 112, 105, 116, 99, - 104, 95, 100, 119, 111, 114, - 100, 115, 95, 115, 99, 97, - 108, 101, 100, 0, 120, 101, - 95, 99, 111, 108, 111, 114, - 95, 101, 120, 112, 95, 98, - 105, 97, 115, 0, 1, 0, - 3, 0, 1, 0, 4, 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, - 172, 6, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 112, 111, 108, 121, 95, - 111, 102, 102, 115, 101, 116, - 95, 102, 114, 111, 110, 116, - 0, 120, 101, 95, 101, 100, - 114, 97, 109, 95, 112, 111, - 108, 121, 95, 111, 102, 102, - 115, 101, 116, 95, 98, 97, - 99, 107, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 100, 101, 112, 116, 104, 95, - 98, 97, 115, 101, 95, 100, - 119, 111, 114, 100, 115, 95, - 115, 99, 97, 108, 101, 100, - 0, 120, 101, 95, 101, 100, - 114, 97, 109, 95, 115, 116, - 101, 110, 99, 105, 108, 0, - 1, 0, 19, 0, 1, 0, - 4, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 19, 8, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, - 98, 97, 115, 101, 95, 100, - 119, 111, 114, 100, 115, 95, - 115, 99, 97, 108, 101, 100, 0, 171, 1, 0, 19, 0, + 1, 0, 4, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 37, 8, + 0, 0, 120, 101, 95, 116, + 101, 120, 116, 117, 114, 101, + 115, 95, 114, 101, 115, 111, + 108, 118, 101, 100, 0, 120, + 101, 95, 97, 108, 112, 104, + 97, 95, 116, 101, 115, 116, + 95, 114, 101, 102, 101, 114, + 101, 110, 99, 101, 0, 120, + 101, 95, 97, 108, 112, 104, + 97, 95, 116, 111, 95, 109, + 97, 115, 107, 0, 120, 101, + 95, 101, 100, 114, 97, 109, + 95, 51, 50, 98, 112, 112, + 95, 116, 105, 108, 101, 95, + 112, 105, 116, 99, 104, 95, + 100, 119, 111, 114, 100, 115, + 95, 115, 99, 97, 108, 101, + 100, 0, 120, 101, 95, 99, + 111, 108, 111, 114, 95, 101, + 120, 112, 95, 98, 105, 97, + 115, 0, 1, 0, 3, 0, 1, 0, 4, 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, 19, 8, + 0, 0, 0, 0, 172, 6, 0, 0, 120, 101, 95, 101, - 100, 114, 97, 109, 95, 114, - 116, 95, 102, 111, 114, 109, - 97, 116, 95, 102, 108, 97, - 103, 115, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 114, 116, 95, 99, 108, 97, - 109, 112, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 172, 6, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 107, 101, - 101, 112, 95, 109, 97, 115, - 107, 0, 171, 171, 1, 0, + 100, 114, 97, 109, 95, 112, + 111, 108, 121, 95, 111, 102, + 102, 115, 101, 116, 95, 102, + 114, 111, 110, 116, 0, 120, + 101, 95, 101, 100, 114, 97, + 109, 95, 112, 111, 108, 121, + 95, 111, 102, 102, 115, 101, + 116, 95, 98, 97, 99, 107, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 100, 101, + 112, 116, 104, 95, 98, 97, + 115, 101, 95, 100, 119, 111, + 114, 100, 115, 95, 115, 99, + 97, 108, 101, 100, 0, 120, + 101, 95, 101, 100, 114, 97, + 109, 95, 115, 116, 101, 110, + 99, 105, 108, 0, 1, 0, 19, 0, 1, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 8, 0, 0, 120, 101, + 37, 8, 0, 0, 120, 101, 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 98, 108, - 101, 110, 100, 95, 102, 97, - 99, 116, 111, 114, 115, 95, - 111, 112, 115, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 98, 108, 101, 110, 100, - 95, 99, 111, 110, 115, 116, - 97, 110, 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, 73, 83, - 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, + 95, 114, 116, 95, 98, 97, + 115, 101, 95, 100, 119, 111, + 114, 100, 115, 95, 115, 99, + 97, 108, 101, 100, 0, 171, + 1, 0, 19, 0, 1, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 1, 1, - 0, 0, 88, 69, 86, 69, - 82, 84, 69, 88, 73, 68, - 0, 171, 79, 83, 71, 78, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 37, 8, 0, 0, + 120, 101, 95, 101, 100, 114, + 97, 109, 95, 114, 116, 95, + 102, 111, 114, 109, 97, 116, + 95, 102, 108, 97, 103, 115, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 114, 116, + 95, 99, 108, 97, 109, 112, + 0, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 4, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 172, 6, + 0, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 114, + 116, 95, 107, 101, 101, 112, + 95, 109, 97, 115, 107, 0, + 171, 171, 1, 0, 19, 0, + 1, 0, 4, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 37, 8, + 0, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 114, + 116, 95, 98, 108, 101, 110, + 100, 95, 102, 97, 99, 116, + 111, 114, 115, 95, 111, 112, + 115, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 98, + 108, 101, 110, 100, 95, 99, + 111, 110, 115, 116, 97, 110, + 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, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 1, 14, 0, 0, + 0, 0, 1, 1, 0, 0, 88, 69, 86, 69, 82, 84, 69, 88, 73, 68, 0, 171, - 80, 67, 83, 71, 188, 0, - 0, 0, 6, 0, 0, 0, - 8, 0, 0, 0, 152, 0, - 0, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 1, 14, 0, 0, 152, 0, + 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, - 11, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 1, 14, 0, 0, 152, 0, - 0, 0, 2, 0, 0, 0, - 11, 0, 0, 0, 3, 0, - 0, 0, 2, 0, 0, 0, - 1, 14, 0, 0, 152, 0, + 8, 0, 0, 0, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 1, 14, 0, 0, 88, 69, + 86, 69, 82, 84, 69, 88, + 73, 68, 0, 171, 80, 67, + 83, 71, 188, 0, 0, 0, + 6, 0, 0, 0, 8, 0, + 0, 0, 152, 0, 0, 0, + 0, 0, 0, 0, 11, 0, 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 1, 14, + 0, 0, 152, 0, 0, 0, + 1, 0, 0, 0, 11, 0, 0, 0, 3, 0, 0, 0, - 1, 14, 0, 0, 166, 0, - 0, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 1, 14, 0, 0, 166, 0, - 0, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 3, 0, - 0, 0, 5, 0, 0, 0, - 1, 14, 0, 0, 83, 86, - 95, 84, 101, 115, 115, 70, - 97, 99, 116, 111, 114, 0, - 83, 86, 95, 73, 110, 115, - 105, 100, 101, 84, 101, 115, - 115, 70, 97, 99, 116, 111, - 114, 0, 171, 171, 83, 72, - 69, 88, 100, 1, 0, 0, - 81, 0, 3, 0, 89, 0, - 0, 0, 113, 0, 0, 1, - 147, 32, 0, 1, 148, 32, - 0, 1, 149, 24, 0, 1, - 150, 8, 0, 1, 151, 24, - 0, 1, 106, 8, 0, 1, - 89, 0, 0, 7, 70, 142, - 48, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 115, 0, - 0, 1, 153, 0, 0, 2, - 4, 0, 0, 0, 95, 0, - 0, 2, 0, 112, 1, 0, - 103, 0, 0, 4, 18, 32, - 16, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 103, 0, - 0, 4, 18, 32, 16, 0, + 1, 0, 0, 0, 1, 14, + 0, 0, 152, 0, 0, 0, + 2, 0, 0, 0, 11, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 1, 14, + 0, 0, 152, 0, 0, 0, + 3, 0, 0, 0, 11, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 1, 14, + 0, 0, 166, 0, 0, 0, + 0, 0, 0, 0, 12, 0, + 0, 0, 3, 0, 0, 0, + 4, 0, 0, 0, 1, 14, + 0, 0, 166, 0, 0, 0, 1, 0, 0, 0, 12, 0, - 0, 0, 103, 0, 0, 4, - 18, 32, 16, 0, 2, 0, - 0, 0, 13, 0, 0, 0, - 103, 0, 0, 4, 18, 32, - 16, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 104, 0, - 0, 2, 1, 0, 0, 0, - 91, 0, 0, 4, 18, 32, - 16, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 4, 18, 0, 16, 0, - 0, 0, 0, 0, 10, 112, - 1, 0, 54, 0, 0, 8, - 18, 32, 144, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 42, 128, 48, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 5, 0, 0, 0, 1, 14, + 0, 0, 83, 86, 95, 84, + 101, 115, 115, 70, 97, 99, + 116, 111, 114, 0, 83, 86, + 95, 73, 110, 115, 105, 100, + 101, 84, 101, 115, 115, 70, + 97, 99, 116, 111, 114, 0, + 171, 171, 83, 72, 69, 88, + 100, 1, 0, 0, 81, 0, + 3, 0, 89, 0, 0, 0, + 113, 0, 0, 1, 147, 32, + 0, 1, 148, 32, 0, 1, + 149, 24, 0, 1, 150, 8, + 0, 1, 151, 24, 0, 1, + 106, 8, 0, 1, 89, 0, + 0, 7, 70, 142, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 0, - 0, 1, 115, 0, 0, 1, - 153, 0, 0, 2, 2, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 115, 0, 0, 1, + 153, 0, 0, 2, 4, 0, 0, 0, 95, 0, 0, 2, 0, 112, 1, 0, 103, 0, 0, 4, 18, 32, 16, 0, - 4, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 11, 0, 0, 0, 103, 0, 0, 4, - 18, 32, 16, 0, 5, 0, - 0, 0, 16, 0, 0, 0, - 104, 0, 0, 2, 1, 0, - 0, 0, 91, 0, 0, 4, + 18, 32, 16, 0, 1, 0, + 0, 0, 12, 0, 0, 0, + 103, 0, 0, 4, 18, 32, + 16, 0, 2, 0, 0, 0, + 13, 0, 0, 0, 103, 0, + 0, 4, 18, 32, 16, 0, + 3, 0, 0, 0, 14, 0, + 0, 0, 104, 0, 0, 2, + 1, 0, 0, 0, 91, 0, + 0, 4, 18, 32, 16, 0, + 0, 0, 0, 0, 4, 0, + 0, 0, 54, 0, 0, 4, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 112, 1, 0, + 54, 0, 0, 8, 18, 32, + 144, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 42, 128, + 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 62, 0, 0, 1, + 115, 0, 0, 1, 153, 0, + 0, 2, 2, 0, 0, 0, + 95, 0, 0, 2, 0, 112, + 1, 0, 103, 0, 0, 4, 18, 32, 16, 0, 4, 0, - 0, 0, 2, 0, 0, 0, - 54, 0, 0, 4, 18, 0, - 16, 0, 0, 0, 0, 0, - 10, 112, 1, 0, 54, 0, - 0, 9, 18, 32, 208, 0, - 4, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 42, 128, 48, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 103, 0, 0, 4, 18, 32, + 16, 0, 5, 0, 0, 0, + 16, 0, 0, 0, 104, 0, + 0, 2, 1, 0, 0, 0, + 91, 0, 0, 4, 18, 32, + 16, 0, 4, 0, 0, 0, + 2, 0, 0, 0, 54, 0, + 0, 4, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 112, + 1, 0, 54, 0, 0, 9, + 18, 32, 208, 0, 4, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 42, 128, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 0, - 0, 1, 83, 84, 65, 84, - 148, 0, 0, 0, 6, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 5, 0, + 0, 0, 62, 0, 0, 1, + 83, 84, 65, 84, 148, 0, + 0, 0, 6, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -708,17 +711,16 @@ const BYTE discrete_quad_hs[] = 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, 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, - 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, + 3, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, - 1, 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 }; diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_triangle_hs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_triangle_hs.h index 39b97f602..a386d836a 100644 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_triangle_hs.h +++ b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_triangle_hs.h @@ -19,8 +19,8 @@ // float xe_point_vertex_diameter_min;// Offset: 140 Size: 4 [unused] // float3 xe_ndc_offset; // Offset: 144 Size: 12 [unused] // float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [unused] -// float2 xe_point_constant_radius; // Offset: 160 Size: 8 [unused] -// float2 xe_point_screen_to_ndc; // Offset: 168 Size: 8 [unused] +// float2 xe_point_constant_diameter; // Offset: 160 Size: 8 [unused] +// float2 xe_point_screen_diameter_to_ndc_radius;// Offset: 168 Size: 8 [unused] // uint xe_interpolator_sampling_pattern;// Offset: 176 Size: 4 [unused] // uint xe_ps_param_gen; // Offset: 180 Size: 4 [unused] // uint2 xe_sample_count_log2; // Offset: 184 Size: 8 [unused] @@ -112,21 +112,21 @@ ret const BYTE discrete_triangle_hs[] = { - 68, 88, 66, 67, 148, 187, - 8, 94, 203, 120, 121, 120, - 126, 74, 170, 83, 209, 21, - 43, 73, 1, 0, 0, 0, - 124, 13, 0, 0, 6, 0, + 68, 88, 66, 67, 242, 103, + 49, 84, 105, 84, 128, 131, + 50, 149, 249, 84, 224, 173, + 77, 78, 1, 0, 0, 0, + 140, 13, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, - 216, 10, 0, 0, 12, 11, - 0, 0, 64, 11, 0, 0, - 212, 11, 0, 0, 224, 12, + 232, 10, 0, 0, 28, 11, + 0, 0, 80, 11, 0, 0, + 228, 11, 0, 0, 240, 12, 0, 0, 82, 68, 69, 70, - 152, 10, 0, 0, 1, 0, + 168, 10, 0, 0, 1, 0, 0, 0, 120, 0, 0, 0, 1, 0, 0, 0, 60, 0, 0, 0, 1, 5, 83, 72, - 0, 5, 0, 0, 110, 10, + 0, 5, 0, 0, 126, 10, 0, 0, 19, 19, 68, 37, 60, 0, 0, 0, 24, 0, 0, 0, 40, 0, 0, 0, @@ -226,137 +226,137 @@ const BYTE discrete_triangle_hs[] = 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 156, 7, + 0, 0, 0, 0, 158, 7, 0, 0, 168, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 179, 7, 0, 0, + 0, 0, 197, 7, 0, 0, 176, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 212, 7, 0, 0, 180, 0, + 230, 7, 0, 0, 180, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 228, 7, + 0, 0, 0, 0, 246, 7, 0, 0, 184, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 116, 6, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 249, 7, 0, 0, + 0, 0, 11, 8, 0, 0, 192, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 28, 8, 0, 0, 0, 0, + 44, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 64, 8, 0, 0, 224, 0, + 80, 8, 0, 0, 224, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 85, 8, + 0, 0, 0, 0, 101, 8, 0, 0, 228, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 52, 7, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 109, 8, 0, 0, + 0, 0, 125, 8, 0, 0, 232, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 126, 8, 0, 0, 236, 0, + 142, 8, 0, 0, 236, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 166, 8, + 0, 0, 0, 0, 182, 8, 0, 0, 240, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 184, 8, 0, 0, + 0, 0, 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 220, 8, 0, 0, + 0, 0, 236, 8, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 247, 8, 0, 0, 8, 1, + 7, 9, 0, 0, 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 17, 9, + 0, 0, 0, 0, 33, 9, 0, 0, 16, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 51, 9, 0, 0, + 0, 0, 67, 9, 0, 0, 32, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 68, 9, 0, 0, 0, 0, + 84, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 104, 9, 0, 0, 64, 1, + 120, 9, 0, 0, 64, 1, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 136, 9, + 0, 0, 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 172, 9, + 0, 0, 0, 0, 188, 9, 0, 0, 80, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 136, 9, 0, 0, + 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 197, 9, 0, 0, + 0, 0, 213, 9, 0, 0, 96, 1, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, - 216, 9, 0, 0, 0, 0, + 232, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 252, 9, 0, 0, 160, 1, + 12, 10, 0, 0, 160, 1, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 20, 10, + 0, 0, 0, 0, 36, 10, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 56, 10, + 0, 0, 0, 0, 72, 10, 0, 0, 192, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 136, 9, 0, 0, + 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 86, 10, 0, 0, + 0, 0, 102, 10, 0, 0, 208, 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 184, 8, 0, 0, 0, 0, + 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, @@ -446,11 +446,14 @@ const BYTE discrete_triangle_hs[] = 0, 120, 101, 95, 112, 111, 105, 110, 116, 95, 99, 111, 110, 115, 116, 97, 110, 116, - 95, 114, 97, 100, 105, 117, - 115, 0, 120, 101, 95, 112, - 111, 105, 110, 116, 95, 115, - 99, 114, 101, 101, 110, 95, - 116, 111, 95, 110, 100, 99, + 95, 100, 105, 97, 109, 101, + 116, 101, 114, 0, 120, 101, + 95, 112, 111, 105, 110, 116, + 95, 115, 99, 114, 101, 101, + 110, 95, 100, 105, 97, 109, + 101, 116, 101, 114, 95, 116, + 111, 95, 110, 100, 99, 95, + 114, 97, 100, 105, 117, 115, 0, 120, 101, 95, 105, 110, 116, 101, 114, 112, 111, 108, 97, 116, 111, 114, 95, 115, @@ -468,224 +471,223 @@ const BYTE discrete_triangle_hs[] = 105, 122, 122, 108, 101, 100, 95, 115, 105, 103, 110, 115, 0, 117, 105, 110, 116, 52, - 0, 171, 171, 171, 1, 0, - 19, 0, 1, 0, 4, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 19, 8, 0, 0, 120, 101, - 95, 116, 101, 120, 116, 117, - 114, 101, 115, 95, 114, 101, - 115, 111, 108, 118, 101, 100, - 0, 120, 101, 95, 97, 108, - 112, 104, 97, 95, 116, 101, - 115, 116, 95, 114, 101, 102, - 101, 114, 101, 110, 99, 101, - 0, 120, 101, 95, 97, 108, - 112, 104, 97, 95, 116, 111, - 95, 109, 97, 115, 107, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 51, 50, 98, - 112, 112, 95, 116, 105, 108, - 101, 95, 112, 105, 116, 99, - 104, 95, 100, 119, 111, 114, - 100, 115, 95, 115, 99, 97, - 108, 101, 100, 0, 120, 101, - 95, 99, 111, 108, 111, 114, - 95, 101, 120, 112, 95, 98, - 105, 97, 115, 0, 1, 0, - 3, 0, 1, 0, 4, 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, - 172, 6, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 112, 111, 108, 121, 95, - 111, 102, 102, 115, 101, 116, - 95, 102, 114, 111, 110, 116, - 0, 120, 101, 95, 101, 100, - 114, 97, 109, 95, 112, 111, - 108, 121, 95, 111, 102, 102, - 115, 101, 116, 95, 98, 97, - 99, 107, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 100, 101, 112, 116, 104, 95, - 98, 97, 115, 101, 95, 100, - 119, 111, 114, 100, 115, 95, - 115, 99, 97, 108, 101, 100, - 0, 120, 101, 95, 101, 100, - 114, 97, 109, 95, 115, 116, - 101, 110, 99, 105, 108, 0, - 1, 0, 19, 0, 1, 0, - 4, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 19, 8, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, - 98, 97, 115, 101, 95, 100, - 119, 111, 114, 100, 115, 95, - 115, 99, 97, 108, 101, 100, 0, 171, 1, 0, 19, 0, + 1, 0, 4, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 37, 8, + 0, 0, 120, 101, 95, 116, + 101, 120, 116, 117, 114, 101, + 115, 95, 114, 101, 115, 111, + 108, 118, 101, 100, 0, 120, + 101, 95, 97, 108, 112, 104, + 97, 95, 116, 101, 115, 116, + 95, 114, 101, 102, 101, 114, + 101, 110, 99, 101, 0, 120, + 101, 95, 97, 108, 112, 104, + 97, 95, 116, 111, 95, 109, + 97, 115, 107, 0, 120, 101, + 95, 101, 100, 114, 97, 109, + 95, 51, 50, 98, 112, 112, + 95, 116, 105, 108, 101, 95, + 112, 105, 116, 99, 104, 95, + 100, 119, 111, 114, 100, 115, + 95, 115, 99, 97, 108, 101, + 100, 0, 120, 101, 95, 99, + 111, 108, 111, 114, 95, 101, + 120, 112, 95, 98, 105, 97, + 115, 0, 1, 0, 3, 0, 1, 0, 4, 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, 19, 8, + 0, 0, 0, 0, 172, 6, 0, 0, 120, 101, 95, 101, - 100, 114, 97, 109, 95, 114, - 116, 95, 102, 111, 114, 109, - 97, 116, 95, 102, 108, 97, - 103, 115, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 114, 116, 95, 99, 108, 97, - 109, 112, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 172, 6, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 107, 101, - 101, 112, 95, 109, 97, 115, - 107, 0, 171, 171, 1, 0, + 100, 114, 97, 109, 95, 112, + 111, 108, 121, 95, 111, 102, + 102, 115, 101, 116, 95, 102, + 114, 111, 110, 116, 0, 120, + 101, 95, 101, 100, 114, 97, + 109, 95, 112, 111, 108, 121, + 95, 111, 102, 102, 115, 101, + 116, 95, 98, 97, 99, 107, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 100, 101, + 112, 116, 104, 95, 98, 97, + 115, 101, 95, 100, 119, 111, + 114, 100, 115, 95, 115, 99, + 97, 108, 101, 100, 0, 120, + 101, 95, 101, 100, 114, 97, + 109, 95, 115, 116, 101, 110, + 99, 105, 108, 0, 1, 0, 19, 0, 1, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 8, 0, 0, 120, 101, + 37, 8, 0, 0, 120, 101, 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 98, 108, - 101, 110, 100, 95, 102, 97, - 99, 116, 111, 114, 115, 95, - 111, 112, 115, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 98, 108, 101, 110, 100, - 95, 99, 111, 110, 115, 116, - 97, 110, 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, 73, 83, - 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, + 95, 114, 116, 95, 98, 97, + 115, 101, 95, 100, 119, 111, + 114, 100, 115, 95, 115, 99, + 97, 108, 101, 100, 0, 171, + 1, 0, 19, 0, 1, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 1, 1, - 0, 0, 88, 69, 86, 69, - 82, 84, 69, 88, 73, 68, - 0, 171, 79, 83, 71, 78, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 37, 8, 0, 0, + 120, 101, 95, 101, 100, 114, + 97, 109, 95, 114, 116, 95, + 102, 111, 114, 109, 97, 116, + 95, 102, 108, 97, 103, 115, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 114, 116, + 95, 99, 108, 97, 109, 112, + 0, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 4, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 172, 6, + 0, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 114, + 116, 95, 107, 101, 101, 112, + 95, 109, 97, 115, 107, 0, + 171, 171, 1, 0, 19, 0, + 1, 0, 4, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 37, 8, + 0, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 114, + 116, 95, 98, 108, 101, 110, + 100, 95, 102, 97, 99, 116, + 111, 114, 115, 95, 111, 112, + 115, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 98, + 108, 101, 110, 100, 95, 99, + 111, 110, 115, 116, 97, 110, + 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, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 1, 14, 0, 0, + 0, 0, 1, 1, 0, 0, 88, 69, 86, 69, 82, 84, 69, 88, 73, 68, 0, 171, - 80, 67, 83, 71, 140, 0, - 0, 0, 4, 0, 0, 0, - 8, 0, 0, 0, 104, 0, - 0, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 1, 14, 0, 0, 104, 0, + 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 1, 14, 0, 0, 104, 0, - 0, 0, 2, 0, 0, 0, - 13, 0, 0, 0, 3, 0, - 0, 0, 2, 0, 0, 0, - 1, 14, 0, 0, 118, 0, + 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 1, 14, 0, 0, 88, 69, + 86, 69, 82, 84, 69, 88, + 73, 68, 0, 171, 80, 67, + 83, 71, 140, 0, 0, 0, + 4, 0, 0, 0, 8, 0, + 0, 0, 104, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 3, 0, 0, 0, - 1, 14, 0, 0, 83, 86, - 95, 84, 101, 115, 115, 70, + 0, 0, 0, 0, 1, 14, + 0, 0, 104, 0, 0, 0, + 1, 0, 0, 0, 13, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 1, 14, + 0, 0, 104, 0, 0, 0, + 2, 0, 0, 0, 13, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 1, 14, + 0, 0, 118, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 1, 14, + 0, 0, 83, 86, 95, 84, + 101, 115, 115, 70, 97, 99, + 116, 111, 114, 0, 83, 86, + 95, 73, 110, 115, 105, 100, + 101, 84, 101, 115, 115, 70, 97, 99, 116, 111, 114, 0, - 83, 86, 95, 73, 110, 115, - 105, 100, 101, 84, 101, 115, - 115, 70, 97, 99, 116, 111, - 114, 0, 171, 171, 83, 72, - 69, 88, 4, 1, 0, 0, - 81, 0, 3, 0, 65, 0, - 0, 0, 113, 0, 0, 1, - 147, 24, 0, 1, 148, 24, - 0, 1, 149, 16, 0, 1, - 150, 8, 0, 1, 151, 24, - 0, 1, 106, 8, 0, 1, - 89, 0, 0, 7, 70, 142, - 48, 0, 0, 0, 0, 0, + 171, 171, 83, 72, 69, 88, + 4, 1, 0, 0, 81, 0, + 3, 0, 65, 0, 0, 0, + 113, 0, 0, 1, 147, 24, + 0, 1, 148, 24, 0, 1, + 149, 16, 0, 1, 150, 8, + 0, 1, 151, 24, 0, 1, + 106, 8, 0, 1, 89, 0, + 0, 7, 70, 142, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 115, 0, - 0, 1, 153, 0, 0, 2, - 3, 0, 0, 0, 95, 0, - 0, 2, 0, 112, 1, 0, - 103, 0, 0, 4, 18, 32, - 16, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 103, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 115, 0, 0, 1, + 153, 0, 0, 2, 3, 0, + 0, 0, 95, 0, 0, 2, + 0, 112, 1, 0, 103, 0, 0, 4, 18, 32, 16, 0, - 1, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 103, 0, 0, 4, - 18, 32, 16, 0, 2, 0, - 0, 0, 19, 0, 0, 0, - 104, 0, 0, 2, 1, 0, - 0, 0, 91, 0, 0, 4, - 18, 32, 16, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 54, 0, 0, 4, 18, 0, + 18, 32, 16, 0, 1, 0, + 0, 0, 18, 0, 0, 0, + 103, 0, 0, 4, 18, 32, + 16, 0, 2, 0, 0, 0, + 19, 0, 0, 0, 104, 0, + 0, 2, 1, 0, 0, 0, + 91, 0, 0, 4, 18, 32, + 16, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 54, 0, + 0, 4, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 112, + 1, 0, 54, 0, 0, 8, + 18, 32, 144, 0, 10, 0, 16, 0, 0, 0, 0, 0, - 10, 112, 1, 0, 54, 0, - 0, 8, 18, 32, 144, 0, - 10, 0, 16, 0, 0, 0, - 0, 0, 42, 128, 48, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 62, 0, 0, 1, 115, 0, - 0, 1, 103, 0, 0, 4, - 18, 32, 16, 0, 3, 0, - 0, 0, 20, 0, 0, 0, - 54, 0, 0, 7, 18, 32, - 16, 0, 3, 0, 0, 0, 42, 128, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, - 0, 1, 83, 84, 65, 84, - 148, 0, 0, 0, 5, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, + 0, 1, 115, 0, 0, 1, + 103, 0, 0, 4, 18, 32, + 16, 0, 3, 0, 0, 0, + 20, 0, 0, 0, 54, 0, + 0, 7, 18, 32, 16, 0, + 3, 0, 0, 0, 42, 128, + 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 62, 0, 0, 1, + 83, 84, 65, 84, 148, 0, + 0, 0, 5, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 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, + 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 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, 3, 0, 0, 0, + 3, 0, 0, 0, 1, 0, 0, 0, 2, 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, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 10, 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, 3, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0 + 0, 0, 0, 0, 0, 0 }; diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_point_list_gs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_point_list_gs.h index acbcce87d..530c45ecd 100644 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_point_list_gs.h +++ b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_point_list_gs.h @@ -19,8 +19,8 @@ // float xe_point_vertex_diameter_min;// Offset: 140 Size: 4 [unused] // float3 xe_ndc_offset; // Offset: 144 Size: 12 [unused] // float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [unused] -// float2 xe_point_constant_radius; // Offset: 160 Size: 8 -// float2 xe_point_screen_to_ndc; // Offset: 168 Size: 8 +// float2 xe_point_constant_diameter; // Offset: 160 Size: 8 +// float2 xe_point_screen_diameter_to_ndc_radius;// Offset: 168 Size: 8 // uint xe_interpolator_sampling_pattern;// Offset: 176 Size: 4 [unused] // uint xe_ps_param_gen; // Offset: 180 Size: 4 [unused] // uint2 xe_sample_count_log2; // Offset: 184 Size: 8 [unused] @@ -162,11 +162,7 @@ if_nz r0.x ret endif ge [precise(x)] r0.x, v[0][16].z, l(0.000000) -if_nz r0.x - mul [precise(xy)] r0.xy, l(0.500000, 0.500000, 0.000000, 0.000000), v[0][16].zzzz -else - mov [precise(xy)] r0.xy, CB0[0][10].xyxx -endif +movc [precise(xy)] r0.xy, r0.xxxx, v[0][16].zzzz, CB0[0][10].xyxx lt [precise(zw)] r0.zw, l(0.000000, 0.000000, 0.000000, 0.000000), r0.xxxy and [precise(z)] r0.z, r0.w, r0.z if_z r0.z @@ -274,26 +270,26 @@ mov o19.xy, v[0][19].xyxx emit_stream m0 cut_stream m0 ret -// Approximately 121 instruction slots used +// Approximately 117 instruction slots used #endif const BYTE primitive_point_list_gs[] = { - 68, 88, 66, 67, 193, 245, - 77, 40, 213, 43, 129, 142, - 106, 187, 17, 173, 235, 7, - 183, 6, 1, 0, 0, 0, - 176, 29, 0, 0, 5, 0, + 68, 88, 66, 67, 189, 205, + 170, 40, 149, 167, 183, 76, + 207, 160, 219, 147, 216, 124, + 203, 93, 1, 0, 0, 0, + 148, 29, 0, 0, 5, 0, 0, 0, 52, 0, 0, 0, - 212, 10, 0, 0, 20, 13, - 0, 0, 124, 15, 0, 0, - 20, 29, 0, 0, 82, 68, - 69, 70, 152, 10, 0, 0, + 228, 10, 0, 0, 36, 13, + 0, 0, 140, 15, 0, 0, + 248, 28, 0, 0, 82, 68, + 69, 70, 168, 10, 0, 0, 1, 0, 0, 0, 120, 0, 0, 0, 1, 0, 0, 0, 60, 0, 0, 0, 1, 5, 83, 71, 0, 5, 0, 0, - 110, 10, 0, 0, 19, 19, + 126, 10, 0, 0, 19, 19, 68, 37, 60, 0, 0, 0, 24, 0, 0, 0, 40, 0, 0, 0, 40, 0, 0, 0, @@ -393,136 +389,136 @@ const BYTE primitive_point_list_gs[] = 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 156, 7, 0, 0, 168, 0, + 158, 7, 0, 0, 168, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 179, 7, + 0, 0, 0, 0, 197, 7, 0, 0, 176, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 212, 7, 0, 0, + 0, 0, 230, 7, 0, 0, 180, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 228, 7, 0, 0, 184, 0, + 246, 7, 0, 0, 184, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 116, 6, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 249, 7, + 0, 0, 0, 0, 11, 8, 0, 0, 192, 0, 0, 0, 32, 0, 0, 0, 0, 0, - 0, 0, 28, 8, 0, 0, + 0, 0, 44, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 64, 8, 0, 0, + 0, 0, 80, 8, 0, 0, 224, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 85, 8, 0, 0, 228, 0, + 101, 8, 0, 0, 228, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 52, 7, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 109, 8, + 0, 0, 0, 0, 125, 8, 0, 0, 232, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 126, 8, 0, 0, + 0, 0, 142, 8, 0, 0, 236, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 166, 8, 0, 0, 240, 0, + 182, 8, 0, 0, 240, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 184, 8, + 0, 0, 0, 0, 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 220, 8, + 0, 0, 0, 0, 236, 8, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 247, 8, 0, 0, + 0, 0, 7, 9, 0, 0, 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 17, 9, 0, 0, 16, 1, + 33, 9, 0, 0, 16, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 51, 9, + 0, 0, 0, 0, 67, 9, 0, 0, 32, 1, 0, 0, 32, 0, 0, 0, 0, 0, - 0, 0, 68, 9, 0, 0, + 0, 0, 84, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 104, 9, 0, 0, + 0, 0, 120, 9, 0, 0, 64, 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 136, 9, 0, 0, 0, 0, + 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 172, 9, 0, 0, 80, 1, + 188, 9, 0, 0, 80, 1, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 136, 9, + 0, 0, 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 197, 9, + 0, 0, 0, 0, 213, 9, 0, 0, 96, 1, 0, 0, 64, 0, 0, 0, 0, 0, - 0, 0, 216, 9, 0, 0, + 0, 0, 232, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 252, 9, 0, 0, + 0, 0, 12, 10, 0, 0, 160, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 20, 10, 0, 0, 0, 0, + 36, 10, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 56, 10, 0, 0, 192, 1, + 72, 10, 0, 0, 192, 1, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 136, 9, + 0, 0, 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 86, 10, + 0, 0, 0, 0, 102, 10, 0, 0, 208, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 184, 8, 0, 0, + 0, 0, 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, @@ -612,12 +608,15 @@ const BYTE primitive_point_list_gs[] = 97, 120, 0, 120, 101, 95, 112, 111, 105, 110, 116, 95, 99, 111, 110, 115, 116, 97, - 110, 116, 95, 114, 97, 100, - 105, 117, 115, 0, 120, 101, - 95, 112, 111, 105, 110, 116, - 95, 115, 99, 114, 101, 101, - 110, 95, 116, 111, 95, 110, - 100, 99, 0, 120, 101, 95, + 110, 116, 95, 100, 105, 97, + 109, 101, 116, 101, 114, 0, + 120, 101, 95, 112, 111, 105, + 110, 116, 95, 115, 99, 114, + 101, 101, 110, 95, 100, 105, + 97, 109, 101, 116, 101, 114, + 95, 116, 111, 95, 110, 100, + 99, 95, 114, 97, 100, 105, + 117, 115, 0, 120, 101, 95, 105, 110, 116, 101, 114, 112, 111, 108, 97, 116, 111, 114, 95, 115, 97, 109, 112, 108, @@ -634,513 +633,596 @@ const BYTE primitive_point_list_gs[] = 115, 119, 105, 122, 122, 108, 101, 100, 95, 115, 105, 103, 110, 115, 0, 117, 105, 110, - 116, 52, 0, 171, 171, 171, + 116, 52, 0, 171, 1, 0, + 19, 0, 1, 0, 4, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 37, 8, 0, 0, 120, 101, + 95, 116, 101, 120, 116, 117, + 114, 101, 115, 95, 114, 101, + 115, 111, 108, 118, 101, 100, + 0, 120, 101, 95, 97, 108, + 112, 104, 97, 95, 116, 101, + 115, 116, 95, 114, 101, 102, + 101, 114, 101, 110, 99, 101, + 0, 120, 101, 95, 97, 108, + 112, 104, 97, 95, 116, 111, + 95, 109, 97, 115, 107, 0, + 120, 101, 95, 101, 100, 114, + 97, 109, 95, 51, 50, 98, + 112, 112, 95, 116, 105, 108, + 101, 95, 112, 105, 116, 99, + 104, 95, 100, 119, 111, 114, + 100, 115, 95, 115, 99, 97, + 108, 101, 100, 0, 120, 101, + 95, 99, 111, 108, 111, 114, + 95, 101, 120, 112, 95, 98, + 105, 97, 115, 0, 1, 0, + 3, 0, 1, 0, 4, 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, + 172, 6, 0, 0, 120, 101, + 95, 101, 100, 114, 97, 109, + 95, 112, 111, 108, 121, 95, + 111, 102, 102, 115, 101, 116, + 95, 102, 114, 111, 110, 116, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 112, 111, + 108, 121, 95, 111, 102, 102, + 115, 101, 116, 95, 98, 97, + 99, 107, 0, 120, 101, 95, + 101, 100, 114, 97, 109, 95, + 100, 101, 112, 116, 104, 95, + 98, 97, 115, 101, 95, 100, + 119, 111, 114, 100, 115, 95, + 115, 99, 97, 108, 101, 100, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 115, 116, + 101, 110, 99, 105, 108, 0, 1, 0, 19, 0, 1, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 8, 0, 0, - 120, 101, 95, 116, 101, 120, - 116, 117, 114, 101, 115, 95, - 114, 101, 115, 111, 108, 118, - 101, 100, 0, 120, 101, 95, - 97, 108, 112, 104, 97, 95, - 116, 101, 115, 116, 95, 114, - 101, 102, 101, 114, 101, 110, - 99, 101, 0, 120, 101, 95, - 97, 108, 112, 104, 97, 95, - 116, 111, 95, 109, 97, 115, - 107, 0, 120, 101, 95, 101, - 100, 114, 97, 109, 95, 51, - 50, 98, 112, 112, 95, 116, - 105, 108, 101, 95, 112, 105, - 116, 99, 104, 95, 100, 119, - 111, 114, 100, 115, 95, 115, - 99, 97, 108, 101, 100, 0, - 120, 101, 95, 99, 111, 108, - 111, 114, 95, 101, 120, 112, - 95, 98, 105, 97, 115, 0, - 1, 0, 3, 0, 1, 0, + 0, 0, 37, 8, 0, 0, + 120, 101, 95, 101, 100, 114, + 97, 109, 95, 114, 116, 95, + 98, 97, 115, 101, 95, 100, + 119, 111, 114, 100, 115, 95, + 115, 99, 97, 108, 101, 100, + 0, 171, 1, 0, 19, 0, + 1, 0, 4, 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, 37, 8, + 0, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 114, + 116, 95, 102, 111, 114, 109, + 97, 116, 95, 102, 108, 97, + 103, 115, 0, 120, 101, 95, + 101, 100, 114, 97, 109, 95, + 114, 116, 95, 99, 108, 97, + 109, 112, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, 4, 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, 172, 6, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 112, 111, 108, - 121, 95, 111, 102, 102, 115, - 101, 116, 95, 102, 114, 111, - 110, 116, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 112, 111, 108, 121, 95, 111, - 102, 102, 115, 101, 116, 95, - 98, 97, 99, 107, 0, 120, - 101, 95, 101, 100, 114, 97, - 109, 95, 100, 101, 112, 116, - 104, 95, 98, 97, 115, 101, - 95, 100, 119, 111, 114, 100, - 115, 95, 115, 99, 97, 108, - 101, 100, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 115, 116, 101, 110, 99, 105, - 108, 0, 1, 0, 19, 0, - 1, 0, 4, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 8, - 0, 0, 120, 101, 95, 101, - 100, 114, 97, 109, 95, 114, - 116, 95, 98, 97, 115, 101, - 95, 100, 119, 111, 114, 100, - 115, 95, 115, 99, 97, 108, - 101, 100, 0, 171, 1, 0, - 19, 0, 1, 0, 4, 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, - 19, 8, 0, 0, 120, 101, + 172, 6, 0, 0, 120, 101, 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 102, 111, - 114, 109, 97, 116, 95, 102, - 108, 97, 103, 115, 0, 120, - 101, 95, 101, 100, 114, 97, - 109, 95, 114, 116, 95, 99, - 108, 97, 109, 112, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 4, 0, 0, 0, + 95, 114, 116, 95, 107, 101, + 101, 112, 95, 109, 97, 115, + 107, 0, 171, 171, 1, 0, + 19, 0, 1, 0, 4, 0, + 2, 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, 172, 6, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, - 107, 101, 101, 112, 95, 109, - 97, 115, 107, 0, 171, 171, - 1, 0, 19, 0, 1, 0, - 4, 0, 2, 0, 0, 0, + 37, 8, 0, 0, 120, 101, + 95, 101, 100, 114, 97, 109, + 95, 114, 116, 95, 98, 108, + 101, 110, 100, 95, 102, 97, + 99, 116, 111, 114, 115, 95, + 111, 112, 115, 0, 120, 101, + 95, 101, 100, 114, 97, 109, + 95, 98, 108, 101, 110, 100, + 95, 99, 111, 110, 115, 116, + 97, 110, 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, 73, 83, + 71, 78, 56, 2, 0, 0, + 21, 0, 0, 0, 8, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 19, 8, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, - 98, 108, 101, 110, 100, 95, - 102, 97, 99, 116, 111, 114, - 115, 95, 111, 112, 115, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 98, 108, 101, - 110, 100, 95, 99, 111, 110, - 115, 116, 97, 110, 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, - 73, 83, 71, 78, 56, 2, - 0, 0, 21, 0, 0, 0, - 8, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 2, 0, 0, 0, - 15, 15, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 4, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 4, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 5, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 5, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 6, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 6, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 7, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 7, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 8, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 9, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 9, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 10, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 10, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 11, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 11, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 12, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 12, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 13, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 13, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 14, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 14, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 15, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 15, 0, 0, 0, 15, 15, + 0, 0, 0, 2, 0, 0, + 16, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 16, 0, 0, 0, 7, 4, + 0, 0, 9, 2, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 17, 0, 0, 0, 15, 15, + 0, 0, 21, 2, 0, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 3, 0, 0, 0, + 18, 0, 0, 0, 15, 15, + 0, 0, 21, 2, 0, 0, + 1, 0, 0, 0, 2, 0, + 0, 0, 3, 0, 0, 0, + 19, 0, 0, 0, 3, 3, + 0, 0, 37, 2, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 5, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 6, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 7, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 8, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 9, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 10, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 11, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 12, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 13, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 14, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 14, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 15, 0, 0, 0, - 15, 15, 0, 0, 0, 2, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 16, 0, 0, 0, - 7, 4, 0, 0, 9, 2, + 19, 0, 0, 0, 4, 4, + 0, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 83, + 86, 95, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 83, + 86, 95, 67, 108, 105, 112, + 68, 105, 115, 116, 97, 110, + 99, 101, 0, 83, 86, 95, + 67, 117, 108, 108, 68, 105, + 115, 116, 97, 110, 99, 101, + 0, 171, 171, 171, 79, 83, + 71, 53, 96, 2, 0, 0, + 20, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 17, 0, 0, 0, - 15, 15, 0, 0, 21, 2, + 56, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 18, 0, 0, 0, - 15, 15, 0, 0, 21, 2, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 56, 2, 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 19, 0, 0, 0, - 3, 3, 0, 0, 37, 2, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 0, 0, + 0, 0, 56, 2, 0, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, + 56, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, + 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 56, 2, + 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 4, 0, 0, 0, + 15, 0, 0, 0, 0, 0, + 0, 0, 56, 2, 0, 0, + 5, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 5, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, + 56, 2, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 6, 0, + 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 56, 2, + 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 7, 0, 0, 0, + 15, 0, 0, 0, 0, 0, + 0, 0, 56, 2, 0, 0, + 8, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, + 56, 2, 0, 0, 9, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 9, 0, + 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 56, 2, + 0, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 10, 0, 0, 0, + 15, 0, 0, 0, 0, 0, + 0, 0, 56, 2, 0, 0, + 11, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 11, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, + 56, 2, 0, 0, 12, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 12, 0, + 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 56, 2, + 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 13, 0, 0, 0, + 15, 0, 0, 0, 0, 0, + 0, 0, 56, 2, 0, 0, + 14, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 14, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, + 56, 2, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 15, 0, + 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 56, 2, + 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 16, 0, 0, 0, + 7, 8, 0, 0, 0, 0, + 0, 0, 65, 2, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 17, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, + 77, 2, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 3, 0, 0, 0, 18, 0, + 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 77, 2, + 0, 0, 1, 0, 0, 0, + 2, 0, 0, 0, 3, 0, 0, 0, 19, 0, 0, 0, - 4, 4, 0, 0, 84, 69, + 3, 12, 0, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 83, 86, 95, 67, 108, 105, 112, 68, 105, 115, 116, - 97, 110, 99, 101, 0, 83, - 86, 95, 67, 117, 108, 108, - 68, 105, 115, 116, 97, 110, - 99, 101, 0, 171, 171, 171, - 79, 83, 71, 53, 96, 2, - 0, 0, 20, 0, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, + 97, 110, 99, 101, 0, 171, + 171, 171, 83, 72, 69, 88, + 100, 13, 0, 0, 81, 0, + 2, 0, 89, 3, 0, 0, + 106, 8, 0, 1, 89, 0, + 0, 7, 70, 142, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 2, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 3, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 4, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 5, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 6, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 6, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 7, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 8, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 9, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 9, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 10, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 10, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 11, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 12, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 12, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 13, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 13, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 14, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 14, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 15, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 16, 0, - 0, 0, 7, 8, 0, 0, - 0, 0, 0, 0, 65, 2, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 17, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 77, 2, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 18, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 77, 2, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 19, 0, - 0, 0, 3, 12, 0, 0, - 84, 69, 88, 67, 79, 79, - 82, 68, 0, 83, 86, 95, - 80, 111, 115, 105, 116, 105, - 111, 110, 0, 83, 86, 95, - 67, 108, 105, 112, 68, 105, - 115, 116, 97, 110, 99, 101, - 0, 171, 171, 171, 83, 72, - 69, 88, 144, 13, 0, 0, - 81, 0, 2, 0, 100, 3, - 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, 11, 0, 0, 0, - 0, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 4, 242, 16, 32, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 95, 0, 0, 4, 242, 16, + 32, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 95, 0, + 0, 4, 242, 16, 32, 0, + 1, 0, 0, 0, 2, 0, + 0, 0, 95, 0, 0, 4, + 242, 16, 32, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 95, 0, 0, 4, 242, 16, + 32, 0, 1, 0, 0, 0, + 4, 0, 0, 0, 95, 0, + 0, 4, 242, 16, 32, 0, + 1, 0, 0, 0, 5, 0, + 0, 0, 95, 0, 0, 4, + 242, 16, 32, 0, 1, 0, + 0, 0, 6, 0, 0, 0, + 95, 0, 0, 4, 242, 16, + 32, 0, 1, 0, 0, 0, + 7, 0, 0, 0, 95, 0, + 0, 4, 242, 16, 32, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 95, 0, 0, 4, + 242, 16, 32, 0, 1, 0, + 0, 0, 9, 0, 0, 0, + 95, 0, 0, 4, 242, 16, + 32, 0, 1, 0, 0, 0, + 10, 0, 0, 0, 95, 0, + 0, 4, 242, 16, 32, 0, + 1, 0, 0, 0, 11, 0, + 0, 0, 95, 0, 0, 4, + 242, 16, 32, 0, 1, 0, + 0, 0, 12, 0, 0, 0, + 95, 0, 0, 4, 242, 16, + 32, 0, 1, 0, 0, 0, + 13, 0, 0, 0, 95, 0, + 0, 4, 242, 16, 32, 0, + 1, 0, 0, 0, 14, 0, + 0, 0, 95, 0, 0, 4, + 242, 16, 32, 0, 1, 0, + 0, 0, 15, 0, 0, 0, + 95, 0, 0, 4, 114, 16, + 32, 0, 1, 0, 0, 0, + 16, 0, 0, 0, 97, 0, + 0, 5, 242, 16, 32, 0, + 1, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 95, 0, 0, 4, 242, 16, 32, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 4, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 5, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 6, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 7, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 9, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 10, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 11, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 12, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 13, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 14, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 15, 0, - 0, 0, 95, 0, 0, 4, - 114, 16, 32, 0, 1, 0, - 0, 0, 16, 0, 0, 0, - 97, 0, 0, 5, 242, 16, - 32, 0, 1, 0, 0, 0, - 17, 0, 0, 0, 1, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 18, 0, 0, 0, - 95, 0, 0, 4, 50, 16, - 32, 0, 1, 0, 0, 0, - 19, 0, 0, 0, 95, 0, - 0, 4, 66, 16, 32, 0, + 18, 0, 0, 0, 95, 0, + 0, 4, 50, 16, 32, 0, 1, 0, 0, 0, 19, 0, - 0, 0, 104, 0, 0, 2, - 3, 0, 0, 0, 93, 8, - 0, 1, 143, 0, 0, 3, - 0, 0, 17, 0, 0, 0, - 0, 0, 92, 40, 0, 1, - 101, 0, 0, 3, 242, 32, - 16, 0, 0, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 2, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 3, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 4, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 5, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 6, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 7, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 8, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 9, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 10, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 11, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 12, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 13, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 14, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 15, 0, 0, 0, - 101, 0, 0, 3, 114, 32, - 16, 0, 16, 0, 0, 0, - 103, 0, 0, 4, 242, 32, - 16, 0, 17, 0, 0, 0, - 1, 0, 0, 0, 103, 0, + 0, 0, 95, 0, 0, 4, + 66, 16, 32, 0, 1, 0, + 0, 0, 19, 0, 0, 0, + 104, 0, 0, 2, 3, 0, + 0, 0, 93, 8, 0, 1, + 143, 0, 0, 3, 0, 0, + 17, 0, 0, 0, 0, 0, + 92, 40, 0, 1, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 3, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 4, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 5, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 6, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 7, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 8, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 9, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 10, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 11, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 12, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 13, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 14, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 15, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 16, 0, 0, 0, 103, 0, 0, 4, 242, 32, 16, 0, - 18, 0, 0, 0, 2, 0, + 17, 0, 0, 0, 1, 0, 0, 0, 103, 0, 0, 4, - 50, 32, 16, 0, 19, 0, + 242, 32, 16, 0, 18, 0, 0, 0, 2, 0, 0, 0, - 94, 0, 0, 2, 4, 0, - 0, 0, 49, 0, 8, 8, - 18, 0, 16, 0, 0, 0, - 0, 0, 42, 16, 32, 0, - 0, 0, 0, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 57, 0, - 120, 9, 242, 0, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 60, 0, - 48, 7, 98, 0, 16, 0, - 0, 0, 0, 0, 166, 11, - 16, 0, 1, 0, 0, 0, - 6, 1, 16, 0, 1, 0, - 0, 0, 60, 0, 16, 7, - 34, 0, 16, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 60, 0, 8, 7, 18, 0, - 16, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 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, - 29, 0, 8, 8, 18, 0, + 103, 0, 0, 4, 50, 32, + 16, 0, 19, 0, 0, 0, + 2, 0, 0, 0, 94, 0, + 0, 2, 4, 0, 0, 0, + 49, 0, 8, 8, 18, 0, 16, 0, 0, 0, 0, 0, 42, 16, 32, 0, 0, 0, - 0, 0, 16, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 1, 64, 0, 0, 0, 0, + 0, 0, 57, 0, 120, 9, + 242, 0, 16, 0, 1, 0, + 0, 0, 70, 30, 32, 0, + 0, 0, 0, 0, 17, 0, + 0, 0, 70, 30, 32, 0, + 0, 0, 0, 0, 17, 0, + 0, 0, 60, 0, 48, 7, + 98, 0, 16, 0, 0, 0, + 0, 0, 166, 11, 16, 0, + 1, 0, 0, 0, 6, 1, + 16, 0, 1, 0, 0, 0, + 60, 0, 16, 7, 34, 0, + 16, 0, 0, 0, 0, 0, + 42, 0, 16, 0, 0, 0, + 0, 0, 26, 0, 16, 0, + 0, 0, 0, 0, 60, 0, + 8, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 26, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, 0, 0, 31, 0, 4, 3, 10, 0, 16, 0, 0, 0, - 0, 0, 56, 0, 24, 11, - 50, 0, 16, 0, 0, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 166, 26, + 0, 0, 62, 0, 0, 1, + 21, 0, 0, 1, 29, 0, + 8, 8, 18, 0, 16, 0, + 0, 0, 0, 0, 42, 16, 32, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 18, 0, - 0, 1, 54, 0, 24, 7, - 50, 0, 16, 0, 0, 0, + 16, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 0, 0, + 55, 0, 24, 12, 50, 0, + 16, 0, 0, 0, 0, 0, + 6, 0, 16, 0, 0, 0, + 0, 0, 166, 26, 32, 0, + 0, 0, 0, 0, 16, 0, 0, 0, 70, 128, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, - 21, 0, 0, 1, 49, 0, - 96, 10, 194, 0, 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, - 6, 4, 16, 0, 0, 0, - 0, 0, 1, 0, 32, 7, - 66, 0, 16, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 0, 0, 0, 0, 42, 0, + 49, 0, 96, 10, 194, 0, 16, 0, 0, 0, 0, 0, - 31, 0, 0, 3, 42, 0, + 2, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 6, 4, 16, 0, + 0, 0, 0, 0, 1, 0, + 32, 7, 66, 0, 16, 0, + 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, - 62, 0, 0, 1, 21, 0, - 0, 1, 56, 0, 24, 9, - 50, 0, 16, 0, 0, 0, - 0, 0, 70, 0, 16, 0, - 0, 0, 0, 0, 230, 138, - 48, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 10, 0, - 0, 0, 56, 0, 24, 8, - 50, 0, 16, 0, 0, 0, - 0, 0, 70, 0, 16, 0, - 0, 0, 0, 0, 246, 31, + 42, 0, 16, 0, 0, 0, + 0, 0, 31, 0, 0, 3, + 42, 0, 16, 0, 0, 0, + 0, 0, 62, 0, 0, 1, + 21, 0, 0, 1, 56, 0, + 24, 9, 50, 0, 16, 0, + 0, 0, 0, 0, 70, 0, + 16, 0, 0, 0, 0, 0, + 230, 138, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 56, 0, + 24, 8, 50, 0, 16, 0, + 0, 0, 0, 0, 70, 0, + 16, 0, 0, 0, 0, 0, + 246, 31, 32, 0, 0, 0, + 0, 0, 17, 0, 0, 0, + 54, 0, 56, 6, 114, 0, + 16, 0, 1, 0, 0, 0, + 6, 1, 16, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 54, 0, 64, 5, 130, 0, + 16, 0, 1, 0, 0, 0, + 26, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 120, 8, + 242, 0, 16, 0, 2, 0, + 0, 0, 198, 9, 16, 0, + 1, 0, 0, 0, 70, 20, 32, 0, 0, 0, 0, 0, 17, 0, 0, 0, 54, 0, - 56, 6, 114, 0, 16, 0, - 1, 0, 0, 0, 6, 1, - 16, 128, 65, 0, 0, 0, + 0, 6, 242, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, - 64, 5, 130, 0, 16, 0, - 1, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 120, 8, 242, 0, - 16, 0, 2, 0, 0, 0, - 198, 9, 16, 0, 1, 0, - 0, 0, 70, 20, 32, 0, + 0, 6, 242, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 4, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 5, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 6, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 7, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 8, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 9, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 10, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 11, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 12, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 13, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 14, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 15, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 54, 0, + 0, 8, 50, 32, 16, 0, + 16, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 54, 0, 0, 6, 66, 32, + 16, 0, 16, 0, 0, 0, + 42, 16, 32, 0, 0, 0, + 0, 0, 16, 0, 0, 0, + 54, 0, 0, 5, 50, 32, + 16, 0, 17, 0, 0, 0, + 70, 0, 16, 0, 2, 0, + 0, 0, 54, 0, 0, 6, + 194, 32, 16, 0, 17, 0, + 0, 0, 166, 30, 32, 0, 0, 0, 0, 0, 17, 0, 0, 0, 54, 0, 0, 6, + 242, 32, 16, 0, 18, 0, + 0, 0, 70, 30, 32, 0, + 0, 0, 0, 0, 18, 0, + 0, 0, 54, 0, 0, 6, + 50, 32, 16, 0, 19, 0, + 0, 0, 70, 16, 32, 0, + 0, 0, 0, 0, 19, 0, + 0, 0, 117, 0, 0, 3, + 0, 0, 17, 0, 0, 0, + 0, 0, 54, 0, 0, 6, 242, 32, 16, 0, 0, 0, 0, 0, 70, 30, 32, 0, 0, 0, 0, 0, 0, 0, @@ -1208,14 +1290,14 @@ const BYTE primitive_point_list_gs[] = 50, 32, 16, 0, 16, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, + 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 6, 66, 32, 16, 0, 16, 0, 0, 0, 42, 16, 32, 0, 0, 0, 0, 0, 16, 0, 0, 0, 54, 0, 0, 5, 50, 32, 16, 0, - 17, 0, 0, 0, 70, 0, + 17, 0, 0, 0, 230, 10, 16, 0, 2, 0, 0, 0, 54, 0, 0, 6, 194, 32, 16, 0, 17, 0, 0, 0, @@ -1231,200 +1313,10 @@ const BYTE primitive_point_list_gs[] = 0, 0, 19, 0, 0, 0, 117, 0, 0, 3, 0, 0, 17, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, + 0, 0, 80, 8, 162, 0, 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 1, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 2, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 3, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 4, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 5, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 5, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 6, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 6, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 7, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 8, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 8, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 9, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 9, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 10, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 10, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 11, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 11, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 12, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 12, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 13, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 13, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 14, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 14, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 15, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 54, 0, 0, 8, 50, 32, - 16, 0, 16, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 63, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 6, - 66, 32, 16, 0, 16, 0, - 0, 0, 42, 16, 32, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 54, 0, 0, 5, - 50, 32, 16, 0, 17, 0, - 0, 0, 230, 10, 16, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 194, 32, 16, 0, - 17, 0, 0, 0, 166, 30, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 0, 0, - 80, 8, 162, 0, 16, 0, - 0, 0, 0, 0, 6, 4, - 16, 0, 0, 0, 0, 0, - 6, 20, 32, 0, 0, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 1, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 2, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 3, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 4, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 5, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 5, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 6, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 6, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 7, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 8, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 8, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 9, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 9, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 10, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 10, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 11, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 11, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 12, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 12, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 13, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 13, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 14, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 14, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 15, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 54, 0, 0, 8, 50, 32, - 16, 0, 16, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 6, - 66, 32, 16, 0, 16, 0, - 0, 0, 42, 16, 32, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 54, 0, 0, 5, - 50, 32, 16, 0, 17, 0, - 0, 0, 214, 5, 16, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 194, 32, 16, 0, - 17, 0, 0, 0, 166, 30, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 32, 5, 66, 0, 16, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 1, 0, 0, 0, - 0, 0, 24, 8, 50, 0, - 16, 0, 0, 0, 0, 0, - 134, 0, 16, 0, 0, 0, - 0, 0, 70, 16, 32, 0, + 6, 4, 16, 0, 0, 0, + 0, 0, 6, 20, 32, 0, 0, 0, 0, 0, 17, 0, 0, 0, 54, 0, 0, 6, 242, 32, 16, 0, 0, 0, @@ -1494,14 +1386,14 @@ const BYTE primitive_point_list_gs[] = 50, 32, 16, 0, 16, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 6, 66, 32, 16, 0, 16, 0, 0, 0, 42, 16, 32, 0, 0, 0, 0, 0, 16, 0, 0, 0, 54, 0, 0, 5, 50, 32, 16, 0, - 17, 0, 0, 0, 70, 0, + 17, 0, 0, 0, 214, 5, 16, 0, 0, 0, 0, 0, 54, 0, 0, 6, 194, 32, 16, 0, 17, 0, 0, 0, @@ -1517,33 +1409,132 @@ const BYTE primitive_point_list_gs[] = 0, 0, 19, 0, 0, 0, 117, 0, 0, 3, 0, 0, 17, 0, 0, 0, 0, 0, - 118, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 62, 0, 0, 1, 83, 84, - 65, 84, 148, 0, 0, 0, - 121, 0, 0, 0, 3, 0, + 54, 0, 32, 5, 66, 0, + 16, 0, 0, 0, 0, 0, + 42, 0, 16, 0, 1, 0, + 0, 0, 0, 0, 24, 8, + 50, 0, 16, 0, 0, 0, + 0, 0, 134, 0, 16, 0, + 0, 0, 0, 0, 70, 16, + 32, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 4, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 5, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 6, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 7, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 8, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 9, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 10, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 11, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 12, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 13, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 14, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 15, 0, 0, 0, 70, 30, + 32, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 54, 0, + 0, 8, 50, 32, 16, 0, + 16, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 128, 63, + 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 41, 0, 0, 0, 11, 0, - 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 4, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, + 54, 0, 0, 6, 66, 32, + 16, 0, 16, 0, 0, 0, + 42, 16, 32, 0, 0, 0, + 0, 0, 16, 0, 0, 0, + 54, 0, 0, 5, 50, 32, + 16, 0, 17, 0, 0, 0, + 70, 0, 16, 0, 0, 0, + 0, 0, 54, 0, 0, 6, + 194, 32, 16, 0, 17, 0, + 0, 0, 166, 30, 32, 0, + 0, 0, 0, 0, 17, 0, + 0, 0, 54, 0, 0, 6, + 242, 32, 16, 0, 18, 0, + 0, 0, 70, 30, 32, 0, + 0, 0, 0, 0, 18, 0, + 0, 0, 54, 0, 0, 6, + 50, 32, 16, 0, 19, 0, + 0, 0, 70, 16, 32, 0, + 0, 0, 0, 0, 19, 0, + 0, 0, 117, 0, 0, 3, + 0, 0, 17, 0, 0, 0, + 0, 0, 118, 0, 0, 3, + 0, 0, 17, 0, 0, 0, + 0, 0, 62, 0, 0, 1, + 83, 84, 65, 84, 148, 0, + 0, 0, 117, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 41, 0, 0, 0, + 10, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, + 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 5, 0, 0, 0, 4, 0, + 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 5, 0, 0, 0, + 4, 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 }; diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_adaptive_vs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_adaptive_vs.h index 1c27f6b7f..b93e23695 100644 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_adaptive_vs.h +++ b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_adaptive_vs.h @@ -19,8 +19,8 @@ // float xe_point_vertex_diameter_min;// Offset: 140 Size: 4 [unused] // float3 xe_ndc_offset; // Offset: 144 Size: 12 [unused] // float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [unused] -// float2 xe_point_constant_radius; // Offset: 160 Size: 8 [unused] -// float2 xe_point_screen_to_ndc; // Offset: 168 Size: 8 [unused] +// float2 xe_point_constant_diameter; // Offset: 160 Size: 8 [unused] +// float2 xe_point_screen_diameter_to_ndc_radius;// Offset: 168 Size: 8 [unused] // uint xe_interpolator_sampling_pattern;// Offset: 176 Size: 4 [unused] // uint xe_ps_param_gen; // Offset: 180 Size: 4 [unused] // uint2 xe_sample_count_log2; // Offset: 184 Size: 8 [unused] @@ -94,21 +94,21 @@ ret const BYTE tessellation_adaptive_vs[] = { - 68, 88, 66, 67, 208, 91, - 167, 102, 8, 237, 14, 199, - 43, 1, 173, 204, 50, 149, - 119, 147, 1, 0, 0, 0, - 224, 13, 0, 0, 5, 0, + 68, 88, 66, 67, 128, 42, + 162, 230, 93, 182, 94, 173, + 222, 50, 66, 199, 253, 227, + 107, 225, 1, 0, 0, 0, + 240, 13, 0, 0, 5, 0, 0, 0, 52, 0, 0, 0, - 212, 10, 0, 0, 8, 11, - 0, 0, 64, 11, 0, 0, - 68, 13, 0, 0, 82, 68, - 69, 70, 152, 10, 0, 0, + 228, 10, 0, 0, 24, 11, + 0, 0, 80, 11, 0, 0, + 84, 13, 0, 0, 82, 68, + 69, 70, 168, 10, 0, 0, 1, 0, 0, 0, 120, 0, 0, 0, 1, 0, 0, 0, 60, 0, 0, 0, 1, 5, 254, 255, 0, 5, 0, 0, - 110, 10, 0, 0, 19, 19, + 126, 10, 0, 0, 19, 19, 68, 37, 60, 0, 0, 0, 24, 0, 0, 0, 40, 0, 0, 0, 40, 0, 0, 0, @@ -208,136 +208,136 @@ const BYTE tessellation_adaptive_vs[] = 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 156, 7, 0, 0, 168, 0, + 158, 7, 0, 0, 168, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 179, 7, + 0, 0, 0, 0, 197, 7, 0, 0, 176, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 212, 7, 0, 0, + 0, 0, 230, 7, 0, 0, 180, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 228, 7, 0, 0, 184, 0, + 246, 7, 0, 0, 184, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 116, 6, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 249, 7, + 0, 0, 0, 0, 11, 8, 0, 0, 192, 0, 0, 0, 32, 0, 0, 0, 0, 0, - 0, 0, 28, 8, 0, 0, + 0, 0, 44, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 64, 8, 0, 0, + 0, 0, 80, 8, 0, 0, 224, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 85, 8, 0, 0, 228, 0, + 101, 8, 0, 0, 228, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 52, 7, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 109, 8, + 0, 0, 0, 0, 125, 8, 0, 0, 232, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 126, 8, 0, 0, + 0, 0, 142, 8, 0, 0, 236, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 166, 8, 0, 0, 240, 0, + 182, 8, 0, 0, 240, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 184, 8, + 0, 0, 0, 0, 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 220, 8, + 0, 0, 0, 0, 236, 8, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 247, 8, 0, 0, + 0, 0, 7, 9, 0, 0, 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 17, 9, 0, 0, 16, 1, + 33, 9, 0, 0, 16, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 51, 9, + 0, 0, 0, 0, 67, 9, 0, 0, 32, 1, 0, 0, 32, 0, 0, 0, 0, 0, - 0, 0, 68, 9, 0, 0, + 0, 0, 84, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 104, 9, 0, 0, + 0, 0, 120, 9, 0, 0, 64, 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 136, 9, 0, 0, 0, 0, + 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 172, 9, 0, 0, 80, 1, + 188, 9, 0, 0, 80, 1, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 136, 9, + 0, 0, 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 197, 9, + 0, 0, 0, 0, 213, 9, 0, 0, 96, 1, 0, 0, 64, 0, 0, 0, 0, 0, - 0, 0, 216, 9, 0, 0, + 0, 0, 232, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 252, 9, 0, 0, + 0, 0, 12, 10, 0, 0, 160, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 20, 10, 0, 0, 0, 0, + 36, 10, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 56, 10, 0, 0, 192, 1, + 72, 10, 0, 0, 192, 1, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 136, 9, + 0, 0, 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 86, 10, + 0, 0, 0, 0, 102, 10, 0, 0, 208, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 184, 8, 0, 0, + 0, 0, 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, @@ -427,12 +427,15 @@ const BYTE tessellation_adaptive_vs[] = 97, 120, 0, 120, 101, 95, 112, 111, 105, 110, 116, 95, 99, 111, 110, 115, 116, 97, - 110, 116, 95, 114, 97, 100, - 105, 117, 115, 0, 120, 101, - 95, 112, 111, 105, 110, 116, - 95, 115, 99, 114, 101, 101, - 110, 95, 116, 111, 95, 110, - 100, 99, 0, 120, 101, 95, + 110, 116, 95, 100, 105, 97, + 109, 101, 116, 101, 114, 0, + 120, 101, 95, 112, 111, 105, + 110, 116, 95, 115, 99, 114, + 101, 101, 110, 95, 100, 105, + 97, 109, 101, 116, 101, 114, + 95, 116, 111, 95, 110, 100, + 99, 95, 114, 97, 100, 105, + 117, 115, 0, 120, 101, 95, 105, 110, 116, 101, 114, 112, 111, 108, 97, 116, 111, 114, 95, 115, 97, 109, 112, 108, @@ -449,232 +452,231 @@ const BYTE tessellation_adaptive_vs[] = 115, 119, 105, 122, 122, 108, 101, 100, 95, 115, 105, 103, 110, 115, 0, 117, 105, 110, - 116, 52, 0, 171, 171, 171, + 116, 52, 0, 171, 1, 0, + 19, 0, 1, 0, 4, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 37, 8, 0, 0, 120, 101, + 95, 116, 101, 120, 116, 117, + 114, 101, 115, 95, 114, 101, + 115, 111, 108, 118, 101, 100, + 0, 120, 101, 95, 97, 108, + 112, 104, 97, 95, 116, 101, + 115, 116, 95, 114, 101, 102, + 101, 114, 101, 110, 99, 101, + 0, 120, 101, 95, 97, 108, + 112, 104, 97, 95, 116, 111, + 95, 109, 97, 115, 107, 0, + 120, 101, 95, 101, 100, 114, + 97, 109, 95, 51, 50, 98, + 112, 112, 95, 116, 105, 108, + 101, 95, 112, 105, 116, 99, + 104, 95, 100, 119, 111, 114, + 100, 115, 95, 115, 99, 97, + 108, 101, 100, 0, 120, 101, + 95, 99, 111, 108, 111, 114, + 95, 101, 120, 112, 95, 98, + 105, 97, 115, 0, 1, 0, + 3, 0, 1, 0, 4, 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, + 172, 6, 0, 0, 120, 101, + 95, 101, 100, 114, 97, 109, + 95, 112, 111, 108, 121, 95, + 111, 102, 102, 115, 101, 116, + 95, 102, 114, 111, 110, 116, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 112, 111, + 108, 121, 95, 111, 102, 102, + 115, 101, 116, 95, 98, 97, + 99, 107, 0, 120, 101, 95, + 101, 100, 114, 97, 109, 95, + 100, 101, 112, 116, 104, 95, + 98, 97, 115, 101, 95, 100, + 119, 111, 114, 100, 115, 95, + 115, 99, 97, 108, 101, 100, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 115, 116, + 101, 110, 99, 105, 108, 0, 1, 0, 19, 0, 1, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 8, 0, 0, - 120, 101, 95, 116, 101, 120, - 116, 117, 114, 101, 115, 95, - 114, 101, 115, 111, 108, 118, - 101, 100, 0, 120, 101, 95, - 97, 108, 112, 104, 97, 95, - 116, 101, 115, 116, 95, 114, - 101, 102, 101, 114, 101, 110, - 99, 101, 0, 120, 101, 95, - 97, 108, 112, 104, 97, 95, - 116, 111, 95, 109, 97, 115, - 107, 0, 120, 101, 95, 101, - 100, 114, 97, 109, 95, 51, - 50, 98, 112, 112, 95, 116, - 105, 108, 101, 95, 112, 105, - 116, 99, 104, 95, 100, 119, - 111, 114, 100, 115, 95, 115, - 99, 97, 108, 101, 100, 0, - 120, 101, 95, 99, 111, 108, - 111, 114, 95, 101, 120, 112, - 95, 98, 105, 97, 115, 0, - 1, 0, 3, 0, 1, 0, + 0, 0, 37, 8, 0, 0, + 120, 101, 95, 101, 100, 114, + 97, 109, 95, 114, 116, 95, + 98, 97, 115, 101, 95, 100, + 119, 111, 114, 100, 115, 95, + 115, 99, 97, 108, 101, 100, + 0, 171, 1, 0, 19, 0, + 1, 0, 4, 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, 37, 8, + 0, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 114, + 116, 95, 102, 111, 114, 109, + 97, 116, 95, 102, 108, 97, + 103, 115, 0, 120, 101, 95, + 101, 100, 114, 97, 109, 95, + 114, 116, 95, 99, 108, 97, + 109, 112, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, 4, 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, 172, 6, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 112, 111, 108, - 121, 95, 111, 102, 102, 115, - 101, 116, 95, 102, 114, 111, - 110, 116, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 112, 111, 108, 121, 95, 111, - 102, 102, 115, 101, 116, 95, - 98, 97, 99, 107, 0, 120, - 101, 95, 101, 100, 114, 97, - 109, 95, 100, 101, 112, 116, - 104, 95, 98, 97, 115, 101, - 95, 100, 119, 111, 114, 100, - 115, 95, 115, 99, 97, 108, - 101, 100, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 115, 116, 101, 110, 99, 105, - 108, 0, 1, 0, 19, 0, - 1, 0, 4, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 8, - 0, 0, 120, 101, 95, 101, - 100, 114, 97, 109, 95, 114, - 116, 95, 98, 97, 115, 101, - 95, 100, 119, 111, 114, 100, - 115, 95, 115, 99, 97, 108, - 101, 100, 0, 171, 1, 0, - 19, 0, 1, 0, 4, 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, - 19, 8, 0, 0, 120, 101, + 172, 6, 0, 0, 120, 101, 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 102, 111, - 114, 109, 97, 116, 95, 102, - 108, 97, 103, 115, 0, 120, - 101, 95, 101, 100, 114, 97, - 109, 95, 114, 116, 95, 99, - 108, 97, 109, 112, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 4, 0, 0, 0, + 95, 114, 116, 95, 107, 101, + 101, 112, 95, 109, 97, 115, + 107, 0, 171, 171, 1, 0, + 19, 0, 1, 0, 4, 0, + 2, 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, 172, 6, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, - 107, 101, 101, 112, 95, 109, - 97, 115, 107, 0, 171, 171, - 1, 0, 19, 0, 1, 0, - 4, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 19, 8, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, - 98, 108, 101, 110, 100, 95, - 102, 97, 99, 116, 111, 114, - 115, 95, 111, 112, 115, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 98, 108, 101, - 110, 100, 95, 99, 111, 110, - 115, 116, 97, 110, 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, - 73, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 1, 0, 0, 83, 86, - 95, 86, 101, 114, 116, 101, - 120, 73, 68, 0, 79, 83, - 71, 78, 48, 0, 0, 0, + 37, 8, 0, 0, 120, 101, + 95, 101, 100, 114, 97, 109, + 95, 114, 116, 95, 98, 108, + 101, 110, 100, 95, 102, 97, + 99, 116, 111, 114, 115, 95, + 111, 112, 115, 0, 120, 101, + 95, 101, 100, 114, 97, 109, + 95, 98, 108, 101, 110, 100, + 95, 99, 111, 110, 115, 116, + 97, 110, 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, 73, 83, + 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 1, 14, - 0, 0, 88, 69, 84, 69, - 83, 83, 70, 65, 67, 84, - 79, 82, 0, 171, 171, 171, - 83, 72, 69, 88, 252, 1, - 0, 0, 81, 0, 1, 0, - 127, 0, 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, - 96, 0, 0, 4, 18, 16, - 16, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 101, 0, - 0, 3, 18, 32, 16, 0, - 0, 0, 0, 0, 104, 0, - 0, 2, 1, 0, 0, 0, - 32, 0, 0, 12, 114, 0, - 16, 0, 0, 0, 0, 0, - 6, 128, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 1, 1, + 0, 0, 83, 86, 95, 86, + 101, 114, 116, 101, 120, 73, + 68, 0, 79, 83, 71, 78, + 48, 0, 0, 0, 1, 0, + 0, 0, 8, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 60, 0, 0, 7, 50, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 1, 14, 0, 0, + 88, 69, 84, 69, 83, 83, + 70, 65, 67, 84, 79, 82, + 0, 171, 171, 171, 83, 72, + 69, 88, 252, 1, 0, 0, + 81, 0, 1, 0, 127, 0, + 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, 96, 0, + 0, 4, 18, 16, 16, 0, + 0, 0, 0, 0, 6, 0, + 0, 0, 101, 0, 0, 3, + 18, 32, 16, 0, 0, 0, + 0, 0, 104, 0, 0, 2, + 1, 0, 0, 0, 32, 0, + 0, 12, 114, 0, 16, 0, + 0, 0, 0, 0, 6, 128, + 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 2, 64, 0, 0, + 1, 0, 0, 0, 2, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 60, 0, + 0, 7, 50, 0, 16, 0, + 0, 0, 0, 0, 150, 5, 16, 0, 0, 0, 0, 0, - 150, 5, 16, 0, 0, 0, - 0, 0, 70, 0, 16, 0, - 0, 0, 0, 0, 31, 0, - 4, 3, 10, 0, 16, 0, - 0, 0, 0, 0, 41, 0, - 0, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 10, 16, - 16, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 8, 0, - 0, 0, 85, 0, 0, 7, - 66, 0, 16, 0, 0, 0, + 70, 0, 16, 0, 0, 0, + 0, 0, 31, 0, 4, 3, + 10, 0, 16, 0, 0, 0, + 0, 0, 41, 0, 0, 7, + 18, 0, 16, 0, 0, 0, 0, 0, 10, 16, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 8, 0, 0, 0, - 1, 0, 0, 10, 82, 0, - 16, 0, 0, 0, 0, 0, - 6, 2, 16, 0, 0, 0, - 0, 0, 2, 64, 0, 0, - 0, 255, 0, 255, 0, 0, - 0, 0, 255, 0, 255, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 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, - 54, 0, 0, 5, 18, 0, + 85, 0, 0, 7, 66, 0, 16, 0, 0, 0, 0, 0, 10, 16, 16, 0, 0, 0, - 0, 0, 21, 0, 0, 1, - 31, 0, 4, 3, 26, 0, - 16, 0, 0, 0, 0, 0, - 85, 0, 0, 7, 34, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 140, 0, - 0, 11, 18, 0, 16, 0, - 0, 0, 0, 0, 1, 64, - 0, 0, 16, 0, 0, 0, - 1, 64, 0, 0, 16, 0, - 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 26, 0, + 8, 0, 0, 0, 1, 0, + 0, 10, 82, 0, 16, 0, + 0, 0, 0, 0, 6, 2, 16, 0, 0, 0, 0, 0, - 21, 0, 0, 1, 0, 0, - 0, 7, 18, 0, 16, 0, + 2, 64, 0, 0, 0, 255, + 0, 255, 0, 0, 0, 0, + 255, 0, 255, 0, 0, 0, + 0, 0, 30, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 52, 0, 0, 9, + 18, 0, 0, 1, 54, 0, + 0, 5, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 16, + 16, 0, 0, 0, 0, 0, + 21, 0, 0, 1, 31, 0, + 4, 3, 26, 0, 16, 0, + 0, 0, 0, 0, 85, 0, + 0, 7, 34, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 1, 64, 0, 0, 16, 0, + 0, 0, 140, 0, 0, 11, + 18, 0, 16, 0, 0, 0, + 0, 0, 1, 64, 0, 0, + 16, 0, 0, 0, 1, 64, + 0, 0, 16, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 26, 0, 16, 0, + 0, 0, 0, 0, 21, 0, + 0, 1, 0, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 26, 128, - 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 128, 63, + 52, 0, 0, 9, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 26, 128, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 51, 0, 0, 9, - 18, 32, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 42, 128, - 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 148, 0, - 0, 0, 18, 0, 0, 0, - 1, 0, 0, 0, 0, 0, + 51, 0, 0, 9, 18, 32, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 42, 128, 48, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 62, 0, 0, 1, 83, 84, + 65, 84, 148, 0, 0, 0, + 18, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 4, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 2, 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, - 1, 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, 0, 0, 0, 0, @@ -685,5 +687,6 @@ const BYTE tessellation_adaptive_vs[] = 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 }; diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_indexed_vs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_indexed_vs.h index 6646f5076..d8e448333 100644 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_indexed_vs.h +++ b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_indexed_vs.h @@ -19,8 +19,8 @@ // float xe_point_vertex_diameter_min;// Offset: 140 Size: 4 [unused] // float3 xe_ndc_offset; // Offset: 144 Size: 12 [unused] // float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [unused] -// float2 xe_point_constant_radius; // Offset: 160 Size: 8 [unused] -// float2 xe_point_screen_to_ndc; // Offset: 168 Size: 8 [unused] +// float2 xe_point_constant_diameter; // Offset: 160 Size: 8 [unused] +// float2 xe_point_screen_diameter_to_ndc_radius;// Offset: 168 Size: 8 [unused] // uint xe_interpolator_sampling_pattern;// Offset: 176 Size: 4 [unused] // uint xe_ps_param_gen; // Offset: 180 Size: 4 [unused] // uint2 xe_sample_count_log2; // Offset: 184 Size: 8 [unused] @@ -96,21 +96,21 @@ ret const BYTE tessellation_indexed_vs[] = { - 68, 88, 66, 67, 188, 215, - 146, 114, 163, 91, 37, 43, - 43, 60, 196, 54, 82, 23, - 130, 140, 1, 0, 0, 0, - 20, 14, 0, 0, 5, 0, + 68, 88, 66, 67, 147, 89, + 233, 26, 127, 143, 37, 15, + 206, 150, 85, 19, 220, 93, + 185, 243, 1, 0, 0, 0, + 36, 14, 0, 0, 5, 0, 0, 0, 52, 0, 0, 0, - 212, 10, 0, 0, 8, 11, - 0, 0, 60, 11, 0, 0, - 120, 13, 0, 0, 82, 68, - 69, 70, 152, 10, 0, 0, + 228, 10, 0, 0, 24, 11, + 0, 0, 76, 11, 0, 0, + 136, 13, 0, 0, 82, 68, + 69, 70, 168, 10, 0, 0, 1, 0, 0, 0, 120, 0, 0, 0, 1, 0, 0, 0, 60, 0, 0, 0, 1, 5, 254, 255, 0, 5, 0, 0, - 110, 10, 0, 0, 19, 19, + 126, 10, 0, 0, 19, 19, 68, 37, 60, 0, 0, 0, 24, 0, 0, 0, 40, 0, 0, 0, 40, 0, 0, 0, @@ -210,136 +210,136 @@ const BYTE tessellation_indexed_vs[] = 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 156, 7, 0, 0, 168, 0, + 158, 7, 0, 0, 168, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 179, 7, + 0, 0, 0, 0, 197, 7, 0, 0, 176, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 212, 7, 0, 0, + 0, 0, 230, 7, 0, 0, 180, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 228, 7, 0, 0, 184, 0, + 246, 7, 0, 0, 184, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 116, 6, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 249, 7, + 0, 0, 0, 0, 11, 8, 0, 0, 192, 0, 0, 0, 32, 0, 0, 0, 0, 0, - 0, 0, 28, 8, 0, 0, + 0, 0, 44, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 64, 8, 0, 0, + 0, 0, 80, 8, 0, 0, 224, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 85, 8, 0, 0, 228, 0, + 101, 8, 0, 0, 228, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 52, 7, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 109, 8, + 0, 0, 0, 0, 125, 8, 0, 0, 232, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 126, 8, 0, 0, + 0, 0, 142, 8, 0, 0, 236, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 166, 8, 0, 0, 240, 0, + 182, 8, 0, 0, 240, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 184, 8, + 0, 0, 0, 0, 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 220, 8, + 0, 0, 0, 0, 236, 8, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 247, 8, 0, 0, + 0, 0, 7, 9, 0, 0, 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 232, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 17, 9, 0, 0, 16, 1, + 33, 9, 0, 0, 16, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 51, 9, + 0, 0, 0, 0, 67, 9, 0, 0, 32, 1, 0, 0, 32, 0, 0, 0, 0, 0, - 0, 0, 68, 9, 0, 0, + 0, 0, 84, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 104, 9, 0, 0, + 0, 0, 120, 9, 0, 0, 64, 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 136, 9, 0, 0, 0, 0, + 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 172, 9, 0, 0, 80, 1, + 188, 9, 0, 0, 80, 1, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 136, 9, + 0, 0, 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 197, 9, + 0, 0, 0, 0, 213, 9, 0, 0, 96, 1, 0, 0, 64, 0, 0, 0, 0, 0, - 0, 0, 216, 9, 0, 0, + 0, 0, 232, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 252, 9, 0, 0, + 0, 0, 12, 10, 0, 0, 160, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 20, 10, 0, 0, 0, 0, + 36, 10, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 56, 10, 0, 0, 192, 1, + 72, 10, 0, 0, 192, 1, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 136, 9, + 0, 0, 0, 0, 152, 9, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 86, 10, + 0, 0, 0, 0, 102, 10, 0, 0, 208, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 184, 8, 0, 0, + 0, 0, 200, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, @@ -429,12 +429,15 @@ const BYTE tessellation_indexed_vs[] = 97, 120, 0, 120, 101, 95, 112, 111, 105, 110, 116, 95, 99, 111, 110, 115, 116, 97, - 110, 116, 95, 114, 97, 100, - 105, 117, 115, 0, 120, 101, - 95, 112, 111, 105, 110, 116, - 95, 115, 99, 114, 101, 101, - 110, 95, 116, 111, 95, 110, - 100, 99, 0, 120, 101, 95, + 110, 116, 95, 100, 105, 97, + 109, 101, 116, 101, 114, 0, + 120, 101, 95, 112, 111, 105, + 110, 116, 95, 115, 99, 114, + 101, 101, 110, 95, 100, 105, + 97, 109, 101, 116, 101, 114, + 95, 116, 111, 95, 110, 100, + 99, 95, 114, 97, 100, 105, + 117, 115, 0, 120, 101, 95, 105, 110, 116, 101, 114, 112, 111, 108, 97, 116, 111, 114, 95, 115, 97, 109, 112, 108, @@ -451,242 +454,242 @@ const BYTE tessellation_indexed_vs[] = 115, 119, 105, 122, 122, 108, 101, 100, 95, 115, 105, 103, 110, 115, 0, 117, 105, 110, - 116, 52, 0, 171, 171, 171, + 116, 52, 0, 171, 1, 0, + 19, 0, 1, 0, 4, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 37, 8, 0, 0, 120, 101, + 95, 116, 101, 120, 116, 117, + 114, 101, 115, 95, 114, 101, + 115, 111, 108, 118, 101, 100, + 0, 120, 101, 95, 97, 108, + 112, 104, 97, 95, 116, 101, + 115, 116, 95, 114, 101, 102, + 101, 114, 101, 110, 99, 101, + 0, 120, 101, 95, 97, 108, + 112, 104, 97, 95, 116, 111, + 95, 109, 97, 115, 107, 0, + 120, 101, 95, 101, 100, 114, + 97, 109, 95, 51, 50, 98, + 112, 112, 95, 116, 105, 108, + 101, 95, 112, 105, 116, 99, + 104, 95, 100, 119, 111, 114, + 100, 115, 95, 115, 99, 97, + 108, 101, 100, 0, 120, 101, + 95, 99, 111, 108, 111, 114, + 95, 101, 120, 112, 95, 98, + 105, 97, 115, 0, 1, 0, + 3, 0, 1, 0, 4, 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, + 172, 6, 0, 0, 120, 101, + 95, 101, 100, 114, 97, 109, + 95, 112, 111, 108, 121, 95, + 111, 102, 102, 115, 101, 116, + 95, 102, 114, 111, 110, 116, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 112, 111, + 108, 121, 95, 111, 102, 102, + 115, 101, 116, 95, 98, 97, + 99, 107, 0, 120, 101, 95, + 101, 100, 114, 97, 109, 95, + 100, 101, 112, 116, 104, 95, + 98, 97, 115, 101, 95, 100, + 119, 111, 114, 100, 115, 95, + 115, 99, 97, 108, 101, 100, + 0, 120, 101, 95, 101, 100, + 114, 97, 109, 95, 115, 116, + 101, 110, 99, 105, 108, 0, 1, 0, 19, 0, 1, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 8, 0, 0, - 120, 101, 95, 116, 101, 120, - 116, 117, 114, 101, 115, 95, - 114, 101, 115, 111, 108, 118, - 101, 100, 0, 120, 101, 95, - 97, 108, 112, 104, 97, 95, - 116, 101, 115, 116, 95, 114, - 101, 102, 101, 114, 101, 110, - 99, 101, 0, 120, 101, 95, - 97, 108, 112, 104, 97, 95, - 116, 111, 95, 109, 97, 115, - 107, 0, 120, 101, 95, 101, - 100, 114, 97, 109, 95, 51, - 50, 98, 112, 112, 95, 116, - 105, 108, 101, 95, 112, 105, - 116, 99, 104, 95, 100, 119, - 111, 114, 100, 115, 95, 115, - 99, 97, 108, 101, 100, 0, - 120, 101, 95, 99, 111, 108, - 111, 114, 95, 101, 120, 112, - 95, 98, 105, 97, 115, 0, - 1, 0, 3, 0, 1, 0, + 0, 0, 37, 8, 0, 0, + 120, 101, 95, 101, 100, 114, + 97, 109, 95, 114, 116, 95, + 98, 97, 115, 101, 95, 100, + 119, 111, 114, 100, 115, 95, + 115, 99, 97, 108, 101, 100, + 0, 171, 1, 0, 19, 0, + 1, 0, 4, 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, 37, 8, + 0, 0, 120, 101, 95, 101, + 100, 114, 97, 109, 95, 114, + 116, 95, 102, 111, 114, 109, + 97, 116, 95, 102, 108, 97, + 103, 115, 0, 120, 101, 95, + 101, 100, 114, 97, 109, 95, + 114, 116, 95, 99, 108, 97, + 109, 112, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, 4, 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, 172, 6, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 112, 111, 108, - 121, 95, 111, 102, 102, 115, - 101, 116, 95, 102, 114, 111, - 110, 116, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 112, 111, 108, 121, 95, 111, - 102, 102, 115, 101, 116, 95, - 98, 97, 99, 107, 0, 120, - 101, 95, 101, 100, 114, 97, - 109, 95, 100, 101, 112, 116, - 104, 95, 98, 97, 115, 101, - 95, 100, 119, 111, 114, 100, - 115, 95, 115, 99, 97, 108, - 101, 100, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 115, 116, 101, 110, 99, 105, - 108, 0, 1, 0, 19, 0, - 1, 0, 4, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 8, - 0, 0, 120, 101, 95, 101, - 100, 114, 97, 109, 95, 114, - 116, 95, 98, 97, 115, 101, - 95, 100, 119, 111, 114, 100, - 115, 95, 115, 99, 97, 108, - 101, 100, 0, 171, 1, 0, - 19, 0, 1, 0, 4, 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, - 19, 8, 0, 0, 120, 101, + 172, 6, 0, 0, 120, 101, 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 102, 111, - 114, 109, 97, 116, 95, 102, - 108, 97, 103, 115, 0, 120, - 101, 95, 101, 100, 114, 97, - 109, 95, 114, 116, 95, 99, - 108, 97, 109, 112, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 4, 0, 0, 0, + 95, 114, 116, 95, 107, 101, + 101, 112, 95, 109, 97, 115, + 107, 0, 171, 171, 1, 0, + 19, 0, 1, 0, 4, 0, + 2, 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, 172, 6, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, - 107, 101, 101, 112, 95, 109, - 97, 115, 107, 0, 171, 171, - 1, 0, 19, 0, 1, 0, - 4, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 19, 8, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, - 98, 108, 101, 110, 100, 95, - 102, 97, 99, 116, 111, 114, - 115, 95, 111, 112, 115, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 98, 108, 101, - 110, 100, 95, 99, 111, 110, - 115, 116, 97, 110, 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, - 73, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 1, 0, 0, 83, 86, - 95, 86, 101, 114, 116, 101, - 120, 73, 68, 0, 79, 83, + 37, 8, 0, 0, 120, 101, + 95, 101, 100, 114, 97, 109, + 95, 114, 116, 95, 98, 108, + 101, 110, 100, 95, 102, 97, + 99, 116, 111, 114, 115, 95, + 111, 112, 115, 0, 120, 101, + 95, 101, 100, 114, 97, 109, + 95, 98, 108, 101, 110, 100, + 95, 99, 111, 110, 115, 116, + 97, 110, 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, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 1, 14, - 0, 0, 88, 69, 86, 69, - 82, 84, 69, 88, 73, 68, - 0, 171, 83, 72, 69, 88, - 52, 2, 0, 0, 81, 0, - 1, 0, 141, 0, 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, 96, 0, 0, 4, - 18, 16, 16, 0, 0, 0, - 0, 0, 6, 0, 0, 0, - 101, 0, 0, 3, 18, 32, - 16, 0, 0, 0, 0, 0, - 104, 0, 0, 2, 1, 0, - 0, 0, 32, 0, 0, 12, - 114, 0, 16, 0, 0, 0, - 0, 0, 6, 128, 48, 0, - 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, - 2, 64, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 1, 1, + 0, 0, 83, 86, 95, 86, + 101, 114, 116, 101, 120, 73, + 68, 0, 79, 83, 71, 78, + 44, 0, 0, 0, 1, 0, + 0, 0, 8, 0, 0, 0, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 60, 0, 0, 7, - 50, 0, 16, 0, 0, 0, - 0, 0, 150, 5, 16, 0, - 0, 0, 0, 0, 70, 0, + 0, 0, 1, 14, 0, 0, + 88, 69, 86, 69, 82, 84, + 69, 88, 73, 68, 0, 171, + 83, 72, 69, 88, 52, 2, + 0, 0, 81, 0, 1, 0, + 141, 0, 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, + 96, 0, 0, 4, 18, 16, 16, 0, 0, 0, 0, 0, - 31, 0, 4, 3, 10, 0, + 6, 0, 0, 0, 101, 0, + 0, 3, 18, 32, 16, 0, + 0, 0, 0, 0, 104, 0, + 0, 2, 1, 0, 0, 0, + 32, 0, 0, 12, 114, 0, 16, 0, 0, 0, 0, 0, - 41, 0, 0, 7, 18, 0, + 6, 128, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 2, 64, + 0, 0, 1, 0, 0, 0, + 2, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 60, 0, 0, 7, 50, 0, 16, 0, 0, 0, 0, 0, - 10, 16, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 8, 0, 0, 0, 85, 0, - 0, 7, 66, 0, 16, 0, + 150, 5, 16, 0, 0, 0, + 0, 0, 70, 0, 16, 0, + 0, 0, 0, 0, 31, 0, + 4, 3, 10, 0, 16, 0, + 0, 0, 0, 0, 41, 0, + 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 16, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 8, 0, - 0, 0, 1, 0, 0, 10, - 82, 0, 16, 0, 0, 0, - 0, 0, 6, 2, 16, 0, - 0, 0, 0, 0, 2, 64, - 0, 0, 0, 255, 0, 255, - 0, 0, 0, 0, 255, 0, - 255, 0, 0, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 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, 54, 0, 0, 5, - 18, 0, 16, 0, 0, 0, - 0, 0, 10, 16, 16, 0, - 0, 0, 0, 0, 21, 0, - 0, 1, 31, 0, 4, 3, - 26, 0, 16, 0, 0, 0, 0, 0, 85, 0, 0, 7, - 34, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, + 66, 0, 16, 0, 0, 0, + 0, 0, 10, 16, 16, 0, + 0, 0, 0, 0, 1, 64, + 0, 0, 8, 0, 0, 0, + 1, 0, 0, 10, 82, 0, + 16, 0, 0, 0, 0, 0, + 6, 2, 16, 0, 0, 0, + 0, 0, 2, 64, 0, 0, + 0, 255, 0, 255, 0, 0, + 0, 0, 255, 0, 255, 0, + 0, 0, 0, 0, 30, 0, + 0, 7, 18, 0, 16, 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, + 54, 0, 0, 5, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 16, 16, 0, 0, 0, + 0, 0, 21, 0, 0, 1, + 31, 0, 4, 3, 26, 0, + 16, 0, 0, 0, 0, 0, + 85, 0, 0, 7, 34, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 1, 64, 0, 0, + 16, 0, 0, 0, 140, 0, + 0, 11, 18, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 16, 0, 0, 0, - 140, 0, 0, 11, 18, 0, - 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 16, 0, - 0, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 10, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 21, 0, 0, 1, - 30, 0, 0, 9, 18, 0, + 21, 0, 0, 1, 30, 0, + 0, 9, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, - 0, 0, 26, 128, 48, 0, + 26, 128, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 1, 64, 0, 0, 255, 255, + 255, 0, 83, 0, 0, 9, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 42, 128, + 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 84, 0, 0, 9, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 58, 128, + 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 86, 0, 0, 5, + 18, 32, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 62, 0, + 0, 1, 83, 84, 65, 84, + 148, 0, 0, 0, 20, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 7, 0, + 0, 0, 2, 0, 0, 0, + 2, 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, 1, 0, 0, 0, - 1, 0, 0, 7, 18, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 255, 0, 83, 0, - 0, 9, 18, 0, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 42, 128, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 84, 0, - 0, 9, 18, 0, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 58, 128, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 86, 0, - 0, 5, 18, 32, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 62, 0, 0, 1, 83, 84, - 65, 84, 148, 0, 0, 0, - 20, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 7, 0, 0, 0, 2, 0, - 0, 0, 2, 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, 1, 0, 0, 0, 0, 0, 0, 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, @@ -696,5 +699,5 @@ const BYTE tessellation_indexed_vs[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 + 0, 0 }; diff --git a/src/xenia/gpu/shaders/primitive_point_list.gs.hlsl b/src/xenia/gpu/shaders/primitive_point_list.gs.hlsl index d5e7cbf14..b32f57fa2 100644 --- a/src/xenia/gpu/shaders/primitive_point_list.gs.hlsl +++ b/src/xenia/gpu/shaders/primitive_point_list.gs.hlsl @@ -1,35 +1,35 @@ #include "xenos_draw.hlsli" -// TODO(Triang3l): Figure out how to see which interpolator gets adjusted. - [maxvertexcount(4)] void main(point XeVertexPreGS xe_in[1], inout TriangleStream xe_stream) { - // TODO(Triang3l): Handle ps_ucp_mode. + // TODO(Triang3l): Handle ps_ucp_mode (transform the host clip space to the + // guest one, calculate the distances to the user clip planes, cull using the + // distance from the center for modes 0, 1 and 2, cull and clip per-vertex for + // modes 2 and 3). if (xe_in[0].cull_distance < 0.0 || any(isnan(xe_in[0].post_gs.position))) { return; } - // The vertex shader's header writes -1.0f to point_size by default, so any + // The vertex shader's header writes -1.0 to point_size by default, so any // non-negative value means that it was overwritten by the translated vertex - // shader. - float2 point_radius = xe_point_constant_radius; - float point_vertex_diameter = xe_in[0].post_gs.pre_ps.point_params.z; - if (point_vertex_diameter >= 0.0) { - // Already clamped in the vertex shader (combined with making it - // non-negative). - point_radius = point_vertex_diameter * 0.5; - } - if (!all(point_radius > 0.0)) { + // shader. The per-vertex diameter is already clamped in the vertex shader + // (combined with making it non-negative). + float point_vertex_diameter = xe_in[0].post_gs.pre_ps.point_parameters.z; + float2 point_screen_diameter = (point_vertex_diameter >= 0.0) + ? point_vertex_diameter + : xe_point_constant_diameter; + if (!all(point_screen_diameter > 0.0)) { // 4D5307F1 has zero-size snowflakes, drop them quicker. return; } - point_radius *= xe_point_screen_to_ndc; - point_radius *= xe_in[0].post_gs.position.w; + float2 point_clip_space_radius = + point_screen_diameter * xe_point_screen_diameter_to_ndc_radius * + xe_in[0].post_gs.position.w; XeVertexPostGS xe_out; xe_out.pre_ps.interpolators = xe_in[0].post_gs.pre_ps.interpolators; - xe_out.pre_ps.point_params.z = xe_in[0].post_gs.pre_ps.point_params.z; + xe_out.pre_ps.point_parameters.z = xe_in[0].post_gs.pre_ps.point_parameters.z; xe_out.position.zw = xe_in[0].post_gs.position.zw; // TODO(Triang3l): Handle ps_ucp_mode. xe_out.clip_distance_0123 = xe_in[0].post_gs.clip_distance_0123; @@ -43,19 +43,21 @@ void main(point XeVertexPreGS xe_in[1], // +|PsParamGen.y|). // TODO(Triang3l): On Vulkan, sign of Y needs to inverted because of the // upper-left origin. - xe_out.pre_ps.point_params.xy = float2(0.0, 0.0); + xe_out.pre_ps.point_parameters.xy = float2(0.0, 0.0); xe_out.position.xy = - xe_in[0].post_gs.position.xy + float2(-point_radius.x, point_radius.y); + xe_in[0].post_gs.position.xy + + float2(-point_clip_space_radius.x, point_clip_space_radius.y); xe_stream.Append(xe_out); - xe_out.pre_ps.point_params.xy = float2(0.0, 1.0); - xe_out.position.xy = xe_in[0].post_gs.position.xy - point_radius; + xe_out.pre_ps.point_parameters.xy = float2(0.0, 1.0); + xe_out.position.xy = xe_in[0].post_gs.position.xy - point_clip_space_radius; xe_stream.Append(xe_out); - xe_out.pre_ps.point_params.xy = float2(1.0, 0.0); - xe_out.position.xy = xe_in[0].post_gs.position.xy + point_radius; + xe_out.pre_ps.point_parameters.xy = float2(1.0, 0.0); + xe_out.position.xy = xe_in[0].post_gs.position.xy + point_clip_space_radius; xe_stream.Append(xe_out); - xe_out.pre_ps.point_params.xy = float2(1.0, 1.0); + xe_out.pre_ps.point_parameters.xy = float2(1.0, 1.0); xe_out.position.xy = - xe_in[0].post_gs.position.xy + float2(point_radius.x, -point_radius.y); + xe_in[0].post_gs.position.xy + + float2(point_clip_space_radius.x, -point_clip_space_radius.y); xe_stream.Append(xe_out); xe_stream.RestartStrip(); } diff --git a/src/xenia/gpu/shaders/primitive_rectangle_list.gs.hlsl b/src/xenia/gpu/shaders/primitive_rectangle_list.gs.hlsl index 13d16d60d..b76bb224f 100644 --- a/src/xenia/gpu/shaders/primitive_rectangle_list.gs.hlsl +++ b/src/xenia/gpu/shaders/primitive_rectangle_list.gs.hlsl @@ -85,10 +85,10 @@ void main(triangle XeVertexPreGS xe_in[3], v3_signs.y * xe_in[1].post_gs.pre_ps.interpolators[i] + v3_signs.z * xe_in[2].post_gs.pre_ps.interpolators[i]; } - xe_out.pre_ps.point_params = - v3_signs.x * xe_in[0].post_gs.pre_ps.point_params + - v3_signs.y * xe_in[1].post_gs.pre_ps.point_params + - v3_signs.z * xe_in[2].post_gs.pre_ps.point_params; + xe_out.pre_ps.point_parameters = + v3_signs.x * xe_in[0].post_gs.pre_ps.point_parameters + + v3_signs.y * xe_in[1].post_gs.pre_ps.point_parameters + + v3_signs.z * xe_in[2].post_gs.pre_ps.point_parameters; xe_out.position = v3_signs.x * xe_in[0].post_gs.position + v3_signs.y * xe_in[1].post_gs.position + v3_signs.z * xe_in[2].post_gs.position; diff --git a/src/xenia/gpu/shaders/xenos_draw.hlsli b/src/xenia/gpu/shaders/xenos_draw.hlsli index 2087c0f3e..53843e83e 100644 --- a/src/xenia/gpu/shaders/xenos_draw.hlsli +++ b/src/xenia/gpu/shaders/xenos_draw.hlsli @@ -18,8 +18,8 @@ cbuffer xe_system_cbuffer : register(b0) { float3 xe_ndc_offset; float xe_point_vertex_diameter_max; - float2 xe_point_constant_radius; - float2 xe_point_screen_to_ndc; + float2 xe_point_constant_diameter; + float2 xe_point_screen_diameter_to_ndc_radius; uint xe_interpolator_sampling_pattern; uint xe_ps_param_gen; @@ -70,7 +70,7 @@ struct XeHSControlPointOutput { struct XeVertexPrePS { float4 interpolators[16] : TEXCOORD0; - float3 point_params : TEXCOORD16; + float3 point_parameters : TEXCOORD16; }; struct XeVertexPostGS { From 2d90d5940f0303d9c579daa718213027f50bdb3e Mon Sep 17 00:00:00 2001 From: Triang3l Date: Wed, 4 May 2022 22:01:30 +0300 Subject: [PATCH 03/14] [DXBC] Jump to the loop skip address before pushing --- src/xenia/gpu/dxbc_shader_translator.cc | 33 +++++++++++++++---------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/xenia/gpu/dxbc_shader_translator.cc b/src/xenia/gpu/dxbc_shader_translator.cc index 2736fe33a..885705476 100644 --- a/src/xenia/gpu/dxbc_shader_translator.cc +++ b/src/xenia/gpu/dxbc_shader_translator.cc @@ -1814,12 +1814,26 @@ void DxbcShaderTranslator::ProcessLoopStartInstruction( 2 + (instr.loop_constant_index >> 2)) .Select(instr.loop_constant_index & 3)); - // Push the count to the loop count stack - move XYZ to YZW and set X to this - // loop count. - a_.OpMov(dxbc::Dest::R(system_temp_loop_count_, 0b1110), - dxbc::Src::R(system_temp_loop_count_, 0b10010000)); - a_.OpAnd(dxbc::Dest::R(system_temp_loop_count_, 0b0001), loop_constant_src, - dxbc::Src::LU(UINT8_MAX)); + { + uint32_t loop_count_temp = PushSystemTemp(); + a_.OpAnd(dxbc::Dest::R(loop_count_temp, 0b0001), loop_constant_src, + dxbc::Src::LU(UINT8_MAX)); + + // Skip the loop without pushing if the count is zero from the beginning. + a_.OpIf(false, dxbc::Src::R(loop_count_temp, dxbc::Src::kXXXX)); + JumpToLabel(instr.loop_skip_address); + a_.OpEndIf(); + + // Push the count to the loop count stack - move XYZ to YZW and set X to the + // new loop count. + a_.OpMov(dxbc::Dest::R(system_temp_loop_count_, 0b1110), + dxbc::Src::R(system_temp_loop_count_, 0b10010000)); + a_.OpMov(dxbc::Dest::R(system_temp_loop_count_, 0b0001), + dxbc::Src::R(loop_count_temp, dxbc::Src::kXXXX)); + + // Release loop_count_temp. + PopSystemTemp(); + } // Push aL - keep the same value as in the previous loop if repeating, or the // new one otherwise. @@ -1829,13 +1843,6 @@ void DxbcShaderTranslator::ProcessLoopStartInstruction( a_.OpUBFE(dxbc::Dest::R(system_temp_aL_, 0b0001), dxbc::Src::LU(8), dxbc::Src::LU(8), loop_constant_src); } - - // Break if the loop counter is 0 (since the condition is checked in the end). - // TODO(Triang3l): Move this before pushing and address loading. This won't - // pop if the counter is 0. - a_.OpIf(false, dxbc::Src::R(system_temp_loop_count_, dxbc::Src::kXXXX)); - JumpToLabel(instr.loop_skip_address); - a_.OpEndIf(); } void DxbcShaderTranslator::ProcessLoopEndInstruction( From c794d0d538b5a2dc809102a196ef57964bfd4002 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Thu, 5 May 2022 13:10:29 +0300 Subject: [PATCH 04/14] [GPU] DC_LUT_RW_INDEX/WRITE_EN_MASK + gamma ramp and registers in traces --- src/xenia/gpu/command_processor.cc | 233 ++++++++++++++---- src/xenia/gpu/command_processor.h | 86 ++----- .../gpu/d3d12/d3d12_command_processor.cc | 67 +++-- src/xenia/gpu/d3d12/d3d12_command_processor.h | 10 +- src/xenia/gpu/register_table.inc | 173 ++++++++++++- src/xenia/gpu/registers.h | 62 +++++ src/xenia/gpu/shaders/apply_gamma_pwl.hlsli | 5 +- src/xenia/gpu/shaders/apply_gamma_table.hlsli | 3 +- .../bytecode/d3d12_5_1/apply_gamma_pwl_cs.h | 64 ++--- .../d3d12_5_1/apply_gamma_pwl_fxaa_luma_cs.h | 64 ++--- src/xenia/gpu/trace_player.cc | 42 +++- src/xenia/gpu/trace_player.h | 2 - src/xenia/gpu/trace_protocol.h | 36 +++ src/xenia/gpu/trace_reader.cc | 14 +- src/xenia/gpu/trace_reader.h | 5 +- src/xenia/gpu/trace_writer.cc | 95 ++++++- src/xenia/gpu/trace_writer.h | 6 + .../gpu/vulkan/vulkan_command_processor.cc | 16 -- .../gpu/vulkan/vulkan_command_processor.h | 2 - 19 files changed, 743 insertions(+), 242 deletions(-) diff --git a/src/xenia/gpu/command_processor.cc b/src/xenia/gpu/command_processor.cc index 0fe9d7cbf..e6422bc73 100644 --- a/src/xenia/gpu/command_processor.cc +++ b/src/xenia/gpu/command_processor.cc @@ -12,6 +12,7 @@ #include #include #include +#include #include "third_party/fmt/include/fmt/format.h" #include "xenia/base/byte_stream.h" @@ -49,22 +50,23 @@ CommandProcessor::~CommandProcessor() = default; bool CommandProcessor::Initialize() { // Initialize the gamma ramps to their default (linear) values - taken from - // what games set when starting. + // what games set when starting with the sRGB (return value 1) + // VdGetCurrentDisplayGamma. for (uint32_t i = 0; i < 256; ++i) { - uint32_t value = i * 1023 / 255; - gamma_ramp_.table[i].value = value | (value << 10) | (value << 20); + uint32_t value = i * 0x3FF / 0xFF; + reg::DC_LUT_30_COLOR& gamma_ramp_entry = gamma_ramp_256_entry_table_[i]; + gamma_ramp_entry.color_10_blue = value; + gamma_ramp_entry.color_10_green = value; + gamma_ramp_entry.color_10_red = value; } for (uint32_t i = 0; i < 128; ++i) { - uint32_t value = (i * 65535 / 127) & ~63; - if (i < 127) { - value |= 0x200 << 16; - } + reg::DC_LUT_PWL_DATA gamma_ramp_entry = {}; + gamma_ramp_entry.base = (i * 0xFFFF / 0x7F) & ~UINT32_C(0x3F); + gamma_ramp_entry.delta = i < 0x7F ? 0x200 : 0; for (uint32_t j = 0; j < 3; ++j) { - gamma_ramp_.pwl[i].values[j].value = value; + gamma_ramp_pwl_rgb_[i][j] = gamma_ramp_entry; } } - dirty_gamma_ramp_table_ = true; - dirty_gamma_ramp_pwl_ = true; worker_running_ = true; worker_thread_ = kernel::object_ref( @@ -128,6 +130,46 @@ void CommandProcessor::EndTracing() { trace_writer_.Close(); } +void CommandProcessor::RestoreRegisters(uint32_t first_register, + const uint32_t* register_values, + uint32_t register_count, + bool execute_callbacks) { + if (first_register > RegisterFile::kRegisterCount || + RegisterFile::kRegisterCount - first_register < register_count) { + XELOGW( + "CommandProcessor::RestoreRegisters out of bounds (0x{:X} registers " + "starting with 0x{:X}, while a total of 0x{:X} registers are stored)", + register_count, first_register, RegisterFile::kRegisterCount); + if (first_register > RegisterFile::kRegisterCount) { + return; + } + register_count = + std::min(uint32_t(RegisterFile::kRegisterCount) - first_register, + register_count); + } + if (execute_callbacks) { + for (uint32_t i = 0; i < register_count; ++i) { + WriteRegister(first_register + i, register_values[i]); + } + } else { + std::memcpy(register_file_->values + first_register, register_values, + sizeof(uint32_t) * register_count); + } +} + +void CommandProcessor::RestoreGammaRamp( + const reg::DC_LUT_30_COLOR* new_gamma_ramp_256_entry_table, + const reg::DC_LUT_PWL_DATA* new_gamma_ramp_pwl_rgb, + uint32_t new_gamma_ramp_rw_component) { + std::memcpy(gamma_ramp_256_entry_table_, new_gamma_ramp_256_entry_table, + sizeof(reg::DC_LUT_30_COLOR) * 256); + std::memcpy(gamma_ramp_pwl_rgb_, new_gamma_ramp_pwl_rgb, + sizeof(reg::DC_LUT_PWL_DATA) * 3 * 128); + gamma_ramp_rw_component_ = new_gamma_ramp_rw_component; + OnGammaRamp256EntryTableValueWritten(); + OnGammaRampPWLValueWritten(); +} + void CommandProcessor::CallInThread(std::function fn) { if (pending_fns_.empty() && kernel::XThread::IsInThread(worker_thread_.get())) { @@ -286,68 +328,141 @@ void CommandProcessor::UpdateWritePointer(uint32_t value) { } void CommandProcessor::WriteRegister(uint32_t index, uint32_t value) { - RegisterFile* regs = register_file_; + RegisterFile& regs = *register_file_; if (index >= RegisterFile::kRegisterCount) { XELOGW("CommandProcessor::WriteRegister index out of bounds: {}", index); return; } - regs->values[index].u32 = value; - if (!regs->GetRegisterInfo(index)) { + regs.values[index].u32 = value; + if (!regs.GetRegisterInfo(index)) { XELOGW("GPU: Write to unknown register ({:04X} = {:08X})", index, value); } - // If this is a COHER register, set the dirty flag. - // This will block the command processor the next time it WAIT_MEM_REGs and - // allow us to synchronize the memory. - if (index == XE_GPU_REG_COHER_STATUS_HOST) { - regs->values[index].u32 |= 0x80000000ul; - } - // Scratch register writeback. if (index >= XE_GPU_REG_SCRATCH_REG0 && index <= XE_GPU_REG_SCRATCH_REG7) { uint32_t scratch_reg = index - XE_GPU_REG_SCRATCH_REG0; - if ((1 << scratch_reg) & regs->values[XE_GPU_REG_SCRATCH_UMSK].u32) { + if ((1 << scratch_reg) & regs.values[XE_GPU_REG_SCRATCH_UMSK].u32) { // Enabled - write to address. - uint32_t scratch_addr = regs->values[XE_GPU_REG_SCRATCH_ADDR].u32; + uint32_t scratch_addr = regs.values[XE_GPU_REG_SCRATCH_ADDR].u32; uint32_t mem_addr = scratch_addr + (scratch_reg * 4); xe::store_and_swap(memory_->TranslatePhysical(mem_addr), value); } - } -} + } else { + switch (index) { + // If this is a COHER register, set the dirty flag. + // This will block the command processor the next time it WAIT_MEM_REGs + // and allow us to synchronize the memory. + case XE_GPU_REG_COHER_STATUS_HOST: { + regs.values[index].u32 |= UINT32_C(0x80000000); + } break; -void CommandProcessor::UpdateGammaRampValue(GammaRampType type, - uint32_t value) { - RegisterFile* regs = register_file_; + case XE_GPU_REG_DC_LUT_RW_INDEX: { + // Reset the sequential read / write component index (see the M56 + // DC_LUT_SEQ_COLOR documentation). + gamma_ramp_rw_component_ = 0; + } break; - auto index = regs->values[XE_GPU_REG_DC_LUT_RW_INDEX].u32; + case XE_GPU_REG_DC_LUT_SEQ_COLOR: { + // Should be in the 256-entry table writing mode. + assert_zero(regs[XE_GPU_REG_DC_LUT_RW_MODE].u32 & 0b1); + auto& gamma_ramp_rw_index = regs.Get(); + // DC_LUT_SEQ_COLOR is in the red, green, blue order, but the write + // enable mask is blue, green, red. + bool write_gamma_ramp_component = + (regs[XE_GPU_REG_DC_LUT_WRITE_EN_MASK].u32 & + (UINT32_C(1) << (2 - gamma_ramp_rw_component_))) != 0; + if (write_gamma_ramp_component) { + reg::DC_LUT_30_COLOR& gamma_ramp_entry = + gamma_ramp_256_entry_table_[gamma_ramp_rw_index.rw_index]; + // Bits 0:5 are hardwired to zero. + uint32_t gamma_ramp_seq_color = + regs.Get().seq_color >> 6; + switch (gamma_ramp_rw_component_) { + case 0: + gamma_ramp_entry.color_10_red = gamma_ramp_seq_color; + break; + case 1: + gamma_ramp_entry.color_10_green = gamma_ramp_seq_color; + break; + case 2: + gamma_ramp_entry.color_10_blue = gamma_ramp_seq_color; + break; + } + } + if (++gamma_ramp_rw_component_ >= 3) { + gamma_ramp_rw_component_ = 0; + ++gamma_ramp_rw_index.rw_index; + } + if (write_gamma_ramp_component) { + OnGammaRamp256EntryTableValueWritten(); + } + } break; - auto mask = regs->values[XE_GPU_REG_DC_LUT_WRITE_EN_MASK].u32; - auto mask_lo = (mask >> 0) & 0x7; - auto mask_hi = (mask >> 3) & 0x7; + case XE_GPU_REG_DC_LUT_PWL_DATA: { + // Should be in the PWL writing mode. + assert_not_zero(regs[XE_GPU_REG_DC_LUT_RW_MODE].u32 & 0b1); + auto& gamma_ramp_rw_index = regs.Get(); + // Bit 7 of the index is ignored for PWL. + uint32_t gamma_ramp_rw_index_pwl = gamma_ramp_rw_index.rw_index & 0x7F; + // DC_LUT_RW_INDEX is likely in the red, green, blue order because + // DC_LUT_SEQ_COLOR is, but the write enable mask is blue, green, red. + bool write_gamma_ramp_component = + (regs[XE_GPU_REG_DC_LUT_WRITE_EN_MASK].u32 & + (UINT32_C(1) << (2 - gamma_ramp_rw_component_))) != 0; + if (write_gamma_ramp_component) { + reg::DC_LUT_PWL_DATA& gamma_ramp_entry = + gamma_ramp_pwl_rgb_[gamma_ramp_rw_index_pwl] + [gamma_ramp_rw_component_]; + auto gamma_ramp_value = regs.Get(); + // Bits 0:5 are hardwired to zero. + gamma_ramp_entry.base = gamma_ramp_value.base & ~UINT32_C(0x3F); + gamma_ramp_entry.delta = gamma_ramp_value.delta & ~UINT32_C(0x3F); + } + if (++gamma_ramp_rw_component_ >= 3) { + gamma_ramp_rw_component_ = 0; + // TODO(Triang3l): Should this increase beyond 7 bits for PWL? + // Direct3D 9 explicitly sets rw_index to 0x80 after writing the last + // PWL entry. However, the DC_LUT_RW_INDEX documentation says that for + // PWL, the bit 7 is ignored. + gamma_ramp_rw_index.rw_index = + (gamma_ramp_rw_index.rw_index & ~UINT32_C(0x7F)) | + ((gamma_ramp_rw_index_pwl + 1) & 0x7F); + } + if (write_gamma_ramp_component) { + OnGammaRampPWLValueWritten(); + } + } break; - // If games update individual components we're going to have a problem. - assert_true(mask_lo == 0 || mask_lo == 7); - assert_true(mask_hi == 0); - - if (mask_lo) { - switch (type) { - case GammaRampType::kTable: - assert_true(regs->values[XE_GPU_REG_DC_LUT_RW_MODE].u32 == 0); - gamma_ramp_.table[index].value = value; - dirty_gamma_ramp_table_ = true; - break; - case GammaRampType::kPWL: - assert_true(regs->values[XE_GPU_REG_DC_LUT_RW_MODE].u32 == 1); - // The lower 6 bits are hardwired to 0. - // https://developer.amd.com/wordpress/media/2012/10/RRG-216M56-03oOEM.pdf - gamma_ramp_.pwl[index].values[gamma_ramp_rw_subindex_].value = - value & ~(uint32_t(63) | (uint32_t(63) << 16)); - gamma_ramp_rw_subindex_ = (gamma_ramp_rw_subindex_ + 1) % 3; - dirty_gamma_ramp_pwl_ = true; - break; - default: - assert_unhandled_case(type); + case XE_GPU_REG_DC_LUT_30_COLOR: { + // Should be in the 256-entry table writing mode. + assert_zero(regs[XE_GPU_REG_DC_LUT_RW_MODE].u32 & 0b1); + auto& gamma_ramp_rw_index = regs.Get(); + uint32_t gamma_ramp_write_enable_mask = + regs[XE_GPU_REG_DC_LUT_WRITE_EN_MASK].u32 & 0b111; + if (gamma_ramp_write_enable_mask) { + reg::DC_LUT_30_COLOR& gamma_ramp_entry = + gamma_ramp_256_entry_table_[gamma_ramp_rw_index.rw_index]; + auto gamma_ramp_value = regs.Get(); + if (gamma_ramp_write_enable_mask & 0b001) { + gamma_ramp_entry.color_10_blue = gamma_ramp_value.color_10_blue; + } + if (gamma_ramp_write_enable_mask & 0b010) { + gamma_ramp_entry.color_10_green = gamma_ramp_value.color_10_green; + } + if (gamma_ramp_write_enable_mask & 0b100) { + gamma_ramp_entry.color_10_red = gamma_ramp_value.color_10_red; + } + } + ++gamma_ramp_rw_index.rw_index; + // TODO(Triang3l): Should this reset the component write index? If this + // increase is assumed to behave like a full DC_LUT_RW_INDEX write, it + // probably should. + gamma_ramp_rw_component_ = 0; + if (gamma_ramp_write_enable_mask) { + OnGammaRamp256EntryTableValueWritten(); + } + } break; } } } @@ -1493,5 +1608,17 @@ bool CommandProcessor::ExecutePacketType3_VIZ_QUERY(RingBuffer* reader, return true; } +void CommandProcessor::InitializeTrace() { + // Write the initial register values, to be loaded directly into the + // RegisterFile since all registers, including those that may have side + // effects on setting, will be saved. + trace_writer_.WriteRegisters( + 0, reinterpret_cast(register_file_->values), + RegisterFile::kRegisterCount, false); + + trace_writer_.WriteGammaRamp(gamma_ramp_256_entry_table(), + gamma_ramp_pwl_rgb(), gamma_ramp_rw_component_); +} + } // namespace gpu } // namespace xe diff --git a/src/xenia/gpu/command_processor.h b/src/xenia/gpu/command_processor.h index caa49e300..367ed9ee2 100644 --- a/src/xenia/gpu/command_processor.h +++ b/src/xenia/gpu/command_processor.h @@ -22,6 +22,7 @@ #include "xenia/base/ring_buffer.h" #include "xenia/base/threading.h" #include "xenia/gpu/register_file.h" +#include "xenia/gpu/registers.h" #include "xenia/gpu/trace_writer.h" #include "xenia/gpu/xenos.h" #include "xenia/kernel/xthread.h" @@ -64,61 +65,6 @@ enum class GammaRampType { kPWL, }; -struct GammaRamp { - // A lot of gamma ramp (DC_LUT) documentation: - // https://developer.amd.com/wordpress/media/2012/10/RRG-216M56-03oOEM.pdf - // The ramps entries are BGR, not RGB. - // For the 256-entry table (used by Direct3D 9 for a 8bpc front buffer), - // 535107D4 has in-game settings allowing separate configuration. - // The component order of the PWL table is untested, however, it's likely BGR - // too, since DC_LUTA/B registers have values for blue first, and for red - // last. - struct TableEntry { - union { - uint32_t value; - struct { - uint32_t b : 10; - uint32_t g : 10; - uint32_t r : 10; - uint32_t : 2; - }; - }; - }; - - struct PWLValue { - union { - uint32_t value; - struct { - // The lower 6 bits are always zero (these are 10-bit in the upper bits - // thus, not fully 16-bit). - // See DC_LUTA/B_CONTROL for information about the way they should be - // interpreted (`output = base + (multiplier * delta) / 2^increment`, - // where the increment is the value specified in DC_LUTA/B_CONTROL for - // the specific color channel, the base is 7 bits of the front buffer - // value above `increment` bits, the multiplier is the lower `increment` - // bits of it; the increment is nonzero, otherwise the 256-entry table - // should be used instead). - uint16_t base; - uint16_t delta; - }; - }; - }; - - struct PWLEntry { - union { - PWLValue values[3]; - struct { - PWLValue b; - PWLValue g; - PWLValue r; - }; - }; - }; - - TableEntry table[256]; - PWLEntry pwl[128]; -}; - class CommandProcessor { public: enum class SwapPostEffect { @@ -170,6 +116,13 @@ class CommandProcessor { virtual void TracePlaybackWroteMemory(uint32_t base_ptr, uint32_t length) = 0; + void RestoreRegisters(uint32_t first_register, + const uint32_t* register_values, + uint32_t register_count, bool execute_callbacks); + void RestoreGammaRamp( + const reg::DC_LUT_30_COLOR* new_gamma_ramp_256_entry_table, + const reg::DC_LUT_PWL_DATA* new_gamma_ramp_pwl_rgb, + uint32_t new_gamma_ramp_rw_component); virtual void RestoreEdramSnapshot(const void* snapshot) = 0; void InitializeRingBuffer(uint32_t ptr, uint32_t size_log2); @@ -201,7 +154,14 @@ class CommandProcessor { virtual void WriteRegister(uint32_t index, uint32_t value); - void UpdateGammaRampValue(GammaRampType type, uint32_t value); + const reg::DC_LUT_30_COLOR* gamma_ramp_256_entry_table() const { + return gamma_ramp_256_entry_table_; + } + const reg::DC_LUT_PWL_DATA* gamma_ramp_pwl_rgb() const { + return gamma_ramp_pwl_rgb_[0]; + } + virtual void OnGammaRamp256EntryTableValueWritten() {} + virtual void OnGammaRampPWLValueWritten() {} virtual void MakeCoherent(); virtual void PrepareForWait(); @@ -285,9 +245,7 @@ class CommandProcessor { return swap_post_effect_actual_; } - // TODO(Triang3l): Write the gamma ramp (including the display controller - // write pointers) in the common code. - virtual void InitializeTrace() = 0; + virtual void InitializeTrace(); Memory* memory_ = nullptr; kernel::KernelState* kernel_state_ = nullptr; @@ -334,15 +292,15 @@ class CommandProcessor { bool paused_ = false; - GammaRamp gamma_ramp_ = {}; - int gamma_ramp_rw_subindex_ = 0; - bool dirty_gamma_ramp_table_ = true; - bool dirty_gamma_ramp_pwl_ = true; - // By default (such as for tools), post-processing is disabled. // "Desired" is for the external thread managing the post-processing effect. SwapPostEffect swap_post_effect_desired_ = SwapPostEffect::kNone; SwapPostEffect swap_post_effect_actual_ = SwapPostEffect::kNone; + + private: + reg::DC_LUT_30_COLOR gamma_ramp_256_entry_table_[256] = {}; + reg::DC_LUT_PWL_DATA gamma_ramp_pwl_rgb_[128][3] = {}; + uint32_t gamma_ramp_rw_component_ = 0; }; } // namespace gpu diff --git a/src/xenia/gpu/d3d12/d3d12_command_processor.cc b/src/xenia/gpu/d3d12/d3d12_command_processor.cc index 9e4bdba44..ebfbbe986 100644 --- a/src/xenia/gpu/d3d12/d3d12_command_processor.cc +++ b/src/xenia/gpu/d3d12/d3d12_command_processor.cc @@ -13,6 +13,7 @@ #include #include "xenia/base/assert.h" +#include "xenia/base/byte_order.h" #include "xenia/base/cvar.h" #include "xenia/base/logging.h" #include "xenia/base/math.h" @@ -1161,8 +1162,8 @@ bool D3D12CommandProcessor::SetupContext() { provider.GetHeapFlagCreateNotZeroed(); // Create gamma ramp resources. - dirty_gamma_ramp_table_ = true; - dirty_gamma_ramp_pwl_ = true; + gamma_ramp_256_entry_table_up_to_date_ = false; + gamma_ramp_pwl_up_to_date_ = false; D3D12_RESOURCE_DESC gamma_ramp_buffer_desc; ui::d3d12::util::FillBufferResourceDesc( gamma_ramp_buffer_desc, (256 + 128 * 3) * 4, D3D12_RESOURCE_FLAG_NONE); @@ -1699,15 +1700,17 @@ void D3D12CommandProcessor::WriteRegister(uint32_t index, uint32_t value) { texture_cache_->TextureFetchConstantWritten( (index - XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0) / 6); } - } else if (index == XE_GPU_REG_DC_LUT_PWL_DATA) { - UpdateGammaRampValue(GammaRampType::kPWL, value); - } else if (index == XE_GPU_REG_DC_LUT_30_COLOR) { - UpdateGammaRampValue(GammaRampType::kTable, value); - } else if (index == XE_GPU_REG_DC_LUT_RW_MODE) { - gamma_ramp_rw_subindex_ = 0; } } +void D3D12CommandProcessor::OnGammaRamp256EntryTableValueWritten() { + gamma_ramp_256_entry_table_up_to_date_ = false; +} + +void D3D12CommandProcessor::OnGammaRampPWLValueWritten() { + gamma_ramp_pwl_up_to_date_ = false; +} + void D3D12CommandProcessor::IssueSwap(uint32_t frontbuffer_ptr, uint32_t frontbuffer_width, uint32_t frontbuffer_height) { @@ -1801,6 +1804,9 @@ void D3D12CommandProcessor::IssueSwap(uint32_t frontbuffer_ptr, // This is according to D3D::InitializePresentationParameters from a // game executable, which initializes the 256-entry table gamma ramp for // 8_8_8_8 output and the PWL gamma ramp for 2_10_10_10. + // TODO(Triang3l): Choose between the table and PWL based on + // DC_LUTA_CONTROL, support both for all formats (and also different + // increments for PWL). bool use_pwl_gamma_ramp = frontbuffer_format == xenos::TextureFormat::k_2_10_10_10 || frontbuffer_format == @@ -1811,20 +1817,43 @@ void D3D12CommandProcessor::IssueSwap(uint32_t frontbuffer_ptr, // Upload the new gamma ramp, using the upload buffer for the current // frame (will close the frame after this anyway, so can't write // multiple times per frame). - if (use_pwl_gamma_ramp ? dirty_gamma_ramp_pwl_ - : dirty_gamma_ramp_table_) { + if (!(use_pwl_gamma_ramp ? gamma_ramp_pwl_up_to_date_ + : gamma_ramp_256_entry_table_up_to_date_)) { uint32_t gamma_ramp_offset_bytes = use_pwl_gamma_ramp ? 256 * 4 : 0; uint32_t gamma_ramp_upload_offset_bytes = uint32_t(frame_current_ % kQueueFrames) * ((256 + 128 * 3) * 4) + gamma_ramp_offset_bytes; uint32_t gamma_ramp_size_bytes = (use_pwl_gamma_ramp ? 128 * 3 : 256) * 4; - std::memcpy(gamma_ramp_upload_buffer_mapping_ + - gamma_ramp_upload_offset_bytes, - use_pwl_gamma_ramp - ? static_cast(gamma_ramp_.pwl) - : static_cast(gamma_ramp_.table), - gamma_ramp_size_bytes); + if (std::endian::native != std::endian::little && + use_pwl_gamma_ramp) { + // R16G16 is first R16, where the shader expects the base, and + // second G16, where the delta should be, but gamma_ramp_pwl_rgb() + // is an array of 32-bit DC_LUT_PWL_DATA registers - swap 16 bits in + // each 32. + auto gamma_ramp_pwl_upload_buffer = + reinterpret_cast( + gamma_ramp_upload_buffer_mapping_ + + gamma_ramp_upload_offset_bytes); + const reg::DC_LUT_PWL_DATA* gamma_ramp_pwl = gamma_ramp_pwl_rgb(); + for (size_t i = 0; i < 128 * 3; ++i) { + reg::DC_LUT_PWL_DATA& gamma_ramp_pwl_upload_buffer_entry = + gamma_ramp_pwl_upload_buffer[i]; + reg::DC_LUT_PWL_DATA gamma_ramp_pwl_entry = gamma_ramp_pwl[i]; + gamma_ramp_pwl_upload_buffer_entry.base = + gamma_ramp_pwl_entry.delta; + gamma_ramp_pwl_upload_buffer_entry.delta = + gamma_ramp_pwl_entry.base; + } + } else { + std::memcpy( + gamma_ramp_upload_buffer_mapping_ + + gamma_ramp_upload_offset_bytes, + use_pwl_gamma_ramp + ? static_cast(gamma_ramp_pwl_rgb()) + : static_cast(gamma_ramp_256_entry_table()), + gamma_ramp_size_bytes); + } PushTransitionBarrier(gamma_ramp_buffer_.Get(), gamma_ramp_buffer_state_, D3D12_RESOURCE_STATE_COPY_DEST); @@ -1834,8 +1863,8 @@ void D3D12CommandProcessor::IssueSwap(uint32_t frontbuffer_ptr, gamma_ramp_buffer_.Get(), gamma_ramp_offset_bytes, gamma_ramp_upload_buffer_.Get(), gamma_ramp_upload_offset_bytes, gamma_ramp_size_bytes); - (use_pwl_gamma_ramp ? dirty_gamma_ramp_pwl_ - : dirty_gamma_ramp_table_) = false; + (use_pwl_gamma_ramp ? gamma_ramp_pwl_up_to_date_ + : gamma_ramp_256_entry_table_up_to_date_) = true; } // Destination, source, and if bindful, gamma ramp. @@ -2589,6 +2618,8 @@ bool D3D12CommandProcessor::IssueDraw(xenos::PrimitiveType primitive_type, } void D3D12CommandProcessor::InitializeTrace() { + CommandProcessor::InitializeTrace(); + if (!BeginSubmission(false)) { return; } diff --git a/src/xenia/gpu/d3d12/d3d12_command_processor.h b/src/xenia/gpu/d3d12/d3d12_command_processor.h index a3b9f8577..2bb7a1c84 100644 --- a/src/xenia/gpu/d3d12/d3d12_command_processor.h +++ b/src/xenia/gpu/d3d12/d3d12_command_processor.h @@ -209,6 +209,9 @@ class D3D12CommandProcessor : public CommandProcessor { void WriteRegister(uint32_t index, uint32_t value) override; + void OnGammaRamp256EntryTableValueWritten() override; + void OnGammaRampPWLValueWritten() override; + void IssueSwap(uint32_t frontbuffer_ptr, uint32_t frontbuffer_width, uint32_t frontbuffer_height) override; @@ -496,17 +499,18 @@ class D3D12CommandProcessor : public CommandProcessor { std::unique_ptr texture_cache_; - // Bytes 0x0...0x3FF - 256-entry R10G10B10X2 gamma ramp (red and blue must be - // read as swapped - 535107D4 has settings allowing separate configuration). + // Bytes 0x0...0x3FF - 256-entry gamma ramp table with B10G10R10X2 data (read + // as R10G10B10X2 with swizzle). // Bytes 0x400...0x9FF - 128-entry PWL R16G16 gamma ramp (R - base, G - delta, // low 6 bits of each are zero, 3 elements per entry). - // https://www.x.org/docs/AMD/old/42590_m76_rrg_1.01o.pdf Microsoft::WRL::ComPtr gamma_ramp_buffer_; D3D12_RESOURCE_STATES gamma_ramp_buffer_state_; // Upload buffer for an image that is the same as gamma_ramp_, but with // kQueueFrames array layers. Microsoft::WRL::ComPtr gamma_ramp_upload_buffer_; uint8_t* gamma_ramp_upload_buffer_mapping_ = nullptr; + bool gamma_ramp_256_entry_table_up_to_date_ = false; + bool gamma_ramp_pwl_up_to_date_ = false; struct ApplyGammaConstants { uint32_t size[2]; diff --git a/src/xenia/gpu/register_table.inc b/src/xenia/gpu/register_table.inc index 8da898a5a..aa22558eb 100644 --- a/src/xenia/gpu/register_table.inc +++ b/src/xenia/gpu/register_table.inc @@ -275,14 +275,183 @@ XE_GPU_REGISTER(0x1844, kDword, D1GRPH_PRIMARY_SURFACE_ADDRESS) XE_GPU_REGISTER(0x1852, kDword, D1GRPH_FLIP_CONTROL) -XE_GPU_REGISTER(0x1921, kDword, DC_LUT_RW_MODE) -XE_GPU_REGISTER(0x1922, kDword, DC_LUT_RW_INDEX) +// In 4B4F07FE, the 256-entry gamma ramp for the 8bpc framebuffer is set to +// different values in multiple places in the game. For VdGetCurrentDisplayGamma +// returning 1 (sRGB), it's set up in the beginning as: +// DC_LUTA_CONTROL = 0x00000000 (256-entry unsigned fixed-point) +// DC_LUT_RW_MODE = 0x00000000 +// DC_LUT_RW_INDEX = 0x00000000 +// DC_LUT_WRITE_EN_MASK = 0x00000007 +// DC_LUT_30_COLOR = 0x00000000 +// DC_LUT_RW_INDEX = 0x00000001 +// DC_LUT_30_COLOR = 0x04812048 +// DC_LUT_RW_INDEX = 0x00000002 +// DC_LUT_30_COLOR = 0x05916459 +// DC_LUT_RW_INDEX = 0x00000003 +// DC_LUT_30_COLOR = 0x06519465 +// ... +// DC_LUT_RW_INDEX = 0x000000FE +// DC_LUT_30_COLOR = 0x3FBFEFFB +// DC_LUT_RW_INDEX = 0x000000FF +// DC_LUT_30_COLOR = 0x3FFFFFFF +// DC_LUT_RW_INDEX = 0x00000100 +// +// One another possible setup in 4B4F07FE is: +// DC_LUTA_CONTROL = 0x00000000 (256-entry unsigned fixed-point) +// DC_LUT_RW_MODE = 0x00000000 +// DC_LUT_RW_INDEX = 0x00000000 +// DC_LUT_WRITE_EN_MASK = 0x00000007 +// DC_LUT_30_COLOR = 0x00000000 +// DC_LUT_RW_INDEX = 0x00000001 +// DC_LUT_30_COLOR = 0x01A0681A +// DC_LUT_RW_INDEX = 0x00000002 +// DC_LUT_30_COLOR = 0x02709C27 +// ... +// DC_LUT_RW_INDEX = 0x000000FE +// DC_LUT_30_COLOR = 0x3FBFEFFB +// DC_LUT_RW_INDEX = 0x000000FF +// DC_LUT_30_COLOR = 0x3FFFFFFF +// DC_LUT_RW_INDEX = 0x00000100 +// +// In 4D5307E6, the 128-entry PWL gamma ramp for the 10bpc framebuffer, for +// VdGetCurrentDisplayGamma returning 1 (sRGB), is set up right after launching +// the game as: +// DC_LUTA_CONTROL = 0x00000003 (8-increment unsigned fixed-point) +// DC_LUT_RW_MODE = 0x00000001 +// DC_LUT_RW_INDEX = 0x00000000 +// DC_LUT_WRITE_EN_MASK = 0x00000007 +// DC_LUT_PWL_DATA = 0x02000000 +// DC_LUT_PWL_DATA = 0x02000000 +// DC_LUT_PWL_DATA = 0x02000000 +// DC_LUT_RW_INDEX = 0x00000001 +// DC_LUT_PWL_DATA = 0x02000200 +// DC_LUT_PWL_DATA = 0x02000200 +// DC_LUT_PWL_DATA = 0x02000200 +// DC_LUT_RW_INDEX = 0x00000001 +// DC_LUT_PWL_DATA = 0x02000400 +// DC_LUT_PWL_DATA = 0x02000400 +// DC_LUT_PWL_DATA = 0x02000400 +// ... +// DC_LUT_RW_INDEX = 0x0000007D +// DC_LUT_PWL_DATA = 0x0200FBC0 +// DC_LUT_PWL_DATA = 0x0200FBC0 +// DC_LUT_PWL_DATA = 0x0200FBC0 +// DC_LUT_RW_INDEX = 0x0000007E +// DC_LUT_PWL_DATA = 0x0200FDC0 +// DC_LUT_PWL_DATA = 0x0200FDC0 +// DC_LUT_PWL_DATA = 0x0200FDC0 +// DC_LUT_RW_INDEX = 0x0000007F +// DC_LUT_PWL_DATA = 0x0000FFC0 +// DC_LUT_PWL_DATA = 0x0000FFC0 +// DC_LUT_PWL_DATA = 0x0000FFC0 +// DC_LUT_RW_INDEX = 0x00000080 +// +// Later in 4D5307E6, for the game itself (apparently for conversion of the bit +// representation of 7e3 floating-point data in the front buffer to 10-bit fixed +// point, as the game draws the final passes to a 7e3 framebuffer), with +// VdGetCurrentDisplayGamma returning 1 (sRGB) and the normal brightness in the +// game settings, it's: +// DC_LUTA_CONTROL = 0x00000003 (8-increment unsigned fixed-point) +// DC_LUT_RW_MODE = 0x00000001 +// DC_LUT_RW_INDEX = 0x00000000 +// DC_LUT_WRITE_EN_MASK = 0x00000007 +// DC_LUT_PWL_DATA = 0x05000000 +// DC_LUT_PWL_DATA = 0x05000000 +// DC_LUT_PWL_DATA = 0x05000000 +// DC_LUT_RW_INDEX = 0x00000001 +// DC_LUT_PWL_DATA = 0x02000500 +// DC_LUT_PWL_DATA = 0x02000500 +// DC_LUT_PWL_DATA = 0x02000500 +// DC_LUT_RW_INDEX = 0x00000001 +// DC_LUT_PWL_DATA = 0x01800740 +// DC_LUT_PWL_DATA = 0x01800740 +// DC_LUT_PWL_DATA = 0x01800740 +// ... +// DC_LUT_RW_INDEX = 0x0000007D +// DC_LUT_PWL_DATA = 0x0440F340 +// DC_LUT_PWL_DATA = 0x0440F340 +// DC_LUT_PWL_DATA = 0x0440F340 +// DC_LUT_RW_INDEX = 0x0000007E +// DC_LUT_PWL_DATA = 0x0400F780 +// DC_LUT_PWL_DATA = 0x0400F780 +// DC_LUT_PWL_DATA = 0x0400F780 +// DC_LUT_RW_INDEX = 0x0000007F +// DC_LUT_PWL_DATA = 0x0400FBC0 +// DC_LUT_PWL_DATA = 0x0400FBC0 +// DC_LUT_PWL_DATA = 0x0400FBC0 +// DC_LUT_RW_INDEX = 0x00000080 +// +// In 535107D4, the 256-entry gamma ramp for the 8bpc framebuffer is +// configurable from the game's settings menu for each channel independently. +// For VdGetCurrentDisplayGamma returning 1 (sRGB), when in the settings, the +// red gamma is at the maximum of 5.56, green is at 1.00, and blue is at the +// minimum of 0.17, the setup is done as: +// DC_LUT_RW_MODE = 0x00000000 +// DC_LUT_RW_INDEX = 0x00000000 +// DC_LUT_WRITE_EN_MASK = 0x00000007 +// DC_LUT_30_COLOR = 0x00000000 +// DC_LUT_RW_INDEX = 0x00000001 +// DC_LUT_30_COLOR = 0x17901000 +// DC_LUT_RW_INDEX = 0x00000002 +// DC_LUT_30_COLOR = 0x1AB02000 +// ... +// DC_LUT_RW_INDEX = 0x000000FE +// DC_LUT_30_COLOR = 0x3FEFE3D2 +// DC_LUT_RW_INDEX = 0x000000FF +// DC_LUT_30_COLOR = 0x3FFFF3E9 +// DC_LUT_RW_INDEX = 0x00000100 +// Read / write mode in bit 0: 0 - 256-entry table, 1 - PWL. +// Default: 0x00000000. +XE_GPU_REGISTER(0x1921, kDword, DC_LUT_RW_MODE) +// Read / write index. No lower and upper halves on the Xenos apparently, for +// the 256-entry table, the bits 0:7 are the index directly (unlike on the M56, +// not split into the index in 1:7 and the lower or upper 10 bits selection in +// 0:0, instead, on the Xenos, the index in 0:7 is just increased +// monotonically). For some reason though Direct3D 9 writes an index that +// overflows by one (0x100 for the 256-entry table, 0x80 for the 128-entry PWL +// gamma ramp) after setting up all the values. However, the index is 8-bit, and +// for PWL, according to the M56 documentation, the bit 7 is not used. +// Default: 0x00000000. +XE_GPU_REGISTER(0x1922, kDword, DC_LUT_RW_INDEX) +// Sequential 10-bit R, G, B host read / write for the 256-entry table. After +// reset or writing DC_LUT_RW_INDEX, the first access is for the red component, +// the second is for green, the third is for blue, and after blue is accessed, +// the LUT index is increased by 1 (without having to explicitly change +// DC_LUT_RW_INDEX). Bits 0:5 are hardwired to zero. +// Default: 0x00000000. +XE_GPU_REGISTER(0x1923, kDword, DC_LUT_SEQ_COLOR) +// Read / write, 0:15 - base, 16:31 - delta. Bits 0:5 of both the base and the +// delta are hardwired to zero. The LUT index is increased by 1 when +// DC_LUT_PWL_DATA is accessed, though three DC_LUT_PWL_DATA writes are done for +// one entry (the order is likely R, G, B, similar to DC_LUT_SEQ_COLOR, but this +// hasn't been verified yet as no games using the PWL gamma ramp with separate +// settings for each channel have been found yet). +// Default: 0x00000000. XE_GPU_REGISTER(0x1924, kDword, DC_LUT_PWL_DATA) +// Read / write, 0:9 - blue, 10:19 - green, 20:29 - red. The LUT index is +// increased by 1 when DC_LUT_30_COLOR is accessed. +// Default: 0x00000000. XE_GPU_REGISTER(0x1925, kDword, DC_LUT_30_COLOR) +// Only LUT pipe 1 on the Xenos apparently (Direct3D 9 sets DC_LUT_WRITE_EN_MASK +// to 0b111 before writing the gamma ramp), 3 bits set, rather than 6 on the +// M56. +// Bit 0 - blue write enable mask. +// Bit 1 - green write enable mask. +// Bit 2 - red write enable mask. +// Default: 0x00000007 (though 0x0000003F on the M56 where there are two pipes). XE_GPU_REGISTER(0x1927, kDword, DC_LUT_WRITE_EN_MASK) +// Single set of parameters for all channels apparently unlike on the M56 +// (4D5307E6 sets DC_LUTA_CONTROL to 0x00000003 for the data increment of 8 in +// the 128-entry PWL gamma ramp for a 10bpc framebuffer). Also set not only +// during setup, but also apparently during every swap by Direct3D 9, though not +// directly in all games (happens in 4B4F07FE and 4D5307E6 even without proper +// VdSwap emulation, but in 535107D4, with a fake VdSwap packet rather than the +// real ones, the register is not set at all, though the expected behavior is +// that of the value of 0x00000000). +// Default: 0x00000000. XE_GPU_REGISTER(0x1930, kDword, DC_LUTA_CONTROL) XE_GPU_REGISTER(0x1961, kDword, AVIVO_D1MODE_VIEWPORT_SIZE) diff --git a/src/xenia/gpu/registers.h b/src/xenia/gpu/registers.h index 7c1020bd9..2d89d541b 100644 --- a/src/xenia/gpu/registers.h +++ b/src/xenia/gpu/registers.h @@ -825,6 +825,68 @@ union alignas(uint32_t) RB_COPY_DEST_PITCH { }; static_assert_size(RB_COPY_DEST_PITCH, sizeof(uint32_t)); +/******************************************************************************* + ___ ___ ___ ___ _ ___ __ + | \_ _/ __| _ \ | /_\ \ / / + | |) | |\__ \ _/ |__ / _ \ V / + |___/___|___/_| |____/_/ \_\_| + + ___ ___ _ _ _____ ___ ___ _ _ ___ ___ + / __/ _ \| \| |_ _| _ \/ _ \| | | | | __| _ \ + | (_| (_) | .` | | | | / (_) | |__| |__| _|| / + \___\___/|_|\_| |_| |_|_\\___/|____|____|___|_|_\ + +*******************************************************************************/ + +union alignas(uint32_t) DC_LUT_RW_INDEX { + uint32_t value; + struct { + // Unlike in the M56 documentation, for the 256-table entry, this is the + // absolute index, without the lower or upper 10 bits selection in the + // bit 0. For PWL, the bit 7 is ignored. + uint32_t rw_index : 8; // +0 + }; + static constexpr Register register_index = XE_GPU_REG_DC_LUT_RW_INDEX; +}; +static_assert_size(DC_LUT_RW_INDEX, sizeof(uint32_t)); + +union alignas(uint32_t) DC_LUT_SEQ_COLOR { + uint32_t value; + struct { + uint32_t seq_color : 16; // +0, bits 0:5 are hardwired to zero + }; + static constexpr Register register_index = XE_GPU_REG_DC_LUT_SEQ_COLOR; +}; +static_assert_size(DC_LUT_SEQ_COLOR, sizeof(uint32_t)); + +union alignas(uint32_t) DC_LUT_PWL_DATA { + uint32_t value; + struct { + // See the M56 DC_LUTA_CONTROL for information about the way these should be + // interpreted (`output = base + (multiplier * delta) / 2^increment`, where + // the increment is the value specified in DC_LUTA_CONTROL for the specific + // color channel, the base is 7 bits of the front buffer value above + // `increment` bits, the multiplier is the lower `increment` bits of it; the + // increment is nonzero, otherwise the 256-entry table should be used + // instead). + uint32_t base : 16; // +0, bits 0:5 are hardwired to zero + uint32_t delta : 16; // +16, bits 0:5 are hardwired to zero + }; + static constexpr Register register_index = XE_GPU_REG_DC_LUT_PWL_DATA; +}; +static_assert_size(DC_LUT_PWL_DATA, sizeof(uint32_t)); + +union alignas(uint32_t) DC_LUT_30_COLOR { + uint32_t value; + struct { + uint32_t color_10_blue : 10; // +0 + uint32_t color_10_green : 10; // +10 + uint32_t color_10_red : 10; // +20 + }; + static constexpr Register register_index = XE_GPU_REG_DC_LUT_30_COLOR; +}; +static_assert_size(DC_LUT_30_COLOR, sizeof(uint32_t)); + } // namespace reg } // namespace gpu diff --git a/src/xenia/gpu/shaders/apply_gamma_pwl.hlsli b/src/xenia/gpu/shaders/apply_gamma_pwl.hlsli index a77c85460..7cae461e4 100644 --- a/src/xenia/gpu/shaders/apply_gamma_pwl.hlsli +++ b/src/xenia/gpu/shaders/apply_gamma_pwl.hlsli @@ -32,10 +32,9 @@ void main(uint3 xe_thread_id : SV_DispatchThreadID) { } // UNORM conversion according to the Direct3D 10+ rules. uint3 input = uint3(xe_apply_gamma_source[xe_thread_id.xy] * 1023.0f + 0.5f); - // The ramp is BGR, not RGB. - float3 output = float3(XeApplyPWLGamma(input.r, 2u), + float3 output = float3(XeApplyPWLGamma(input.r, 0u), XeApplyPWLGamma(input.g, 1u), - XeApplyPWLGamma(input.b, 0u)); + XeApplyPWLGamma(input.b, 2u)); xe_apply_gamma_dest[xe_thread_id.xy] = float4(output, XeApplyGammaGetAlpha(output)); } diff --git a/src/xenia/gpu/shaders/apply_gamma_table.hlsli b/src/xenia/gpu/shaders/apply_gamma_table.hlsli index 7f43a9567..c3786ee47 100644 --- a/src/xenia/gpu/shaders/apply_gamma_table.hlsli +++ b/src/xenia/gpu/shaders/apply_gamma_table.hlsli @@ -14,7 +14,8 @@ void main(uint3 xe_thread_id : SV_DispatchThreadID) { } // UNORM conversion according to the Direct3D 10+ rules. uint3 input = uint3(xe_apply_gamma_source[xe_thread_id.xy] * 255.0f + 0.5f); - // The ramp is BGR, not RGB. + // The ramp has blue in bits 0:9, green in 10:19, red in 20:29 - BGR passed as + // an R10G10B10A2 buffer. float3 output = float3(xe_apply_gamma_ramp[input.r].b, xe_apply_gamma_ramp[input.g].g, xe_apply_gamma_ramp[input.b].r); diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_cs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_cs.h index 727d15384..01cb7de40 100644 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_cs.h +++ b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_cs.h @@ -55,17 +55,17 @@ ld r0.xyz, r0.xyzw, T0[0].xyzw mad r0.xyz, r0.xyzx, l(1023.000000, 1023.000000, 1023.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000) ftou r0.xyz, r0.xyzx ushr r1.xyz, r0.xyzx, l(3, 3, 3, 0) -imul null, r0.w, r1.z, l(3) -imad r1.xy, r1.xyxx, l(3, 3, 0, 0), l(2, 1, 0, 0) -ld r1.xz, r1.xxxx, T1[1].xzyw -utof r1.x, r1.x +imul null, r0.w, r1.x, l(3) +ld r1.xw, r0.wwww, T1[1].xzwy +utof r0.w, r1.x and r0.xyz, r0.xyzx, l(7, 7, 7, 0) -imul null, r0.x, r1.z, r0.x +imul null, r0.x, r1.w, r0.x utof r0.x, r0.x -mad r0.x, r0.x, l(0.125000), r1.x +mad r0.x, r0.x, l(0.125000), r0.w mul r0.x, r0.x, l(0.000015) min r2.x, r0.x, l(1.000000) -ld r1.xy, r1.yyyy, T1[1].xyzw +imad r0.xw, r1.yyyz, l(3, 0, 0, 3), l(1, 0, 0, 2) +ld r1.xy, r0.xxxx, T1[1].xyzw utof r0.x, r1.x imul null, r0.y, r0.y, r1.y utof r0.y, r0.y @@ -86,10 +86,10 @@ ret const BYTE apply_gamma_pwl_cs[] = { - 68, 88, 66, 67, 180, 180, - 222, 28, 4, 138, 188, 113, - 52, 97, 214, 88, 116, 106, - 105, 240, 1, 0, 0, 0, + 68, 88, 66, 67, 134, 193, + 189, 188, 150, 246, 151, 78, + 29, 10, 33, 117, 212, 145, + 204, 130, 1, 0, 0, 0, 128, 7, 0, 0, 5, 0, 0, 0, 52, 0, 0, 0, 24, 2, 0, 0, 40, 2, @@ -257,26 +257,16 @@ const BYTE apply_gamma_pwl_cs[] = 0, 0, 0, 0, 38, 0, 0, 8, 0, 208, 0, 0, 130, 0, 16, 0, 0, 0, - 0, 0, 42, 0, 16, 0, + 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 3, 0, 0, 0, - 35, 0, 0, 15, 50, 0, + 45, 0, 0, 8, 146, 0, 16, 0, 1, 0, 0, 0, - 70, 0, 16, 0, 1, 0, - 0, 0, 2, 64, 0, 0, - 3, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 64, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 45, 0, 0, 8, 82, 0, - 16, 0, 1, 0, 0, 0, - 6, 0, 16, 0, 1, 0, - 0, 0, 134, 125, 32, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 134, 119, 32, 0, 1, 0, 0, 0, 1, 0, 0, 0, 86, 0, 0, 5, - 18, 0, 16, 0, 1, 0, + 130, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 0, 0, 10, 114, 0, 16, 0, @@ -288,7 +278,7 @@ const BYTE apply_gamma_pwl_cs[] = 0, 0, 38, 0, 0, 8, 0, 208, 0, 0, 18, 0, 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 1, 0, + 58, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 86, 0, 0, 5, 18, 0, 16, 0, @@ -298,8 +288,8 @@ const BYTE apply_gamma_pwl_cs[] = 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, - 0, 0, 0, 62, 10, 0, - 16, 0, 1, 0, 0, 0, + 0, 0, 0, 62, 58, 0, + 16, 0, 0, 0, 0, 0, 56, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, @@ -309,10 +299,20 @@ const BYTE apply_gamma_pwl_cs[] = 2, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, - 128, 63, 45, 0, 0, 8, + 128, 63, 35, 0, 0, 15, + 146, 0, 16, 0, 0, 0, + 0, 0, 86, 9, 16, 0, + 1, 0, 0, 0, 2, 64, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 64, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 45, 0, 0, 8, 50, 0, 16, 0, 1, 0, - 0, 0, 86, 5, 16, 0, - 1, 0, 0, 0, 70, 126, + 0, 0, 6, 0, 16, 0, + 0, 0, 0, 0, 70, 126, 32, 0, 1, 0, 0, 0, 1, 0, 0, 0, 86, 0, 0, 5, 18, 0, 16, 0, diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_fxaa_luma_cs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_fxaa_luma_cs.h index ed86b4d4a..a4dd510d2 100644 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_fxaa_luma_cs.h +++ b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_fxaa_luma_cs.h @@ -55,17 +55,17 @@ ld r0.xyz, r0.xyzw, T0[0].xyzw mad r0.xyz, r0.xyzx, l(1023.000000, 1023.000000, 1023.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000) ftou r0.xyz, r0.xyzx ushr r1.xyz, r0.xyzx, l(3, 3, 3, 0) -imul null, r0.w, r1.z, l(3) -imad r1.xy, r1.xyxx, l(3, 3, 0, 0), l(2, 1, 0, 0) -ld r1.xz, r1.xxxx, T1[1].xzyw -utof r1.x, r1.x +imul null, r0.w, r1.x, l(3) +ld r1.xw, r0.wwww, T1[1].xzwy +utof r0.w, r1.x and r0.xyz, r0.xyzx, l(7, 7, 7, 0) -imul null, r0.x, r1.z, r0.x +imul null, r0.x, r1.w, r0.x utof r0.x, r0.x -mad r0.x, r0.x, l(0.125000), r1.x +mad r0.x, r0.x, l(0.125000), r0.w mul r0.x, r0.x, l(0.000015) min r2.x, r0.x, l(1.000000) -ld r1.xy, r1.yyyy, T1[1].xyzw +imad r0.xw, r1.yyyz, l(3, 0, 0, 3), l(1, 0, 0, 2) +ld r1.xy, r0.xxxx, T1[1].xyzw utof r0.x, r1.x imul null, r0.y, r0.y, r1.y utof r0.y, r0.y @@ -86,10 +86,10 @@ ret const BYTE apply_gamma_pwl_fxaa_luma_cs[] = { - 68, 88, 66, 67, 165, 122, - 242, 36, 160, 218, 193, 67, - 37, 43, 138, 45, 109, 219, - 226, 109, 1, 0, 0, 0, + 68, 88, 66, 67, 115, 68, + 69, 234, 116, 212, 118, 193, + 71, 10, 44, 165, 244, 209, + 63, 198, 1, 0, 0, 0, 148, 7, 0, 0, 5, 0, 0, 0, 52, 0, 0, 0, 24, 2, 0, 0, 40, 2, @@ -257,26 +257,16 @@ const BYTE apply_gamma_pwl_fxaa_luma_cs[] = 0, 0, 0, 0, 38, 0, 0, 8, 0, 208, 0, 0, 130, 0, 16, 0, 0, 0, - 0, 0, 42, 0, 16, 0, + 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 3, 0, 0, 0, - 35, 0, 0, 15, 50, 0, + 45, 0, 0, 8, 146, 0, 16, 0, 1, 0, 0, 0, - 70, 0, 16, 0, 1, 0, - 0, 0, 2, 64, 0, 0, - 3, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 64, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 45, 0, 0, 8, 82, 0, - 16, 0, 1, 0, 0, 0, - 6, 0, 16, 0, 1, 0, - 0, 0, 134, 125, 32, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 134, 119, 32, 0, 1, 0, 0, 0, 1, 0, 0, 0, 86, 0, 0, 5, - 18, 0, 16, 0, 1, 0, + 130, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 0, 0, 10, 114, 0, 16, 0, @@ -288,7 +278,7 @@ const BYTE apply_gamma_pwl_fxaa_luma_cs[] = 0, 0, 38, 0, 0, 8, 0, 208, 0, 0, 18, 0, 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 1, 0, + 58, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 86, 0, 0, 5, 18, 0, 16, 0, @@ -298,8 +288,8 @@ const BYTE apply_gamma_pwl_fxaa_luma_cs[] = 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, - 0, 0, 0, 62, 10, 0, - 16, 0, 1, 0, 0, 0, + 0, 0, 0, 62, 58, 0, + 16, 0, 0, 0, 0, 0, 56, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, @@ -309,10 +299,20 @@ const BYTE apply_gamma_pwl_fxaa_luma_cs[] = 2, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, - 128, 63, 45, 0, 0, 8, + 128, 63, 35, 0, 0, 15, + 146, 0, 16, 0, 0, 0, + 0, 0, 86, 9, 16, 0, + 1, 0, 0, 0, 2, 64, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 64, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 45, 0, 0, 8, 50, 0, 16, 0, 1, 0, - 0, 0, 86, 5, 16, 0, - 1, 0, 0, 0, 70, 126, + 0, 0, 6, 0, 16, 0, + 0, 0, 0, 0, 70, 126, 32, 0, 1, 0, 0, 0, 1, 0, 0, 0, 86, 0, 0, 5, 18, 0, 16, 0, diff --git a/src/xenia/gpu/trace_player.cc b/src/xenia/gpu/trace_player.cc index a141c9b8d..b1aa8f615 100644 --- a/src/xenia/gpu/trace_player.cc +++ b/src/xenia/gpu/trace_player.cc @@ -9,8 +9,11 @@ #include "xenia/gpu/trace_player.h" +#include + #include "xenia/gpu/command_processor.h" #include "xenia/gpu/graphics_system.h" +#include "xenia/gpu/registers.h" #include "xenia/gpu/xenos.h" #include "xenia/memory.h" @@ -33,8 +36,6 @@ TracePlayer::TracePlayer(GraphicsSystem* graphics_system) assert_not_null(playback_event_); } -TracePlayer::~TracePlayer() { delete[] edram_snapshot_; } - const TraceReader::Frame* TracePlayer::current_frame() const { if (current_frame_index_ >= frame_count()) { return nullptr; @@ -197,13 +198,12 @@ void TracePlayer::PlayTraceOnThread(const uint8_t* trace_data, case TraceCommandType::kEdramSnapshot: { auto cmd = reinterpret_cast(trace_ptr); trace_ptr += sizeof(*cmd); - if (!edram_snapshot_) { - edram_snapshot_ = new uint8_t[xenos::kEdramSizeBytes]; - } + std::unique_ptr edram_snapshot( + new uint8_t[xenos::kEdramSizeBytes]); DecompressMemory(cmd->encoding_format, trace_ptr, cmd->encoded_length, - edram_snapshot_, xenos::kEdramSizeBytes); + edram_snapshot.get(), xenos::kEdramSizeBytes); trace_ptr += cmd->encoded_length; - command_processor->RestoreEdramSnapshot(edram_snapshot_); + command_processor->RestoreEdramSnapshot(edram_snapshot.get()); break; } case TraceCommandType::kEvent: { @@ -219,6 +219,34 @@ void TracePlayer::PlayTraceOnThread(const uint8_t* trace_data, } break; } + case TraceCommandType::kRegisters: { + auto cmd = reinterpret_cast(trace_ptr); + trace_ptr += sizeof(*cmd); + std::unique_ptr register_values( + new uint32_t[cmd->register_count]); + DecompressMemory(cmd->encoding_format, trace_ptr, cmd->encoded_length, + register_values.get(), + sizeof(uint32_t) * cmd->register_count); + trace_ptr += cmd->encoded_length; + command_processor->RestoreRegisters( + cmd->first_register, register_values.get(), cmd->register_count, + cmd->execute_callbacks); + break; + } + case TraceCommandType::kGammaRamp: { + auto cmd = reinterpret_cast(trace_ptr); + trace_ptr += sizeof(*cmd); + std::unique_ptr gamma_ramps(new uint32_t[256 + 3 * 128]); + DecompressMemory(cmd->encoding_format, trace_ptr, cmd->encoded_length, + gamma_ramps.get(), sizeof(uint32_t) * (256 + 3 * 128)); + trace_ptr += cmd->encoded_length; + command_processor->RestoreGammaRamp( + reinterpret_cast(gamma_ramps.get()), + reinterpret_cast(gamma_ramps.get() + + 256), + cmd->rw_component); + break; + } } } diff --git a/src/xenia/gpu/trace_player.h b/src/xenia/gpu/trace_player.h index cfc2702a1..4bb5fdd2c 100644 --- a/src/xenia/gpu/trace_player.h +++ b/src/xenia/gpu/trace_player.h @@ -30,7 +30,6 @@ enum class TracePlaybackMode { class TracePlayer : public TraceReader { public: TracePlayer(GraphicsSystem* graphics_system); - ~TracePlayer() override; GraphicsSystem* graphics_system() const { return graphics_system_; } void SetPresentLastCopy(bool present_last_copy) { @@ -66,7 +65,6 @@ class TracePlayer : public TraceReader { bool playing_trace_ = false; std::atomic playback_percent_ = {0}; std::unique_ptr playback_event_; - uint8_t* edram_snapshot_ = nullptr; }; } // namespace gpu diff --git a/src/xenia/gpu/trace_protocol.h b/src/xenia/gpu/trace_protocol.h index b29ecfb7e..be881ef2b 100644 --- a/src/xenia/gpu/trace_protocol.h +++ b/src/xenia/gpu/trace_protocol.h @@ -53,6 +53,8 @@ enum class TraceCommandType : uint32_t { kMemoryWrite, kEdramSnapshot, kEvent, + kRegisters, + kGammaRamp, }; struct PrimaryBufferStartCommand { @@ -134,6 +136,40 @@ struct EventCommand { Type event_type; }; +// Represents a range of registers. +struct RegistersCommand { + TraceCommandType type; + + uint32_t first_register; + uint32_t register_count; + // Whether to set the registers via WriteRegister, which may have side + // effects, rather than by copying them directly to the register file. + bool execute_callbacks; + + // Encoding format of the values in the trace file. + MemoryEncodingFormat encoding_format; + // Number of bytes the values occupy in the trace file in their encoded form. + // If no encoding is used, this will be sizeof(uint32_t) * register_count. + uint32_t encoded_length; +}; + +// Represents a gamma ramp - encoded 256 DC_LUT_30_COLOR values and 128 +// interleaved RGB DC_LUT_PWL_DATA values. +// Assuming that all other gamma ramp state is saved as plain registers. +struct GammaRampCommand { + TraceCommandType type; + + // The component index (0 = red, 1 = green, 2 = blue) for the next + // DC_LUT_SEQ_COLOR or DC_LUT_PWL_DATA read or write. + uint8_t rw_component; + + // Encoding format of the ramps in the trace file. + MemoryEncodingFormat encoding_format; + // Number of bytes the ramps occupy in the trace file in their encoded form. + // If no encoding is used, this will be sizeof(uint32_t) * (256 + 3 * 128). + uint32_t encoded_length; +}; + } // namespace gpu } // namespace xe diff --git a/src/xenia/gpu/trace_reader.cc b/src/xenia/gpu/trace_reader.cc index 0f25b710a..6c20c79ec 100644 --- a/src/xenia/gpu/trace_reader.cc +++ b/src/xenia/gpu/trace_reader.cc @@ -205,6 +205,16 @@ void TraceReader::ParseTrace() { } break; } + case TraceCommandType::kRegisters: { + auto cmd = reinterpret_cast(trace_ptr); + trace_ptr += sizeof(*cmd) + cmd->encoded_length; + break; + } + case TraceCommandType::kGammaRamp: { + auto cmd = reinterpret_cast(trace_ptr); + trace_ptr += sizeof(*cmd) + cmd->encoded_length; + break; + } default: // Broken trace file? assert_unhandled_case(type); @@ -218,8 +228,8 @@ void TraceReader::ParseTrace() { } bool TraceReader::DecompressMemory(MemoryEncodingFormat encoding_format, - const uint8_t* src, size_t src_size, - uint8_t* dest, size_t dest_size) { + const void* src, size_t src_size, void* dest, + size_t dest_size) { switch (encoding_format) { case MemoryEncodingFormat::kNone: assert_true(src_size == dest_size); diff --git a/src/xenia/gpu/trace_reader.h b/src/xenia/gpu/trace_reader.h index 7480d3e4a..d1b51e4cd 100644 --- a/src/xenia/gpu/trace_reader.h +++ b/src/xenia/gpu/trace_reader.h @@ -135,9 +135,8 @@ class TraceReader { protected: void ParseTrace(); - bool DecompressMemory(MemoryEncodingFormat encoding_format, - const uint8_t* src, size_t src_size, uint8_t* dest, - size_t dest_size); + bool DecompressMemory(MemoryEncodingFormat encoding_format, const void* src, + size_t src_size, void* dest, size_t dest_size); std::unique_ptr mmap_; const uint8_t* trace_data_ = nullptr; diff --git a/src/xenia/gpu/trace_writer.cc b/src/xenia/gpu/trace_writer.cc index 96c287318..b83e21868 100644 --- a/src/xenia/gpu/trace_writer.cc +++ b/src/xenia/gpu/trace_writer.cc @@ -10,6 +10,7 @@ #include "xenia/gpu/trace_writer.h" #include +#include #include "third_party/snappy/snappy-sinksource.h" #include "third_party/snappy/snappy.h" @@ -19,6 +20,7 @@ #include "xenia/base/filesystem.h" #include "xenia/base/logging.h" #include "xenia/base/string.h" +#include "xenia/gpu/registers.h" #include "xenia/gpu/xenos.h" namespace xe { @@ -194,7 +196,7 @@ class SnappySink : public snappy::Sink { void TraceWriter::WriteMemoryCommand(TraceCommandType type, uint32_t base_ptr, size_t length, const void* host_ptr) { - MemoryCommand cmd; + MemoryCommand cmd = {}; cmd.type = type; cmd.base_ptr = base_ptr; cmd.encoding_format = MemoryEncodingFormat::kNone; @@ -232,8 +234,9 @@ void TraceWriter::WriteMemoryCommand(TraceCommandType type, uint32_t base_ptr, } void TraceWriter::WriteEdramSnapshot(const void* snapshot) { - EdramSnapshotCommand cmd; + EdramSnapshotCommand cmd = {}; cmd.type = TraceCommandType::kEdramSnapshot; + if (compress_output_) { // Write the header now so we reserve space in the buffer. long header_position = std::ftell(file_); @@ -272,5 +275,93 @@ void TraceWriter::WriteEvent(EventCommand::Type event_type) { fwrite(&cmd, 1, sizeof(cmd), file_); } +void TraceWriter::WriteRegisters(uint32_t first_register, + const uint32_t* register_values, + uint32_t register_count, + bool execute_callbacks_on_play) { + RegistersCommand cmd = {}; + cmd.type = TraceCommandType::kRegisters; + cmd.first_register = first_register; + cmd.register_count = register_count; + cmd.execute_callbacks = execute_callbacks_on_play; + + uint32_t uncompressed_length = uint32_t(sizeof(uint32_t) * register_count); + if (compress_output_) { + // Write the header now so we reserve space in the buffer. + long header_position = std::ftell(file_); + cmd.encoding_format = MemoryEncodingFormat::kSnappy; + fwrite(&cmd, 1, sizeof(cmd), file_); + + // Stream the content right to the buffer. + snappy::ByteArraySource snappy_source( + reinterpret_cast(register_values), uncompressed_length); + SnappySink snappy_sink(file_); + cmd.encoded_length = + static_cast(snappy::Compress(&snappy_source, &snappy_sink)); + + // Seek back and overwrite the header with our final size. + std::fseek(file_, header_position, SEEK_SET); + fwrite(&cmd, 1, sizeof(cmd), file_); + std::fseek(file_, header_position + sizeof(cmd) + cmd.encoded_length, + SEEK_SET); + } else { + // Uncompressed - write the values directly to the file. + cmd.encoding_format = MemoryEncodingFormat::kNone; + cmd.encoded_length = uncompressed_length; + fwrite(&cmd, 1, sizeof(cmd), file_); + fwrite(register_values, 1, uncompressed_length, file_); + } +} + +void TraceWriter::WriteGammaRamp( + const reg::DC_LUT_30_COLOR* gamma_ramp_256_entry_table, + const reg::DC_LUT_PWL_DATA* gamma_ramp_pwl_rgb, + uint32_t gamma_ramp_rw_component) { + GammaRampCommand cmd = {}; + cmd.type = TraceCommandType::kGammaRamp; + cmd.rw_component = uint8_t(gamma_ramp_rw_component); + + constexpr uint32_t k256EntryTableUncompressedLength = + sizeof(reg::DC_LUT_30_COLOR) * 256; + constexpr uint32_t kPWLUncompressedLength = + sizeof(reg::DC_LUT_PWL_DATA) * 3 * 128; + constexpr uint32_t kUncompressedLength = + k256EntryTableUncompressedLength + kPWLUncompressedLength; + if (compress_output_) { + // Write the header now so we reserve space in the buffer. + long header_position = std::ftell(file_); + cmd.encoding_format = MemoryEncodingFormat::kSnappy; + fwrite(&cmd, 1, sizeof(cmd), file_); + + // Stream the content right to the buffer. + { + std::unique_ptr gamma_ramps(new char[kUncompressedLength]); + std::memcpy(gamma_ramps.get(), gamma_ramp_256_entry_table, + k256EntryTableUncompressedLength); + std::memcpy(gamma_ramps.get() + k256EntryTableUncompressedLength, + gamma_ramp_pwl_rgb, kPWLUncompressedLength); + snappy::ByteArraySource snappy_source(gamma_ramps.get(), + kUncompressedLength); + SnappySink snappy_sink(file_); + cmd.encoded_length = + static_cast(snappy::Compress(&snappy_source, &snappy_sink)); + } + + // Seek back and overwrite the header with our final size. + std::fseek(file_, header_position, SEEK_SET); + fwrite(&cmd, 1, sizeof(cmd), file_); + std::fseek(file_, header_position + sizeof(cmd) + cmd.encoded_length, + SEEK_SET); + } else { + // Uncompressed - write the values directly to the file. + cmd.encoding_format = MemoryEncodingFormat::kNone; + cmd.encoded_length = kUncompressedLength; + fwrite(&cmd, 1, sizeof(cmd), file_); + fwrite(gamma_ramp_256_entry_table, 1, k256EntryTableUncompressedLength, + file_); + fwrite(gamma_ramp_pwl_rgb, 1, kPWLUncompressedLength, file_); + } +} + } // namespace gpu } // namespace xe diff --git a/src/xenia/gpu/trace_writer.h b/src/xenia/gpu/trace_writer.h index 03e30185a..407166068 100644 --- a/src/xenia/gpu/trace_writer.h +++ b/src/xenia/gpu/trace_writer.h @@ -14,6 +14,7 @@ #include #include +#include "xenia/gpu/registers.h" #include "xenia/gpu/trace_protocol.h" namespace xe { @@ -44,6 +45,11 @@ class TraceWriter { const void* host_ptr = nullptr); void WriteEdramSnapshot(const void* snapshot); void WriteEvent(EventCommand::Type event_type); + void WriteRegisters(uint32_t first_register, const uint32_t* register_values, + uint32_t register_count, bool execute_callbacks_on_play); + void WriteGammaRamp(const reg::DC_LUT_30_COLOR* gamma_ramp_256_entry_table, + const reg::DC_LUT_PWL_DATA* gamma_ramp_pwl_rgb, + uint32_t gamma_ramp_rw_component); private: void WriteMemoryCommand(TraceCommandType type, uint32_t base_ptr, diff --git a/src/xenia/gpu/vulkan/vulkan_command_processor.cc b/src/xenia/gpu/vulkan/vulkan_command_processor.cc index 14cce000e..9421e4481 100644 --- a/src/xenia/gpu/vulkan/vulkan_command_processor.cc +++ b/src/xenia/gpu/vulkan/vulkan_command_processor.cc @@ -191,20 +191,6 @@ void VulkanCommandProcessor::WriteRegister(uint32_t index, uint32_t value) { offset ^= 0x1F; dirty_loop_constants_ |= (1 << offset); - } else if (index == XE_GPU_REG_DC_LUT_PWL_DATA) { - UpdateGammaRampValue(GammaRampType::kPWL, value); - } else if (index == XE_GPU_REG_DC_LUT_30_COLOR) { - UpdateGammaRampValue(GammaRampType::kTable, value); - } else if (index >= XE_GPU_REG_DC_LUT_RW_MODE && - index <= XE_GPU_REG_DC_LUTA_CONTROL) { - uint32_t offset = index - XE_GPU_REG_DC_LUT_RW_MODE; - offset ^= 0x05; - - dirty_gamma_constants_ |= (1 << offset); - - if (index == XE_GPU_REG_DC_LUT_RW_INDEX) { - gamma_ramp_rw_subindex_ = 0; - } } } @@ -1400,8 +1386,6 @@ bool VulkanCommandProcessor::IssueCopy() { return true; } -void VulkanCommandProcessor::InitializeTrace() {} - } // namespace vulkan } // namespace gpu } // namespace xe diff --git a/src/xenia/gpu/vulkan/vulkan_command_processor.h b/src/xenia/gpu/vulkan/vulkan_command_processor.h index 2c2738440..f67570587 100644 --- a/src/xenia/gpu/vulkan/vulkan_command_processor.h +++ b/src/xenia/gpu/vulkan/vulkan_command_processor.h @@ -98,8 +98,6 @@ class VulkanCommandProcessor : public CommandProcessor { VulkanShader* pixel_shader); bool IssueCopy() override; - void InitializeTrace() override; - uint64_t dirty_float_constants_ = 0; // Dirty float constants in blocks of 4 uint8_t dirty_bool_constants_ = 0; uint32_t dirty_loop_constants_ = 0; From 9c8e0cc53eb7b1a241d86f7e9d573cecd6a2cc16 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Thu, 5 May 2022 13:13:30 +0300 Subject: [PATCH 05/14] [GPU] DC_LUT_PWL_DATA comment fix [ci skip] --- src/xenia/gpu/command_processor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xenia/gpu/command_processor.cc b/src/xenia/gpu/command_processor.cc index e6422bc73..f935f22ec 100644 --- a/src/xenia/gpu/command_processor.cc +++ b/src/xenia/gpu/command_processor.cc @@ -405,7 +405,7 @@ void CommandProcessor::WriteRegister(uint32_t index, uint32_t value) { auto& gamma_ramp_rw_index = regs.Get(); // Bit 7 of the index is ignored for PWL. uint32_t gamma_ramp_rw_index_pwl = gamma_ramp_rw_index.rw_index & 0x7F; - // DC_LUT_RW_INDEX is likely in the red, green, blue order because + // DC_LUT_PWL_DATA is likely in the red, green, blue order because // DC_LUT_SEQ_COLOR is, but the write enable mask is blue, green, red. bool write_gamma_ramp_component = (regs[XE_GPU_REG_DC_LUT_WRITE_EN_MASK].u32 & From 5875f6ab3181fef2120cb33d56d58ec79cb7ee82 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Thu, 5 May 2022 21:46:20 +0300 Subject: [PATCH 06/14] [UI] Windows: Disable rounded corners --- docs/building.md | 2 +- premake5.lua | 3 ++- src/xenia/ui/premake5.lua | 3 ++- src/xenia/ui/window_win.cc | 10 +++++++++- xenia-build | 2 +- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/docs/building.md b/docs/building.md index 16430edb8..13e6e1f33 100644 --- a/docs/building.md +++ b/docs/building.md @@ -13,7 +13,7 @@ drivers. * For Visual Studio 2022, MSBuild `v142` must be used due to a compiler bug; See [#2003](https://github.com/xenia-project/xenia/issues/2003). * [Python 3.6+](https://www.python.org/downloads/) * Ensure Python is in PATH. -* Windows 10 SDK version 10.0.19041.0 (for Visual Studio 2019, this or any newer version) +* Windows 11 SDK version 10.0.22000.0 (for Visual Studio 2019, this or any newer version) ``` git clone https://github.com/xenia-project/xenia.git diff --git a/premake5.lua b/premake5.lua index f603b59af..449879afa 100644 --- a/premake5.lua +++ b/premake5.lua @@ -225,8 +225,9 @@ workspace("xenia") platforms({"Windows"}) -- 10.0.15063.0: ID3D12GraphicsCommandList1::SetSamplePositions. -- 10.0.19041.0: D3D12_HEAP_FLAG_CREATE_NOT_ZEROED. + -- 10.0.22000.0: DWMWA_WINDOW_CORNER_PREFERENCE. filter("action:vs2017") - systemversion("10.0.19041.0") + systemversion("10.0.22000.0") filter("action:vs2019") systemversion("10.0") filter({}) diff --git a/src/xenia/ui/premake5.lua b/src/xenia/ui/premake5.lua index 3b9e482c4..6aff82bec 100644 --- a/src/xenia/ui/premake5.lua +++ b/src/xenia/ui/premake5.lua @@ -21,5 +21,6 @@ project("xenia-ui") filter("platforms:Windows") links({ - "DXGI", + "dwmapi", + "dxgi", }) diff --git a/src/xenia/ui/window_win.cc b/src/xenia/ui/window_win.cc index f7ab5ff71..f2458b69d 100644 --- a/src/xenia/ui/window_win.cc +++ b/src/xenia/ui/window_win.cc @@ -23,8 +23,8 @@ #include "xenia/ui/virtual_key.h" #include "xenia/ui/windowed_app_context_win.h" -// For per-monitor DPI awareness v1. #include +#include namespace xe { namespace ui { @@ -182,6 +182,14 @@ bool Win32Window::OpenImpl() { } } + // Disable rounded corners starting with Windows 11 (or silently receive and + // ignore E_INVALIDARG on Windows versions before 10.0.22000.0), primarily to + // preserve all pixels of the guest output. + DWM_WINDOW_CORNER_PREFERENCE window_corner_preference = DWMWCP_DONOTROUND; + DwmSetWindowAttribute(hwnd_, DWMWA_WINDOW_CORNER_PREFERENCE, + &window_corner_preference, + sizeof(window_corner_preference)); + // Disable flicks. ATOM atom = GlobalAddAtomW(L"MicrosoftTabletPenServiceProperty"); const DWORD_PTR dwHwndTabletProperty = diff --git a/xenia-build b/xenia-build index d41b9f4b0..543114686 100755 --- a/xenia-build +++ b/xenia-build @@ -920,7 +920,7 @@ class BuildShadersCommand(Command): print('ERROR: could not find 32-bit Program Files') return 1 windows_sdk_bin_path = os.path.join( - program_files_path, 'Windows Kits/10/bin/10.0.19041.0/x64') + program_files_path, 'Windows Kits/10/bin/10.0.22000.0/x64') if not os.path.exists(windows_sdk_bin_path): print('ERROR: could not find Windows 10 SDK binaries') return 1 From e3425b242e191de2b3b9442567b94d14f18b4b6e Mon Sep 17 00:00:00 2001 From: Triang3l Date: Sat, 7 May 2022 16:17:17 +0300 Subject: [PATCH 07/14] [DXBC] Both v[#] and v[#][#] operands for HS and GS --- .../gpu/d3d12/d3d12_render_target_cache.cc | 12 +- src/xenia/gpu/dxbc.h | 170 +++++++++--------- src/xenia/gpu/dxbc_shader_translator.cc | 51 +++--- .../gpu/dxbc_shader_translator_memexport.cc | 6 +- src/xenia/gpu/dxbc_shader_translator_om.cc | 56 +++--- 5 files changed, 145 insertions(+), 150 deletions(-) diff --git a/src/xenia/gpu/d3d12/d3d12_render_target_cache.cc b/src/xenia/gpu/d3d12/d3d12_render_target_cache.cc index 45454f4fb..510669dbc 100644 --- a/src/xenia/gpu/d3d12/d3d12_render_target_cache.cc +++ b/src/xenia/gpu/d3d12/d3d12_render_target_cache.cc @@ -2943,10 +2943,10 @@ D3D12RenderTargetCache::GetOrCreateTransferPipelines(TransferShaderKey key) { kTransferSRVRegisterHostDepth)); } a.OpDclInputPSSIV(dxbc::InterpolationMode::kLinearNoPerspective, - dxbc::Dest::V(kInputRegisterPosition, 0b0011), + dxbc::Dest::V1D(kInputRegisterPosition, 0b0011), dxbc::Name::kPosition); if (key.dest_msaa_samples != xenos::MsaaSamples::k1X) { - a.OpDclInputPSSGV(dxbc::Dest::V(kInputRegisterSampleIndex, 0b0001), + a.OpDclInputPSSGV(dxbc::Dest::V1D(kInputRegisterSampleIndex, 0b0001), dxbc::Name::kSampleIndex); } if (osgn_parameter_index_sv_target != UINT32_MAX) { @@ -2971,7 +2971,7 @@ D3D12RenderTargetCache::GetOrCreateTransferPipelines(TransferShaderKey key) { // Split the destination pixel index into 32bpp tile in r0.z and // 32bpp-tile-relative pixel index in r0.xy. // r0.xy = pixel XY as uint - a.OpFToU(dxbc::Dest::R(0, 0b0011), dxbc::Src::V(kInputRegisterPosition)); + a.OpFToU(dxbc::Dest::R(0, 0b0011), dxbc::Src::V1D(kInputRegisterPosition)); uint32_t dest_sample_width_log2 = uint32_t(dest_is_64bpp) + uint32_t(key.dest_msaa_samples >= xenos::MsaaSamples::k4X); @@ -3057,7 +3057,7 @@ D3D12RenderTargetCache::GetOrCreateTransferPipelines(TransferShaderKey key) { // If 64bpp -> 32bpp, also the needed half in r0.w. dxbc::Src dest_sample( - dxbc::Src::V(kInputRegisterSampleIndex, dxbc::Src::kXXXX)); + dxbc::Src::V1D(kInputRegisterSampleIndex, dxbc::Src::kXXXX)); dxbc::Src source_sample(dest_sample); uint32_t source_tile_pixel_x_reg = 0; uint32_t source_tile_pixel_y_reg = 0; @@ -3086,7 +3086,7 @@ D3D12RenderTargetCache::GetOrCreateTransferPipelines(TransferShaderKey key) { source_sample = dxbc::Src::R(1, dxbc::Src::kZZZZ); a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(31), dxbc::Src::LU(1), dxbc::Src::R(0, dxbc::Src::kXXXX), - dxbc::Src::V(kInputRegisterSampleIndex, dxbc::Src::kXXXX)); + dxbc::Src::V1D(kInputRegisterSampleIndex, dxbc::Src::kXXXX)); source_tile_pixel_x_reg = 1; } else if (key.dest_msaa_samples == xenos::MsaaSamples::k2X) { // 32bpp -> 64bpp, 4x -> 2x. @@ -3128,7 +3128,7 @@ D3D12RenderTargetCache::GetOrCreateTransferPipelines(TransferShaderKey key) { a.OpIShL(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX), dxbc::Src::LU(2)); a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(1), dxbc::Src::LU(1), - dxbc::Src::V(kInputRegisterSampleIndex, dxbc::Src::kXXXX), + dxbc::Src::V1D(kInputRegisterSampleIndex, dxbc::Src::kXXXX), dxbc::Src::R(1, dxbc::Src::kXXXX)); source_tile_pixel_x_reg = 1; // Y is handled by common code. diff --git a/src/xenia/gpu/dxbc.h b/src/xenia/gpu/dxbc.h index e0c0efb85..34eb6e8b7 100644 --- a/src/xenia/gpu/dxbc.h +++ b/src/xenia/gpu/dxbc.h @@ -655,33 +655,6 @@ enum class OperandType : uint32_t { kOutputStencilRef = 41, }; -// D3D10_SB_OPERAND_INDEX_DIMENSION -constexpr uint32_t GetOperandIndexDimension(OperandType type, - bool in_dcl = false) { - switch (type) { - case OperandType::kTemp: - case OperandType::kInput: - // FIXME(Triang3l): kInput has a dimensionality of 2 in the control point - // phase of hull shaders, however, currently the translator isn't used to - // emit them - if code where this matters is emitted by Xenia, the actual - // dimensionality will need to be stored in OperandAddress itself. - case OperandType::kOutput: - case OperandType::kLabel: - return 1; - case OperandType::kIndexableTemp: - case OperandType::kInputControlPoint: - return 2; - case OperandType::kSampler: - case OperandType::kResource: - case OperandType::kUnorderedAccessView: - return in_dcl ? 3 : 2; - case OperandType::kConstantBuffer: - return 3; - default: - return 0; - } -} - // D3D10_SB_OPERAND_NUM_COMPONENTS enum class OperandDimension : uint32_t { kNoData, // D3D10_SB_OPERAND_0_COMPONENT @@ -766,11 +739,22 @@ struct Index { struct OperandAddress { OperandType type_; + uint32_t index_dimension_; Index index_1d_, index_2d_, index_3d_; - explicit OperandAddress(OperandType type, Index index_1d = Index(), - Index index_2d = Index(), Index index_3d = Index()) + explicit OperandAddress(OperandType type) + : type_(type), index_dimension_(0) {} + explicit OperandAddress(OperandType type, Index index_1d) + : type_(type), index_dimension_(1), index_1d_(index_1d) {} + explicit OperandAddress(OperandType type, Index index_1d, Index index_2d) : type_(type), + index_dimension_(2), + index_1d_(index_1d), + index_2d_(index_2d) {} + explicit OperandAddress(OperandType type, Index index_1d, Index index_2d, + Index index_3d) + : type_(type), + index_dimension_(3), index_1d_(index_1d), index_2d_(index_2d), index_3d_(index_3d) {} @@ -778,44 +762,38 @@ struct OperandAddress { OperandDimension GetDimension(bool in_dcl = false) const { return GetOperandDimension(type_, in_dcl); } - uint32_t GetIndexDimension(bool in_dcl = false) const { - return GetOperandIndexDimension(type_, in_dcl); - } - uint32_t GetOperandTokenTypeAndIndex(bool in_dcl = false) const { - uint32_t index_dimension = GetIndexDimension(in_dcl); - uint32_t operand_token = (uint32_t(type_) << 12) | (index_dimension << 20); - if (index_dimension > 0) { + uint32_t GetOperandTokenTypeAndIndex() const { + uint32_t operand_token = (uint32_t(type_) << 12) | (index_dimension_ << 20); + if (index_dimension_ > 0) { operand_token |= uint32_t(index_1d_.GetRepresentation()) << 22; - if (index_dimension > 1) { + if (index_dimension_ > 1) { operand_token |= uint32_t(index_2d_.GetRepresentation()) << 25; - if (index_dimension > 2) { + if (index_dimension_ > 2) { operand_token |= uint32_t(index_3d_.GetRepresentation()) << 28; } } } return operand_token; } - uint32_t GetLength(bool in_dcl = false) const { + uint32_t GetLength() const { uint32_t length = 0; - uint32_t index_dimension = GetIndexDimension(in_dcl); - if (index_dimension > 0) { + if (index_dimension_ > 0) { length += index_1d_.GetLength(); - if (index_dimension > 1) { + if (index_dimension_ > 1) { length += index_2d_.GetLength(); - if (index_dimension > 2) { + if (index_dimension_ > 2) { length += index_3d_.GetLength(); } } } return length; } - void Write(std::vector& code, bool in_dcl = false) const { - uint32_t index_dimension = GetIndexDimension(in_dcl); - if (index_dimension > 0) { + void Write(std::vector& code) const { + if (index_dimension_ > 0) { index_1d_.Write(code); - if (index_dimension > 1) { + if (index_dimension_ > 1) { index_2d_.Write(code); - if (index_dimension > 2) { + if (index_dimension_ > 2) { index_3d_.Write(code); } } @@ -845,18 +823,28 @@ struct Dest : OperandAddress { // declarations use read masks instead of swizzle (resource declarations still // use swizzle when they're vector, however). - explicit Dest(OperandType type, uint32_t write_mask = 0b1111, - Index index_1d = Index(), Index index_2d = Index(), - Index index_3d = Index()) + explicit Dest(OperandType type, uint32_t write_mask) + : OperandAddress(type), write_mask_(write_mask) {} + explicit Dest(OperandType type, uint32_t write_mask, Index index_1d) + : OperandAddress(type, index_1d), write_mask_(write_mask) {} + explicit Dest(OperandType type, uint32_t write_mask, Index index_1d, + Index index_2d) + : OperandAddress(type, index_1d, index_2d), write_mask_(write_mask) {} + explicit Dest(OperandType type, uint32_t write_mask, Index index_1d, + Index index_2d, Index index_3d) : OperandAddress(type, index_1d, index_2d, index_3d), write_mask_(write_mask) {} static Dest R(uint32_t index, uint32_t write_mask = 0b1111) { return Dest(OperandType::kTemp, write_mask, index); } - static Dest V(uint32_t index, uint32_t read_mask = 0b1111) { + static Dest V1D(uint32_t index, uint32_t read_mask = 0b1111) { return Dest(OperandType::kInput, read_mask, index); } + static Dest V2D(uint32_t index_1d, uint32_t index_2d, + uint32_t read_mask = 0b1111) { + return Dest(OperandType::kInput, read_mask, index_1d, index_2d); + } static Dest O(Index index, uint32_t write_mask = 0b1111) { return Dest(OperandType::kOutput, write_mask, index); } @@ -915,11 +903,14 @@ struct Dest : OperandAddress { } } [[nodiscard]] Dest Mask(uint32_t write_mask) const { - return Dest(type_, write_mask, index_1d_, index_2d_, index_3d_); + Dest new_dest(*this); + new_dest.write_mask_ = write_mask; + return new_dest; } [[nodiscard]] Dest MaskMasked(uint32_t write_mask) const { - return Dest(type_, write_mask_ & write_mask, index_1d_, index_2d_, - index_3d_); + Dest new_dest(*this); + new_dest.write_mask_ &= write_mask; + return new_dest; } static uint32_t GetMaskSingleComponent(uint32_t write_mask) { uint32_t component; @@ -934,11 +925,9 @@ struct Dest : OperandAddress { return GetMaskSingleComponent(GetMask(in_dcl)); } - uint32_t GetLength(bool in_dcl = false) const { - return 1 + OperandAddress::GetLength(in_dcl); - } + uint32_t GetLength() const { return 1 + OperandAddress::GetLength(); } void Write(std::vector& code, bool in_dcl = false) const { - uint32_t operand_token = GetOperandTokenTypeAndIndex(in_dcl); + uint32_t operand_token = GetOperandTokenTypeAndIndex(); OperandDimension dimension = GetDimension(in_dcl); operand_token |= uint32_t(dimension); if (dimension == OperandDimension::kVector) { @@ -947,7 +936,7 @@ struct Dest : OperandAddress { (uint32_t(ComponentSelection::kMask) << 2) | (write_mask_ << 4); } code.push_back(operand_token); - OperandAddress::Write(code, in_dcl); + OperandAddress::Write(code); } }; @@ -962,18 +951,21 @@ struct Src : OperandAddress { // Ignored for 0-component and 1-component operand types. uint32_t swizzle_; - bool absolute_; - bool negate_; + bool absolute_ = false; + bool negate_ = false; // Only valid for OperandType::kImmediate32. uint32_t immediate_[4]; - explicit Src(OperandType type, uint32_t swizzle = kXYZW, - Index index_1d = Index(), Index index_2d = Index(), - Index index_3d = Index()) - : OperandAddress(type, index_1d, index_2d, index_3d), - swizzle_(swizzle), - absolute_(false), - negate_(false) {} + explicit Src(OperandType type, uint32_t swizzle) + : OperandAddress(type), swizzle_(swizzle) {} + explicit Src(OperandType type, uint32_t swizzle, Index index_1d) + : OperandAddress(type, index_1d), swizzle_(swizzle) {} + explicit Src(OperandType type, uint32_t swizzle, Index index_1d, + Index index_2d) + : OperandAddress(type, index_1d, index_2d), swizzle_(swizzle) {} + explicit Src(OperandType type, uint32_t swizzle, Index index_1d, + Index index_2d, Index index_3d) + : OperandAddress(type, index_1d, index_2d, index_3d), swizzle_(swizzle) {} // For creating instances for use in declarations. struct DclT {}; @@ -982,9 +974,12 @@ struct Src : OperandAddress { static Src R(uint32_t index, uint32_t swizzle = kXYZW) { return Src(OperandType::kTemp, swizzle, index); } - static Src V(Index index, uint32_t swizzle = kXYZW) { + static Src V1D(Index index, uint32_t swizzle = kXYZW) { return Src(OperandType::kInput, swizzle, index); } + static Src V2D(Index index_1d, Index index_2d, uint32_t swizzle = kXYZW) { + return Src(OperandType::kInput, swizzle, index_1d, index_2d); + } static Src X(uint32_t index_1d, Index index_2d, uint32_t swizzle = kXYZW) { return Src(OperandType::kIndexableTemp, swizzle, index_1d, index_2d); } @@ -1108,15 +1103,14 @@ struct Src : OperandAddress { return new_src; } - uint32_t GetLength(uint32_t mask, bool force_vector = false, - bool in_dcl = false) const { + uint32_t GetLength(uint32_t mask, bool force_vector = false) const { bool is_vector = force_vector || (mask != 0b0000 && Dest::GetMaskSingleComponent(mask) == UINT32_MAX); if (type_ == OperandType::kImmediate32) { return is_vector ? 5 : 2; } - return ((absolute_ || negate_) ? 2 : 1) + OperandAddress::GetLength(in_dcl); + return ((absolute_ || negate_) ? 2 : 1) + OperandAddress::GetLength(); } static constexpr uint32_t GetModifiedImmediate(uint32_t value, bool is_integer, bool absolute, @@ -1147,7 +1141,7 @@ struct Src : OperandAddress { } void Write(std::vector& code, bool is_integer, uint32_t mask, bool force_vector = false, bool in_dcl = false) const { - uint32_t operand_token = GetOperandTokenTypeAndIndex(in_dcl); + uint32_t operand_token = GetOperandTokenTypeAndIndex(); uint32_t mask_single_component = Dest::GetMaskSingleComponent(mask); uint32_t select_component = mask_single_component != UINT32_MAX ? mask_single_component : 0; @@ -1220,7 +1214,7 @@ struct Src : OperandAddress { code.push_back(uint32_t(ExtendedOperandType::kModifier) | (uint32_t(modifier) << 6)); } - OperandAddress::Write(code, in_dcl); + OperandAddress::Write(code); } } }; @@ -1915,7 +1909,7 @@ class Assembler { } void OpDclResource(ResourceDimension dimension, uint32_t return_type_token, const Src& operand, uint32_t space = 0) { - uint32_t operands_length = operand.GetLength(0b1111, false, true); + uint32_t operands_length = operand.GetLength(0b1111, false); code_.reserve(code_.size() + 3 + operands_length); code_.push_back(OpcodeToken(Opcode::kDclResource, 2 + operands_length) | (uint32_t(dimension) << 11)); @@ -1929,7 +1923,7 @@ class Assembler { ConstantBufferAccessPattern access_pattern = ConstantBufferAccessPattern::kImmediateIndexed, uint32_t space = 0) { - uint32_t operands_length = operand.GetLength(0b1111, false, true); + uint32_t operands_length = operand.GetLength(0b1111, false); code_.reserve(code_.size() + 3 + operands_length); code_.push_back( OpcodeToken(Opcode::kDclConstantBuffer, 2 + operands_length) | @@ -1941,7 +1935,7 @@ class Assembler { void OpDclSampler(const Src& operand, SamplerMode mode = SamplerMode::kDefault, uint32_t space = 0) { - uint32_t operands_length = operand.GetLength(0b1111, false, true); + uint32_t operands_length = operand.GetLength(0b1111, false); code_.reserve(code_.size() + 2 + operands_length); code_.push_back(OpcodeToken(Opcode::kDclSampler, 1 + operands_length) | (uint32_t(mode) << 11)); @@ -1949,14 +1943,14 @@ class Assembler { code_.push_back(space); } void OpDclInput(const Dest& operand) { - uint32_t operands_length = operand.GetLength(true); + uint32_t operands_length = operand.GetLength(); code_.reserve(code_.size() + 1 + operands_length); code_.push_back(OpcodeToken(Opcode::kDclInput, operands_length)); operand.Write(code_, true); ++stat_.dcl_count; } void OpDclInputSGV(const Dest& operand, Name name) { - uint32_t operands_length = operand.GetLength(true); + uint32_t operands_length = operand.GetLength(); code_.reserve(code_.size() + 2 + operands_length); code_.push_back(OpcodeToken(Opcode::kDclInputSGV, 1 + operands_length)); operand.Write(code_, true); @@ -1964,7 +1958,7 @@ class Assembler { ++stat_.dcl_count; } void OpDclInputPS(InterpolationMode interpolation_mode, const Dest& operand) { - uint32_t operands_length = operand.GetLength(true); + uint32_t operands_length = operand.GetLength(); code_.reserve(code_.size() + 1 + operands_length); code_.push_back(OpcodeToken(Opcode::kDclInputPS, operands_length) | (uint32_t(interpolation_mode) << 11)); @@ -1972,7 +1966,7 @@ class Assembler { ++stat_.dcl_count; } void OpDclInputPSSGV(const Dest& operand, Name name) { - uint32_t operands_length = operand.GetLength(true); + uint32_t operands_length = operand.GetLength(); code_.reserve(code_.size() + 2 + operands_length); // Constant interpolation mode is set in FXC output at least for // SV_IsFrontFace, despite the comment in d3d12TokenizedProgramFormat.hpp @@ -1985,7 +1979,7 @@ class Assembler { } void OpDclInputPSSIV(InterpolationMode interpolation_mode, const Dest& operand, Name name) { - uint32_t operands_length = operand.GetLength(true); + uint32_t operands_length = operand.GetLength(); code_.reserve(code_.size() + 2 + operands_length); code_.push_back(OpcodeToken(Opcode::kDclInputPSSIV, 1 + operands_length) | (uint32_t(interpolation_mode) << 11)); @@ -1994,14 +1988,14 @@ class Assembler { ++stat_.dcl_count; } void OpDclOutput(const Dest& operand) { - uint32_t operands_length = operand.GetLength(true); + uint32_t operands_length = operand.GetLength(); code_.reserve(code_.size() + 1 + operands_length); code_.push_back(OpcodeToken(Opcode::kDclOutput, operands_length)); operand.Write(code_, true); ++stat_.dcl_count; } void OpDclOutputSIV(const Dest& operand, Name name) { - uint32_t operands_length = operand.GetLength(true); + uint32_t operands_length = operand.GetLength(); code_.reserve(code_.size() + 2 + operands_length); code_.push_back(OpcodeToken(Opcode::kDclOutputSIV, 1 + operands_length)); operand.Write(code_, true); @@ -2124,7 +2118,7 @@ class Assembler { void OpDclUnorderedAccessViewTyped(ResourceDimension dimension, uint32_t flags, uint32_t return_type_token, const Src& operand, uint32_t space = 0) { - uint32_t operands_length = operand.GetLength(0b1111, false, true); + uint32_t operands_length = operand.GetLength(0b1111, false); code_.reserve(code_.size() + 3 + operands_length); code_.push_back( OpcodeToken(Opcode::kDclUnorderedAccessViewTyped, 2 + operands_length) | @@ -2137,7 +2131,7 @@ class Assembler { // kUAVFlagRasterizerOrderedAccess. void OpDclUnorderedAccessViewRaw(uint32_t flags, const Src& operand, uint32_t space = 0) { - uint32_t operands_length = operand.GetLength(0b1111, false, true); + uint32_t operands_length = operand.GetLength(0b1111, false); code_.reserve(code_.size() + 2 + operands_length); code_.push_back( OpcodeToken(Opcode::kDclUnorderedAccessViewRaw, 1 + operands_length) | @@ -2146,7 +2140,7 @@ class Assembler { code_.push_back(space); } void OpDclResourceRaw(const Src& operand, uint32_t space = 0) { - uint32_t operands_length = operand.GetLength(0b1111, false, true); + uint32_t operands_length = operand.GetLength(0b1111, false); code_.reserve(code_.size() + 2 + operands_length); code_.push_back(OpcodeToken(Opcode::kDclResourceRaw, 1 + operands_length)); operand.Write(code_, true, 0b1111, false, true); diff --git a/src/xenia/gpu/dxbc_shader_translator.cc b/src/xenia/gpu/dxbc_shader_translator.cc index 885705476..b99e9cbe8 100644 --- a/src/xenia/gpu/dxbc_shader_translator.cc +++ b/src/xenia/gpu/dxbc_shader_translator.cc @@ -326,16 +326,17 @@ void DxbcShaderTranslator::StartVertexShader_LoadVertexIndex() { // Check if the closing vertex of a non-indexed line loop is being processed. a_.OpINE( index_dest, - dxbc::Src::V(uint32_t(InOutRegister::kVSInVertexIndex), dxbc::Src::kXXXX), + dxbc::Src::V1D(uint32_t(InOutRegister::kVSInVertexIndex), + dxbc::Src::kXXXX), LoadSystemConstant(SystemConstants::Index::kLineLoopClosingIndex, offsetof(SystemConstants, line_loop_closing_index), dxbc::Src::kXXXX)); // Zero the index if processing the closing vertex of a line loop, or do // nothing (replace 0 with 0) if not needed. - a_.OpAnd( - index_dest, - dxbc::Src::V(uint32_t(InOutRegister::kVSInVertexIndex), dxbc::Src::kXXXX), - index_src); + a_.OpAnd(index_dest, + dxbc::Src::V1D(uint32_t(InOutRegister::kVSInVertexIndex), + dxbc::Src::kXXXX), + index_src); { // Swap the vertex index's endianness. @@ -590,7 +591,7 @@ void DxbcShaderTranslator::StartPixelShader() { // system_temp_depth_stencil_ before any return statement is possibly // reached. assert_true(system_temp_depth_stencil_ != UINT32_MAX); - dxbc::Src in_position_z(dxbc::Src::V( + dxbc::Src in_position_z(dxbc::Src::V1D( uint32_t(InOutRegister::kPSInPosition), dxbc::Src::kZZZZ)); in_position_used_ |= 0b0100; a_.OpDerivRTXCoarse(dxbc::Dest::R(system_temp_depth_stencil_, 0b0001), @@ -633,14 +634,14 @@ void DxbcShaderTranslator::StartPixelShader() { // At center. a_.OpMov(uses_register_dynamic_addressing ? dxbc::Dest::X(0, i) : dxbc::Dest::R(i), - dxbc::Src::V(uint32_t(InOutRegister::kPSInInterpolators) + i)); + dxbc::Src::V1D(uint32_t(InOutRegister::kPSInInterpolators) + i)); a_.OpElse(); // At centroid. Not really important that 2x MSAA is emulated using // ForcedSampleCount 4 - what matters is that the sample position will // be within the primitive, and the value will not be extrapolated. a_.OpEvalCentroid( dxbc::Dest::R(centroid_register), - dxbc::Src::V(uint32_t(InOutRegister::kPSInInterpolators) + i)); + dxbc::Src::V1D(uint32_t(InOutRegister::kPSInInterpolators) + i)); if (uses_register_dynamic_addressing) { a_.OpMov(dxbc::Dest::X(0, i), dxbc::Src::R(centroid_register)); } @@ -677,7 +678,7 @@ void DxbcShaderTranslator::StartPixelShader() { // have correct derivative magnitude and LODs. in_position_used_ |= 0b0011; a_.OpRoundNI(dxbc::Dest::R(param_gen_temp, 0b0011), - dxbc::Src::V(uint32_t(InOutRegister::kPSInPosition))); + dxbc::Src::V1D(uint32_t(InOutRegister::kPSInPosition))); uint32_t resolution_scaled_axes = uint32_t(draw_resolution_scale_x_ > 1) | (uint32_t(draw_resolution_scale_y_ > 1) << 1); @@ -701,20 +702,20 @@ void DxbcShaderTranslator::StartPixelShader() { // Negate modifier flips the sign bit even for 0 - set it to minus for // backfaces. in_front_face_used_ = true; - a_.OpMovC( - dxbc::Dest::R(param_gen_temp, 0b0001), - dxbc::Src::V(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - dxbc::Src::kXXXX), - dxbc::Src::R(param_gen_temp, dxbc::Src::kXXXX), - -dxbc::Src::R(param_gen_temp, dxbc::Src::kXXXX)); + a_.OpMovC(dxbc::Dest::R(param_gen_temp, 0b0001), + dxbc::Src::V1D( + uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), + dxbc::Src::kXXXX), + dxbc::Src::R(param_gen_temp, dxbc::Src::kXXXX), + -dxbc::Src::R(param_gen_temp, dxbc::Src::kXXXX)); } a_.OpEndIf(); // Point sprite coordinates. // Saturate to avoid negative point coordinates if the center of the pixel // is not covered, and extrapolation is done. a_.OpMov(dxbc::Dest::R(param_gen_temp, 0b1100), - dxbc::Src::V(uint32_t(InOutRegister::kPSInPointParameters), - 0b0100 << 4), + dxbc::Src::V1D(uint32_t(InOutRegister::kPSInPointParameters), + 0b0100 << 4), true); // Primitive type. { @@ -3499,7 +3500,7 @@ void DxbcShaderTranslator::WriteShaderCode() { if (register_count()) { // Unswapped vertex index input (only X component). ao_.OpDclInputSGV( - dxbc::Dest::V(uint32_t(InOutRegister::kVSInVertexIndex), 0b0001), + dxbc::Dest::V1D(uint32_t(InOutRegister::kVSInVertexIndex), 0b0001), dxbc::Name::kVertexID); } } @@ -3537,14 +3538,14 @@ void DxbcShaderTranslator::WriteShaderCode() { for (uint32_t i = 0; i < interpolator_count; ++i) { ao_.OpDclInputPS( dxbc::InterpolationMode::kLinear, - dxbc::Dest::V(uint32_t(InOutRegister::kPSInInterpolators) + i)); + dxbc::Dest::V1D(uint32_t(InOutRegister::kPSInInterpolators) + i)); } if (register_count()) { // Point parameters input (only coordinates, not size, needed). ao_.OpDclInputPS( dxbc::InterpolationMode::kLinear, - dxbc::Dest::V(uint32_t(InOutRegister::kPSInPointParameters), - 0b0011)); + dxbc::Dest::V1D(uint32_t(InOutRegister::kPSInPointParameters), + 0b0011)); } } if (in_position_used_) { @@ -3560,8 +3561,8 @@ void DxbcShaderTranslator::WriteShaderCode() { (is_writing_float24_depth && !shader_writes_depth) ? dxbc::InterpolationMode::kLinearNoPerspectiveSample : dxbc::InterpolationMode::kLinearNoPerspective, - dxbc::Dest::V(uint32_t(InOutRegister::kPSInPosition), - in_position_used_), + dxbc::Dest::V1D(uint32_t(InOutRegister::kPSInPosition), + in_position_used_), dxbc::Name::kPosition); } bool sample_rate_memexport = @@ -3575,8 +3576,8 @@ void DxbcShaderTranslator::WriteShaderCode() { if (front_face_and_sample_index_mask) { // Is front face, sample index. ao_.OpDclInputPSSGV( - dxbc::Dest::V(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - front_face_and_sample_index_mask), + dxbc::Dest::V1D(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), + front_face_and_sample_index_mask), dxbc::Name::kIsFrontFace); } if (edram_rov_used_) { diff --git a/src/xenia/gpu/dxbc_shader_translator_memexport.cc b/src/xenia/gpu/dxbc_shader_translator_memexport.cc index f9d09fc7d..e2f65e66f 100644 --- a/src/xenia/gpu/dxbc_shader_translator_memexport.cc +++ b/src/xenia/gpu/dxbc_shader_translator_memexport.cc @@ -139,7 +139,7 @@ void DxbcShaderTranslator::ExportToMemory() { in_position_used_ |= resolution_scaled_axes; a_.OpFToU( dxbc::Dest::R(control_temp, resolution_scaled_axes << 1), - dxbc::Src::V(uint32_t(InOutRegister::kPSInPosition), 0b0100 << 2)); + dxbc::Src::V1D(uint32_t(InOutRegister::kPSInPosition), 0b0100 << 2)); dxbc::Dest resolution_scaling_temp_dest( dxbc::Dest::R(control_temp, 0b1000)); dxbc::Src resolution_scaling_temp_src( @@ -201,8 +201,8 @@ void DxbcShaderTranslator::ExportToMemory() { a_.OpIEq( dxbc::Dest::R(control_temp, inner_condition_provided ? 0b0010 : 0b0001), - dxbc::Src::V(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - dxbc::Src::kYYYY), + dxbc::Src::V1D(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), + dxbc::Src::kYYYY), dxbc::Src::R(control_temp, dxbc::Src::kYYYY)); if (inner_condition_provided) { // Merge with the previous condition in control_temp.x. diff --git a/src/xenia/gpu/dxbc_shader_translator_om.cc b/src/xenia/gpu/dxbc_shader_translator_om.cc index 6c90c42e8..164ac07fb 100644 --- a/src/xenia/gpu/dxbc_shader_translator_om.cc +++ b/src/xenia/gpu/dxbc_shader_translator_om.cc @@ -172,7 +172,7 @@ void DxbcShaderTranslator::StartPixelShader_LoadROVParameters() { // system_temp_rov_params_.y = Y host pixel position as uint in_position_used_ |= 0b0011; a_.OpFToU(dxbc::Dest::R(system_temp_rov_params_, 0b0011), - dxbc::Src::V(uint32_t(InOutRegister::kPSInPosition))); + dxbc::Src::V1D(uint32_t(InOutRegister::kPSInPosition))); // Convert the position from pixels to samples. // system_temp_rov_params_.x = X sample 0 position // system_temp_rov_params_.y = Y sample 0 position @@ -605,8 +605,8 @@ void DxbcShaderTranslator::ROV_DepthStencilTest() { ROV_DepthTo24Bit(system_temp_depth_stencil_, 0, system_temp_depth_stencil_, 0, temp, 0); } else { - dxbc::Src in_position_z( - dxbc::Src::V(uint32_t(InOutRegister::kPSInPosition), dxbc::Src::kZZZZ)); + dxbc::Src in_position_z(dxbc::Src::V1D( + uint32_t(InOutRegister::kPSInPosition), dxbc::Src::kZZZZ)); // Get the derivatives of the screen-space (but not clamped to the viewport // depth bounds yet - this happens after the pixel shader in Direct3D 11+; // also linear within the triangle - thus constant derivatives along the @@ -645,9 +645,9 @@ void DxbcShaderTranslator::ROV_DepthStencilTest() { a_.OpMax(temp_z_dest, z_ddx_src.Abs(), z_ddy_src.Abs()); // Calculate the depth bias for the needed faceness. in_front_face_used_ = true; - a_.OpIf(true, - dxbc::Src::V(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - dxbc::Src::kXXXX)); + a_.OpIf(true, dxbc::Src::V1D( + uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), + dxbc::Src::kXXXX)); // temp.x if early = ddx(z) // temp.y if early = ddy(z) // temp.z = front face polygon offset @@ -949,7 +949,7 @@ void DxbcShaderTranslator::ROV_DepthStencilTest() { { // Check the current face to get the reference and apply the read mask. in_front_face_used_ = true; - a_.OpIf(true, dxbc::Src::V( + a_.OpIf(true, dxbc::Src::V1D( uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), dxbc::Src::kXXXX)); for (uint32_t j = 0; j < 2; ++j) { @@ -1012,8 +1012,8 @@ void DxbcShaderTranslator::ROV_DepthStencilTest() { in_front_face_used_ = true; a_.OpMovC( sample_temp_z_dest, - dxbc::Src::V(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - dxbc::Src::kXXXX), + dxbc::Src::V1D(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), + dxbc::Src::kXXXX), LoadSystemConstant( SystemConstants::Index::kEdramStencil, offsetof(SystemConstants, edram_stencil_front_func_ops), @@ -1090,18 +1090,18 @@ void DxbcShaderTranslator::ROV_DepthStencilTest() { // Replace. a_.OpCase(dxbc::Src::LU(uint32_t(xenos::StencilOp::kReplace))); in_front_face_used_ = true; - a_.OpMovC( - sample_temp_y_dest, - dxbc::Src::V(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - dxbc::Src::kXXXX), - LoadSystemConstant( - SystemConstants::Index::kEdramStencil, - offsetof(SystemConstants, edram_stencil_front_reference), - dxbc::Src::kXXXX), - LoadSystemConstant( - SystemConstants::Index::kEdramStencil, - offsetof(SystemConstants, edram_stencil_back_reference), - dxbc::Src::kXXXX)); + a_.OpMovC(sample_temp_y_dest, + dxbc::Src::V1D( + uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), + dxbc::Src::kXXXX), + LoadSystemConstant( + SystemConstants::Index::kEdramStencil, + offsetof(SystemConstants, edram_stencil_front_reference), + dxbc::Src::kXXXX), + LoadSystemConstant( + SystemConstants::Index::kEdramStencil, + offsetof(SystemConstants, edram_stencil_back_reference), + dxbc::Src::kXXXX)); a_.OpBreak(); // Increment and clamp. a_.OpCase(dxbc::Src::LU(uint32_t(xenos::StencilOp::kIncrementClamp))); @@ -1155,8 +1155,8 @@ void DxbcShaderTranslator::ROV_DepthStencilTest() { in_front_face_used_ = true; a_.OpMovC( sample_temp_z_dest, - dxbc::Src::V(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - dxbc::Src::kXXXX), + dxbc::Src::V1D(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), + dxbc::Src::kXXXX), LoadSystemConstant( SystemConstants::Index::kEdramStencil, offsetof(SystemConstants, edram_stencil_front_write_mask), @@ -1924,10 +1924,10 @@ void DxbcShaderTranslator::CompletePixelShader_DSV_DepthTo24Bit() { // assumption of it being clamped while working with the bit representation. temp = PushSystemTemp(); in_position_used_ |= 0b0100; - a_.OpMul( - dxbc::Dest::R(temp, 0b0001), - dxbc::Src::V(uint32_t(InOutRegister::kPSInPosition), dxbc::Src::kZZZZ), - dxbc::Src::LF(2.0f), true); + a_.OpMul(dxbc::Dest::R(temp, 0b0001), + dxbc::Src::V1D(uint32_t(InOutRegister::kPSInPosition), + dxbc::Src::kZZZZ), + dxbc::Src::LF(2.0f), true); } dxbc::Dest temp_x_dest(dxbc::Dest::R(temp, 0b0001)); @@ -2068,7 +2068,7 @@ void DxbcShaderTranslator::CompletePixelShader_AlphaToMask() { // temp.x = alpha to coverage offset as float 0.0...3.0. in_position_used_ |= 0b0011; a_.OpFToU(dxbc::Dest::R(temp, 0b0011), - dxbc::Src::V(uint32_t(InOutRegister::kPSInPosition))); + dxbc::Src::V1D(uint32_t(InOutRegister::kPSInPosition))); a_.OpAnd(dxbc::Dest::R(temp, 0b0010), dxbc::Src::R(temp, dxbc::Src::kYYYY), dxbc::Src::LU(1)); a_.OpBFI(temp_x_dest, dxbc::Src::LU(1), dxbc::Src::LU(1), temp_x_src, From d36c3975d8af03971c6f2883ed9eba80dbd02867 Mon Sep 17 00:00:00 2001 From: Caroline Joy Bell Date: Wed, 2 Feb 2022 22:52:19 -0800 Subject: [PATCH 08/14] [UI] Implement Type::kDirectory in Win32FilePicker --- src/xenia/ui/file_picker_win.cc | 44 +++++++++++++++++---------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/xenia/ui/file_picker_win.cc b/src/xenia/ui/file_picker_win.cc index 88ce056bc..5cb467ca1 100644 --- a/src/xenia/ui/file_picker_win.cc +++ b/src/xenia/ui/file_picker_win.cc @@ -113,8 +113,6 @@ Win32FilePicker::~Win32FilePicker() = default; bool Win32FilePicker::Show(Window* parent_window) { // TODO(benvanik): FileSaveDialog. assert_true(mode() == Mode::kOpen); - // TODO(benvanik): folder dialogs. - assert_true(type() == Type::kFile); Microsoft::WRL::ComPtr file_dialog; HRESULT hr = @@ -134,37 +132,41 @@ bool Win32FilePicker::Show(Window* parent_window) { if (!SUCCEEDED(hr)) { return false; } - // FOS_PICKFOLDERS // FOS_FILEMUSTEXIST // FOS_PATHMUSTEXIST flags |= FOS_FORCEFILESYSTEM; if (multi_selection()) { flags |= FOS_ALLOWMULTISELECT; } + if (type() == Type::kDirectory) { + flags |= FOS_PICKFOLDERS; + } hr = file_dialog->SetOptions(flags); if (!SUCCEEDED(hr)) { return false; } - // Set the file types to display only. Notice that this is a 1-based array. - std::vector> file_pairs; - std::vector file_types; - for (const auto& extension : this->extensions()) { - const auto& file_pair = - file_pairs.emplace_back(std::move(xe::to_utf16(extension.first)), - std::move(xe::to_utf16(extension.second))); - file_types.push_back( - {(LPCWSTR)file_pair.first.c_str(), (LPCWSTR)file_pair.second.c_str()}); - } - hr = file_dialog->SetFileTypes(static_cast(file_types.size()), - file_types.data()); - if (!SUCCEEDED(hr)) { - return false; - } + if (type() == Type::kFile) { + // Set the file types to display only. Notice that this is a 1-based array. + std::vector> file_pairs; + std::vector file_types; + for (const auto& extension : this->extensions()) { + const auto& file_pair = + file_pairs.emplace_back(std::move(xe::to_utf16(extension.first)), + std::move(xe::to_utf16(extension.second))); + file_types.push_back({(LPCWSTR)file_pair.first.c_str(), + (LPCWSTR)file_pair.second.c_str()}); + } + hr = file_dialog->SetFileTypes(static_cast(file_types.size()), + file_types.data()); + if (!SUCCEEDED(hr)) { + return false; + } - hr = file_dialog->SetFileTypeIndex(1); - if (!SUCCEEDED(hr)) { - return false; + hr = file_dialog->SetFileTypeIndex(1); + if (!SUCCEEDED(hr)) { + return false; + } } // Create an event handling object, and hook it up to the dialog. From 72cf75f365a22734b46c9a9ea4e526bc255744e0 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Sat, 7 May 2022 22:11:31 +0300 Subject: [PATCH 09/14] [DXBC] Geometry shader instructions --- src/xenia/gpu/dxbc.h | 182 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 173 insertions(+), 9 deletions(-) diff --git a/src/xenia/gpu/dxbc.h b/src/xenia/gpu/dxbc.h index 34eb6e8b7..5d5cb9f27 100644 --- a/src/xenia/gpu/dxbc.h +++ b/src/xenia/gpu/dxbc.h @@ -166,8 +166,11 @@ struct alignas(uint32_t) BlobHeader { // In order of appearance in a container. kResourceDefinition = MakeFourCC('R', 'D', 'E', 'F'), kInputSignature = MakeFourCC('I', 'S', 'G', 'N'), + kInputSignature11_1 = MakeFourCC('I', 'S', 'G', '1'), kPatchConstantSignature = MakeFourCC('P', 'C', 'S', 'G'), kOutputSignature = MakeFourCC('O', 'S', 'G', 'N'), + kOutputSignatureForGS = MakeFourCC('O', 'S', 'G', '5'), + kOutputSignature11_1 = MakeFourCC('O', 'S', 'G', '1'), kShaderEx = MakeFourCC('S', 'H', 'E', 'X'), kShaderFeatureInfo = MakeFourCC('S', 'F', 'I', '0'), kStatistics = MakeFourCC('S', 'T', 'A', 'T'), @@ -320,6 +323,7 @@ enum RdefInputFlags : uint32_t { enum class RdefShaderModel : uint32_t { kPixelShader5_1 = 0xFFFF0501u, kVertexShader5_1 = 0xFFFE0501u, + kGeometryShader5_1 = 0x47530501u, kDomainShader5_1 = 0x44530501u, kComputeShader5_1 = 0x43530501u, }; @@ -467,8 +471,7 @@ enum class SignatureRegisterComponentType : uint32_t { }; // D3D_MIN_PRECISION -// uint8_t as it's used as one byte in SignatureParameter. -enum class MinPrecision : uint8_t { +enum class MinPrecision : uint32_t { kDefault, kFloat16, kFloat2_8, @@ -478,7 +481,7 @@ enum class MinPrecision : uint8_t { kAny10, }; -// D3D11_INTERNALSHADER_PARAMETER_11_1 +// D3D10_INTERNALSHADER_PARAMETER struct alignas(uint32_t) SignatureParameter { uint32_t semantic_name_ptr; uint32_t semantic_index; @@ -496,10 +499,45 @@ struct alignas(uint32_t) SignatureParameter { // For an input signature. uint8_t always_reads_mask; }; - MinPrecision min_precision; }; static_assert_size(SignatureParameter, sizeof(uint32_t) * 6); +// D3D11_INTERNALSHADER_PARAMETER_FOR_GS +// Extends SignatureParameter, see it for more information. +struct alignas(uint32_t) SignatureParameterForGS { + // Stream index (parameters must appear in non-decreasing stream order). + uint32_t stream; + uint32_t semantic_name_ptr; + uint32_t semantic_index; + Name system_value; + SignatureRegisterComponentType component_type; + uint32_t register_index; + uint8_t mask; + union { + uint8_t never_writes_mask; + uint8_t always_reads_mask; + }; +}; +static_assert_size(SignatureParameterForGS, sizeof(uint32_t) * 7); + +// D3D11_INTERNALSHADER_PARAMETER_11_1 +// Extends SignatureParameterForGS, see it for more information. +struct alignas(uint32_t) SignatureParameter11_1 { + uint32_t stream; + uint32_t semantic_name_ptr; + uint32_t semantic_index; + Name system_value; + SignatureRegisterComponentType component_type; + uint32_t register_index; + uint8_t mask; + union { + uint8_t never_writes_mask; + uint8_t always_reads_mask; + }; + MinPrecision min_precision; +}; +static_assert_size(SignatureParameter11_1, sizeof(uint32_t) * 8); + // D3D10_INTERNALSHADER_SIGNATURE struct alignas(uint32_t) Signature { uint32_t parameter_count; @@ -543,6 +581,62 @@ enum class TessellatorDomain : uint32_t { kQuad, }; +// D3D10_SB_PRIMITIVE_TOPOLOGY +enum class PrimitiveTopology : uint32_t { + kUndefined = 0, + kPointList = 1, + kLineList = 2, + kLineStrip = 3, + kTriangleList = 4, + kTriangleStrip = 5, + kLineListWithAdjacency = 10, + kLineStripWithAdjacency = 11, + kTriangleListWithAdjacency = 12, + kTriangleStripWithAdjacency = 13, +}; + +// D3D10_SB_PRIMITIVE +enum class Primitive : uint32_t { + kUndefined = 0, + kPoint = 1, + kLine = 2, + kTriangle = 3, + kLineWithAdjacency = 6, + kTriangleWithAdjacency = 7, + k1ControlPointPatch = 8, + k2ControlPointPatch = 9, + k3ControlPointPatch = 10, + k4ControlPointPatch = 11, + k5ControlPointPatch = 12, + k6ControlPointPatch = 13, + k7ControlPointPatch = 14, + k8ControlPointPatch = 15, + k9ControlPointPatch = 16, + k10ControlPointPatch = 17, + k11ControlPointPatch = 18, + k12ControlPointPatch = 19, + k13ControlPointPatch = 20, + k14ControlPointPatch = 21, + k15ControlPointPatch = 22, + k16ControlPointPatch = 23, + k17ControlPointPatch = 24, + k18ControlPointPatch = 25, + k19ControlPointPatch = 26, + k20ControlPointPatch = 27, + k21ControlPointPatch = 28, + k22ControlPointPatch = 29, + k23ControlPointPatch = 30, + k24ControlPointPatch = 31, + k25ControlPointPatch = 32, + k26ControlPointPatch = 33, + k27ControlPointPatch = 34, + k28ControlPointPatch = 35, + k29ControlPointPatch = 36, + k30ControlPointPatch = 37, + k31ControlPointPatch = 38, + k32ControlPointPatch = 39, +}; + // The STAT blob (based on Wine d3dcompiler_parse_stat). struct alignas(uint32_t) Statistics { // Not increased by declarations and labels. @@ -576,11 +670,11 @@ struct alignas(uint32_t) Statistics { uint32_t movc_instruction_count; // +50 uint32_t conversion_instruction_count; // +54 // Unknown in Wine. - uint32_t unknown_22; // +58 - uint32_t input_primitive; // +5C - uint32_t gs_output_topology; // +60 - uint32_t gs_max_output_vertex_count; // +64 - uint32_t unknown_26; // +68 + uint32_t unknown_22; // +58 + Primitive input_primitive; // +5C + PrimitiveTopology gs_output_topology; // +60 + uint32_t gs_max_output_vertex_count; // +64 + uint32_t unknown_26; // +68 // Unknown in Wine, but confirmed by testing. uint32_t lod_instructions; // +6C uint32_t unknown_28; // +70 @@ -644,6 +738,7 @@ enum class OperandType : uint32_t { kOutputDepth = 12, kNull = 13, kOutputCoverageMask = 15, + kStream = 16, kInputControlPoint = 25, kInputDomainPoint = 28, kUnorderedAccessView = 30, @@ -669,6 +764,7 @@ constexpr OperandDimension GetOperandDimension(OperandType type, return in_dcl ? OperandDimension::kVector : OperandDimension::kNoData; case OperandType::kLabel: case OperandType::kNull: + case OperandType::kStream: return OperandDimension::kNoData; case OperandType::kInputPrimitiveID: case OperandType::kOutputDepth: @@ -856,6 +952,9 @@ struct Dest : OperandAddress { static Dest ODepth() { return Dest(OperandType::kOutputDepth, 0b0001); } static Dest Null() { return Dest(OperandType::kNull, 0b0000); } static Dest OMask() { return Dest(OperandType::kOutputCoverageMask, 0b0001); } + static Dest M(uint32_t index) { + return Dest(OperandType::kStream, 0b0000, index); + } static Dest VICP(uint32_t control_point_count, uint32_t element, uint32_t read_mask = 0b1111) { return Dest(OperandType::kInputControlPoint, read_mask, control_point_count, @@ -1366,8 +1465,12 @@ enum class Opcode : uint32_t { kDclResource = 88, kDclConstantBuffer = 89, kDclSampler = 90, + kDclOutputTopology = 92, + kDclInputPrimitive = 93, + kDclMaxOutputVertexCount = 94, kDclInput = 95, kDclInputSGV = 96, + kDclInputSIV = 97, kDclInputPS = 98, kDclInputPSSGV = 99, kDclInputPSSIV = 100, @@ -1377,6 +1480,9 @@ enum class Opcode : uint32_t { kDclIndexableTemp = 105, kDclGlobalFlags = 106, kLOD = 108, + kEmitStream = 117, + kCutStream = 118, + kEmitThenCutStream = 119, kDerivRTXCoarse = 122, kDerivRTXFine = 123, kDerivRTYCoarse = 124, @@ -1390,6 +1496,7 @@ enum class Opcode : uint32_t { kIBFE = 139, kBFI = 140, kBFRev = 141, + kDclStream = 143, kDclInputControlPointCount = 147, kDclTessDomain = 149, kDclThreadGroup = 155, @@ -1942,6 +2049,24 @@ class Assembler { operand.Write(code_, false, 0b1111, false, true); code_.push_back(space); } + void OpDclOutputTopology(PrimitiveTopology output_topology) { + code_.push_back(OpcodeToken(Opcode::kDclOutputTopology, 0) | + (uint32_t(output_topology) << 11)); + stat_.gs_output_topology = output_topology; + } + void OpDclInputPrimitive(Primitive input_primitive) { + code_.push_back(OpcodeToken(Opcode::kDclInputPrimitive, 0) | + (uint32_t(input_primitive) << 11)); + stat_.input_primitive = input_primitive; + } + // Returns the index of the count written in the code_ vector. + size_t OpDclMaxOutputVertexCount(uint32_t count) { + code_.reserve(code_.size() + 2); + code_.push_back(OpcodeToken(Opcode::kDclMaxOutputVertexCount, 1)); + code_.push_back(count); + stat_.gs_max_output_vertex_count = count; + return code_.size() - 1; + } void OpDclInput(const Dest& operand) { uint32_t operands_length = operand.GetLength(); code_.reserve(code_.size() + 1 + operands_length); @@ -1957,6 +2082,14 @@ class Assembler { code_.push_back(uint32_t(name)); ++stat_.dcl_count; } + void OpDclInputSIV(const Dest& operand, Name name) { + uint32_t operands_length = operand.GetLength(); + code_.reserve(code_.size() + 2 + operands_length); + code_.push_back(OpcodeToken(Opcode::kDclInputSIV, 1 + operands_length)); + operand.Write(code_, true); + code_.push_back(uint32_t(name)); + ++stat_.dcl_count; + } void OpDclInputPS(InterpolationMode interpolation_mode, const Dest& operand) { uint32_t operands_length = operand.GetLength(); code_.reserve(code_.size() + 1 + operands_length); @@ -2039,6 +2172,31 @@ class Assembler { ++stat_.instruction_count; ++stat_.lod_instructions; } + void OpEmitStream(const Dest& stream) { + uint32_t operands_length = stream.GetLength(); + code_.reserve(code_.size() + 1 + operands_length); + code_.push_back(OpcodeToken(Opcode::kEmitStream, operands_length)); + stream.Write(code_); + ++stat_.instruction_count; + ++stat_.emit_instruction_count; + } + void OpCutStream(const Dest& stream) { + uint32_t operands_length = stream.GetLength(); + code_.reserve(code_.size() + 1 + operands_length); + code_.push_back(OpcodeToken(Opcode::kCutStream, operands_length)); + stream.Write(code_); + ++stat_.instruction_count; + ++stat_.cut_instruction_count; + } + void OpEmitThenCutStream(const Dest& stream) { + uint32_t operands_length = stream.GetLength(); + code_.reserve(code_.size() + 1 + operands_length); + code_.push_back(OpcodeToken(Opcode::kEmitThenCutStream, operands_length)); + stream.Write(code_); + ++stat_.instruction_count; + ++stat_.emit_instruction_count; + ++stat_.cut_instruction_count; + } void OpDerivRTXCoarse(const Dest& dest, const Src& src, bool saturate = false) { EmitAluOp(Opcode::kDerivRTXCoarse, 0b0, dest, src, saturate); @@ -2096,6 +2254,12 @@ class Assembler { EmitAluOp(Opcode::kBFRev, 0b1, dest, src); ++stat_.uint_instruction_count; } + void OpDclStream(const Dest& stream) { + uint32_t operands_length = stream.GetLength(); + code_.reserve(code_.size() + 1 + operands_length); + code_.push_back(OpcodeToken(Opcode::kDclStream, operands_length)); + stream.Write(code_, true); + } void OpDclInputControlPointCount(uint32_t count) { code_.push_back(OpcodeToken(Opcode::kDclInputControlPointCount, 0) | (count << 11)); From 2473496c7e4f152ca54034776a9abb023a262b44 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Sun, 8 May 2022 19:37:29 +0300 Subject: [PATCH 10/14] [GPU] Make RegisterFile::kRegisterCount constexpr --- src/xenia/gpu/register_file.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xenia/gpu/register_file.h b/src/xenia/gpu/register_file.h index ae26f2cb9..e9a4f1137 100644 --- a/src/xenia/gpu/register_file.h +++ b/src/xenia/gpu/register_file.h @@ -33,7 +33,7 @@ class RegisterFile { static const RegisterInfo* GetRegisterInfo(uint32_t index); - static const size_t kRegisterCount = 0x5003; + static constexpr size_t kRegisterCount = 0x5003; union RegisterValue { uint32_t u32; float f32; From 44cda56d350efd0bd997db144e61b060cd0df0da Mon Sep 17 00:00:00 2001 From: Triang3l Date: Sun, 8 May 2022 19:41:11 +0300 Subject: [PATCH 11/14] [GPU] Handle kRegisters and kGammaRamp in the trace viewer --- src/xenia/gpu/trace_reader.h | 30 ------------------------------ src/xenia/gpu/trace_viewer.cc | 12 ++++++++++++ 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/src/xenia/gpu/trace_reader.h b/src/xenia/gpu/trace_reader.h index d1b51e4cd..7ee65a283 100644 --- a/src/xenia/gpu/trace_reader.h +++ b/src/xenia/gpu/trace_reader.h @@ -20,36 +20,6 @@ namespace xe { namespace gpu { -// void Foo() { -// auto trace_ptr = trace_data; -// while (trace_ptr < trace_data + trace_size) { -// auto cmd_type = *reinterpret_cast(trace_ptr); -// switch (cmd_type) { -// case TraceCommandType::kPrimaryBufferStart: -// break; -// case TraceCommandType::kPrimaryBufferEnd: -// break; -// case TraceCommandType::kIndirectBufferStart: -// break; -// case TraceCommandType::kIndirectBufferEnd: -// break; -// case TraceCommandType::kPacketStart: -// break; -// case TraceCommandType::kPacketEnd: -// break; -// case TraceCommandType::kMemoryRead: -// break; -// case TraceCommandType::kMemoryWrite: -// break; -// case TraceCommandType::kEvent: -// break; -// } -// /*trace_ptr = graphics_system->PlayTrace( -// trace_ptr, trace_size - (trace_ptr - trace_data), -// GraphicsSystem::TracePlaybackMode::kBreakOnSwap);*/ -// } -//} - class TraceReader { public: struct CommandBuffer { diff --git a/src/xenia/gpu/trace_viewer.cc b/src/xenia/gpu/trace_viewer.cc index 660f24805..a4733ecbf 100644 --- a/src/xenia/gpu/trace_viewer.cc +++ b/src/xenia/gpu/trace_viewer.cc @@ -408,6 +408,18 @@ void TraceViewer::DrawPacketDisassemblerUI() { } break; } + case TraceCommandType::kRegisters: { + auto cmd = reinterpret_cast(trace_ptr); + trace_ptr += sizeof(*cmd) + cmd->encoded_length; + // ImGui::BulletText("Registers"); + break; + } + case TraceCommandType::kGammaRamp: { + auto cmd = reinterpret_cast(trace_ptr); + trace_ptr += sizeof(*cmd) + cmd->encoded_length; + // ImGui::BulletText("GammaRamp"); + break; + } } } ImGui::EndChild(); From 8f0e7519096d2c08fa25a6065fe22d35aae0e5af Mon Sep 17 00:00:00 2001 From: Triang3l Date: Mon, 9 May 2022 19:16:22 +0300 Subject: [PATCH 12/14] [D3D12] Runtime geometry shader generation --- src/xenia/gpu/d3d12/pipeline_cache.cc | 1157 ++++++++- src/xenia/gpu/d3d12/pipeline_cache.h | 43 +- src/xenia/gpu/dxbc.h | 19 +- src/xenia/gpu/registers.h | 8 +- .../d3d12_5_1/primitive_point_list_gs.h | 1540 ------------ .../d3d12_5_1/primitive_quad_list_gs.h | 886 ------- .../d3d12_5_1/primitive_rectangle_list_gs.h | 2145 ----------------- .../gpu/shaders/primitive_point_list.gs.hlsl | 63 - .../gpu/shaders/primitive_quad_list.gs.hlsl | 23 - .../shaders/primitive_rectangle_list.gs.hlsl | 103 - 10 files changed, 1198 insertions(+), 4789 deletions(-) delete mode 100644 src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_point_list_gs.h delete mode 100644 src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_quad_list_gs.h delete mode 100644 src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_rectangle_list_gs.h delete mode 100644 src/xenia/gpu/shaders/primitive_point_list.gs.hlsl delete mode 100644 src/xenia/gpu/shaders/primitive_quad_list.gs.hlsl delete mode 100644 src/xenia/gpu/shaders/primitive_rectangle_list.gs.hlsl diff --git a/src/xenia/gpu/d3d12/pipeline_cache.cc b/src/xenia/gpu/d3d12/pipeline_cache.cc index cf5e3c948..e35e94bb7 100644 --- a/src/xenia/gpu/d3d12/pipeline_cache.cc +++ b/src/xenia/gpu/d3d12/pipeline_cache.cc @@ -20,6 +20,7 @@ #include #include +#include "third_party/dxbc/DXBCChecksum.h" #include "third_party/fmt/include/fmt/format.h" #include "xenia/base/assert.h" #include "xenia/base/byte_order.h" @@ -35,6 +36,8 @@ #include "xenia/gpu/d3d12/d3d12_command_processor.h" #include "xenia/gpu/d3d12/d3d12_render_target_cache.h" #include "xenia/gpu/draw_util.h" +#include "xenia/gpu/dxbc.h" +#include "xenia/gpu/dxbc_shader_translator.h" #include "xenia/gpu/gpu_flags.h" #include "xenia/gpu/registers.h" #include "xenia/gpu/xenos.h" @@ -73,9 +76,6 @@ namespace shaders { #include "xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_triangle_hs.h" #include "xenia/gpu/shaders/bytecode/d3d12_5_1/float24_round_ps.h" #include "xenia/gpu/shaders/bytecode/d3d12_5_1/float24_truncate_ps.h" -#include "xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_point_list_gs.h" -#include "xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_quad_list_gs.h" -#include "xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_rectangle_list_gs.h" #include "xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_adaptive_vs.h" #include "xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_indexed_vs.h" } // namespace shaders @@ -676,6 +676,12 @@ void PipelineCache::InitializeShaderStorage( pixel_shader = nullptr; pipeline_runtime_description.pixel_shader = nullptr; } + GeometryShaderKey pipeline_geometry_shader_key; + pipeline_runtime_description.geometry_shader = + GetGeometryShaderKey(pipeline_description.geometry_shader, + pipeline_geometry_shader_key) + ? &GetGeometryShader(pipeline_geometry_shader_key) + : nullptr; pipeline_runtime_description.root_signature = command_processor_.GetRootSignature( vertex_shader, pixel_shader, @@ -1390,6 +1396,11 @@ bool PipelineCache::GetCurrentStateDescription( break; } } + GeometryShaderKey geometry_shader_key; + runtime_description_out.geometry_shader = + GetGeometryShaderKey(description_out.geometry_shader, geometry_shader_key) + ? &GetGeometryShader(geometry_shader_key) + : nullptr; // The rest doesn't matter when rasterization is disabled (thus no writing to // anywhere from post-geometry stages and no samples are counted). @@ -1669,6 +1680,1121 @@ bool PipelineCache::GetCurrentStateDescription( return true; } +bool PipelineCache::GetGeometryShaderKey( + PipelineGeometryShader geometry_shader_type, GeometryShaderKey& key_out) { + if (geometry_shader_type == PipelineGeometryShader::kNone) { + return false; + } + GeometryShaderKey key; + key.type = geometry_shader_type; + // TODO(Triang3l): Make the linkage parameters depend on the real needs of the + // vertex and the pixel shader. + key.interpolator_count = xenos::kMaxInterpolators; + key.user_clip_plane_count = 6; + key.user_clip_plane_cull = 0; + key.has_vertex_kill_and = 1; + key.has_point_size = 1; + key.has_point_coordinates = 1; + key_out = key; + return true; +} + +void PipelineCache::CreateDxbcGeometryShader( + GeometryShaderKey key, std::vector& shader_out) { + shader_out.clear(); + + // RDEF, ISGN, OSG5, SHEX, STAT. + constexpr uint32_t kBlobCount = 5; + + // Allocate space for the container header and the blob offsets. + shader_out.resize(sizeof(dxbc::ContainerHeader) / sizeof(uint32_t) + + kBlobCount); + uint32_t blob_offset_position_dwords = + sizeof(dxbc::ContainerHeader) / sizeof(uint32_t); + uint32_t blob_position_dwords = uint32_t(shader_out.size()); + constexpr uint32_t kBlobHeaderSizeDwords = + sizeof(dxbc::BlobHeader) / sizeof(uint32_t); + + uint32_t name_ptr; + + // *************************************************************************** + // Resource definition + // *************************************************************************** + + shader_out[blob_offset_position_dwords] = + uint32_t(blob_position_dwords * sizeof(uint32_t)); + uint32_t rdef_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords; + // Not needed, as the next operation done is resize, to allocate the space for + // both the blob header and the resource definition header. + // shader_out.resize(rdef_position_dwords); + + // RDEF header - the actual definitions will be written if needed. + shader_out.resize(rdef_position_dwords + + sizeof(dxbc::RdefHeader) / sizeof(uint32_t)); + // Generator name. + dxbc::AppendAlignedString(shader_out, "Xenia"); + { + auto& rdef_header = *reinterpret_cast( + shader_out.data() + rdef_position_dwords); + rdef_header.shader_model = dxbc::RdefShaderModel::kGeometryShader5_1; + rdef_header.compile_flags = + dxbc::kCompileFlagNoPreshader | dxbc::kCompileFlagPreferFlowControl | + dxbc::kCompileFlagIeeeStrictness | dxbc::kCompileFlagAllResourcesBound; + // Generator name is right after the header. + rdef_header.generator_name_ptr = sizeof(dxbc::RdefHeader); + rdef_header.fourcc = dxbc::RdefHeader::FourCC::k5_1; + rdef_header.InitializeSizes(); + } + + uint32_t system_cbuffer_size_vector_aligned_bytes = 0; + + if (key.type == PipelineGeometryShader::kPointList) { + // Need point parameters from the system constants. + + // Constant types - float2 only. + // Names. + name_ptr = + uint32_t((shader_out.size() - rdef_position_dwords) * sizeof(uint32_t)); + uint32_t rdef_name_ptr_float2 = name_ptr; + name_ptr += dxbc::AppendAlignedString(shader_out, "float2"); + // Types. + uint32_t rdef_type_float2_position_dwords = uint32_t(shader_out.size()); + uint32_t rdef_type_float2_ptr = + uint32_t((rdef_type_float2_position_dwords - rdef_position_dwords) * + sizeof(uint32_t)); + shader_out.resize(rdef_type_float2_position_dwords + + sizeof(dxbc::RdefType) / sizeof(uint32_t)); + { + auto& rdef_type_float2 = *reinterpret_cast( + shader_out.data() + rdef_type_float2_position_dwords); + rdef_type_float2.variable_class = dxbc::RdefVariableClass::kVector; + rdef_type_float2.variable_type = dxbc::RdefVariableType::kFloat; + rdef_type_float2.row_count = 1; + rdef_type_float2.column_count = 2; + rdef_type_float2.name_ptr = rdef_name_ptr_float2; + } + + // Constants: + // - float2 xe_point_constant_diameter + // - float2 xe_point_screen_diameter_to_ndc_radius + enum PointConstant : uint32_t { + kPointConstantConstantDiameter, + kPointConstantScreenDiameterToNDCRadius, + kPointConstantCount, + }; + // Names. + name_ptr = + uint32_t((shader_out.size() - rdef_position_dwords) * sizeof(uint32_t)); + uint32_t rdef_name_ptr_xe_point_constant_diameter = name_ptr; + name_ptr += + dxbc::AppendAlignedString(shader_out, "xe_point_constant_diameter"); + uint32_t rdef_name_ptr_xe_point_screen_diameter_to_ndc_radius = name_ptr; + name_ptr += dxbc::AppendAlignedString( + shader_out, "xe_point_screen_diameter_to_ndc_radius"); + // Constants. + uint32_t rdef_constants_position_dwords = uint32_t(shader_out.size()); + uint32_t rdef_constants_ptr = + uint32_t((rdef_constants_position_dwords - rdef_position_dwords) * + sizeof(uint32_t)); + shader_out.resize(rdef_constants_position_dwords + + sizeof(dxbc::RdefVariable) / sizeof(uint32_t) * + kPointConstantCount); + { + auto rdef_constants = reinterpret_cast( + shader_out.data() + rdef_constants_position_dwords); + // float2 xe_point_constant_diameter + static_assert( + sizeof(DxbcShaderTranslator::SystemConstants :: + point_constant_diameter) == sizeof(float) * 2, + "DxbcShaderTranslator point_constant_diameter system constant size " + "differs between the shader translator and geometry shader " + "generation"); + static_assert_size( + DxbcShaderTranslator::SystemConstants::point_constant_diameter, + sizeof(float) * 2); + dxbc::RdefVariable& rdef_constant_point_constant_diameter = + rdef_constants[kPointConstantConstantDiameter]; + rdef_constant_point_constant_diameter.name_ptr = + rdef_name_ptr_xe_point_constant_diameter; + rdef_constant_point_constant_diameter.start_offset_bytes = offsetof( + DxbcShaderTranslator::SystemConstants, point_constant_diameter); + rdef_constant_point_constant_diameter.size_bytes = sizeof(float) * 2; + rdef_constant_point_constant_diameter.flags = dxbc::kRdefVariableFlagUsed; + rdef_constant_point_constant_diameter.type_ptr = rdef_type_float2_ptr; + rdef_constant_point_constant_diameter.start_texture = UINT32_MAX; + rdef_constant_point_constant_diameter.start_sampler = UINT32_MAX; + // float2 xe_point_screen_diameter_to_ndc_radius + static_assert( + sizeof(DxbcShaderTranslator::SystemConstants :: + point_screen_diameter_to_ndc_radius) == sizeof(float) * 2, + "DxbcShaderTranslator point_screen_diameter_to_ndc_radius system " + "constant size differs between the shader translator and geometry " + "shader generation"); + dxbc::RdefVariable& rdef_constant_point_screen_diameter_to_ndc_radius = + rdef_constants[kPointConstantScreenDiameterToNDCRadius]; + rdef_constant_point_screen_diameter_to_ndc_radius.name_ptr = + rdef_name_ptr_xe_point_screen_diameter_to_ndc_radius; + rdef_constant_point_screen_diameter_to_ndc_radius.start_offset_bytes = + offsetof(DxbcShaderTranslator::SystemConstants, + point_screen_diameter_to_ndc_radius); + rdef_constant_point_screen_diameter_to_ndc_radius.size_bytes = + sizeof(float) * 2; + rdef_constant_point_screen_diameter_to_ndc_radius.flags = + dxbc::kRdefVariableFlagUsed; + rdef_constant_point_screen_diameter_to_ndc_radius.type_ptr = + rdef_type_float2_ptr; + rdef_constant_point_screen_diameter_to_ndc_radius.start_texture = + UINT32_MAX; + rdef_constant_point_screen_diameter_to_ndc_radius.start_sampler = + UINT32_MAX; + } + + // Constant buffers - xe_system_cbuffer only. + + // Names. + name_ptr = + uint32_t((shader_out.size() - rdef_position_dwords) * sizeof(uint32_t)); + uint32_t rdef_name_ptr_xe_system_cbuffer = name_ptr; + name_ptr += dxbc::AppendAlignedString(shader_out, "xe_system_cbuffer"); + // Constant buffers. + uint32_t rdef_cbuffer_position_dwords = uint32_t(shader_out.size()); + shader_out.resize(rdef_cbuffer_position_dwords + + sizeof(dxbc::RdefCbuffer) / sizeof(uint32_t)); + { + auto& rdef_cbuffer_system = *reinterpret_cast( + shader_out.data() + rdef_cbuffer_position_dwords); + rdef_cbuffer_system.name_ptr = rdef_name_ptr_xe_system_cbuffer; + rdef_cbuffer_system.variable_count = kPointConstantCount; + rdef_cbuffer_system.variables_ptr = rdef_constants_ptr; + auto rdef_constants = reinterpret_cast( + shader_out.data() + rdef_constants_position_dwords); + for (uint32_t i = 0; i < kPointConstantCount; ++i) { + system_cbuffer_size_vector_aligned_bytes = + std::max(system_cbuffer_size_vector_aligned_bytes, + rdef_constants[i].start_offset_bytes + + rdef_constants[i].size_bytes); + } + system_cbuffer_size_vector_aligned_bytes = + xe::align(system_cbuffer_size_vector_aligned_bytes, + uint32_t(sizeof(uint32_t) * 4)); + rdef_cbuffer_system.size_vector_aligned_bytes = + system_cbuffer_size_vector_aligned_bytes; + } + + // Bindings - xe_system_cbuffer only. + uint32_t rdef_binding_position_dwords = uint32_t(shader_out.size()); + shader_out.resize(rdef_binding_position_dwords + + sizeof(dxbc::RdefInputBind) / sizeof(uint32_t)); + { + auto& rdef_binding_cbuffer_system = + *reinterpret_cast(shader_out.data() + + rdef_binding_position_dwords); + rdef_binding_cbuffer_system.name_ptr = rdef_name_ptr_xe_system_cbuffer; + rdef_binding_cbuffer_system.type = dxbc::RdefInputType::kCbuffer; + rdef_binding_cbuffer_system.bind_point = + uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants); + rdef_binding_cbuffer_system.bind_count = 1; + rdef_binding_cbuffer_system.flags = dxbc::kRdefInputFlagUserPacked; + } + + // Pointers in the header. + { + auto& rdef_header = *reinterpret_cast( + shader_out.data() + rdef_position_dwords); + rdef_header.cbuffer_count = 1; + rdef_header.cbuffers_ptr = + uint32_t((rdef_cbuffer_position_dwords - rdef_position_dwords) * + sizeof(uint32_t)); + rdef_header.input_bind_count = 1; + rdef_header.input_binds_ptr = + uint32_t((rdef_binding_position_dwords - rdef_position_dwords) * + sizeof(uint32_t)); + } + } + + { + auto& blob_header = *reinterpret_cast( + shader_out.data() + blob_position_dwords); + blob_header.fourcc = dxbc::BlobHeader::FourCC::kResourceDefinition; + blob_position_dwords = uint32_t(shader_out.size()); + blob_header.size_bytes = + (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) - + shader_out[blob_offset_position_dwords++]; + } + + // *************************************************************************** + // Input signature + // *************************************************************************** + + // Clip and cull distances are tightly packed together into registers, but + // have separate signature parameters with each being a vec4-aligned window. + uint32_t input_clip_distance_count = + key.user_clip_plane_cull ? 0 : key.user_clip_plane_count; + uint32_t input_cull_distance_count = + (key.user_clip_plane_cull ? key.user_clip_plane_count : 0) + + key.has_vertex_kill_and; + uint32_t input_clip_and_cull_distance_count = + input_clip_distance_count + input_cull_distance_count; + + // Interpolators, point size, position, clip and cull distances (parameters + // containing only clip or cull distances, and also one parameter containing + // both if present). + // TODO(Triang3l): Reorder as needed when the respective changes are done in + // the shader translator. + uint32_t isgn_parameter_count = + key.interpolator_count + key.has_point_size + 1 + + ((input_clip_and_cull_distance_count + 3) / 4) + + uint32_t(input_cull_distance_count && + (input_clip_distance_count & 3) != 0); + + // Reserve space for the header and the parameters. + shader_out[blob_offset_position_dwords] = + uint32_t(blob_position_dwords * sizeof(uint32_t)); + uint32_t isgn_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords; + shader_out.resize(isgn_position_dwords + + sizeof(dxbc::Signature) / sizeof(uint32_t) + + sizeof(dxbc::SignatureParameter) / sizeof(uint32_t) * + isgn_parameter_count); + + // Names (after the parameters). + name_ptr = + uint32_t((shader_out.size() - isgn_position_dwords) * sizeof(uint32_t)); + uint32_t isgn_name_ptr_texcoord = name_ptr; + if (key.interpolator_count || key.has_point_size) { + name_ptr += dxbc::AppendAlignedString(shader_out, "TEXCOORD"); + } + uint32_t isgn_name_ptr_sv_position = name_ptr; + name_ptr += dxbc::AppendAlignedString(shader_out, "SV_Position"); + uint32_t isgn_name_ptr_sv_clip_distance = name_ptr; + if (input_clip_distance_count) { + name_ptr += dxbc::AppendAlignedString(shader_out, "SV_ClipDistance"); + } + uint32_t isgn_name_ptr_sv_cull_distance = name_ptr; + if (input_cull_distance_count) { + name_ptr += dxbc::AppendAlignedString(shader_out, "SV_CullDistance"); + } + + // Header and parameters. + uint32_t input_register_interpolators = UINT32_MAX; + uint32_t input_register_point_size = UINT32_MAX; + uint32_t input_register_position; + uint32_t input_register_clip_and_cull_distances = UINT32_MAX; + { + // Header. + auto& isgn_header = *reinterpret_cast( + shader_out.data() + isgn_position_dwords); + isgn_header.parameter_count = isgn_parameter_count; + isgn_header.parameter_info_ptr = sizeof(dxbc::Signature); + + // Parameters. + auto isgn_parameters = reinterpret_cast( + shader_out.data() + isgn_position_dwords + + sizeof(dxbc::Signature) / sizeof(uint32_t)); + uint32_t isgn_parameter_index = 0; + uint32_t input_register_index = 0; + + // Interpolators (TEXCOORD#). + if (key.interpolator_count) { + input_register_interpolators = input_register_index; + for (uint32_t i = 0; i < key.interpolator_count; ++i) { + assert_true(isgn_parameter_index < isgn_parameter_count); + dxbc::SignatureParameter& isgn_interpolator = + isgn_parameters[isgn_parameter_index++]; + isgn_interpolator.semantic_name_ptr = isgn_name_ptr_texcoord; + isgn_interpolator.semantic_index = i; + isgn_interpolator.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + isgn_interpolator.register_index = input_register_index++; + isgn_interpolator.mask = 0b1111; + isgn_interpolator.always_reads_mask = 0b1111; + } + } + + // Point size. + // TODO(Triang3l): Put the size in X of float1, not in Z of float3, when + // linkage via shader modifications is done. + // TODO(Triang3l): Rename from TEXCOORD# to XEPSIZE when linkage via shader + // modifications is done. + if (key.has_point_size) { + input_register_point_size = input_register_index; + assert_true(isgn_parameter_index < isgn_parameter_count); + dxbc::SignatureParameter& isgn_point_size = + isgn_parameters[isgn_parameter_index++]; + isgn_point_size.semantic_name_ptr = isgn_name_ptr_texcoord; + isgn_point_size.semantic_index = key.interpolator_count; + isgn_point_size.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + isgn_point_size.register_index = input_register_index++; + isgn_point_size.mask = 0b0111; + isgn_point_size.always_reads_mask = + key.type == PipelineGeometryShader::kPointList ? 0b0100 : 0; + } + + // Position. + input_register_position = input_register_index; + assert_true(isgn_parameter_index < isgn_parameter_count); + dxbc::SignatureParameter& isgn_sv_position = + isgn_parameters[isgn_parameter_index++]; + isgn_sv_position.semantic_name_ptr = isgn_name_ptr_sv_position; + isgn_sv_position.system_value = dxbc::Name::kPosition; + isgn_sv_position.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + isgn_sv_position.register_index = input_register_index++; + isgn_sv_position.mask = 0b1111; + isgn_sv_position.always_reads_mask = 0b1111; + + // Clip and cull distances. + if (input_clip_and_cull_distance_count) { + input_register_clip_and_cull_distances = input_register_index; + uint32_t isgn_cull_distance_semantic_index = 0; + for (uint32_t i = 0; i < input_clip_and_cull_distance_count; i += 4) { + if (i < input_clip_distance_count) { + dxbc::SignatureParameter& isgn_sv_clip_distance = + isgn_parameters[isgn_parameter_index++]; + isgn_sv_clip_distance.semantic_name_ptr = + isgn_name_ptr_sv_clip_distance; + isgn_sv_clip_distance.semantic_index = i / 4; + isgn_sv_clip_distance.system_value = dxbc::Name::kClipDistance; + isgn_sv_clip_distance.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + isgn_sv_clip_distance.register_index = input_register_index; + uint8_t isgn_sv_clip_distance_mask = + (UINT8_C(1) << std::min(input_clip_distance_count - i, + UINT32_C(4))) - + 1; + isgn_sv_clip_distance.mask = isgn_sv_clip_distance_mask; + isgn_sv_clip_distance.always_reads_mask = isgn_sv_clip_distance_mask; + } + if (input_cull_distance_count && i + 4 > input_clip_distance_count) { + dxbc::SignatureParameter& isgn_sv_cull_distance = + isgn_parameters[isgn_parameter_index++]; + isgn_sv_cull_distance.semantic_name_ptr = + isgn_name_ptr_sv_cull_distance; + isgn_sv_cull_distance.semantic_index = + isgn_cull_distance_semantic_index++; + isgn_sv_cull_distance.system_value = dxbc::Name::kCullDistance; + isgn_sv_cull_distance.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + isgn_sv_cull_distance.register_index = input_register_index; + uint8_t isgn_sv_cull_distance_mask = + (UINT8_C(1) << std::min(input_clip_and_cull_distance_count - i, + UINT32_C(4))) - + 1; + if (i < input_clip_distance_count) { + isgn_sv_cull_distance_mask &= + ~((UINT8_C(1) << (input_clip_distance_count - i)) - 1); + } + isgn_sv_cull_distance.mask = isgn_sv_cull_distance_mask; + isgn_sv_cull_distance.always_reads_mask = isgn_sv_cull_distance_mask; + } + ++input_register_index; + } + } + + assert_true(isgn_parameter_index == isgn_parameter_count); + } + + { + auto& blob_header = *reinterpret_cast( + shader_out.data() + blob_position_dwords); + blob_header.fourcc = dxbc::BlobHeader::FourCC::kInputSignature; + blob_position_dwords = uint32_t(shader_out.size()); + blob_header.size_bytes = + (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) - + shader_out[blob_offset_position_dwords++]; + } + + // *************************************************************************** + // Output signature + // *************************************************************************** + + // Interpolators, point coordinates, position, clip distances. + // TODO(Triang3l): Reorder as needed when the respective changes are done in + // the shader translator. + uint32_t osgn_parameter_count = key.interpolator_count + + key.has_point_coordinates + 1 + + ((input_clip_distance_count + 3) / 4); + + // Reserve space for the header and the parameters. + shader_out[blob_offset_position_dwords] = + uint32_t(blob_position_dwords * sizeof(uint32_t)); + uint32_t osgn_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords; + shader_out.resize(osgn_position_dwords + + sizeof(dxbc::Signature) / sizeof(uint32_t) + + sizeof(dxbc::SignatureParameterForGS) / sizeof(uint32_t) * + osgn_parameter_count); + + // Names (after the parameters). + name_ptr = + uint32_t((shader_out.size() - osgn_position_dwords) * sizeof(uint32_t)); + uint32_t osgn_name_ptr_texcoord = name_ptr; + if (key.interpolator_count || key.has_point_coordinates) { + name_ptr += dxbc::AppendAlignedString(shader_out, "TEXCOORD"); + } + uint32_t osgn_name_ptr_sv_position = name_ptr; + name_ptr += dxbc::AppendAlignedString(shader_out, "SV_Position"); + uint32_t osgn_name_ptr_sv_clip_distance = name_ptr; + if (input_clip_distance_count) { + name_ptr += dxbc::AppendAlignedString(shader_out, "SV_ClipDistance"); + } + + // Header and parameters. + uint32_t output_register_interpolators = UINT32_MAX; + uint32_t output_register_point_coordinates = UINT32_MAX; + uint32_t output_register_position; + uint32_t output_register_clip_distances = UINT32_MAX; + { + // Header. + auto& osgn_header = *reinterpret_cast( + shader_out.data() + osgn_position_dwords); + osgn_header.parameter_count = osgn_parameter_count; + osgn_header.parameter_info_ptr = sizeof(dxbc::Signature); + + // Parameters. + auto osgn_parameters = reinterpret_cast( + shader_out.data() + osgn_position_dwords + + sizeof(dxbc::Signature) / sizeof(uint32_t)); + uint32_t osgn_parameter_index = 0; + uint32_t output_register_index = 0; + + // Interpolators (TEXCOORD#). + if (key.interpolator_count) { + output_register_interpolators = output_register_index; + for (uint32_t i = 0; i < key.interpolator_count; ++i) { + assert_true(osgn_parameter_index < osgn_parameter_count); + dxbc::SignatureParameterForGS& osgn_interpolator = + osgn_parameters[osgn_parameter_index++]; + osgn_interpolator.semantic_name_ptr = osgn_name_ptr_texcoord; + osgn_interpolator.semantic_index = i; + osgn_interpolator.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + osgn_interpolator.register_index = output_register_index++; + osgn_interpolator.mask = 0b1111; + } + } + + // Point coordinates. + // TODO(Triang3l): Put the coordinates in XY of float2 when linkage via + // shader modifications is done. + // TODO(Triang3l): Rename from TEXCOORD# to XESPRITETEXCOORD when linkage + // via shader modifications is done. + if (key.has_point_coordinates) { + output_register_point_coordinates = output_register_index; + assert_true(osgn_parameter_index < osgn_parameter_count); + dxbc::SignatureParameterForGS& osgn_point_coordinates = + osgn_parameters[osgn_parameter_index++]; + osgn_point_coordinates.semantic_name_ptr = osgn_name_ptr_texcoord; + osgn_point_coordinates.semantic_index = key.interpolator_count; + osgn_point_coordinates.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + osgn_point_coordinates.register_index = output_register_index++; + osgn_point_coordinates.mask = 0b0111; + osgn_point_coordinates.never_writes_mask = 0b1100; + } + + // Position. + output_register_position = output_register_index; + assert_true(osgn_parameter_index < osgn_parameter_count); + dxbc::SignatureParameterForGS& osgn_sv_position = + osgn_parameters[osgn_parameter_index++]; + osgn_sv_position.semantic_name_ptr = osgn_name_ptr_sv_position; + osgn_sv_position.system_value = dxbc::Name::kPosition; + osgn_sv_position.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + osgn_sv_position.register_index = output_register_index++; + osgn_sv_position.mask = 0b1111; + + // Clip distances. + if (input_clip_distance_count) { + output_register_clip_distances = output_register_index; + for (uint32_t i = 0; i < input_clip_distance_count; i += 4) { + dxbc::SignatureParameterForGS& osgn_sv_clip_distance = + osgn_parameters[osgn_parameter_index++]; + osgn_sv_clip_distance.semantic_name_ptr = + osgn_name_ptr_sv_clip_distance; + osgn_sv_clip_distance.semantic_index = i / 4; + osgn_sv_clip_distance.system_value = dxbc::Name::kClipDistance; + osgn_sv_clip_distance.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + osgn_sv_clip_distance.register_index = output_register_index++; + uint8_t osgn_sv_clip_distance_mask = + (UINT8_C(1) << std::min(input_clip_distance_count - i, + UINT32_C(4))) - + 1; + osgn_sv_clip_distance.mask = osgn_sv_clip_distance_mask; + osgn_sv_clip_distance.never_writes_mask = + osgn_sv_clip_distance_mask ^ 0b1111; + } + } + + assert_true(osgn_parameter_index == osgn_parameter_count); + } + + { + auto& blob_header = *reinterpret_cast( + shader_out.data() + blob_position_dwords); + blob_header.fourcc = dxbc::BlobHeader::FourCC::kOutputSignatureForGS; + blob_position_dwords = uint32_t(shader_out.size()); + blob_header.size_bytes = + (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) - + shader_out[blob_offset_position_dwords++]; + } + + // *************************************************************************** + // Shader program + // *************************************************************************** + + shader_out[blob_offset_position_dwords] = + uint32_t(blob_position_dwords * sizeof(uint32_t)); + uint32_t shex_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords; + shader_out.resize(shex_position_dwords); + + shader_out.push_back( + dxbc::VersionToken(dxbc::ProgramType::kGeometryShader, 5, 1)); + // Reserve space for the length token. + shader_out.push_back(0); + + dxbc::Statistics stat; + std::memset(&stat, 0, sizeof(dxbc::Statistics)); + dxbc::Assembler a(shader_out, stat); + + a.OpDclGlobalFlags(dxbc::kGlobalFlagAllResourcesBound); + + if (system_cbuffer_size_vector_aligned_bytes) { + a.OpDclConstantBuffer( + dxbc::Src::CB( + dxbc::Src::Dcl, 0, + uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants), + uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants)), + system_cbuffer_size_vector_aligned_bytes / (sizeof(uint32_t) * 4)); + } + + dxbc::Primitive input_primitive = dxbc::Primitive::kUndefined; + uint32_t input_primitive_vertex_count = 0; + dxbc::PrimitiveTopology output_primitive_topology = + dxbc::PrimitiveTopology::kUndefined; + uint32_t max_output_vertex_count = 0; + switch (key.type) { + case PipelineGeometryShader::kPointList: + // Point to a strip of 2 triangles. + input_primitive = dxbc::Primitive::kPoint; + input_primitive_vertex_count = 1; + output_primitive_topology = dxbc::PrimitiveTopology::kTriangleStrip; + max_output_vertex_count = 4; + break; + case PipelineGeometryShader::kRectangleList: + // Triangle to a strip of 2 triangles. + input_primitive = dxbc::Primitive::kTriangle; + input_primitive_vertex_count = 3; + output_primitive_topology = dxbc::PrimitiveTopology::kTriangleStrip; + max_output_vertex_count = 4; + break; + case PipelineGeometryShader::kQuadList: + // 4 vertices passed via kLineWithAdjacency to a strip of 2 triangles. + input_primitive = dxbc::Primitive::kLineWithAdjacency; + input_primitive_vertex_count = 4; + output_primitive_topology = dxbc::PrimitiveTopology::kTriangleStrip; + max_output_vertex_count = 4; + break; + default: + assert_unhandled_case(key.type); + } + + assert_false(key.interpolator_count && + input_register_interpolators == UINT32_MAX); + for (uint32_t i = 0; i < key.interpolator_count; ++i) { + a.OpDclInput(dxbc::Dest::V2D(input_primitive_vertex_count, + input_register_interpolators + i)); + } + if (key.has_point_size && key.type == PipelineGeometryShader::kPointList) { + assert_true(input_register_point_size != UINT32_MAX); + a.OpDclInput(dxbc::Dest::V2D(input_primitive_vertex_count, + input_register_point_size, 0b0100)); + } + a.OpDclInputSIV( + dxbc::Dest::V2D(input_primitive_vertex_count, input_register_position), + dxbc::Name::kPosition); + // Clip and cull plane declarations are separate in FXC-generated code even + // for a single register. + assert_false(input_clip_and_cull_distance_count && + input_register_clip_and_cull_distances == UINT32_MAX); + for (uint32_t i = 0; i < input_clip_and_cull_distance_count; i += 4) { + if (i < input_clip_distance_count) { + a.OpDclInput( + dxbc::Dest::V2D(input_primitive_vertex_count, + input_register_clip_and_cull_distances + (i >> 2), + (UINT32_C(1) << std::min( + input_clip_distance_count - i, UINT32_C(4))) - + 1)); + } + if (input_cull_distance_count && i + 4 > input_clip_distance_count) { + uint32_t cull_distance_mask = + (UINT32_C(1) << std::min(input_clip_and_cull_distance_count - i, + UINT32_C(4))) - + 1; + if (i < input_clip_distance_count) { + cull_distance_mask &= + ~((UINT32_C(1) << (input_clip_distance_count - i)) - 1); + } + a.OpDclInput( + dxbc::Dest::V2D(input_primitive_vertex_count, + input_register_clip_and_cull_distances + (i >> 2), + cull_distance_mask)); + } + } + + size_t dcl_temps_instruction_position_dwords = shader_out.size(); + size_t dcl_temps_count_position_dwords = a.OpDclTemps(0); + + a.OpDclInputPrimitive(input_primitive); + dxbc::Dest stream(dxbc::Dest::M(0)); + a.OpDclStream(stream); + a.OpDclOutputTopology(output_primitive_topology); + + assert_false(key.interpolator_count && + output_register_interpolators == UINT32_MAX); + for (uint32_t i = 0; i < key.interpolator_count; ++i) { + a.OpDclOutput(dxbc::Dest::O(output_register_interpolators + i)); + } + if (key.has_point_coordinates) { + assert_true(output_register_point_coordinates != UINT32_MAX); + a.OpDclOutput(dxbc::Dest::O(output_register_point_coordinates, 0b0011)); + } + a.OpDclOutputSIV(dxbc::Dest::O(output_register_position), + dxbc::Name::kPosition); + assert_false(input_clip_distance_count && + output_register_clip_distances == UINT32_MAX); + for (uint32_t i = 0; i < input_clip_distance_count; i += 4) { + a.OpDclOutputSIV( + dxbc::Dest::O(output_register_clip_distances + (i >> 2), + (UINT32_C(1) << std::min(input_clip_distance_count - i, + UINT32_C(4))) - + 1), + dxbc::Name::kClipDistance); + } + + a.OpDclMaxOutputVertexCount(max_output_vertex_count); + + // Note that after every emit, all o# become initialized and must be written + // to again. + // Also, FXC generates only movs (from statically or dynamically indexed + // v[#][#], from r#, or from a literal) to o# for some reason. + + // Cull the whole primitive if all cull distances are < 0. + // TODO(Triang3l): For points, handle ps_ucp_mode (transform the host clip + // space to the guest one, calculate the distances to the user clip planes, + // cull using the distance from the center for modes 0, 1 and 2, cull and clip + // per-vertex for modes 2 and 3) - except for the vertex kill flag. + if (input_cull_distance_count) { + stat.temp_register_count = std::max(UINT32_C(1), stat.temp_register_count); + for (uint32_t i = 0; i < input_cull_distance_count; ++i) { + uint32_t cull_distance_register = input_register_clip_and_cull_distances + + ((input_clip_distance_count + i) >> 2); + uint32_t cull_distance_component = (input_clip_distance_count + i) & 3; + a.OpLT(dxbc::Dest::R(0, 0b0001), + dxbc::Src::V2D(0, cull_distance_register) + .Select(cull_distance_component), + dxbc::Src::LF(0.0f)); + for (uint32_t j = 1; j < input_primitive_vertex_count; ++j) { + a.OpLT(dxbc::Dest::R(0, 0b0010), + dxbc::Src::V2D(j, cull_distance_register) + .Select(cull_distance_component), + dxbc::Src::LF(0.0f)); + a.OpAnd(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX), + dxbc::Src::R(0, dxbc::Src::kYYYY)); + } + a.OpRetC(true, dxbc::Src::R(0, dxbc::Src::kXXXX)); + } + } + + switch (key.type) { + case PipelineGeometryShader::kPointList: { + // Expand the point sprite, with left-to-right, top-to-bottom UVs. + dxbc::Src point_size_src(dxbc::Src::CB( + 0, uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants), + offsetof(DxbcShaderTranslator::SystemConstants, + point_constant_diameter) >> + 4, + ((offsetof(DxbcShaderTranslator::SystemConstants, + point_constant_diameter[0]) >> + 2) & + 3) | + (((offsetof(DxbcShaderTranslator::SystemConstants, + point_constant_diameter[1]) >> + 2) & + 3) + << 2))); + stat.temp_register_count = + std::max(UINT32_C(1), stat.temp_register_count); + if (key.has_point_size) { + // The vertex shader's header writes -1.0 to point_size by default, so + // any non-negative value means that it was overwritten by the + // translated vertex shader, and needs to be used instead of the + // constant size. The per-vertex diameter is already clamped in the + // vertex shader (combined with making it non-negative). + a.OpGE(dxbc::Dest::R(0, 0b0001), + dxbc::Src::V2D(0, input_register_point_size, dxbc::Src::kZZZZ), + dxbc::Src::LF(0.0f)); + a.OpMovC(dxbc::Dest::R(0, 0b0011), dxbc::Src::R(0, dxbc::Src::kXXXX), + dxbc::Src::V2D(0, input_register_point_size, dxbc::Src::kZZZZ), + point_size_src); + point_size_src = dxbc::Src::R(0, 0b0100); + } + // 4D5307F1 has zero-size snowflakes, drop them quicker, and also drop + // points with a constant size of zero since point lists may also be used + // as just "compute" with memexport. + // XY may contain the point size with the per-vertex override applied, use + // Z as temporary. + for (uint32_t i = 0; i < 2; ++i) { + a.OpLT(dxbc::Dest::R(0, 0b0100), dxbc::Src::LF(0.0f), + point_size_src.SelectFromSwizzled(i)); + a.OpRetC(false, dxbc::Src::R(0, dxbc::Src::kZZZZ)); + } + // Transform the diameter in the guest screen coordinates to radius in the + // normalized device coordinates, and then to the clip space by + // multiplying by W. + a.OpMul( + dxbc::Dest::R(0, 0b0011), point_size_src, + dxbc::Src::CB( + 0, + uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants), + offsetof(DxbcShaderTranslator::SystemConstants, + point_screen_diameter_to_ndc_radius) >> + 4, + ((offsetof(DxbcShaderTranslator::SystemConstants, + point_screen_diameter_to_ndc_radius[0]) >> + 2) & + 3) | + (((offsetof(DxbcShaderTranslator::SystemConstants, + point_screen_diameter_to_ndc_radius[1]) >> + 2) & + 3) + << 2))); + point_size_src = dxbc::Src::R(0, 0b0100); + a.OpMul(dxbc::Dest::R(0, 0b0011), point_size_src, + dxbc::Src::V2D(0, input_register_position, dxbc::Src::kWWWW)); + dxbc::Src point_radius_x_src(point_size_src.SelectFromSwizzled(0)); + dxbc::Src point_radius_y_src(point_size_src.SelectFromSwizzled(1)); + + for (uint32_t i = 0; i < 4; ++i) { + // Same interpolators for the entire sprite. + for (uint32_t j = 0; j < key.interpolator_count; ++j) { + a.OpMov(dxbc::Dest::O(output_register_interpolators + j), + dxbc::Src::V2D(0, input_register_interpolators + j)); + } + // Top-left, top-right, bottom-left, bottom-right order (chosen + // arbitrarily, simply based on clockwise meaning front with + // FrontCounterClockwise = FALSE, but faceness is ignored for + // non-polygon primitive types). + // Bottom is -Y in Direct3D NDC, +V in point sprite coordinates. + if (key.has_point_coordinates) { + a.OpMov(dxbc::Dest::O(output_register_point_coordinates, 0b0011), + dxbc::Src::LF(float(i & 1), float(i >> 1), 0.0f, 0.0f)); + } + // FXC generates only `mov`s for o#, use temporary registers (r0.zw, as + // r0.xy already used for the point size) for calculations. + a.OpAdd(dxbc::Dest::R(0, 0b0100), + dxbc::Src::V2D(0, input_register_position, dxbc::Src::kXXXX), + (i & 1) ? point_radius_x_src : -point_radius_x_src); + a.OpAdd(dxbc::Dest::R(0, 0b1000), + dxbc::Src::V2D(0, input_register_position, dxbc::Src::kYYYY), + (i >> 1) ? -point_radius_y_src : point_radius_y_src); + a.OpMov(dxbc::Dest::O(output_register_position, 0b0011), + dxbc::Src::R(0, 0b1110)); + a.OpMov(dxbc::Dest::O(output_register_position, 0b1100), + dxbc::Src::V2D(0, input_register_position)); + // TODO(Triang3l): Handle ps_ucp_mode properly, clip expanded points if + // needed. + for (uint32_t j = 0; j < input_clip_distance_count; j += 4) { + a.OpMov( + dxbc::Dest::O(output_register_clip_distances + (j >> 2), + (UINT32_C(1) << std::min( + input_clip_distance_count - j, UINT32_C(4))) - + 1), + dxbc::Src::V2D( + 0, input_register_clip_and_cull_distances + (j >> 2))); + } + if (i < 3) { + a.OpEmitStream(stream); + } + } + a.OpEmitThenCutStream(stream); + } break; + + case PipelineGeometryShader::kRectangleList: { + // Construct a strip with the fourth vertex generated by mirroring a + // vertex across the longest edge (the diagonal). + // + // Possible options: + // + // 0---1 + // | /| + // | / | - 12 is the longest edge, strip 0123 (most commonly used) + // |/ | v3 = v0 + (v1 - v0) + (v2 - v0), or v3 = -v0 + v1 + v2 + // 2--[3] + // + // 1---2 + // | /| + // | / | - 20 is the longest edge, strip 1203 + // |/ | + // 0--[3] + // + // 2---0 + // | /| + // | / | - 01 is the longest edge, strip 2013 + // |/ | + // 1--[3] + // + // Input vertices are implicitly indexable, dcl_indexRange is not needed + // for the first dimension of a v[#][#] index. + + stat.temp_register_count = + std::max(UINT32_C(1), stat.temp_register_count); + + // Get squares of edge lengths into r0.xyz to choose the longest edge. + // r0.x = ||12||^2 + a.OpAdd(dxbc::Dest::R(0, 0b0011), + dxbc::Src::V2D(2, input_register_position, 0b0100), + -dxbc::Src::V2D(1, input_register_position, 0b0100)); + a.OpDP2(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, 0b0100), + dxbc::Src::R(0, 0b0100)); + // r0.y = ||20||^2 + a.OpAdd(dxbc::Dest::R(0, 0b0110), + dxbc::Src::V2D(0, input_register_position, 0b0100 << 2), + -dxbc::Src::V2D(2, input_register_position, 0b0100 << 2)); + a.OpDP2(dxbc::Dest::R(0, 0b0010), dxbc::Src::R(0, 0b1001), + dxbc::Src::R(0, 0b1001)); + // r0.z = ||01||^2 + a.OpAdd(dxbc::Dest::R(0, 0b1100), + dxbc::Src::V2D(1, input_register_position, 0b0100 << 4), + -dxbc::Src::V2D(0, input_register_position, 0b0100 << 4)); + a.OpDP2(dxbc::Dest::R(0, 0b0100), dxbc::Src::R(0, 0b1110), + dxbc::Src::R(0, 0b1110)); + + // Find the longest edge, and select the strip vertex indices into r0.xyz. + // r0.w = 12 > 20 + a.OpLT(dxbc::Dest::R(0, 0b1000), dxbc::Src::R(0, dxbc::Src::kYYYY), + dxbc::Src::R(0, dxbc::Src::kXXXX)); + // r0.x = 12 > 01 + a.OpLT(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kZZZZ), + dxbc::Src::R(0, dxbc::Src::kXXXX)); + // r0.x = 12 > 20 && 12 > 01 + a.OpAnd(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kWWWW), + dxbc::Src::R(0, dxbc::Src::kXXXX)); + a.OpIf(true, dxbc::Src::R(0, dxbc::Src::kXXXX)); + { + // 12 is the longest edge, the first triangle in the strip is 012. + a.OpMov(dxbc::Dest::R(0, 0b0111), dxbc::Src::LU(0, 1, 2, 0)); + } + a.OpElse(); + { + // r0.x = 20 > 01 + a.OpLT(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kZZZZ), + dxbc::Src::R(0, dxbc::Src::kYYYY)); + // If 20 is the longest edge, the first triangle in the strip is 120. + // Otherwise, it's 201. + a.OpMovC(dxbc::Dest::R(0, 0b0111), dxbc::Src::R(0, dxbc::Src::kXXXX), + dxbc::Src::LU(1, 2, 0, 0), dxbc::Src::LU(2, 0, 1, 0)); + } + a.OpEndIf(); + + // Emit the triangle in the strip that consisting of the original + // vertices. + for (uint32_t i = 0; i < 3; ++i) { + dxbc::Index input_vertex_index(0, i); + for (uint32_t j = 0; j < key.interpolator_count; ++j) { + a.OpMov(dxbc::Dest::O(output_register_interpolators + j), + dxbc::Src::V2D(input_vertex_index, + input_register_interpolators + j)); + } + if (key.has_point_coordinates) { + a.OpMov(dxbc::Dest::O(output_register_point_coordinates, 0b0011), + dxbc::Src::LF(0.0f)); + } + a.OpMov(dxbc::Dest::O(output_register_position), + dxbc::Src::V2D(input_vertex_index, input_register_position)); + for (uint32_t j = 0; j < input_clip_distance_count; j += 4) { + a.OpMov( + dxbc::Dest::O(output_register_clip_distances + (j >> 2), + (UINT32_C(1) << std::min( + input_clip_distance_count - j, UINT32_C(4))) - + 1), + dxbc::Src::V2D( + input_vertex_index, + input_register_clip_and_cull_distances + (j >> 2))); + } + a.OpEmitStream(stream); + } + + // Construct the fourth vertex using r1 as temporary storage, including + // for the final operation as FXC generates only `mov`s for o#. + stat.temp_register_count = + std::max(UINT32_C(2), stat.temp_register_count); + for (uint32_t j = 0; j < key.interpolator_count; ++j) { + uint32_t input_register_interpolator = input_register_interpolators + j; + a.OpAdd(dxbc::Dest::R(1), + -dxbc::Src::V2D(dxbc::Index(0, 0), input_register_interpolator), + dxbc::Src::V2D(dxbc::Index(0, 1), input_register_interpolator)); + a.OpAdd(dxbc::Dest::R(1), dxbc::Src::R(1), + dxbc::Src::V2D(dxbc::Index(0, 2), input_register_interpolator)); + a.OpMov(dxbc::Dest::O(output_register_interpolators + j), + dxbc::Src::R(1)); + } + if (key.has_point_coordinates) { + a.OpMov(dxbc::Dest::O(output_register_point_coordinates, 0b0011), + dxbc::Src::LF(0.0f)); + } + a.OpAdd(dxbc::Dest::R(1), + -dxbc::Src::V2D(dxbc::Index(0, 0), input_register_position), + dxbc::Src::V2D(dxbc::Index(0, 1), input_register_position)); + a.OpAdd(dxbc::Dest::R(1), dxbc::Src::R(1), + dxbc::Src::V2D(dxbc::Index(0, 2), input_register_position)); + a.OpMov(dxbc::Dest::O(output_register_position), dxbc::Src::R(1)); + for (uint32_t j = 0; j < input_clip_distance_count; j += 4) { + uint32_t clip_distance_mask = + (UINT32_C(1) << std::min(input_clip_distance_count - j, + UINT32_C(4))) - + 1; + uint32_t input_register_clip_distance = + input_register_clip_and_cull_distances + (j >> 2); + a.OpAdd( + dxbc::Dest::R(1, clip_distance_mask), + -dxbc::Src::V2D(dxbc::Index(0, 0), input_register_clip_distance), + dxbc::Src::V2D(dxbc::Index(0, 1), input_register_clip_distance)); + a.OpAdd( + dxbc::Dest::R(1, clip_distance_mask), dxbc::Src::R(1), + dxbc::Src::V2D(dxbc::Index(0, 2), input_register_clip_distance)); + a.OpMov(dxbc::Dest::O(output_register_clip_distances + (j >> 2), + clip_distance_mask), + dxbc::Src::R(1)); + } + a.OpEmitThenCutStream(stream); + } break; + + case PipelineGeometryShader::kQuadList: { + // Build the triangle strip from the original quad vertices in the + // 0, 1, 3, 2 order (like specified for GL_QUAD_STRIP). + // TODO(Triang3l): Find the correct decomposition of quads into triangles + // on the real hardware. + for (uint32_t i = 0; i < 4; ++i) { + uint32_t input_vertex_index = i ^ (i >> 1); + for (uint32_t j = 0; j < key.interpolator_count; ++j) { + a.OpMov(dxbc::Dest::O(output_register_interpolators + j), + dxbc::Src::V2D(input_vertex_index, + input_register_interpolators + j)); + } + if (key.has_point_coordinates) { + a.OpMov(dxbc::Dest::O(output_register_point_coordinates, 0b0011), + dxbc::Src::LF(0.0f)); + } + a.OpMov(dxbc::Dest::O(output_register_position), + dxbc::Src::V2D(input_vertex_index, input_register_position)); + for (uint32_t j = 0; j < input_clip_distance_count; j += 4) { + a.OpMov( + dxbc::Dest::O(output_register_clip_distances + (j >> 2), + (UINT32_C(1) << std::min( + input_clip_distance_count - j, UINT32_C(4))) - + 1), + dxbc::Src::V2D( + input_vertex_index, + input_register_clip_and_cull_distances + (j >> 2))); + } + if (i < 3) { + a.OpEmitStream(stream); + } + } + a.OpEmitThenCutStream(stream); + } break; + + default: + assert_unhandled_case(key.type); + } + + a.OpRet(); + + if (stat.temp_register_count) { + // Write the actual number of temporary registers used. + shader_out[dcl_temps_count_position_dwords] = stat.temp_register_count; + } else { + // Remove the dcl_temps instruction (FXC doesn't generate it when temporary + // variables aren't used). + uint32_t dcl_temps_length_dwords = dxbc::GetOpcodeTokenInstructionLength( + shader_out[dcl_temps_instruction_position_dwords]); + size_t dcl_temps_end_position_dwords = + dcl_temps_instruction_position_dwords + dcl_temps_length_dwords; + size_t shader_size_with_dcl_temps = shader_out.size(); + std::memmove(shader_out.data() + dcl_temps_instruction_position_dwords, + shader_out.data() + dcl_temps_end_position_dwords, + sizeof(uint32_t) * (shader_size_with_dcl_temps - + dcl_temps_end_position_dwords)); + shader_out.resize(shader_size_with_dcl_temps - dcl_temps_length_dwords); + } + + // Write the shader program length in dwords. + shader_out[shex_position_dwords + 1] = + uint32_t(shader_out.size()) - shex_position_dwords; + + { + auto& blob_header = *reinterpret_cast( + shader_out.data() + blob_position_dwords); + blob_header.fourcc = dxbc::BlobHeader::FourCC::kShaderEx; + blob_position_dwords = uint32_t(shader_out.size()); + blob_header.size_bytes = + (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) - + shader_out[blob_offset_position_dwords++]; + } + + // *************************************************************************** + // Statistics + // *************************************************************************** + + shader_out[blob_offset_position_dwords] = + uint32_t(blob_position_dwords * sizeof(uint32_t)); + uint32_t stat_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords; + shader_out.resize(stat_position_dwords + + sizeof(dxbc::Statistics) / sizeof(uint32_t)); + std::memcpy(shader_out.data() + stat_position_dwords, &stat, + sizeof(dxbc::Statistics)); + + { + auto& blob_header = *reinterpret_cast( + shader_out.data() + blob_position_dwords); + blob_header.fourcc = dxbc::BlobHeader::FourCC::kStatistics; + blob_position_dwords = uint32_t(shader_out.size()); + blob_header.size_bytes = + (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) - + shader_out[blob_offset_position_dwords++]; + } + + // *************************************************************************** + // Container header + // *************************************************************************** + + uint32_t shader_size_bytes = uint32_t(shader_out.size() * sizeof(uint32_t)); + { + auto& container_header = + *reinterpret_cast(shader_out.data()); + container_header.InitializeIdentification(); + container_header.size_bytes = shader_size_bytes; + container_header.blob_count = kBlobCount; + CalculateDXBCChecksum( + reinterpret_cast(shader_out.data()), + static_cast(shader_size_bytes), + reinterpret_cast(&container_header.hash)); + } +} + +const std::vector& PipelineCache::GetGeometryShader( + GeometryShaderKey key) { + auto it = geometry_shaders_.find(key); + if (it != geometry_shaders_.end()) { + return it->second; + } + std::vector shader; + CreateDxbcGeometryShader(key, shader); + return geometry_shaders_.emplace(key, std::move(shader)).first->second; +} + ID3D12PipelineState* PipelineCache::CreateD3D12Pipeline( const PipelineRuntimeDescription& runtime_description) { const PipelineDescription& description = runtime_description.description; @@ -1739,23 +2865,6 @@ ID3D12PipelineState* PipelineCache::CreateD3D12Pipeline( assert_unhandled_case(primitive_topology_type); return nullptr; } - switch (description.geometry_shader) { - case PipelineGeometryShader::kPointList: - state_desc.GS.pShaderBytecode = shaders::primitive_point_list_gs; - state_desc.GS.BytecodeLength = sizeof(shaders::primitive_point_list_gs); - break; - case PipelineGeometryShader::kRectangleList: - state_desc.GS.pShaderBytecode = shaders::primitive_rectangle_list_gs; - state_desc.GS.BytecodeLength = - sizeof(shaders::primitive_rectangle_list_gs); - break; - case PipelineGeometryShader::kQuadList: - state_desc.GS.pShaderBytecode = shaders::primitive_quad_list_gs; - state_desc.GS.BytecodeLength = sizeof(shaders::primitive_quad_list_gs); - break; - default: - break; - } } else { state_desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH; xenos::TessellationMode tessellation_mode = xenos::TessellationMode( @@ -1864,6 +2973,14 @@ ID3D12PipelineState* PipelineCache::CreateD3D12Pipeline( } } + // Geometry shader. + if (runtime_description.geometry_shader != nullptr) { + state_desc.GS.pShaderBytecode = runtime_description.geometry_shader->data(); + state_desc.GS.BytecodeLength = + sizeof(*runtime_description.geometry_shader->data()) * + runtime_description.geometry_shader->size(); + } + // Rasterizer state. state_desc.RasterizerState.FillMode = description.fill_mode_wireframe ? D3D12_FILL_MODE_WIREFRAME diff --git a/src/xenia/gpu/d3d12/pipeline_cache.h b/src/xenia/gpu/d3d12/pipeline_cache.h index 74ea0c9e0..f60dff1f6 100644 --- a/src/xenia/gpu/d3d12/pipeline_cache.h +++ b/src/xenia/gpu/d3d12/pipeline_cache.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2018 Ben Vanik. All rights reserved. * + * Copyright 2022 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -21,6 +22,7 @@ #include #include +#include "xenia/base/assert.h" #include "xenia/base/hash.h" #include "xenia/base/platform.h" #include "xenia/base/string_buffer.h" @@ -230,9 +232,37 @@ class PipelineCache { ID3D12RootSignature* root_signature; D3D12Shader::D3D12Translation* vertex_shader; D3D12Shader::D3D12Translation* pixel_shader; + const std::vector* geometry_shader; PipelineDescription description; }; + union GeometryShaderKey { + uint32_t key; + struct { + PipelineGeometryShader type : 2; + uint32_t interpolator_count : 5; + uint32_t user_clip_plane_count : 3; + uint32_t user_clip_plane_cull : 1; + uint32_t has_vertex_kill_and : 1; + uint32_t has_point_size : 1; + uint32_t has_point_coordinates : 1; + }; + + GeometryShaderKey() : key(0) { static_assert_size(*this, sizeof(key)); } + + struct Hasher { + size_t operator()(const GeometryShaderKey& key) const { + return std::hash{}(key.key); + } + }; + bool operator==(const GeometryShaderKey& other_key) const { + return key == other_key.key; + } + bool operator!=(const GeometryShaderKey& other_key) const { + return !(*this == other_key); + } + }; + D3D12Shader* LoadShader(xenos::ShaderType shader_type, const uint32_t* host_address, uint32_t dword_count, uint64_t data_hash); @@ -257,6 +287,12 @@ class PipelineCache { const uint32_t* bound_depth_and_color_render_target_formats, PipelineRuntimeDescription& runtime_description_out); + static bool GetGeometryShaderKey(PipelineGeometryShader geometry_shader_type, + GeometryShaderKey& key_out); + static void CreateDxbcGeometryShader(GeometryShaderKey key, + std::vector& shader_out); + const std::vector& GetGeometryShader(GeometryShaderKey key); + ID3D12PipelineState* CreateD3D12Pipeline( const PipelineRuntimeDescription& runtime_description); @@ -302,6 +338,11 @@ class PipelineCache { xe::hash::IdentityHasher> bindless_sampler_layout_map_; + // Geometry shaders for Xenos primitive types not supported by Direct3D 12. + std::unordered_map, + GeometryShaderKey::Hasher> + geometry_shaders_; + // Empty depth-only pixel shader for writing to depth buffer via ROV when no // Xenos pixel shader provided. std::vector depth_only_pixel_shader_; diff --git a/src/xenia/gpu/dxbc.h b/src/xenia/gpu/dxbc.h index 5d5cb9f27..2c9f5eeab 100644 --- a/src/xenia/gpu/dxbc.h +++ b/src/xenia/gpu/dxbc.h @@ -166,11 +166,11 @@ struct alignas(uint32_t) BlobHeader { // In order of appearance in a container. kResourceDefinition = MakeFourCC('R', 'D', 'E', 'F'), kInputSignature = MakeFourCC('I', 'S', 'G', 'N'), - kInputSignature11_1 = MakeFourCC('I', 'S', 'G', '1'), + kInputSignature_11_1 = MakeFourCC('I', 'S', 'G', '1'), kPatchConstantSignature = MakeFourCC('P', 'C', 'S', 'G'), kOutputSignature = MakeFourCC('O', 'S', 'G', 'N'), kOutputSignatureForGS = MakeFourCC('O', 'S', 'G', '5'), - kOutputSignature11_1 = MakeFourCC('O', 'S', 'G', '1'), + kOutputSignature_11_1 = MakeFourCC('O', 'S', 'G', '1'), kShaderEx = MakeFourCC('S', 'H', 'E', 'X'), kShaderFeatureInfo = MakeFourCC('S', 'F', 'I', '0'), kStatistics = MakeFourCC('S', 'T', 'A', 'T'), @@ -522,7 +522,7 @@ static_assert_size(SignatureParameterForGS, sizeof(uint32_t) * 7); // D3D11_INTERNALSHADER_PARAMETER_11_1 // Extends SignatureParameterForGS, see it for more information. -struct alignas(uint32_t) SignatureParameter11_1 { +struct alignas(uint32_t) SignatureParameter_11_1 { uint32_t stream; uint32_t semantic_name_ptr; uint32_t semantic_index; @@ -536,7 +536,7 @@ struct alignas(uint32_t) SignatureParameter11_1 { }; MinPrecision min_precision; }; -static_assert_size(SignatureParameter11_1, sizeof(uint32_t) * 8); +static_assert_size(SignatureParameter_11_1, sizeof(uint32_t) * 8); // D3D10_INTERNALSHADER_SIGNATURE struct alignas(uint32_t) Signature { @@ -1527,6 +1527,10 @@ constexpr uint32_t OpcodeToken(Opcode opcode, uint32_t operands_length, (extended_opcode_count ? (uint32_t(1) << 31) : 0); } +constexpr uint32_t GetOpcodeTokenInstructionLength(uint32_t opcode_token) { + return (opcode_token >> 24) & ((UINT32_C(1) << 7) - 1); +} + constexpr uint32_t SampleControlsExtendedOpcodeToken(int32_t aoffimmi_u, int32_t aoffimmi_v, int32_t aoffimmi_w, @@ -2049,11 +2053,15 @@ class Assembler { operand.Write(code_, false, 0b1111, false, true); code_.push_back(space); } + // In geometry shaders, only kPointList, kLineStrip and kTriangleStrip are + // allowed. void OpDclOutputTopology(PrimitiveTopology output_topology) { code_.push_back(OpcodeToken(Opcode::kDclOutputTopology, 0) | (uint32_t(output_topology) << 11)); stat_.gs_output_topology = output_topology; } + // In geometry shaders, only kPoint, kLine, kTriangle, kLineWithAdjacency and + // kTriangleWithAdjacency are allowed. void OpDclInputPrimitive(Primitive input_primitive) { code_.push_back(OpcodeToken(Opcode::kDclInputPrimitive, 0) | (uint32_t(input_primitive) << 11)); @@ -2194,6 +2202,9 @@ class Assembler { code_.push_back(OpcodeToken(Opcode::kEmitThenCutStream, operands_length)); stream.Write(code_); ++stat_.instruction_count; + // TODO(Triang3l): Verify if the instruction counts should be incremented + // this way (haven't been able to obtain this from FXC because it generates + // separate emit_stream and cut_stream, at least for Shader Model 5.1). ++stat_.emit_instruction_count; ++stat_.cut_instruction_count; } diff --git a/src/xenia/gpu/registers.h b/src/xenia/gpu/registers.h index 2d89d541b..ec2017185 100644 --- a/src/xenia/gpu/registers.h +++ b/src/xenia/gpu/registers.h @@ -130,16 +130,16 @@ union alignas(uint32_t) SQ_CONTEXT_MISC { uint32_t sc_output_screen_xy : 1; // +1 xenos::SampleControl sc_sample_cntl : 2; // +2 uint32_t : 4; // +4 - // Pixel shader interpolator (according to the XNA microcode compiler - + // Pixel shader interpolator (according to the XNA microcode validator - // limited to the interpolator count, 16, not the total register count of // 64) index to write pixel parameters to. // See https://portal.unifiedpatents.com/ptab/case/IPR2015-00325 Exhibit // 2039 R400 Sequencer Specification 2.11 (a significantly early version of // the specification, however) section 19.2 "Sprites/ XY screen coordinates/ // FB information" for additional details. - // * |XY| - position on screen (vPos - the XNA microcode compiler translates - // ps_3_0 vPos directly to this, so at least in Direct3D 9 pixel center - // mode, this contains 0, 1, 2, not 0.5, 1.5, 2.5). flto also said in the + // * |XY| - position on screen (vPos - the XNA assembler translates ps_3_0 + // vPos directly to this, so at least in Direct3D 9 pixel center mode, + // this contains 0, 1, 2, not 0.5, 1.5, 2.5). flto also said in the // Freedreno IRC that it's .0 even in OpenGL: // https://dri.freedesktop.org/~cbrill/dri-log/?channel=freedreno&date=2020-04-19 // According to the actual usage, in the final version of the hardware, diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_point_list_gs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_point_list_gs.h deleted file mode 100644 index 530c45ecd..000000000 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_point_list_gs.h +++ /dev/null @@ -1,1540 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 10.1 -// -// -// Buffer Definitions: -// -// cbuffer xe_system_cbuffer -// { -// -// uint xe_flags; // Offset: 0 Size: 4 [unused] -// float2 xe_tessellation_factor_range;// Offset: 4 Size: 8 [unused] -// uint xe_line_loop_closing_index; // Offset: 12 Size: 4 [unused] -// uint xe_vertex_index_endian; // Offset: 16 Size: 4 [unused] -// uint xe_vertex_index_offset; // Offset: 20 Size: 4 [unused] -// uint2 xe_vertex_index_min_max; // Offset: 24 Size: 8 [unused] -// float4 xe_user_clip_planes[6]; // Offset: 32 Size: 96 [unused] -// float3 xe_ndc_scale; // Offset: 128 Size: 12 [unused] -// float xe_point_vertex_diameter_min;// Offset: 140 Size: 4 [unused] -// float3 xe_ndc_offset; // Offset: 144 Size: 12 [unused] -// float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [unused] -// float2 xe_point_constant_diameter; // Offset: 160 Size: 8 -// float2 xe_point_screen_diameter_to_ndc_radius;// Offset: 168 Size: 8 -// uint xe_interpolator_sampling_pattern;// Offset: 176 Size: 4 [unused] -// uint xe_ps_param_gen; // Offset: 180 Size: 4 [unused] -// uint2 xe_sample_count_log2; // Offset: 184 Size: 8 [unused] -// uint4 xe_texture_swizzled_signs[2];// Offset: 192 Size: 32 [unused] -// uint xe_textures_resolved; // Offset: 224 Size: 4 [unused] -// float xe_alpha_test_reference; // Offset: 228 Size: 4 [unused] -// uint xe_alpha_to_mask; // Offset: 232 Size: 4 [unused] -// uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset: 236 Size: 4 [unused] -// float4 xe_color_exp_bias; // Offset: 240 Size: 16 [unused] -// float2 xe_edram_poly_offset_front; // Offset: 256 Size: 8 [unused] -// float2 xe_edram_poly_offset_back; // Offset: 264 Size: 8 [unused] -// uint xe_edram_depth_base_dwords_scaled;// Offset: 272 Size: 4 [unused] -// uint4 xe_edram_stencil[2]; // Offset: 288 Size: 32 [unused] -// uint4 xe_edram_rt_base_dwords_scaled;// Offset: 320 Size: 16 [unused] -// uint4 xe_edram_rt_format_flags; // Offset: 336 Size: 16 [unused] -// float4 xe_edram_rt_clamp[4]; // Offset: 352 Size: 64 [unused] -// uint4 xe_edram_rt_keep_mask[2]; // Offset: 416 Size: 32 [unused] -// uint4 xe_edram_rt_blend_factors_ops;// Offset: 448 Size: 16 [unused] -// float4 xe_edram_blend_constant; // Offset: 464 Size: 16 [unused] -// -// } -// -// -// Resource Bindings: -// -// Name Type Format Dim ID HLSL Bind Count -// ------------------------------ ---------- ------- ----------- ------- -------------- ------ -// xe_system_cbuffer cbuffer NA NA CB0 cb0 1 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// TEXCOORD 0 xyzw 0 NONE float xyzw -// TEXCOORD 1 xyzw 1 NONE float xyzw -// TEXCOORD 2 xyzw 2 NONE float xyzw -// TEXCOORD 3 xyzw 3 NONE float xyzw -// TEXCOORD 4 xyzw 4 NONE float xyzw -// TEXCOORD 5 xyzw 5 NONE float xyzw -// TEXCOORD 6 xyzw 6 NONE float xyzw -// TEXCOORD 7 xyzw 7 NONE float xyzw -// TEXCOORD 8 xyzw 8 NONE float xyzw -// TEXCOORD 9 xyzw 9 NONE float xyzw -// TEXCOORD 10 xyzw 10 NONE float xyzw -// TEXCOORD 11 xyzw 11 NONE float xyzw -// TEXCOORD 12 xyzw 12 NONE float xyzw -// TEXCOORD 13 xyzw 13 NONE float xyzw -// TEXCOORD 14 xyzw 14 NONE float xyzw -// TEXCOORD 15 xyzw 15 NONE float xyzw -// TEXCOORD 16 xyz 16 NONE float z -// SV_Position 0 xyzw 17 POS float xyzw -// SV_ClipDistance 0 xyzw 18 CLIPDST float xyzw -// SV_ClipDistance 1 xy 19 CLIPDST float xy -// SV_CullDistance 0 z 19 CULLDST float z -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// TEXCOORD 0 xyzw 0 NONE float xyzw -// TEXCOORD 1 xyzw 1 NONE float xyzw -// TEXCOORD 2 xyzw 2 NONE float xyzw -// TEXCOORD 3 xyzw 3 NONE float xyzw -// TEXCOORD 4 xyzw 4 NONE float xyzw -// TEXCOORD 5 xyzw 5 NONE float xyzw -// TEXCOORD 6 xyzw 6 NONE float xyzw -// TEXCOORD 7 xyzw 7 NONE float xyzw -// TEXCOORD 8 xyzw 8 NONE float xyzw -// TEXCOORD 9 xyzw 9 NONE float xyzw -// TEXCOORD 10 xyzw 10 NONE float xyzw -// TEXCOORD 11 xyzw 11 NONE float xyzw -// TEXCOORD 12 xyzw 12 NONE float xyzw -// TEXCOORD 13 xyzw 13 NONE float xyzw -// TEXCOORD 14 xyzw 14 NONE float xyzw -// TEXCOORD 15 xyzw 15 NONE float xyzw -// TEXCOORD 16 xyz 16 NONE float xyz -// SV_Position 0 xyzw 17 POS float xyzw -// SV_ClipDistance 0 xyzw 18 CLIPDST float xyzw -// SV_ClipDistance 1 xy 19 CLIPDST float xy -// -gs_5_1 -dcl_globalFlags refactoringAllowed -dcl_constantbuffer CB0[0:0][11], immediateIndexed, space=0 -dcl_input v[1][0].xyzw -dcl_input v[1][1].xyzw -dcl_input v[1][2].xyzw -dcl_input v[1][3].xyzw -dcl_input v[1][4].xyzw -dcl_input v[1][5].xyzw -dcl_input v[1][6].xyzw -dcl_input v[1][7].xyzw -dcl_input v[1][8].xyzw -dcl_input v[1][9].xyzw -dcl_input v[1][10].xyzw -dcl_input v[1][11].xyzw -dcl_input v[1][12].xyzw -dcl_input v[1][13].xyzw -dcl_input v[1][14].xyzw -dcl_input v[1][15].xyzw -dcl_input v[1][16].xyz -dcl_input_siv v[1][17].xyzw, position -dcl_input v[1][18].xyzw -dcl_input v[1][19].xy -dcl_input v[1][19].z -dcl_temps 3 -dcl_inputprimitive point -dcl_stream m0 -dcl_outputtopology trianglestrip -dcl_output o0.xyzw -dcl_output o1.xyzw -dcl_output o2.xyzw -dcl_output o3.xyzw -dcl_output o4.xyzw -dcl_output o5.xyzw -dcl_output o6.xyzw -dcl_output o7.xyzw -dcl_output o8.xyzw -dcl_output o9.xyzw -dcl_output o10.xyzw -dcl_output o11.xyzw -dcl_output o12.xyzw -dcl_output o13.xyzw -dcl_output o14.xyzw -dcl_output o15.xyzw -dcl_output o16.xyz -dcl_output_siv o17.xyzw, position -dcl_output_siv o18.xyzw, clip_distance -dcl_output_siv o19.xy, clip_distance -dcl_maxout 4 -lt [precise(x)] r0.x, v[0][19].z, l(0.000000) -ne [precise] r1.xyzw, v[0][17].xyzw, v[0][17].xyzw -or [precise(yz)] r0.yz, r1.zzwz, r1.xxyx -or [precise(y)] r0.y, r0.z, r0.y -or [precise(x)] r0.x, r0.y, r0.x -if_nz r0.x - ret -endif -ge [precise(x)] r0.x, v[0][16].z, l(0.000000) -movc [precise(xy)] r0.xy, r0.xxxx, v[0][16].zzzz, CB0[0][10].xyxx -lt [precise(zw)] r0.zw, l(0.000000, 0.000000, 0.000000, 0.000000), r0.xxxy -and [precise(z)] r0.z, r0.w, r0.z -if_z r0.z - ret -endif -mul [precise(xy)] r0.xy, r0.xyxx, CB0[0][10].zwzz -mul [precise(xy)] r0.xy, r0.xyxx, v[0][17].wwww -mov [precise(xyz)] r1.xyz, -r0.xxyx -mov [precise(w)] r1.w, r0.y -add [precise] r2.xyzw, r1.xwyz, v[0][17].xyxy -mov o0.xyzw, v[0][0].xyzw -mov o1.xyzw, v[0][1].xyzw -mov o2.xyzw, v[0][2].xyzw -mov o3.xyzw, v[0][3].xyzw -mov o4.xyzw, v[0][4].xyzw -mov o5.xyzw, v[0][5].xyzw -mov o6.xyzw, v[0][6].xyzw -mov o7.xyzw, v[0][7].xyzw -mov o8.xyzw, v[0][8].xyzw -mov o9.xyzw, v[0][9].xyzw -mov o10.xyzw, v[0][10].xyzw -mov o11.xyzw, v[0][11].xyzw -mov o12.xyzw, v[0][12].xyzw -mov o13.xyzw, v[0][13].xyzw -mov o14.xyzw, v[0][14].xyzw -mov o15.xyzw, v[0][15].xyzw -mov o16.xy, l(0,0,0,0) -mov o16.z, v[0][16].z -mov o17.xy, r2.xyxx -mov o17.zw, v[0][17].zzzw -mov o18.xyzw, v[0][18].xyzw -mov o19.xy, v[0][19].xyxx -emit_stream m0 -mov o0.xyzw, v[0][0].xyzw -mov o1.xyzw, v[0][1].xyzw -mov o2.xyzw, v[0][2].xyzw -mov o3.xyzw, v[0][3].xyzw -mov o4.xyzw, v[0][4].xyzw -mov o5.xyzw, v[0][5].xyzw -mov o6.xyzw, v[0][6].xyzw -mov o7.xyzw, v[0][7].xyzw -mov o8.xyzw, v[0][8].xyzw -mov o9.xyzw, v[0][9].xyzw -mov o10.xyzw, v[0][10].xyzw -mov o11.xyzw, v[0][11].xyzw -mov o12.xyzw, v[0][12].xyzw -mov o13.xyzw, v[0][13].xyzw -mov o14.xyzw, v[0][14].xyzw -mov o15.xyzw, v[0][15].xyzw -mov o16.xy, l(0,1.000000,0,0) -mov o16.z, v[0][16].z -mov o17.xy, r2.zwzz -mov o17.zw, v[0][17].zzzw -mov o18.xyzw, v[0][18].xyzw -mov o19.xy, v[0][19].xyxx -emit_stream m0 -add [precise(yw)] r0.yw, r0.xxxy, v[0][17].xxxy -mov o0.xyzw, v[0][0].xyzw -mov o1.xyzw, v[0][1].xyzw -mov o2.xyzw, v[0][2].xyzw -mov o3.xyzw, v[0][3].xyzw -mov o4.xyzw, v[0][4].xyzw -mov o5.xyzw, v[0][5].xyzw -mov o6.xyzw, v[0][6].xyzw -mov o7.xyzw, v[0][7].xyzw -mov o8.xyzw, v[0][8].xyzw -mov o9.xyzw, v[0][9].xyzw -mov o10.xyzw, v[0][10].xyzw -mov o11.xyzw, v[0][11].xyzw -mov o12.xyzw, v[0][12].xyzw -mov o13.xyzw, v[0][13].xyzw -mov o14.xyzw, v[0][14].xyzw -mov o15.xyzw, v[0][15].xyzw -mov o16.xy, l(1.000000,0,0,0) -mov o16.z, v[0][16].z -mov o17.xy, r0.ywyy -mov o17.zw, v[0][17].zzzw -mov o18.xyzw, v[0][18].xyzw -mov o19.xy, v[0][19].xyxx -emit_stream m0 -mov [precise(z)] r0.z, r1.z -add [precise(xy)] r0.xy, r0.xzxx, v[0][17].xyxx -mov o0.xyzw, v[0][0].xyzw -mov o1.xyzw, v[0][1].xyzw -mov o2.xyzw, v[0][2].xyzw -mov o3.xyzw, v[0][3].xyzw -mov o4.xyzw, v[0][4].xyzw -mov o5.xyzw, v[0][5].xyzw -mov o6.xyzw, v[0][6].xyzw -mov o7.xyzw, v[0][7].xyzw -mov o8.xyzw, v[0][8].xyzw -mov o9.xyzw, v[0][9].xyzw -mov o10.xyzw, v[0][10].xyzw -mov o11.xyzw, v[0][11].xyzw -mov o12.xyzw, v[0][12].xyzw -mov o13.xyzw, v[0][13].xyzw -mov o14.xyzw, v[0][14].xyzw -mov o15.xyzw, v[0][15].xyzw -mov o16.xy, l(1.000000,1.000000,0,0) -mov o16.z, v[0][16].z -mov o17.xy, r0.xyxx -mov o17.zw, v[0][17].zzzw -mov o18.xyzw, v[0][18].xyzw -mov o19.xy, v[0][19].xyxx -emit_stream m0 -cut_stream m0 -ret -// Approximately 117 instruction slots used -#endif - -const BYTE primitive_point_list_gs[] = -{ - 68, 88, 66, 67, 189, 205, - 170, 40, 149, 167, 183, 76, - 207, 160, 219, 147, 216, 124, - 203, 93, 1, 0, 0, 0, - 148, 29, 0, 0, 5, 0, - 0, 0, 52, 0, 0, 0, - 228, 10, 0, 0, 36, 13, - 0, 0, 140, 15, 0, 0, - 248, 28, 0, 0, 82, 68, - 69, 70, 168, 10, 0, 0, - 1, 0, 0, 0, 120, 0, - 0, 0, 1, 0, 0, 0, - 60, 0, 0, 0, 1, 5, - 83, 71, 0, 5, 0, 0, - 126, 10, 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, - 100, 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, 115, 121, 115, 116, 101, - 109, 95, 99, 98, 117, 102, - 102, 101, 114, 0, 171, 171, - 100, 0, 0, 0, 32, 0, - 0, 0, 144, 0, 0, 0, - 224, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 144, 5, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 196, 5, - 0, 0, 4, 0, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 232, 5, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 12, 6, 0, 0, - 12, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 39, 6, 0, 0, 16, 0, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 62, 6, - 0, 0, 20, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 85, 6, 0, 0, - 24, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, - 116, 6, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 152, 6, 0, 0, 32, 0, - 0, 0, 96, 0, 0, 0, - 0, 0, 0, 0, 180, 6, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 216, 6, - 0, 0, 128, 0, 0, 0, - 12, 0, 0, 0, 0, 0, - 0, 0, 236, 6, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 16, 7, 0, 0, - 140, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 52, 7, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 88, 7, 0, 0, 144, 0, - 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 236, 6, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 102, 7, - 0, 0, 156, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 52, 7, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 131, 7, 0, 0, - 160, 0, 0, 0, 8, 0, - 0, 0, 2, 0, 0, 0, - 232, 5, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 158, 7, 0, 0, 168, 0, - 0, 0, 8, 0, 0, 0, - 2, 0, 0, 0, 232, 5, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 197, 7, - 0, 0, 176, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 230, 7, 0, 0, - 180, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 246, 7, 0, 0, 184, 0, - 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 116, 6, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 11, 8, - 0, 0, 192, 0, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 44, 8, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 80, 8, 0, 0, - 224, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 101, 8, 0, 0, 228, 0, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 52, 7, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 125, 8, - 0, 0, 232, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 142, 8, 0, 0, - 236, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 182, 8, 0, 0, 240, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 200, 8, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 236, 8, - 0, 0, 0, 1, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 232, 5, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 7, 9, 0, 0, - 8, 1, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, - 232, 5, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 33, 9, 0, 0, 16, 1, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 67, 9, - 0, 0, 32, 1, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 84, 9, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 120, 9, 0, 0, - 64, 1, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 152, 9, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 188, 9, 0, 0, 80, 1, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 152, 9, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 213, 9, - 0, 0, 96, 1, 0, 0, - 64, 0, 0, 0, 0, 0, - 0, 0, 232, 9, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 12, 10, 0, 0, - 160, 1, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 36, 10, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 72, 10, 0, 0, 192, 1, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 152, 9, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 102, 10, - 0, 0, 208, 1, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 200, 8, 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, 102, - 108, 97, 103, 115, 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, 153, 5, 0, 0, - 120, 101, 95, 116, 101, 115, - 115, 101, 108, 108, 97, 116, - 105, 111, 110, 95, 102, 97, - 99, 116, 111, 114, 95, 114, - 97, 110, 103, 101, 0, 102, - 108, 111, 97, 116, 50, 0, - 1, 0, 3, 0, 1, 0, - 2, 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, 225, 5, 0, 0, - 120, 101, 95, 108, 105, 110, - 101, 95, 108, 111, 111, 112, - 95, 99, 108, 111, 115, 105, - 110, 103, 95, 105, 110, 100, - 101, 120, 0, 120, 101, 95, - 118, 101, 114, 116, 101, 120, - 95, 105, 110, 100, 101, 120, - 95, 101, 110, 100, 105, 97, - 110, 0, 120, 101, 95, 118, - 101, 114, 116, 101, 120, 95, - 105, 110, 100, 101, 120, 95, - 111, 102, 102, 115, 101, 116, - 0, 120, 101, 95, 118, 101, - 114, 116, 101, 120, 95, 105, - 110, 100, 101, 120, 95, 109, - 105, 110, 95, 109, 97, 120, - 0, 117, 105, 110, 116, 50, - 0, 171, 1, 0, 19, 0, - 1, 0, 2, 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, 109, 6, - 0, 0, 120, 101, 95, 117, - 115, 101, 114, 95, 99, 108, - 105, 112, 95, 112, 108, 97, - 110, 101, 115, 0, 102, 108, - 111, 97, 116, 52, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 172, 6, 0, 0, - 120, 101, 95, 110, 100, 99, - 95, 115, 99, 97, 108, 101, - 0, 102, 108, 111, 97, 116, - 51, 0, 1, 0, 3, 0, - 1, 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, 229, 6, - 0, 0, 120, 101, 95, 112, - 111, 105, 110, 116, 95, 118, - 101, 114, 116, 101, 120, 95, - 100, 105, 97, 109, 101, 116, - 101, 114, 95, 109, 105, 110, - 0, 102, 108, 111, 97, 116, - 0, 171, 0, 0, 3, 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, 45, 7, - 0, 0, 120, 101, 95, 110, - 100, 99, 95, 111, 102, 102, - 115, 101, 116, 0, 120, 101, - 95, 112, 111, 105, 110, 116, - 95, 118, 101, 114, 116, 101, - 120, 95, 100, 105, 97, 109, - 101, 116, 101, 114, 95, 109, - 97, 120, 0, 120, 101, 95, - 112, 111, 105, 110, 116, 95, - 99, 111, 110, 115, 116, 97, - 110, 116, 95, 100, 105, 97, - 109, 101, 116, 101, 114, 0, - 120, 101, 95, 112, 111, 105, - 110, 116, 95, 115, 99, 114, - 101, 101, 110, 95, 100, 105, - 97, 109, 101, 116, 101, 114, - 95, 116, 111, 95, 110, 100, - 99, 95, 114, 97, 100, 105, - 117, 115, 0, 120, 101, 95, - 105, 110, 116, 101, 114, 112, - 111, 108, 97, 116, 111, 114, - 95, 115, 97, 109, 112, 108, - 105, 110, 103, 95, 112, 97, - 116, 116, 101, 114, 110, 0, - 120, 101, 95, 112, 115, 95, - 112, 97, 114, 97, 109, 95, - 103, 101, 110, 0, 120, 101, - 95, 115, 97, 109, 112, 108, - 101, 95, 99, 111, 117, 110, - 116, 95, 108, 111, 103, 50, - 0, 120, 101, 95, 116, 101, - 120, 116, 117, 114, 101, 95, - 115, 119, 105, 122, 122, 108, - 101, 100, 95, 115, 105, 103, - 110, 115, 0, 117, 105, 110, - 116, 52, 0, 171, 1, 0, - 19, 0, 1, 0, 4, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 37, 8, 0, 0, 120, 101, - 95, 116, 101, 120, 116, 117, - 114, 101, 115, 95, 114, 101, - 115, 111, 108, 118, 101, 100, - 0, 120, 101, 95, 97, 108, - 112, 104, 97, 95, 116, 101, - 115, 116, 95, 114, 101, 102, - 101, 114, 101, 110, 99, 101, - 0, 120, 101, 95, 97, 108, - 112, 104, 97, 95, 116, 111, - 95, 109, 97, 115, 107, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 51, 50, 98, - 112, 112, 95, 116, 105, 108, - 101, 95, 112, 105, 116, 99, - 104, 95, 100, 119, 111, 114, - 100, 115, 95, 115, 99, 97, - 108, 101, 100, 0, 120, 101, - 95, 99, 111, 108, 111, 114, - 95, 101, 120, 112, 95, 98, - 105, 97, 115, 0, 1, 0, - 3, 0, 1, 0, 4, 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, - 172, 6, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 112, 111, 108, 121, 95, - 111, 102, 102, 115, 101, 116, - 95, 102, 114, 111, 110, 116, - 0, 120, 101, 95, 101, 100, - 114, 97, 109, 95, 112, 111, - 108, 121, 95, 111, 102, 102, - 115, 101, 116, 95, 98, 97, - 99, 107, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 100, 101, 112, 116, 104, 95, - 98, 97, 115, 101, 95, 100, - 119, 111, 114, 100, 115, 95, - 115, 99, 97, 108, 101, 100, - 0, 120, 101, 95, 101, 100, - 114, 97, 109, 95, 115, 116, - 101, 110, 99, 105, 108, 0, - 1, 0, 19, 0, 1, 0, - 4, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 37, 8, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, - 98, 97, 115, 101, 95, 100, - 119, 111, 114, 100, 115, 95, - 115, 99, 97, 108, 101, 100, - 0, 171, 1, 0, 19, 0, - 1, 0, 4, 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, 37, 8, - 0, 0, 120, 101, 95, 101, - 100, 114, 97, 109, 95, 114, - 116, 95, 102, 111, 114, 109, - 97, 116, 95, 102, 108, 97, - 103, 115, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 114, 116, 95, 99, 108, 97, - 109, 112, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 172, 6, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 107, 101, - 101, 112, 95, 109, 97, 115, - 107, 0, 171, 171, 1, 0, - 19, 0, 1, 0, 4, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 37, 8, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 98, 108, - 101, 110, 100, 95, 102, 97, - 99, 116, 111, 114, 115, 95, - 111, 112, 115, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 98, 108, 101, 110, 100, - 95, 99, 111, 110, 115, 116, - 97, 110, 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, 73, 83, - 71, 78, 56, 2, 0, 0, - 21, 0, 0, 0, 8, 0, - 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 3, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 4, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 6, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 6, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 7, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 7, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 9, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 9, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 10, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 10, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 12, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 12, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 13, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 13, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 15, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 16, 0, 0, 0, 7, 4, - 0, 0, 9, 2, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 15, 15, - 0, 0, 21, 2, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 18, 0, 0, 0, 15, 15, - 0, 0, 21, 2, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 3, 3, - 0, 0, 37, 2, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 4, 4, - 0, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 83, - 86, 95, 67, 108, 105, 112, - 68, 105, 115, 116, 97, 110, - 99, 101, 0, 83, 86, 95, - 67, 117, 108, 108, 68, 105, - 115, 116, 97, 110, 99, 101, - 0, 171, 171, 171, 79, 83, - 71, 53, 96, 2, 0, 0, - 20, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 3, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 6, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 6, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 7, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 9, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 9, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 10, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 12, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 13, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 15, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 16, 0, 0, 0, - 7, 8, 0, 0, 0, 0, - 0, 0, 65, 2, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 77, 2, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 18, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 77, 2, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 19, 0, 0, 0, - 3, 12, 0, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 83, 86, 95, 67, 108, - 105, 112, 68, 105, 115, 116, - 97, 110, 99, 101, 0, 171, - 171, 171, 83, 72, 69, 88, - 100, 13, 0, 0, 81, 0, - 2, 0, 89, 3, 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, - 11, 0, 0, 0, 0, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 5, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 6, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 7, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 9, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 10, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 11, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 12, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 14, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 15, 0, 0, 0, - 95, 0, 0, 4, 114, 16, - 32, 0, 1, 0, 0, 0, - 16, 0, 0, 0, 97, 0, - 0, 5, 242, 16, 32, 0, - 1, 0, 0, 0, 17, 0, - 0, 0, 1, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 18, 0, 0, 0, 95, 0, - 0, 4, 50, 16, 32, 0, - 1, 0, 0, 0, 19, 0, - 0, 0, 95, 0, 0, 4, - 66, 16, 32, 0, 1, 0, - 0, 0, 19, 0, 0, 0, - 104, 0, 0, 2, 3, 0, - 0, 0, 93, 8, 0, 1, - 143, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 92, 40, 0, 1, 101, 0, - 0, 3, 242, 32, 16, 0, - 0, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 2, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 3, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 4, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 5, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 6, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 7, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 8, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 9, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 10, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 11, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 12, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 13, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 14, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 15, 0, 0, 0, 101, 0, - 0, 3, 114, 32, 16, 0, - 16, 0, 0, 0, 103, 0, - 0, 4, 242, 32, 16, 0, - 17, 0, 0, 0, 1, 0, - 0, 0, 103, 0, 0, 4, - 242, 32, 16, 0, 18, 0, - 0, 0, 2, 0, 0, 0, - 103, 0, 0, 4, 50, 32, - 16, 0, 19, 0, 0, 0, - 2, 0, 0, 0, 94, 0, - 0, 2, 4, 0, 0, 0, - 49, 0, 8, 8, 18, 0, - 16, 0, 0, 0, 0, 0, - 42, 16, 32, 0, 0, 0, - 0, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 57, 0, 120, 9, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 60, 0, 48, 7, - 98, 0, 16, 0, 0, 0, - 0, 0, 166, 11, 16, 0, - 1, 0, 0, 0, 6, 1, - 16, 0, 1, 0, 0, 0, - 60, 0, 16, 7, 34, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 60, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 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, 29, 0, - 8, 8, 18, 0, 16, 0, - 0, 0, 0, 0, 42, 16, - 32, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 55, 0, 24, 12, 50, 0, - 16, 0, 0, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 166, 26, 32, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 70, 128, 48, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 0, - 49, 0, 96, 10, 194, 0, - 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, 6, 4, 16, 0, - 0, 0, 0, 0, 1, 0, - 32, 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, 31, 0, 0, 3, - 42, 0, 16, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 21, 0, 0, 1, 56, 0, - 24, 9, 50, 0, 16, 0, - 0, 0, 0, 0, 70, 0, - 16, 0, 0, 0, 0, 0, - 230, 138, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 56, 0, - 24, 8, 50, 0, 16, 0, - 0, 0, 0, 0, 70, 0, - 16, 0, 0, 0, 0, 0, - 246, 31, 32, 0, 0, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 56, 6, 114, 0, - 16, 0, 1, 0, 0, 0, - 6, 1, 16, 128, 65, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 64, 5, 130, 0, - 16, 0, 1, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 120, 8, - 242, 0, 16, 0, 2, 0, - 0, 0, 198, 9, 16, 0, - 1, 0, 0, 0, 70, 20, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 8, 50, 32, 16, 0, - 16, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 66, 32, - 16, 0, 16, 0, 0, 0, - 42, 16, 32, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 54, 0, 0, 5, 50, 32, - 16, 0, 17, 0, 0, 0, - 70, 0, 16, 0, 2, 0, - 0, 0, 54, 0, 0, 6, - 194, 32, 16, 0, 17, 0, - 0, 0, 166, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 18, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 18, 0, - 0, 0, 54, 0, 0, 6, - 50, 32, 16, 0, 19, 0, - 0, 0, 70, 16, 32, 0, - 0, 0, 0, 0, 19, 0, - 0, 0, 117, 0, 0, 3, - 0, 0, 17, 0, 0, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 1, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 2, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 3, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 4, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 4, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 5, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 5, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 6, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 6, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 7, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 8, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 8, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 9, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 9, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 10, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 10, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 11, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 11, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 12, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 12, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 13, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 13, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 14, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 14, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 15, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 54, 0, 0, 8, - 50, 32, 16, 0, 16, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 66, 32, 16, 0, - 16, 0, 0, 0, 42, 16, - 32, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 5, 50, 32, 16, 0, - 17, 0, 0, 0, 230, 10, - 16, 0, 2, 0, 0, 0, - 54, 0, 0, 6, 194, 32, - 16, 0, 17, 0, 0, 0, - 166, 30, 32, 0, 0, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 18, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 18, 0, 0, 0, - 54, 0, 0, 6, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 16, 32, 0, 0, 0, - 0, 0, 19, 0, 0, 0, - 117, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 0, 0, 80, 8, 162, 0, - 16, 0, 0, 0, 0, 0, - 6, 4, 16, 0, 0, 0, - 0, 0, 6, 20, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 1, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 2, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 3, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 4, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 4, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 5, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 5, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 6, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 6, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 7, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 8, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 8, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 9, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 9, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 10, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 10, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 11, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 11, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 12, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 12, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 13, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 13, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 14, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 14, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 15, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 54, 0, 0, 8, - 50, 32, 16, 0, 16, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 128, 63, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 66, 32, 16, 0, - 16, 0, 0, 0, 42, 16, - 32, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 5, 50, 32, 16, 0, - 17, 0, 0, 0, 214, 5, - 16, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 194, 32, - 16, 0, 17, 0, 0, 0, - 166, 30, 32, 0, 0, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 18, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 18, 0, 0, 0, - 54, 0, 0, 6, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 16, 32, 0, 0, 0, - 0, 0, 19, 0, 0, 0, - 117, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 54, 0, 32, 5, 66, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 1, 0, - 0, 0, 0, 0, 24, 8, - 50, 0, 16, 0, 0, 0, - 0, 0, 134, 0, 16, 0, - 0, 0, 0, 0, 70, 16, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 8, 50, 32, 16, 0, - 16, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 66, 32, - 16, 0, 16, 0, 0, 0, - 42, 16, 32, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 54, 0, 0, 5, 50, 32, - 16, 0, 17, 0, 0, 0, - 70, 0, 16, 0, 0, 0, - 0, 0, 54, 0, 0, 6, - 194, 32, 16, 0, 17, 0, - 0, 0, 166, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 18, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 18, 0, - 0, 0, 54, 0, 0, 6, - 50, 32, 16, 0, 19, 0, - 0, 0, 70, 16, 32, 0, - 0, 0, 0, 0, 19, 0, - 0, 0, 117, 0, 0, 3, - 0, 0, 17, 0, 0, 0, - 0, 0, 118, 0, 0, 3, - 0, 0, 17, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 148, 0, - 0, 0, 117, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 41, 0, 0, 0, - 10, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 3, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 5, 0, 0, 0, - 4, 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 -}; diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_quad_list_gs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_quad_list_gs.h deleted file mode 100644 index e349a4f47..000000000 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_quad_list_gs.h +++ /dev/null @@ -1,886 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 10.1 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// TEXCOORD 0 xyzw 0 NONE float xyzw -// TEXCOORD 1 xyzw 1 NONE float xyzw -// TEXCOORD 2 xyzw 2 NONE float xyzw -// TEXCOORD 3 xyzw 3 NONE float xyzw -// TEXCOORD 4 xyzw 4 NONE float xyzw -// TEXCOORD 5 xyzw 5 NONE float xyzw -// TEXCOORD 6 xyzw 6 NONE float xyzw -// TEXCOORD 7 xyzw 7 NONE float xyzw -// TEXCOORD 8 xyzw 8 NONE float xyzw -// TEXCOORD 9 xyzw 9 NONE float xyzw -// TEXCOORD 10 xyzw 10 NONE float xyzw -// TEXCOORD 11 xyzw 11 NONE float xyzw -// TEXCOORD 12 xyzw 12 NONE float xyzw -// TEXCOORD 13 xyzw 13 NONE float xyzw -// TEXCOORD 14 xyzw 14 NONE float xyzw -// TEXCOORD 15 xyzw 15 NONE float xyzw -// TEXCOORD 16 xyz 16 NONE float xyz -// SV_Position 0 xyzw 17 POS float xyzw -// SV_ClipDistance 0 xyzw 18 CLIPDST float xyzw -// SV_ClipDistance 1 xy 19 CLIPDST float xy -// SV_CullDistance 0 z 19 CULLDST float -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// TEXCOORD 0 xyzw 0 NONE float xyzw -// TEXCOORD 1 xyzw 1 NONE float xyzw -// TEXCOORD 2 xyzw 2 NONE float xyzw -// TEXCOORD 3 xyzw 3 NONE float xyzw -// TEXCOORD 4 xyzw 4 NONE float xyzw -// TEXCOORD 5 xyzw 5 NONE float xyzw -// TEXCOORD 6 xyzw 6 NONE float xyzw -// TEXCOORD 7 xyzw 7 NONE float xyzw -// TEXCOORD 8 xyzw 8 NONE float xyzw -// TEXCOORD 9 xyzw 9 NONE float xyzw -// TEXCOORD 10 xyzw 10 NONE float xyzw -// TEXCOORD 11 xyzw 11 NONE float xyzw -// TEXCOORD 12 xyzw 12 NONE float xyzw -// TEXCOORD 13 xyzw 13 NONE float xyzw -// TEXCOORD 14 xyzw 14 NONE float xyzw -// TEXCOORD 15 xyzw 15 NONE float xyzw -// TEXCOORD 16 xyz 16 NONE float xyz -// SV_Position 0 xyzw 17 POS float xyzw -// SV_ClipDistance 0 xyzw 18 CLIPDST float xyzw -// SV_ClipDistance 1 xy 19 CLIPDST float xy -// -gs_5_1 -dcl_globalFlags refactoringAllowed -dcl_input v[4][0].xyzw -dcl_input v[4][1].xyzw -dcl_input v[4][2].xyzw -dcl_input v[4][3].xyzw -dcl_input v[4][4].xyzw -dcl_input v[4][5].xyzw -dcl_input v[4][6].xyzw -dcl_input v[4][7].xyzw -dcl_input v[4][8].xyzw -dcl_input v[4][9].xyzw -dcl_input v[4][10].xyzw -dcl_input v[4][11].xyzw -dcl_input v[4][12].xyzw -dcl_input v[4][13].xyzw -dcl_input v[4][14].xyzw -dcl_input v[4][15].xyzw -dcl_input v[4][16].xyz -dcl_input_siv v[4][17].xyzw, position -dcl_input v[4][18].xyzw -dcl_input v[4][19].xy -dcl_input v[4][19].z -dcl_inputprimitive lineadj -dcl_stream m0 -dcl_outputtopology trianglestrip -dcl_output o0.xyzw -dcl_output o1.xyzw -dcl_output o2.xyzw -dcl_output o3.xyzw -dcl_output o4.xyzw -dcl_output o5.xyzw -dcl_output o6.xyzw -dcl_output o7.xyzw -dcl_output o8.xyzw -dcl_output o9.xyzw -dcl_output o10.xyzw -dcl_output o11.xyzw -dcl_output o12.xyzw -dcl_output o13.xyzw -dcl_output o14.xyzw -dcl_output o15.xyzw -dcl_output o16.xyz -dcl_output_siv o17.xyzw, position -dcl_output_siv o18.xyzw, clip_distance -dcl_output_siv o19.xy, clip_distance -dcl_maxout 4 -mov o0.xyzw, v[0][0].xyzw -mov o1.xyzw, v[0][1].xyzw -mov o2.xyzw, v[0][2].xyzw -mov o3.xyzw, v[0][3].xyzw -mov o4.xyzw, v[0][4].xyzw -mov o5.xyzw, v[0][5].xyzw -mov o6.xyzw, v[0][6].xyzw -mov o7.xyzw, v[0][7].xyzw -mov o8.xyzw, v[0][8].xyzw -mov o9.xyzw, v[0][9].xyzw -mov o10.xyzw, v[0][10].xyzw -mov o11.xyzw, v[0][11].xyzw -mov o12.xyzw, v[0][12].xyzw -mov o13.xyzw, v[0][13].xyzw -mov o14.xyzw, v[0][14].xyzw -mov o15.xyzw, v[0][15].xyzw -mov o16.xyz, v[0][16].xyzx -mov o17.xyzw, v[0][17].xyzw -mov o18.xyzw, v[0][18].xyzw -mov o19.xy, v[0][19].xyxx -emit_stream m0 -mov o0.xyzw, v[1][0].xyzw -mov o1.xyzw, v[1][1].xyzw -mov o2.xyzw, v[1][2].xyzw -mov o3.xyzw, v[1][3].xyzw -mov o4.xyzw, v[1][4].xyzw -mov o5.xyzw, v[1][5].xyzw -mov o6.xyzw, v[1][6].xyzw -mov o7.xyzw, v[1][7].xyzw -mov o8.xyzw, v[1][8].xyzw -mov o9.xyzw, v[1][9].xyzw -mov o10.xyzw, v[1][10].xyzw -mov o11.xyzw, v[1][11].xyzw -mov o12.xyzw, v[1][12].xyzw -mov o13.xyzw, v[1][13].xyzw -mov o14.xyzw, v[1][14].xyzw -mov o15.xyzw, v[1][15].xyzw -mov o16.xyz, v[1][16].xyzx -mov o17.xyzw, v[1][17].xyzw -mov o18.xyzw, v[1][18].xyzw -mov o19.xy, v[1][19].xyxx -emit_stream m0 -mov o0.xyzw, v[3][0].xyzw -mov o1.xyzw, v[3][1].xyzw -mov o2.xyzw, v[3][2].xyzw -mov o3.xyzw, v[3][3].xyzw -mov o4.xyzw, v[3][4].xyzw -mov o5.xyzw, v[3][5].xyzw -mov o6.xyzw, v[3][6].xyzw -mov o7.xyzw, v[3][7].xyzw -mov o8.xyzw, v[3][8].xyzw -mov o9.xyzw, v[3][9].xyzw -mov o10.xyzw, v[3][10].xyzw -mov o11.xyzw, v[3][11].xyzw -mov o12.xyzw, v[3][12].xyzw -mov o13.xyzw, v[3][13].xyzw -mov o14.xyzw, v[3][14].xyzw -mov o15.xyzw, v[3][15].xyzw -mov o16.xyz, v[3][16].xyzx -mov o17.xyzw, v[3][17].xyzw -mov o18.xyzw, v[3][18].xyzw -mov o19.xy, v[3][19].xyxx -emit_stream m0 -mov o0.xyzw, v[2][0].xyzw -mov o1.xyzw, v[2][1].xyzw -mov o2.xyzw, v[2][2].xyzw -mov o3.xyzw, v[2][3].xyzw -mov o4.xyzw, v[2][4].xyzw -mov o5.xyzw, v[2][5].xyzw -mov o6.xyzw, v[2][6].xyzw -mov o7.xyzw, v[2][7].xyzw -mov o8.xyzw, v[2][8].xyzw -mov o9.xyzw, v[2][9].xyzw -mov o10.xyzw, v[2][10].xyzw -mov o11.xyzw, v[2][11].xyzw -mov o12.xyzw, v[2][12].xyzw -mov o13.xyzw, v[2][13].xyzw -mov o14.xyzw, v[2][14].xyzw -mov o15.xyzw, v[2][15].xyzw -mov o16.xyz, v[2][16].xyzx -mov o17.xyzw, v[2][17].xyzw -mov o18.xyzw, v[2][18].xyzw -mov o19.xy, v[2][19].xyxx -emit_stream m0 -cut_stream m0 -ret -// Approximately 86 instruction slots used -#endif - -const BYTE primitive_quad_list_gs[] = -{ - 68, 88, 66, 67, 26, 143, - 179, 72, 238, 147, 43, 130, - 37, 11, 116, 191, 138, 68, - 255, 76, 1, 0, 0, 0, - 36, 16, 0, 0, 5, 0, - 0, 0, 52, 0, 0, 0, - 160, 0, 0, 0, 224, 2, - 0, 0, 72, 5, 0, 0, - 136, 15, 0, 0, 82, 68, - 69, 70, 100, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 60, 0, 0, 0, 1, 5, - 83, 71, 0, 5, 0, 0, - 60, 0, 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, - 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, 73, 83, - 71, 78, 56, 2, 0, 0, - 21, 0, 0, 0, 8, 0, - 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 3, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 4, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 6, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 6, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 7, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 7, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 9, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 9, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 10, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 10, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 12, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 12, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 13, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 13, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 15, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 16, 0, 0, 0, 7, 7, - 0, 0, 9, 2, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 15, 15, - 0, 0, 21, 2, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 18, 0, 0, 0, 15, 15, - 0, 0, 21, 2, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 3, 3, - 0, 0, 37, 2, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 4, 0, - 0, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 83, - 86, 95, 67, 108, 105, 112, - 68, 105, 115, 116, 97, 110, - 99, 101, 0, 83, 86, 95, - 67, 117, 108, 108, 68, 105, - 115, 116, 97, 110, 99, 101, - 0, 171, 171, 171, 79, 83, - 71, 53, 96, 2, 0, 0, - 20, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 3, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 6, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 6, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 7, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 9, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 9, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 10, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 12, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 13, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 15, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 16, 0, 0, 0, - 7, 8, 0, 0, 0, 0, - 0, 0, 65, 2, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 77, 2, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 18, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 77, 2, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 19, 0, 0, 0, - 3, 12, 0, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 83, 86, 95, 67, 108, - 105, 112, 68, 105, 115, 116, - 97, 110, 99, 101, 0, 171, - 171, 171, 83, 72, 69, 88, - 56, 10, 0, 0, 81, 0, - 2, 0, 142, 2, 0, 0, - 106, 8, 0, 1, 95, 0, - 0, 4, 242, 16, 32, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 4, 0, - 0, 0, 1, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 4, 0, 0, 0, 3, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 4, 0, - 0, 0, 4, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 4, 0, 0, 0, - 5, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 4, 0, 0, 0, 6, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 4, 0, - 0, 0, 7, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 4, 0, 0, 0, - 8, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 4, 0, 0, 0, 9, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 4, 0, - 0, 0, 10, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 4, 0, 0, 0, - 11, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 4, 0, 0, 0, 12, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 4, 0, - 0, 0, 13, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 4, 0, 0, 0, - 14, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 4, 0, 0, 0, 15, 0, - 0, 0, 95, 0, 0, 4, - 114, 16, 32, 0, 4, 0, - 0, 0, 16, 0, 0, 0, - 97, 0, 0, 5, 242, 16, - 32, 0, 4, 0, 0, 0, - 17, 0, 0, 0, 1, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 4, 0, - 0, 0, 18, 0, 0, 0, - 95, 0, 0, 4, 50, 16, - 32, 0, 4, 0, 0, 0, - 19, 0, 0, 0, 95, 0, - 0, 4, 66, 16, 32, 0, - 4, 0, 0, 0, 19, 0, - 0, 0, 93, 48, 0, 1, - 143, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 92, 40, 0, 1, 101, 0, - 0, 3, 242, 32, 16, 0, - 0, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 2, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 3, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 4, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 5, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 6, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 7, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 8, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 9, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 10, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 11, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 12, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 13, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 14, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 15, 0, 0, 0, 101, 0, - 0, 3, 114, 32, 16, 0, - 16, 0, 0, 0, 103, 0, - 0, 4, 242, 32, 16, 0, - 17, 0, 0, 0, 1, 0, - 0, 0, 103, 0, 0, 4, - 242, 32, 16, 0, 18, 0, - 0, 0, 2, 0, 0, 0, - 103, 0, 0, 4, 50, 32, - 16, 0, 19, 0, 0, 0, - 2, 0, 0, 0, 94, 0, - 0, 2, 4, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 1, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 2, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 3, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 4, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 5, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 5, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 6, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 6, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 7, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 8, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 8, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 9, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 9, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 10, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 10, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 11, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 11, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 12, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 12, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 13, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 13, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 14, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 14, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 15, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 54, 0, 0, 6, 114, 32, - 16, 0, 16, 0, 0, 0, - 70, 18, 32, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 17, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 18, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 18, 0, 0, 0, - 54, 0, 0, 6, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 16, 32, 0, 0, 0, - 0, 0, 19, 0, 0, 0, - 117, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 1, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 2, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 3, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 4, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 4, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 5, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 5, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 6, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 6, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 7, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 7, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 8, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 8, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 9, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 9, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 10, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 10, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 11, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 11, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 12, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 12, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 13, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 13, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 14, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 14, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 15, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 15, 0, 0, 0, - 54, 0, 0, 6, 114, 32, - 16, 0, 16, 0, 0, 0, - 70, 18, 32, 0, 1, 0, - 0, 0, 16, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 17, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 18, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 18, 0, 0, 0, - 54, 0, 0, 6, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 16, 32, 0, 1, 0, - 0, 0, 19, 0, 0, 0, - 117, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 1, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 2, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 2, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 3, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 3, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 4, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 5, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 5, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 6, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 6, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 7, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 7, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 8, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 8, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 9, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 9, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 10, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 10, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 11, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 11, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 12, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 12, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 13, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 13, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 14, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 14, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 15, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 15, 0, 0, 0, - 54, 0, 0, 6, 114, 32, - 16, 0, 16, 0, 0, 0, - 70, 18, 32, 0, 3, 0, - 0, 0, 16, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 17, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 18, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 18, 0, 0, 0, - 54, 0, 0, 6, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 16, 32, 0, 3, 0, - 0, 0, 19, 0, 0, 0, - 117, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 1, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 2, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 2, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 3, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 4, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 4, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 5, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 5, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 6, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 6, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 7, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 7, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 8, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 8, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 9, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 9, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 10, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 10, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 11, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 11, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 12, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 12, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 13, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 13, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 14, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 14, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 15, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 15, 0, 0, 0, - 54, 0, 0, 6, 114, 32, - 16, 0, 16, 0, 0, 0, - 70, 18, 32, 0, 2, 0, - 0, 0, 16, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 17, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 18, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 18, 0, 0, 0, - 54, 0, 0, 6, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 16, 32, 0, 2, 0, - 0, 0, 19, 0, 0, 0, - 117, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 118, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 62, 0, 0, 1, 83, 84, - 65, 84, 148, 0, 0, 0, - 86, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 41, 0, 0, 0, 0, 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, 0, 0, 0, 0, - 1, 0, 0, 0, 4, 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, 6, 0, 0, 0, - 5, 0, 0, 0, 4, 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 -}; diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_rectangle_list_gs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_rectangle_list_gs.h deleted file mode 100644 index 4c078e6ed..000000000 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_rectangle_list_gs.h +++ /dev/null @@ -1,2145 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 10.1 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// TEXCOORD 0 xyzw 0 NONE float xyzw -// TEXCOORD 1 xyzw 1 NONE float xyzw -// TEXCOORD 2 xyzw 2 NONE float xyzw -// TEXCOORD 3 xyzw 3 NONE float xyzw -// TEXCOORD 4 xyzw 4 NONE float xyzw -// TEXCOORD 5 xyzw 5 NONE float xyzw -// TEXCOORD 6 xyzw 6 NONE float xyzw -// TEXCOORD 7 xyzw 7 NONE float xyzw -// TEXCOORD 8 xyzw 8 NONE float xyzw -// TEXCOORD 9 xyzw 9 NONE float xyzw -// TEXCOORD 10 xyzw 10 NONE float xyzw -// TEXCOORD 11 xyzw 11 NONE float xyzw -// TEXCOORD 12 xyzw 12 NONE float xyzw -// TEXCOORD 13 xyzw 13 NONE float xyzw -// TEXCOORD 14 xyzw 14 NONE float xyzw -// TEXCOORD 15 xyzw 15 NONE float xyzw -// TEXCOORD 16 xyz 16 NONE float xyz -// SV_Position 0 xyzw 17 POS float xyzw -// SV_ClipDistance 0 xyzw 18 CLIPDST float xyzw -// SV_ClipDistance 1 xy 19 CLIPDST float xy -// SV_CullDistance 0 z 19 CULLDST float z -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// TEXCOORD 0 xyzw 0 NONE float xyzw -// TEXCOORD 1 xyzw 1 NONE float xyzw -// TEXCOORD 2 xyzw 2 NONE float xyzw -// TEXCOORD 3 xyzw 3 NONE float xyzw -// TEXCOORD 4 xyzw 4 NONE float xyzw -// TEXCOORD 5 xyzw 5 NONE float xyzw -// TEXCOORD 6 xyzw 6 NONE float xyzw -// TEXCOORD 7 xyzw 7 NONE float xyzw -// TEXCOORD 8 xyzw 8 NONE float xyzw -// TEXCOORD 9 xyzw 9 NONE float xyzw -// TEXCOORD 10 xyzw 10 NONE float xyzw -// TEXCOORD 11 xyzw 11 NONE float xyzw -// TEXCOORD 12 xyzw 12 NONE float xyzw -// TEXCOORD 13 xyzw 13 NONE float xyzw -// TEXCOORD 14 xyzw 14 NONE float xyzw -// TEXCOORD 15 xyzw 15 NONE float xyzw -// TEXCOORD 16 xyz 16 NONE float xyz -// SV_Position 0 xyzw 17 POS float xyzw -// SV_ClipDistance 0 xyzw 18 CLIPDST float xyzw -// SV_ClipDistance 1 xy 19 CLIPDST float xy -// -gs_5_1 -dcl_globalFlags refactoringAllowed -dcl_input v[3][0].xyzw -dcl_input v[3][1].xyzw -dcl_input v[3][2].xyzw -dcl_input v[3][3].xyzw -dcl_input v[3][4].xyzw -dcl_input v[3][5].xyzw -dcl_input v[3][6].xyzw -dcl_input v[3][7].xyzw -dcl_input v[3][8].xyzw -dcl_input v[3][9].xyzw -dcl_input v[3][10].xyzw -dcl_input v[3][11].xyzw -dcl_input v[3][12].xyzw -dcl_input v[3][13].xyzw -dcl_input v[3][14].xyzw -dcl_input v[3][15].xyzw -dcl_input v[3][16].xyz -dcl_input_siv v[3][17].xyzw, position -dcl_input v[3][18].xyzw -dcl_input v[3][19].xy -dcl_input v[3][19].z -dcl_temps 20 -dcl_inputprimitive triangle -dcl_stream m0 -dcl_outputtopology trianglestrip -dcl_output o0.xyzw -dcl_output o1.xyzw -dcl_output o2.xyzw -dcl_output o3.xyzw -dcl_output o4.xyzw -dcl_output o5.xyzw -dcl_output o6.xyzw -dcl_output o7.xyzw -dcl_output o8.xyzw -dcl_output o9.xyzw -dcl_output o10.xyzw -dcl_output o11.xyzw -dcl_output o12.xyzw -dcl_output o13.xyzw -dcl_output o14.xyzw -dcl_output o15.xyzw -dcl_output o16.xyz -dcl_output_siv o17.xyzw, position -dcl_output_siv o18.xyzw, clip_distance -dcl_output_siv o19.xy, clip_distance -dcl_maxout 6 -max [precise(x)] r0.x, v[1][19].z, v[0][19].z -max [precise(x)] r0.x, r0.x, v[2][19].z -lt [precise(x)] r0.x, r0.x, l(0.000000) -ne [precise] r1.xyzw, v[0][17].xyzw, v[0][17].xyzw -or [precise(yz)] r0.yz, r1.zzwz, r1.xxyx -or [precise(y)] r0.y, r0.z, r0.y -or [precise(x)] r0.x, r0.y, r0.x -ne [precise] r1.xyzw, v[1][17].xyzw, v[1][17].xyzw -or [precise(yz)] r0.yz, r1.zzwz, r1.xxyx -or [precise(y)] r0.y, r0.z, r0.y -or [precise(x)] r0.x, r0.y, r0.x -ne [precise] r1.xyzw, v[2][17].xyzw, v[2][17].xyzw -or [precise(yz)] r0.yz, r1.zzwz, r1.xxyx -or [precise(y)] r0.y, r0.z, r0.y -or [precise(x)] r0.x, r0.y, r0.x -if_nz r0.x - ret -endif -mov o0.xyzw, v[0][0].xyzw -mov o1.xyzw, v[0][1].xyzw -mov o2.xyzw, v[0][2].xyzw -mov o3.xyzw, v[0][3].xyzw -mov o4.xyzw, v[0][4].xyzw -mov o5.xyzw, v[0][5].xyzw -mov o6.xyzw, v[0][6].xyzw -mov o7.xyzw, v[0][7].xyzw -mov o8.xyzw, v[0][8].xyzw -mov o9.xyzw, v[0][9].xyzw -mov o10.xyzw, v[0][10].xyzw -mov o11.xyzw, v[0][11].xyzw -mov o12.xyzw, v[0][12].xyzw -mov o13.xyzw, v[0][13].xyzw -mov o14.xyzw, v[0][14].xyzw -mov o15.xyzw, v[0][15].xyzw -mov o16.xyz, v[0][16].xyzx -mov o17.xyzw, v[0][17].xyzw -mov o18.xyzw, v[0][18].xyzw -mov o19.xy, v[0][19].xyxx -emit_stream m0 -mov o0.xyzw, v[1][0].xyzw -mov o1.xyzw, v[1][1].xyzw -mov o2.xyzw, v[1][2].xyzw -mov o3.xyzw, v[1][3].xyzw -mov o4.xyzw, v[1][4].xyzw -mov o5.xyzw, v[1][5].xyzw -mov o6.xyzw, v[1][6].xyzw -mov o7.xyzw, v[1][7].xyzw -mov o8.xyzw, v[1][8].xyzw -mov o9.xyzw, v[1][9].xyzw -mov o10.xyzw, v[1][10].xyzw -mov o11.xyzw, v[1][11].xyzw -mov o12.xyzw, v[1][12].xyzw -mov o13.xyzw, v[1][13].xyzw -mov o14.xyzw, v[1][14].xyzw -mov o15.xyzw, v[1][15].xyzw -mov o16.xyz, v[1][16].xyzx -mov o17.xyzw, v[1][17].xyzw -mov o18.xyzw, v[1][18].xyzw -mov o19.xy, v[1][19].xyxx -emit_stream m0 -mov o0.xyzw, v[2][0].xyzw -mov o1.xyzw, v[2][1].xyzw -mov o2.xyzw, v[2][2].xyzw -mov o3.xyzw, v[2][3].xyzw -mov o4.xyzw, v[2][4].xyzw -mov o5.xyzw, v[2][5].xyzw -mov o6.xyzw, v[2][6].xyzw -mov o7.xyzw, v[2][7].xyzw -mov o8.xyzw, v[2][8].xyzw -mov o9.xyzw, v[2][9].xyzw -mov o10.xyzw, v[2][10].xyzw -mov o11.xyzw, v[2][11].xyzw -mov o12.xyzw, v[2][12].xyzw -mov o13.xyzw, v[2][13].xyzw -mov o14.xyzw, v[2][14].xyzw -mov o15.xyzw, v[2][15].xyzw -mov o16.xyz, v[2][16].xyzx -mov o17.xyzw, v[2][17].xyzw -mov o18.xyzw, v[2][18].xyzw -mov o19.xy, v[2][19].xyxx -emit_stream m0 -cut_stream m0 -add [precise(xyz)] r0.xyz, -v[0][17].xyzx, v[1][17].xyzx -add [precise(xyz)] r1.xyz, -v[0][17].xyzx, v[2][17].xyzx -add [precise(xyz)] r2.xyz, -v[1][17].xyzx, v[2][17].xyzx -dp3 [precise(x)] r0.x, r0.xyzx, r0.xyzx -dp3 [precise(y)] r0.y, r1.xyzx, r1.xyzx -dp3 [precise(z)] r0.z, r2.xyzx, r2.xyzx -lt [precise(w)] r0.w, r0.x, r0.z -lt [precise(x)] r1.x, r0.y, r0.z -and [precise(w)] r0.w, r0.w, r1.x -if_nz r0.w - mov o0.xyzw, v[2][0].xyzw - mov o1.xyzw, v[2][1].xyzw - mov o2.xyzw, v[2][2].xyzw - mov o3.xyzw, v[2][3].xyzw - mov o4.xyzw, v[2][4].xyzw - mov o5.xyzw, v[2][5].xyzw - mov o6.xyzw, v[2][6].xyzw - mov o7.xyzw, v[2][7].xyzw - mov o8.xyzw, v[2][8].xyzw - mov o9.xyzw, v[2][9].xyzw - mov o10.xyzw, v[2][10].xyzw - mov o11.xyzw, v[2][11].xyzw - mov o12.xyzw, v[2][12].xyzw - mov o13.xyzw, v[2][13].xyzw - mov o14.xyzw, v[2][14].xyzw - mov o15.xyzw, v[2][15].xyzw - mov o16.xyz, v[2][16].xyzx - mov o17.xyzw, v[2][17].xyzw - mov o18.xyzw, v[2][18].xyzw - mov o19.xy, v[2][19].xyxx - emit_stream m0 - mov o0.xyzw, v[1][0].xyzw - mov o1.xyzw, v[1][1].xyzw - mov o2.xyzw, v[1][2].xyzw - mov o3.xyzw, v[1][3].xyzw - mov o4.xyzw, v[1][4].xyzw - mov o5.xyzw, v[1][5].xyzw - mov o6.xyzw, v[1][6].xyzw - mov o7.xyzw, v[1][7].xyzw - mov o8.xyzw, v[1][8].xyzw - mov o9.xyzw, v[1][9].xyzw - mov o10.xyzw, v[1][10].xyzw - mov o11.xyzw, v[1][11].xyzw - mov o12.xyzw, v[1][12].xyzw - mov o13.xyzw, v[1][13].xyzw - mov o14.xyzw, v[1][14].xyzw - mov o15.xyzw, v[1][15].xyzw - mov o16.xyz, v[1][16].xyzx - mov o17.xyzw, v[1][17].xyzw - mov o18.xyzw, v[1][18].xyzw - mov o19.xy, v[1][19].xyxx - emit_stream m0 - mov [precise(xyz)] r0.xyz, l(1.000000,1.000000,-1.000000,0) -else - lt [precise(x)] r0.x, r0.x, r0.y - lt [precise(y)] r0.y, r0.z, r0.y - and [precise(x)] r0.x, r0.y, r0.x - if_nz r0.x - mov o0.xyzw, v[0][0].xyzw - mov o1.xyzw, v[0][1].xyzw - mov o2.xyzw, v[0][2].xyzw - mov o3.xyzw, v[0][3].xyzw - mov o4.xyzw, v[0][4].xyzw - mov o5.xyzw, v[0][5].xyzw - mov o6.xyzw, v[0][6].xyzw - mov o7.xyzw, v[0][7].xyzw - mov o8.xyzw, v[0][8].xyzw - mov o9.xyzw, v[0][9].xyzw - mov o10.xyzw, v[0][10].xyzw - mov o11.xyzw, v[0][11].xyzw - mov o12.xyzw, v[0][12].xyzw - mov o13.xyzw, v[0][13].xyzw - mov o14.xyzw, v[0][14].xyzw - mov o15.xyzw, v[0][15].xyzw - mov o16.xyz, v[0][16].xyzx - mov o17.xyzw, v[0][17].xyzw - mov o18.xyzw, v[0][18].xyzw - mov o19.xy, v[0][19].xyxx - emit_stream m0 - mov o0.xyzw, v[2][0].xyzw - mov o1.xyzw, v[2][1].xyzw - mov o2.xyzw, v[2][2].xyzw - mov o3.xyzw, v[2][3].xyzw - mov o4.xyzw, v[2][4].xyzw - mov o5.xyzw, v[2][5].xyzw - mov o6.xyzw, v[2][6].xyzw - mov o7.xyzw, v[2][7].xyzw - mov o8.xyzw, v[2][8].xyzw - mov o9.xyzw, v[2][9].xyzw - mov o10.xyzw, v[2][10].xyzw - mov o11.xyzw, v[2][11].xyzw - mov o12.xyzw, v[2][12].xyzw - mov o13.xyzw, v[2][13].xyzw - mov o14.xyzw, v[2][14].xyzw - mov o15.xyzw, v[2][15].xyzw - mov o16.xyz, v[2][16].xyzx - mov o17.xyzw, v[2][17].xyzw - mov o18.xyzw, v[2][18].xyzw - mov o19.xy, v[2][19].xyxx - emit_stream m0 - mov [precise(xy)] r0.xy, l(-1.000000,1.000000,0,0) - else - mov o0.xyzw, v[1][0].xyzw - mov o1.xyzw, v[1][1].xyzw - mov o2.xyzw, v[1][2].xyzw - mov o3.xyzw, v[1][3].xyzw - mov o4.xyzw, v[1][4].xyzw - mov o5.xyzw, v[1][5].xyzw - mov o6.xyzw, v[1][6].xyzw - mov o7.xyzw, v[1][7].xyzw - mov o8.xyzw, v[1][8].xyzw - mov o9.xyzw, v[1][9].xyzw - mov o10.xyzw, v[1][10].xyzw - mov o11.xyzw, v[1][11].xyzw - mov o12.xyzw, v[1][12].xyzw - mov o13.xyzw, v[1][13].xyzw - mov o14.xyzw, v[1][14].xyzw - mov o15.xyzw, v[1][15].xyzw - mov o16.xyz, v[1][16].xyzx - mov o17.xyzw, v[1][17].xyzw - mov o18.xyzw, v[1][18].xyzw - mov o19.xy, v[1][19].xyxx - emit_stream m0 - mov o0.xyzw, v[0][0].xyzw - mov o1.xyzw, v[0][1].xyzw - mov o2.xyzw, v[0][2].xyzw - mov o3.xyzw, v[0][3].xyzw - mov o4.xyzw, v[0][4].xyzw - mov o5.xyzw, v[0][5].xyzw - mov o6.xyzw, v[0][6].xyzw - mov o7.xyzw, v[0][7].xyzw - mov o8.xyzw, v[0][8].xyzw - mov o9.xyzw, v[0][9].xyzw - mov o10.xyzw, v[0][10].xyzw - mov o11.xyzw, v[0][11].xyzw - mov o12.xyzw, v[0][12].xyzw - mov o13.xyzw, v[0][13].xyzw - mov o14.xyzw, v[0][14].xyzw - mov o15.xyzw, v[0][15].xyzw - mov o16.xyz, v[0][16].xyzx - mov o17.xyzw, v[0][17].xyzw - mov o18.xyzw, v[0][18].xyzw - mov o19.xy, v[0][19].xyxx - emit_stream m0 - mov [precise(xy)] r0.xy, l(1.000000,-1.000000,0,0) - endif - mov [precise(z)] r0.z, l(1.000000) -endif -mul r1.xyzw, r0.xxxx, v[1][0].xyzw -mad r1.xyzw, r0.zzzz, v[0][0].xyzw, r1.xyzw -mad r1.xyzw, r0.yyyy, v[2][0].xyzw, r1.xyzw -mul r2.xyzw, r0.xxxx, v[1][1].xyzw -mad r2.xyzw, r0.zzzz, v[0][1].xyzw, r2.xyzw -mad r2.xyzw, r0.yyyy, v[2][1].xyzw, r2.xyzw -mul r3.xyzw, r0.xxxx, v[1][2].xyzw -mad r3.xyzw, r0.zzzz, v[0][2].xyzw, r3.xyzw -mad r3.xyzw, r0.yyyy, v[2][2].xyzw, r3.xyzw -mul r4.xyzw, r0.xxxx, v[1][3].xyzw -mad r4.xyzw, r0.zzzz, v[0][3].xyzw, r4.xyzw -mad r4.xyzw, r0.yyyy, v[2][3].xyzw, r4.xyzw -mul r5.xyzw, r0.xxxx, v[1][4].xyzw -mad r5.xyzw, r0.zzzz, v[0][4].xyzw, r5.xyzw -mad r5.xyzw, r0.yyyy, v[2][4].xyzw, r5.xyzw -mul r6.xyzw, r0.xxxx, v[1][5].xyzw -mad r6.xyzw, r0.zzzz, v[0][5].xyzw, r6.xyzw -mad r6.xyzw, r0.yyyy, v[2][5].xyzw, r6.xyzw -mul r7.xyzw, r0.xxxx, v[1][6].xyzw -mad r7.xyzw, r0.zzzz, v[0][6].xyzw, r7.xyzw -mad r7.xyzw, r0.yyyy, v[2][6].xyzw, r7.xyzw -mul r8.xyzw, r0.xxxx, v[1][7].xyzw -mad r8.xyzw, r0.zzzz, v[0][7].xyzw, r8.xyzw -mad r8.xyzw, r0.yyyy, v[2][7].xyzw, r8.xyzw -mul r9.xyzw, r0.xxxx, v[1][8].xyzw -mad r9.xyzw, r0.zzzz, v[0][8].xyzw, r9.xyzw -mad r9.xyzw, r0.yyyy, v[2][8].xyzw, r9.xyzw -mul r10.xyzw, r0.xxxx, v[1][9].xyzw -mad r10.xyzw, r0.zzzz, v[0][9].xyzw, r10.xyzw -mad r10.xyzw, r0.yyyy, v[2][9].xyzw, r10.xyzw -mul r11.xyzw, r0.xxxx, v[1][10].xyzw -mad r11.xyzw, r0.zzzz, v[0][10].xyzw, r11.xyzw -mad r11.xyzw, r0.yyyy, v[2][10].xyzw, r11.xyzw -mul r12.xyzw, r0.xxxx, v[1][11].xyzw -mad r12.xyzw, r0.zzzz, v[0][11].xyzw, r12.xyzw -mad r12.xyzw, r0.yyyy, v[2][11].xyzw, r12.xyzw -mul r13.xyzw, r0.xxxx, v[1][12].xyzw -mad r13.xyzw, r0.zzzz, v[0][12].xyzw, r13.xyzw -mad r13.xyzw, r0.yyyy, v[2][12].xyzw, r13.xyzw -mul r14.xyzw, r0.xxxx, v[1][13].xyzw -mad r14.xyzw, r0.zzzz, v[0][13].xyzw, r14.xyzw -mad r14.xyzw, r0.yyyy, v[2][13].xyzw, r14.xyzw -mul r15.xyzw, r0.xxxx, v[1][14].xyzw -mad r15.xyzw, r0.zzzz, v[0][14].xyzw, r15.xyzw -mad r15.xyzw, r0.yyyy, v[2][14].xyzw, r15.xyzw -mul r16.xyzw, r0.xxxx, v[1][15].xyzw -mad r16.xyzw, r0.zzzz, v[0][15].xyzw, r16.xyzw -mad r16.xyzw, r0.yyyy, v[2][15].xyzw, r16.xyzw -mul r17.xyz, r0.xxxx, v[1][16].xyzx -mad r17.xyz, r0.zzzz, v[0][16].xyzx, r17.xyzx -mad r17.xyz, r0.yyyy, v[2][16].xyzx, r17.xyzx -mul [precise] r18.xyzw, r0.zzzz, v[0][17].xyzw -mul [precise] r19.xyzw, r0.xxxx, v[1][17].xyzw -add [precise] r18.xyzw, r18.xyzw, r19.xyzw -mul [precise] r19.xyzw, r0.yyyy, v[2][17].xyzw -add [precise] r18.xyzw, r18.xyzw, r19.xyzw -mul r19.xyzw, r0.xxxx, v[1][18].xyzw -mad r19.xyzw, r0.zzzz, v[0][18].xyzw, r19.xyzw -mad r19.xyzw, r0.yyyy, v[2][18].xyzw, r19.xyzw -mul r0.xw, r0.xxxx, v[1][19].xxxy -mad r0.xz, r0.zzzz, v[0][19].xxyx, r0.xxwx -mad r0.xy, r0.yyyy, v[2][19].xyxx, r0.xzxx -mov o0.xyzw, r1.xyzw -mov o1.xyzw, r2.xyzw -mov o2.xyzw, r3.xyzw -mov o3.xyzw, r4.xyzw -mov o4.xyzw, r5.xyzw -mov o5.xyzw, r6.xyzw -mov o6.xyzw, r7.xyzw -mov o7.xyzw, r8.xyzw -mov o8.xyzw, r9.xyzw -mov o9.xyzw, r10.xyzw -mov o10.xyzw, r11.xyzw -mov o11.xyzw, r12.xyzw -mov o12.xyzw, r13.xyzw -mov o13.xyzw, r14.xyzw -mov o14.xyzw, r15.xyzw -mov o15.xyzw, r16.xyzw -mov o16.xyz, r17.xyzx -mov o17.xyzw, r18.xyzw -mov o18.xyzw, r19.xyzw -mov o19.xy, r0.xyxx -emit_stream m0 -cut_stream m0 -ret -// Approximately 315 instruction slots used -#endif - -const BYTE primitive_rectangle_list_gs[] = -{ - 68, 88, 66, 67, 84, 207, - 1, 11, 213, 109, 28, 213, - 94, 110, 135, 167, 112, 243, - 154, 30, 1, 0, 0, 0, - 68, 40, 0, 0, 5, 0, - 0, 0, 52, 0, 0, 0, - 160, 0, 0, 0, 224, 2, - 0, 0, 72, 5, 0, 0, - 168, 39, 0, 0, 82, 68, - 69, 70, 100, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 60, 0, 0, 0, 1, 5, - 83, 71, 0, 5, 0, 0, - 60, 0, 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, - 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, 73, 83, - 71, 78, 56, 2, 0, 0, - 21, 0, 0, 0, 8, 0, - 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 3, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 4, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 6, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 6, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 7, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 7, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 9, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 9, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 10, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 10, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 12, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 12, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 13, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 13, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 15, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 16, 0, 0, 0, 7, 7, - 0, 0, 9, 2, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 15, 15, - 0, 0, 21, 2, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 18, 0, 0, 0, 15, 15, - 0, 0, 21, 2, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 3, 3, - 0, 0, 37, 2, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 4, 4, - 0, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 83, - 86, 95, 67, 108, 105, 112, - 68, 105, 115, 116, 97, 110, - 99, 101, 0, 83, 86, 95, - 67, 117, 108, 108, 68, 105, - 115, 116, 97, 110, 99, 101, - 0, 171, 171, 171, 79, 83, - 71, 53, 96, 2, 0, 0, - 20, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 3, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 6, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 6, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 7, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 9, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 9, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 10, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 12, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 13, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 15, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 16, 0, 0, 0, - 7, 8, 0, 0, 0, 0, - 0, 0, 65, 2, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 77, 2, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 18, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 77, 2, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 19, 0, 0, 0, - 3, 12, 0, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 83, 86, 95, 67, 108, - 105, 112, 68, 105, 115, 116, - 97, 110, 99, 101, 0, 171, - 171, 171, 83, 72, 69, 88, - 88, 34, 0, 0, 81, 0, - 2, 0, 150, 8, 0, 0, - 106, 8, 0, 1, 95, 0, - 0, 4, 242, 16, 32, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 3, 0, 0, 0, 3, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 3, 0, 0, 0, 6, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 3, 0, - 0, 0, 7, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 3, 0, 0, 0, 9, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 3, 0, - 0, 0, 10, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 3, 0, 0, 0, 12, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 3, 0, - 0, 0, 13, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 3, 0, 0, 0, 15, 0, - 0, 0, 95, 0, 0, 4, - 114, 16, 32, 0, 3, 0, - 0, 0, 16, 0, 0, 0, - 97, 0, 0, 5, 242, 16, - 32, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 1, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 3, 0, - 0, 0, 18, 0, 0, 0, - 95, 0, 0, 4, 50, 16, - 32, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 95, 0, - 0, 4, 66, 16, 32, 0, - 3, 0, 0, 0, 19, 0, - 0, 0, 104, 0, 0, 2, - 20, 0, 0, 0, 93, 24, - 0, 1, 143, 0, 0, 3, - 0, 0, 17, 0, 0, 0, - 0, 0, 92, 40, 0, 1, - 101, 0, 0, 3, 242, 32, - 16, 0, 0, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 2, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 3, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 4, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 5, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 6, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 7, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 8, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 9, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 10, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 11, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 12, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 13, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 14, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 15, 0, 0, 0, - 101, 0, 0, 3, 114, 32, - 16, 0, 16, 0, 0, 0, - 103, 0, 0, 4, 242, 32, - 16, 0, 17, 0, 0, 0, - 1, 0, 0, 0, 103, 0, - 0, 4, 242, 32, 16, 0, - 18, 0, 0, 0, 2, 0, - 0, 0, 103, 0, 0, 4, - 50, 32, 16, 0, 19, 0, - 0, 0, 2, 0, 0, 0, - 94, 0, 0, 2, 6, 0, - 0, 0, 52, 0, 8, 9, - 18, 0, 16, 0, 0, 0, - 0, 0, 42, 16, 32, 0, - 1, 0, 0, 0, 19, 0, - 0, 0, 42, 16, 32, 0, - 0, 0, 0, 0, 19, 0, - 0, 0, 52, 0, 8, 8, - 18, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 42, 16, - 32, 0, 2, 0, 0, 0, - 19, 0, 0, 0, 49, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 57, 0, 120, 9, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 60, 0, 48, 7, - 98, 0, 16, 0, 0, 0, - 0, 0, 166, 11, 16, 0, - 1, 0, 0, 0, 6, 1, - 16, 0, 1, 0, 0, 0, - 60, 0, 16, 7, 34, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 60, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, - 0, 0, 57, 0, 120, 9, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 17, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 17, 0, - 0, 0, 60, 0, 48, 7, - 98, 0, 16, 0, 0, 0, - 0, 0, 166, 11, 16, 0, - 1, 0, 0, 0, 6, 1, - 16, 0, 1, 0, 0, 0, - 60, 0, 16, 7, 34, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 60, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, - 0, 0, 57, 0, 120, 9, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 17, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 17, 0, - 0, 0, 60, 0, 48, 7, - 98, 0, 16, 0, 0, 0, - 0, 0, 166, 11, 16, 0, - 1, 0, 0, 0, 6, 1, - 16, 0, 1, 0, 0, 0, - 60, 0, 16, 7, 34, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 60, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 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, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 1, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 1, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 2, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 2, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 118, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 0, 0, - 56, 10, 114, 0, 16, 0, - 0, 0, 0, 0, 70, 18, - 32, 128, 65, 0, 0, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 70, 18, 32, 0, - 1, 0, 0, 0, 17, 0, - 0, 0, 0, 0, 56, 10, - 114, 0, 16, 0, 1, 0, - 0, 0, 70, 18, 32, 128, - 65, 0, 0, 0, 0, 0, - 0, 0, 17, 0, 0, 0, - 70, 18, 32, 0, 2, 0, - 0, 0, 17, 0, 0, 0, - 0, 0, 56, 10, 114, 0, - 16, 0, 2, 0, 0, 0, - 70, 18, 32, 128, 65, 0, - 0, 0, 1, 0, 0, 0, - 17, 0, 0, 0, 70, 18, - 32, 0, 2, 0, 0, 0, - 17, 0, 0, 0, 16, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 0, 0, - 0, 0, 16, 0, 16, 7, - 34, 0, 16, 0, 0, 0, - 0, 0, 70, 2, 16, 0, - 1, 0, 0, 0, 70, 2, - 16, 0, 1, 0, 0, 0, - 16, 0, 32, 7, 66, 0, - 16, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 2, 0, - 0, 0, 70, 2, 16, 0, - 2, 0, 0, 0, 49, 0, - 64, 7, 130, 0, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 49, 0, 8, 7, - 18, 0, 16, 0, 1, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 0, 0, 0, 0, - 1, 0, 64, 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, 31, 0, - 4, 3, 58, 0, 16, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 2, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 2, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 1, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 1, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 56, 8, 114, 0, 16, 0, - 0, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 191, 0, 0, 0, 0, - 18, 0, 0, 1, 49, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 49, 0, 16, 7, - 34, 0, 16, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 1, 0, 8, 7, 18, 0, - 16, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 31, 0, - 4, 3, 10, 0, 16, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 2, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 2, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 24, 8, 50, 0, 16, 0, - 0, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 191, - 0, 0, 128, 63, 0, 0, - 0, 0, 0, 0, 0, 0, - 18, 0, 0, 1, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 1, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 1, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 24, 8, 50, 0, 16, 0, - 0, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 191, 0, 0, - 0, 0, 0, 0, 0, 0, - 21, 0, 0, 1, 54, 0, - 32, 5, 66, 0, 16, 0, - 0, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 21, 0, 0, 1, 56, 0, - 0, 8, 242, 0, 16, 0, - 1, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 1, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 1, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 2, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 2, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 70, 14, 16, 0, 2, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 2, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 70, 14, - 16, 0, 2, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 3, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 3, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 70, 14, - 16, 0, 3, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 3, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 2, 0, - 0, 0, 70, 14, 16, 0, - 3, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 4, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 4, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 70, 14, 16, 0, - 4, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 4, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 70, 14, 16, 0, 4, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 5, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 5, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 70, 14, 16, 0, 5, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 5, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 70, 14, - 16, 0, 5, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 6, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 5, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 6, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 70, 14, - 16, 0, 6, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 6, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 5, 0, - 0, 0, 70, 14, 16, 0, - 6, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 7, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 6, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 7, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 6, 0, - 0, 0, 70, 14, 16, 0, - 7, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 7, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 6, 0, 0, 0, - 70, 14, 16, 0, 7, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 8, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 7, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 8, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 70, 14, 16, 0, 8, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 8, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 7, 0, 0, 0, 70, 14, - 16, 0, 8, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 9, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 9, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 70, 14, - 16, 0, 9, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 9, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 8, 0, - 0, 0, 70, 14, 16, 0, - 9, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 10, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 9, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 10, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 9, 0, - 0, 0, 70, 14, 16, 0, - 10, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 10, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 9, 0, 0, 0, - 70, 14, 16, 0, 10, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 11, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 10, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 11, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 10, 0, 0, 0, - 70, 14, 16, 0, 11, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 11, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 10, 0, 0, 0, 70, 14, - 16, 0, 11, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 12, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 11, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 12, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 70, 14, - 16, 0, 12, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 12, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 11, 0, - 0, 0, 70, 14, 16, 0, - 12, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 13, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 12, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 13, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 12, 0, - 0, 0, 70, 14, 16, 0, - 13, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 13, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 12, 0, 0, 0, - 70, 14, 16, 0, 13, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 14, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 14, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 13, 0, 0, 0, - 70, 14, 16, 0, 14, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 14, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 13, 0, 0, 0, 70, 14, - 16, 0, 14, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 15, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 14, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 15, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 70, 14, - 16, 0, 15, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 15, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 14, 0, - 0, 0, 70, 14, 16, 0, - 15, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 16, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 15, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 16, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 70, 14, 16, 0, - 16, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 16, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 15, 0, 0, 0, - 70, 14, 16, 0, 16, 0, - 0, 0, 56, 0, 0, 8, - 114, 0, 16, 0, 17, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 18, - 32, 0, 1, 0, 0, 0, - 16, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 17, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 18, 32, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 70, 2, 16, 0, 17, 0, - 0, 0, 50, 0, 0, 10, - 114, 0, 16, 0, 17, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 18, - 32, 0, 2, 0, 0, 0, - 16, 0, 0, 0, 70, 2, - 16, 0, 17, 0, 0, 0, - 56, 0, 120, 8, 242, 0, - 16, 0, 18, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 56, 0, 120, 8, - 242, 0, 16, 0, 19, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 17, 0, 0, 0, 0, 0, - 120, 7, 242, 0, 16, 0, - 18, 0, 0, 0, 70, 14, - 16, 0, 18, 0, 0, 0, - 70, 14, 16, 0, 19, 0, - 0, 0, 56, 0, 120, 8, - 242, 0, 16, 0, 19, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 17, 0, 0, 0, 0, 0, - 120, 7, 242, 0, 16, 0, - 18, 0, 0, 0, 70, 14, - 16, 0, 18, 0, 0, 0, - 70, 14, 16, 0, 19, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 19, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 18, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 19, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 18, 0, 0, 0, - 70, 14, 16, 0, 19, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 19, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 18, 0, 0, 0, 70, 14, - 16, 0, 19, 0, 0, 0, - 56, 0, 0, 8, 146, 0, - 16, 0, 0, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 6, 20, 32, 0, - 1, 0, 0, 0, 19, 0, - 0, 0, 50, 0, 0, 10, - 82, 0, 16, 0, 0, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 6, 17, - 32, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 6, 3, - 16, 0, 0, 0, 0, 0, - 50, 0, 0, 10, 50, 0, - 16, 0, 0, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 16, 32, 0, - 2, 0, 0, 0, 19, 0, - 0, 0, 134, 0, 16, 0, - 0, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 54, 0, 0, 5, 242, 32, - 16, 0, 1, 0, 0, 0, - 70, 14, 16, 0, 2, 0, - 0, 0, 54, 0, 0, 5, - 242, 32, 16, 0, 2, 0, - 0, 0, 70, 14, 16, 0, - 3, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 14, - 16, 0, 4, 0, 0, 0, - 54, 0, 0, 5, 242, 32, - 16, 0, 4, 0, 0, 0, - 70, 14, 16, 0, 5, 0, - 0, 0, 54, 0, 0, 5, - 242, 32, 16, 0, 5, 0, - 0, 0, 70, 14, 16, 0, - 6, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 14, - 16, 0, 7, 0, 0, 0, - 54, 0, 0, 5, 242, 32, - 16, 0, 7, 0, 0, 0, - 70, 14, 16, 0, 8, 0, - 0, 0, 54, 0, 0, 5, - 242, 32, 16, 0, 8, 0, - 0, 0, 70, 14, 16, 0, - 9, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 14, - 16, 0, 10, 0, 0, 0, - 54, 0, 0, 5, 242, 32, - 16, 0, 10, 0, 0, 0, - 70, 14, 16, 0, 11, 0, - 0, 0, 54, 0, 0, 5, - 242, 32, 16, 0, 11, 0, - 0, 0, 70, 14, 16, 0, - 12, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 14, - 16, 0, 13, 0, 0, 0, - 54, 0, 0, 5, 242, 32, - 16, 0, 13, 0, 0, 0, - 70, 14, 16, 0, 14, 0, - 0, 0, 54, 0, 0, 5, - 242, 32, 16, 0, 14, 0, - 0, 0, 70, 14, 16, 0, - 15, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 14, - 16, 0, 16, 0, 0, 0, - 54, 0, 0, 5, 114, 32, - 16, 0, 16, 0, 0, 0, - 70, 2, 16, 0, 17, 0, - 0, 0, 54, 0, 0, 5, - 242, 32, 16, 0, 17, 0, - 0, 0, 70, 14, 16, 0, - 18, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 14, - 16, 0, 19, 0, 0, 0, - 54, 0, 0, 5, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 0, 16, 0, 0, 0, - 0, 0, 117, 0, 0, 3, - 0, 0, 17, 0, 0, 0, - 0, 0, 118, 0, 0, 3, - 0, 0, 17, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 148, 0, - 0, 0, 59, 1, 0, 0, - 20, 0, 0, 0, 0, 0, - 0, 0, 41, 0, 0, 0, - 78, 0, 0, 0, 0, 0, - 0, 0, 11, 0, 0, 0, - 4, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 10, 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, 5, 0, 0, 0, - 6, 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 -}; diff --git a/src/xenia/gpu/shaders/primitive_point_list.gs.hlsl b/src/xenia/gpu/shaders/primitive_point_list.gs.hlsl deleted file mode 100644 index b32f57fa2..000000000 --- a/src/xenia/gpu/shaders/primitive_point_list.gs.hlsl +++ /dev/null @@ -1,63 +0,0 @@ -#include "xenos_draw.hlsli" - -[maxvertexcount(4)] -void main(point XeVertexPreGS xe_in[1], - inout TriangleStream xe_stream) { - // TODO(Triang3l): Handle ps_ucp_mode (transform the host clip space to the - // guest one, calculate the distances to the user clip planes, cull using the - // distance from the center for modes 0, 1 and 2, cull and clip per-vertex for - // modes 2 and 3). - if (xe_in[0].cull_distance < 0.0 || any(isnan(xe_in[0].post_gs.position))) { - return; - } - - // The vertex shader's header writes -1.0 to point_size by default, so any - // non-negative value means that it was overwritten by the translated vertex - // shader. The per-vertex diameter is already clamped in the vertex shader - // (combined with making it non-negative). - float point_vertex_diameter = xe_in[0].post_gs.pre_ps.point_parameters.z; - float2 point_screen_diameter = (point_vertex_diameter >= 0.0) - ? point_vertex_diameter - : xe_point_constant_diameter; - if (!all(point_screen_diameter > 0.0)) { - // 4D5307F1 has zero-size snowflakes, drop them quicker. - return; - } - float2 point_clip_space_radius = - point_screen_diameter * xe_point_screen_diameter_to_ndc_radius * - xe_in[0].post_gs.position.w; - - XeVertexPostGS xe_out; - xe_out.pre_ps.interpolators = xe_in[0].post_gs.pre_ps.interpolators; - xe_out.pre_ps.point_parameters.z = xe_in[0].post_gs.pre_ps.point_parameters.z; - xe_out.position.zw = xe_in[0].post_gs.position.zw; - // TODO(Triang3l): Handle ps_ucp_mode. - xe_out.clip_distance_0123 = xe_in[0].post_gs.clip_distance_0123; - xe_out.clip_distance_45 = xe_in[0].post_gs.clip_distance_45; - - // V = 0 in the top (+Y in Direct3D), 1 in the bottom, according to the - // analysis of Adreno 200 behavior (V = 1 towards -gl_FragCoord.y, the bottom, - // but the top-left rule is used for rasterization, and gl_FragCoord is - // generated from |PsParamGen.xy| via multiply-addition as opposed to just - // addition, so -gl_FragCoord.y is likely positive in screen coordinates, or - // +|PsParamGen.y|). - // TODO(Triang3l): On Vulkan, sign of Y needs to inverted because of the - // upper-left origin. - xe_out.pre_ps.point_parameters.xy = float2(0.0, 0.0); - xe_out.position.xy = - xe_in[0].post_gs.position.xy + - float2(-point_clip_space_radius.x, point_clip_space_radius.y); - xe_stream.Append(xe_out); - xe_out.pre_ps.point_parameters.xy = float2(0.0, 1.0); - xe_out.position.xy = xe_in[0].post_gs.position.xy - point_clip_space_radius; - xe_stream.Append(xe_out); - xe_out.pre_ps.point_parameters.xy = float2(1.0, 0.0); - xe_out.position.xy = xe_in[0].post_gs.position.xy + point_clip_space_radius; - xe_stream.Append(xe_out); - xe_out.pre_ps.point_parameters.xy = float2(1.0, 1.0); - xe_out.position.xy = - xe_in[0].post_gs.position.xy + - float2(point_clip_space_radius.x, -point_clip_space_radius.y); - xe_stream.Append(xe_out); - xe_stream.RestartStrip(); -} diff --git a/src/xenia/gpu/shaders/primitive_quad_list.gs.hlsl b/src/xenia/gpu/shaders/primitive_quad_list.gs.hlsl deleted file mode 100644 index 874ee4247..000000000 --- a/src/xenia/gpu/shaders/primitive_quad_list.gs.hlsl +++ /dev/null @@ -1,23 +0,0 @@ -#include "xenos_draw.hlsli" - -[maxvertexcount(4)] -void main(lineadj XeVertexPreGS xe_in[4], - inout TriangleStream xe_stream) { - // Culling should probably be done per-triangle - while there's no - // RETAIN_QUADS on Adreno 2xx, on R6xx it's always disabled for - // non-tessellated quads, so they are always decomposed into triangles. - // Therefore, not doing any cull distance or NaN position checks here. - // TODO(Triang3l): Find whether vertex killing should actually work for each - // triangle or for the entire quad. - // TODO(Triang3l): Find the correct order. - XeVertexPostGS xe_out; - xe_out = xe_in[0].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[1].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[3].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[2].post_gs; - xe_stream.Append(xe_out); - xe_stream.RestartStrip(); -} diff --git a/src/xenia/gpu/shaders/primitive_rectangle_list.gs.hlsl b/src/xenia/gpu/shaders/primitive_rectangle_list.gs.hlsl deleted file mode 100644 index b76bb224f..000000000 --- a/src/xenia/gpu/shaders/primitive_rectangle_list.gs.hlsl +++ /dev/null @@ -1,103 +0,0 @@ -#include "xenos_draw.hlsli" - -[maxvertexcount(6)] -void main(triangle XeVertexPreGS xe_in[3], - inout TriangleStream xe_stream) { - if (max(max(xe_in[0].cull_distance, xe_in[1].cull_distance), - xe_in[2].cull_distance) < 0.0f || - any(isnan(xe_in[0].post_gs.position)) || - any(isnan(xe_in[1].post_gs.position)) || - any(isnan(xe_in[2].post_gs.position))) { - return; - } - - XeVertexPostGS xe_out; - - xe_out = xe_in[0].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[1].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[2].post_gs; - xe_stream.Append(xe_out); - xe_stream.RestartStrip(); - - // Find the diagonal (the edge that is longer than both the other two) and - // mirror the other vertex across it. - float3 edge_01 = - xe_in[1].post_gs.position.xyz - xe_in[0].post_gs.position.xyz; - float3 edge_02 = - xe_in[2].post_gs.position.xyz - xe_in[0].post_gs.position.xyz; - float3 edge_12 = - xe_in[2].post_gs.position.xyz - xe_in[1].post_gs.position.xyz; - float3 edge_squares = float3( - dot(edge_01, edge_01), dot(edge_02, edge_02), dot(edge_12, edge_12)); - float3 v3_signs; - if (edge_squares.z > edge_squares.x && edge_squares.z > edge_squares.y) { - // 12 is the diagonal. Most games use this form. - // - // 0 ------ 1 0: -1,-1 - // | - | 1: 1,-1 - // | // | 2: -1, 1 - // | - | 3: [ 1, 1 ] - // 2 ----- [3] - // - // 0 ------ 2 0: -1,-1 - // | - | 1: -1, 1 - // | // | 2: 1,-1 - // | - | 3: [ 1, 1 ] - // 1 ------[3] - xe_out = xe_in[2].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[1].post_gs; - xe_stream.Append(xe_out); - v3_signs = float3(-1.0f, 1.0f, 1.0f); - } else if (edge_squares.y > edge_squares.x && - edge_squares.y > edge_squares.z) { - // 02 is the diagonal. - // - // 0 ------ 1 0: -1,-1 - // | - | 1: 1,-1 - // | \\ | 2: 1, 1 - // | - | 3: [-1, 1 ] - // [3] ----- 2 - xe_out = xe_in[0].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[2].post_gs; - xe_stream.Append(xe_out); - v3_signs = float3(1.0f, -1.0f, 1.0f); - } else { - // 01 is the diagonal. Not seen in any game so far. - // - // 0 ------ 2 0: -1,-1 - // | - | 1: 1, 1 - // | \\ | 2: 1,-1 - // | - | 3: [-1, 1 ] - // [3] ----- 1 - xe_out = xe_in[1].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[0].post_gs; - xe_stream.Append(xe_out); - v3_signs = float3(1.0f, 1.0f, -1.0f); - } - [unroll] for (int i = 0; i < 16; ++i) { - xe_out.pre_ps.interpolators[i] = - v3_signs.x * xe_in[0].post_gs.pre_ps.interpolators[i] + - v3_signs.y * xe_in[1].post_gs.pre_ps.interpolators[i] + - v3_signs.z * xe_in[2].post_gs.pre_ps.interpolators[i]; - } - xe_out.pre_ps.point_parameters = - v3_signs.x * xe_in[0].post_gs.pre_ps.point_parameters + - v3_signs.y * xe_in[1].post_gs.pre_ps.point_parameters + - v3_signs.z * xe_in[2].post_gs.pre_ps.point_parameters; - xe_out.position = v3_signs.x * xe_in[0].post_gs.position + - v3_signs.y * xe_in[1].post_gs.position + - v3_signs.z * xe_in[2].post_gs.position; - xe_out.clip_distance_0123 = v3_signs.x * xe_in[0].post_gs.clip_distance_0123 + - v3_signs.y * xe_in[1].post_gs.clip_distance_0123 + - v3_signs.z * xe_in[2].post_gs.clip_distance_0123; - xe_out.clip_distance_45 = v3_signs.x * xe_in[0].post_gs.clip_distance_45 + - v3_signs.y * xe_in[1].post_gs.clip_distance_45 + - v3_signs.z * xe_in[2].post_gs.clip_distance_45; - xe_stream.Append(xe_out); - xe_stream.RestartStrip(); -} From 4cd4a91aa73f9e7c48339c03fc0b55468a834e6e Mon Sep 17 00:00:00 2001 From: Triang3l Date: Mon, 9 May 2022 19:17:55 +0300 Subject: [PATCH 13/14] [D3D12] Rectangle GS comment typo fix [ci skip] --- src/xenia/gpu/d3d12/pipeline_cache.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/xenia/gpu/d3d12/pipeline_cache.cc b/src/xenia/gpu/d3d12/pipeline_cache.cc index e35e94bb7..2d2fd8cdc 100644 --- a/src/xenia/gpu/d3d12/pipeline_cache.cc +++ b/src/xenia/gpu/d3d12/pipeline_cache.cc @@ -2598,8 +2598,7 @@ void PipelineCache::CreateDxbcGeometryShader( } a.OpEndIf(); - // Emit the triangle in the strip that consisting of the original - // vertices. + // Emit the triangle in the strip that consists of the original vertices. for (uint32_t i = 0; i < 3; ++i) { dxbc::Index input_vertex_index(0, i); for (uint32_t j = 0; j < key.interpolator_count; ++j) { From e6fb9883d2b9071c0d463a723ba74de8f040fe9d Mon Sep 17 00:00:00 2001 From: Triang3l Date: Mon, 9 May 2022 22:34:17 +0300 Subject: [PATCH 14/14] [D3D12] Discard primitives with NaN position in GS --- src/xenia/gpu/d3d12/pipeline_cache.cc | 45 +++++++++++---------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/src/xenia/gpu/d3d12/pipeline_cache.cc b/src/xenia/gpu/d3d12/pipeline_cache.cc index 2d2fd8cdc..1ae7bef55 100644 --- a/src/xenia/gpu/d3d12/pipeline_cache.cc +++ b/src/xenia/gpu/d3d12/pipeline_cache.cc @@ -2343,8 +2343,9 @@ void PipelineCache::CreateDxbcGeometryShader( } } - size_t dcl_temps_instruction_position_dwords = shader_out.size(); - size_t dcl_temps_count_position_dwords = a.OpDclTemps(0); + // At least 1 temporary register needed to discard primitives with NaN + // position. + size_t dcl_temps_count_position_dwords = a.OpDclTemps(1); a.OpDclInputPrimitive(input_primitive); dxbc::Dest stream(dxbc::Dest::M(0)); @@ -2380,13 +2381,25 @@ void PipelineCache::CreateDxbcGeometryShader( // Also, FXC generates only movs (from statically or dynamically indexed // v[#][#], from r#, or from a literal) to o# for some reason. - // Cull the whole primitive if all cull distances are < 0. + // Discard the whole primitive if any vertex has a NaN position (may also be + // set to NaN for emulation of vertex killing with the OR operator). + for (uint32_t i = 0; i < input_primitive_vertex_count; ++i) { + a.OpNE(dxbc::Dest::R(0), dxbc::Src::V2D(i, input_register_position), + dxbc::Src::V2D(i, input_register_position)); + a.OpOr(dxbc::Dest::R(0, 0b0011), dxbc::Src::R(0, 0b0100), + dxbc::Src::R(0, 0b1110)); + a.OpOr(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX), + dxbc::Src::R(0, dxbc::Src::kYYYY)); + a.OpRetC(true, dxbc::Src::R(0, dxbc::Src::kXXXX)); + } + + // Cull the whole primitive if any cull distance for all vertices in the + // primitive is < 0. // TODO(Triang3l): For points, handle ps_ucp_mode (transform the host clip // space to the guest one, calculate the distances to the user clip planes, // cull using the distance from the center for modes 0, 1 and 2, cull and clip // per-vertex for modes 2 and 3) - except for the vertex kill flag. if (input_cull_distance_count) { - stat.temp_register_count = std::max(UINT32_C(1), stat.temp_register_count); for (uint32_t i = 0; i < input_cull_distance_count; ++i) { uint32_t cull_distance_register = input_register_clip_and_cull_distances + ((input_clip_distance_count + i) >> 2); @@ -2424,8 +2437,6 @@ void PipelineCache::CreateDxbcGeometryShader( 2) & 3) << 2))); - stat.temp_register_count = - std::max(UINT32_C(1), stat.temp_register_count); if (key.has_point_size) { // The vertex shader's header writes -1.0 to point_size by default, so // any non-negative value means that it was overwritten by the @@ -2548,9 +2559,6 @@ void PipelineCache::CreateDxbcGeometryShader( // Input vertices are implicitly indexable, dcl_indexRange is not needed // for the first dimension of a v[#][#] index. - stat.temp_register_count = - std::max(UINT32_C(1), stat.temp_register_count); - // Get squares of edge lengths into r0.xyz to choose the longest edge. // r0.x = ||12||^2 a.OpAdd(dxbc::Dest::R(0, 0b0011), @@ -2711,23 +2719,8 @@ void PipelineCache::CreateDxbcGeometryShader( a.OpRet(); - if (stat.temp_register_count) { - // Write the actual number of temporary registers used. - shader_out[dcl_temps_count_position_dwords] = stat.temp_register_count; - } else { - // Remove the dcl_temps instruction (FXC doesn't generate it when temporary - // variables aren't used). - uint32_t dcl_temps_length_dwords = dxbc::GetOpcodeTokenInstructionLength( - shader_out[dcl_temps_instruction_position_dwords]); - size_t dcl_temps_end_position_dwords = - dcl_temps_instruction_position_dwords + dcl_temps_length_dwords; - size_t shader_size_with_dcl_temps = shader_out.size(); - std::memmove(shader_out.data() + dcl_temps_instruction_position_dwords, - shader_out.data() + dcl_temps_end_position_dwords, - sizeof(uint32_t) * (shader_size_with_dcl_temps - - dcl_temps_end_position_dwords)); - shader_out.resize(shader_size_with_dcl_temps - dcl_temps_length_dwords); - } + // Write the actual number of temporary registers used. + shader_out[dcl_temps_count_position_dwords] = stat.temp_register_count; // Write the shader program length in dwords. shader_out[shex_position_dwords + 1] =