diff --git a/src/xenia/gpu/d3d12/d3d12_command_processor.cc b/src/xenia/gpu/d3d12/d3d12_command_processor.cc index 955c2667b..9a49e43c6 100644 --- a/src/xenia/gpu/d3d12/d3d12_command_processor.cc +++ b/src/xenia/gpu/d3d12/d3d12_command_processor.cc @@ -2159,12 +2159,21 @@ bool D3D12CommandProcessor::IssueDraw(xenos::PrimitiveType primitive_type, draw_util::GetNormalizedDepthControl(regs); // Shader modifications. + uint32_t ps_param_gen_pos = UINT32_MAX; + uint32_t interpolator_mask = + pixel_shader ? (vertex_shader->writes_interpolators() & + pixel_shader->GetInterpolatorInputMask( + regs.Get(), + regs.Get(), ps_param_gen_pos)) + : 0; DxbcShaderTranslator::Modification vertex_shader_modification = pipeline_cache_->GetCurrentVertexShaderModification( - *vertex_shader, primitive_processing_result.host_vertex_shader_type); + *vertex_shader, primitive_processing_result.host_vertex_shader_type, + interpolator_mask); DxbcShaderTranslator::Modification pixel_shader_modification = pixel_shader ? pipeline_cache_->GetCurrentPixelShaderModification( - *pixel_shader, normalized_depth_control) + *pixel_shader, interpolator_mask, ps_param_gen_pos, + normalized_depth_control) : DxbcShaderTranslator::Modification(0); // Set up the render targets - this may perform dispatches and draws. @@ -3227,25 +3236,14 @@ void D3D12CommandProcessor::UpdateSystemConstantValues( if (pa_cl_vte_cntl.vtx_w0_fmt) { flags |= DxbcShaderTranslator::kSysFlag_WNotReciprocal; } - // User clip planes (UCP_ENA_#), when not CLIP_DISABLE. - if (!pa_cl_clip_cntl.clip_disable) { - flags |= (pa_cl_clip_cntl.value & 0b111111) - << DxbcShaderTranslator::kSysFlag_UserClipPlane0_Shift; - } // Whether the primitive is polygonal and SV_IsFrontFace matters. if (primitive_polygonal) { flags |= DxbcShaderTranslator::kSysFlag_PrimitivePolygonal; } // Primitive type. - if (vgt_draw_initiator.prim_type == xenos::PrimitiveType::kPointList) { - flags |= DxbcShaderTranslator::kSysFlag_PrimitivePoint; - } else if (draw_util::IsPrimitiveLine(regs)) { + if (draw_util::IsPrimitiveLine(regs)) { flags |= DxbcShaderTranslator::kSysFlag_PrimitiveLine; } - // Primitive killing condition. - if (pa_cl_clip_cntl.vtx_kill_or) { - flags |= DxbcShaderTranslator::kSysFlag_KillIfAnyVertexKilled; - } // Depth format. if (rb_depth_info.depth_format == xenos::DepthRenderTargetFormat::kD24FS8) { flags |= DxbcShaderTranslator::kSysFlag_DepthFloat24; @@ -3325,18 +3323,24 @@ void D3D12CommandProcessor::UpdateSystemConstantValues( system_constants_.vertex_index_max = vgt_max_vtx_indx; // User clip planes (UCP_ENA_#), when not CLIP_DISABLE. + // The shader knows only the total count - tightly packing the user clip + // planes that are actually used. if (!pa_cl_clip_cntl.clip_disable) { - for (uint32_t i = 0; i < 6; ++i) { - if (!(pa_cl_clip_cntl.value & (1 << i))) { - continue; - } - const float* ucp = ®s[XE_GPU_REG_PA_CL_UCP_0_X + i * 4].f32; - if (std::memcmp(system_constants_.user_clip_planes[i], ucp, + float* user_clip_plane_write_ptr = system_constants_.user_clip_planes[0]; + uint32_t user_clip_planes_remaining = pa_cl_clip_cntl.ucp_ena; + uint32_t user_clip_plane_index; + while (xe::bit_scan_forward(user_clip_planes_remaining, + &user_clip_plane_index)) { + user_clip_planes_remaining &= ~(UINT32_C(1) << user_clip_plane_index); + const float* user_clip_plane = + ®s[XE_GPU_REG_PA_CL_UCP_0_X + user_clip_plane_index * 4].f32; + if (std::memcmp(user_clip_plane_write_ptr, user_clip_plane, 4 * sizeof(float))) { dirty = true; - std::memcpy(system_constants_.user_clip_planes[i], ucp, + std::memcpy(user_clip_plane_write_ptr, user_clip_plane, 4 * sizeof(float)); } + user_clip_plane_write_ptr += 4; } } @@ -3387,22 +3391,6 @@ void D3D12CommandProcessor::UpdateSystemConstantValues( 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 = - xenos::GetInterpolatorSamplingPattern( - rb_surface_info.msaa_samples, sq_context_misc.sc_sample_cntl, - regs.Get().sampling_pattern); - dirty |= system_constants_.interpolator_sampling_pattern != - interpolator_sampling_pattern; - system_constants_.interpolator_sampling_pattern = - interpolator_sampling_pattern; - - // Pixel parameter register. - uint32_t ps_param_gen = - sq_program_cntl.param_gen ? sq_context_misc.param_gen_pos : UINT_MAX; - dirty |= system_constants_.ps_param_gen != ps_param_gen; - system_constants_.ps_param_gen = ps_param_gen; - // Texture signedness / gamma. bool gamma_render_target_as_srgb = render_target_cache_->gamma_render_target_as_srgb(); diff --git a/src/xenia/gpu/d3d12/pipeline_cache.cc b/src/xenia/gpu/d3d12/pipeline_cache.cc index ecb3e3ac6..8095199dd 100644 --- a/src/xenia/gpu/d3d12/pipeline_cache.cc +++ b/src/xenia/gpu/d3d12/pipeline_cache.cc @@ -643,8 +643,13 @@ void PipelineCache::InitializeShaderStorage( } GeometryShaderKey pipeline_geometry_shader_key; pipeline_runtime_description.geometry_shader = - GetGeometryShaderKey(pipeline_description.geometry_shader, - pipeline_geometry_shader_key) + GetGeometryShaderKey( + pipeline_description.geometry_shader, + DxbcShaderTranslator::Modification( + pipeline_description.vertex_shader_modification), + DxbcShaderTranslator::Modification( + pipeline_description.pixel_shader_modification), + pipeline_geometry_shader_key) ? &GetGeometryShader(pipeline_geometry_shader_key) : nullptr; pipeline_runtime_description.root_signature = @@ -855,29 +860,71 @@ D3D12Shader* PipelineCache::LoadShader(xenos::ShaderType shader_type, DxbcShaderTranslator::Modification PipelineCache::GetCurrentVertexShaderModification( - const Shader& shader, - Shader::HostVertexShaderType host_vertex_shader_type) const { + const Shader& shader, Shader::HostVertexShaderType host_vertex_shader_type, + uint32_t interpolator_mask) const { assert_true(shader.type() == xenos::ShaderType::kVertex); assert_true(shader.is_ucode_analyzed()); const auto& regs = register_file_; - auto sq_program_cntl = regs.Get(); - return DxbcShaderTranslator::Modification( + + DxbcShaderTranslator::Modification modification( shader_translator_->GetDefaultVertexShaderModification( - shader.GetDynamicAddressableRegisterCount(sq_program_cntl.vs_num_reg), + shader.GetDynamicAddressableRegisterCount( + regs.Get().vs_num_reg), host_vertex_shader_type)); + + modification.vertex.interpolator_mask = interpolator_mask; + + auto pa_cl_clip_cntl = regs.Get(); + uint32_t user_clip_planes = + pa_cl_clip_cntl.clip_disable ? 0 : pa_cl_clip_cntl.ucp_ena; + modification.vertex.user_clip_plane_count = xe::bit_count(user_clip_planes); + modification.vertex.user_clip_plane_cull = + uint32_t(user_clip_planes && pa_cl_clip_cntl.ucp_cull_only_ena); + modification.vertex.vertex_kill_and = + uint32_t((shader.writes_point_size_edge_flag_kill_vertex() & 0b100) && + !pa_cl_clip_cntl.vtx_kill_or); + + modification.vertex.output_point_size = + uint32_t((shader.writes_point_size_edge_flag_kill_vertex() & 0b001) && + regs.Get().prim_type == + xenos::PrimitiveType::kPointList); + + return modification; } DxbcShaderTranslator::Modification PipelineCache::GetCurrentPixelShaderModification( - const Shader& shader, reg::RB_DEPTHCONTROL normalized_depth_control) const { + const Shader& shader, uint32_t interpolator_mask, uint32_t param_gen_pos, + reg::RB_DEPTHCONTROL normalized_depth_control) const { assert_true(shader.type() == xenos::ShaderType::kPixel); assert_true(shader.is_ucode_analyzed()); const auto& regs = register_file_; - auto sq_program_cntl = regs.Get(); + DxbcShaderTranslator::Modification modification( shader_translator_->GetDefaultPixelShaderModification( shader.GetDynamicAddressableRegisterCount( - sq_program_cntl.ps_num_reg))); + regs.Get().ps_num_reg))); + + modification.pixel.interpolator_mask = interpolator_mask; + modification.pixel.interpolators_centroid = + interpolator_mask & + ~xenos::GetInterpolatorSamplingPattern( + regs.Get().msaa_samples, + regs.Get().sc_sample_cntl, + regs.Get().sampling_pattern); + + if (param_gen_pos < xenos::kMaxInterpolators) { + modification.pixel.param_gen_enable = 1; + modification.pixel.param_gen_interpolator = param_gen_pos; + modification.pixel.param_gen_point = + uint32_t(regs.Get().prim_type == + xenos::PrimitiveType::kPointList); + } else { + modification.pixel.param_gen_enable = 0; + modification.pixel.param_gen_interpolator = 0; + modification.pixel.param_gen_point = 0; + } + if (render_target_cache_.GetPath() == RenderTargetCache::Path::kHostRenderTargets) { using DepthStencilMode = @@ -901,6 +948,7 @@ PipelineCache::GetCurrentPixelShaderModification( } } } + return modification; } @@ -1086,6 +1134,8 @@ bool PipelineCache::TranslateAnalyzedShader( host_shader_type = "patch-indexed quad domain"; break; default: + assert(modification.vertex.host_vertex_shader_type == + Shader::HostVertexShaderType::kVertex); host_shader_type = "vertex"; } } else { @@ -1356,7 +1406,12 @@ bool PipelineCache::GetCurrentStateDescription( } GeometryShaderKey geometry_shader_key; runtime_description_out.geometry_shader = - GetGeometryShaderKey(description_out.geometry_shader, geometry_shader_key) + GetGeometryShaderKey( + description_out.geometry_shader, + DxbcShaderTranslator::Modification(vertex_shader->modification()), + DxbcShaderTranslator::Modification( + pixel_shader ? pixel_shader->modification() : 0), + geometry_shader_key) ? &GetGeometryShader(geometry_shader_key) : nullptr; @@ -1631,20 +1686,26 @@ bool PipelineCache::GetCurrentStateDescription( } bool PipelineCache::GetGeometryShaderKey( - PipelineGeometryShader geometry_shader_type, GeometryShaderKey& key_out) { + PipelineGeometryShader geometry_shader_type, + DxbcShaderTranslator::Modification vertex_shader_modification, + DxbcShaderTranslator::Modification pixel_shader_modification, + GeometryShaderKey& key_out) { if (geometry_shader_type == PipelineGeometryShader::kNone) { return false; } + assert_true(vertex_shader_modification.vertex.interpolator_mask == + pixel_shader_modification.pixel.interpolator_mask); 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.interpolator_count = + xe::bit_count(vertex_shader_modification.vertex.interpolator_mask); + key.user_clip_plane_count = + vertex_shader_modification.vertex.user_clip_plane_count; + key.user_clip_plane_cull = + vertex_shader_modification.vertex.user_clip_plane_cull; + key.has_vertex_kill_and = vertex_shader_modification.vertex.vertex_kill_and; + key.has_point_size = vertex_shader_modification.vertex.output_point_size; + key.has_point_coordinates = pixel_shader_modification.pixel.param_gen_point; key_out = key; return true; } @@ -1886,16 +1947,15 @@ void PipelineCache::CreateDxbcGeometryShader( 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. + // Interpolators, position, clip and cull distances (parameters containing + // only clip or cull distances, and also one parameter containing both if + // present), point size. uint32_t isgn_parameter_count = - key.interpolator_count + key.has_point_size + 1 + + key.interpolator_count + 1 + ((input_clip_and_cull_distance_count + 3) / 4) + uint32_t(input_cull_distance_count && - (input_clip_distance_count & 3) != 0); + (input_clip_distance_count & 3) != 0) + + key.has_point_size; // Reserve space for the header and the parameters. shader_out[blob_offset_position_dwords] = @@ -1910,7 +1970,7 @@ void PipelineCache::CreateDxbcGeometryShader( 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) { + if (key.interpolator_count) { name_ptr += dxbc::AppendAlignedString(shader_out, "TEXCOORD"); } uint32_t isgn_name_ptr_sv_position = name_ptr; @@ -1923,12 +1983,16 @@ void PipelineCache::CreateDxbcGeometryShader( if (input_cull_distance_count) { name_ptr += dxbc::AppendAlignedString(shader_out, "SV_CullDistance"); } + uint32_t isgn_name_ptr_xepsize = name_ptr; + if (key.has_point_size) { + name_ptr += dxbc::AppendAlignedString(shader_out, "XEPSIZE"); + } // 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; + uint32_t input_register_point_size = UINT32_MAX; { // Header. auto& isgn_header = *reinterpret_cast( @@ -1960,27 +2024,7 @@ void PipelineCache::CreateDxbcGeometryShader( } } - // 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. + // Position (SV_Position). input_register_position = input_register_index; assert_true(isgn_parameter_index < isgn_parameter_count); dxbc::SignatureParameter& isgn_sv_position = @@ -1993,7 +2037,7 @@ void PipelineCache::CreateDxbcGeometryShader( isgn_sv_position.mask = 0b1111; isgn_sv_position.always_reads_mask = 0b1111; - // Clip and cull distances. + // Clip and cull distances (SV_ClipDistance#, SV_CullDistance#). if (input_clip_and_cull_distance_count) { input_register_clip_and_cull_distances = input_register_index; uint32_t isgn_cull_distance_semantic_index = 0; @@ -2041,6 +2085,21 @@ void PipelineCache::CreateDxbcGeometryShader( } } + // Point size (XEPSIZE). + 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_xepsize; + isgn_point_size.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + isgn_point_size.register_index = input_register_index++; + isgn_point_size.mask = 0b0001; + isgn_point_size.always_reads_mask = + key.type == PipelineGeometryShader::kPointList ? 0b0001 : 0; + } + assert_true(isgn_parameter_index == isgn_parameter_count); } @@ -2059,8 +2118,6 @@ void PipelineCache::CreateDxbcGeometryShader( // *************************************************************************** // 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); @@ -2078,9 +2135,13 @@ void PipelineCache::CreateDxbcGeometryShader( 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) { + if (key.interpolator_count) { name_ptr += dxbc::AppendAlignedString(shader_out, "TEXCOORD"); } + uint32_t osgn_name_ptr_xespritetexcoord = name_ptr; + if (key.has_point_coordinates) { + name_ptr += dxbc::AppendAlignedString(shader_out, "XESPRITETEXCOORD"); + } 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; @@ -2123,26 +2184,21 @@ void PipelineCache::CreateDxbcGeometryShader( } } - // 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. + // Point coordinates (XESPRITETEXCOORD). 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.semantic_name_ptr = osgn_name_ptr_xespritetexcoord; osgn_point_coordinates.component_type = dxbc::SignatureRegisterComponentType::kFloat32; osgn_point_coordinates.register_index = output_register_index++; - osgn_point_coordinates.mask = 0b0111; + osgn_point_coordinates.mask = 0b0011; osgn_point_coordinates.never_writes_mask = 0b1100; } - // Position. + // Position (SV_Position). output_register_position = output_register_index; assert_true(osgn_parameter_index < osgn_parameter_count); dxbc::SignatureParameterForGS& osgn_sv_position = @@ -2154,7 +2210,7 @@ void PipelineCache::CreateDxbcGeometryShader( osgn_sv_position.register_index = output_register_index++; osgn_sv_position.mask = 0b1111; - // Clip distances. + // Clip distances (SV_ClipDistance#). if (input_clip_distance_count) { output_register_clip_distances = output_register_index; for (uint32_t i = 0; i < input_clip_distance_count; i += 4) { @@ -2256,11 +2312,6 @@ void PipelineCache::CreateDxbcGeometryShader( 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); @@ -2292,6 +2343,11 @@ void PipelineCache::CreateDxbcGeometryShader( cull_distance_mask)); } } + 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, 0b0001)); + } // At least 1 temporary register needed to discard primitives with NaN // position. @@ -2394,10 +2450,10 @@ void PipelineCache::CreateDxbcGeometryShader( // 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::V2D(0, input_register_point_size, dxbc::Src::kXXXX), 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), + dxbc::Src::V2D(0, input_register_point_size, dxbc::Src::kXXXX), point_size_src); point_size_src = dxbc::Src::R(0, 0b0100); } diff --git a/src/xenia/gpu/d3d12/pipeline_cache.h b/src/xenia/gpu/d3d12/pipeline_cache.h index 8f19858d7..d1ede5ffa 100644 --- a/src/xenia/gpu/d3d12/pipeline_cache.h +++ b/src/xenia/gpu/d3d12/pipeline_cache.h @@ -78,9 +78,10 @@ class PipelineCache { // have microcode analyzed. DxbcShaderTranslator::Modification GetCurrentVertexShaderModification( const Shader& shader, - Shader::HostVertexShaderType host_vertex_shader_type) const; + Shader::HostVertexShaderType host_vertex_shader_type, + uint32_t interpolator_mask) const; DxbcShaderTranslator::Modification GetCurrentPixelShaderModification( - const Shader& shader, + const Shader& shader, uint32_t interpolator_mask, uint32_t param_gen_pos, reg::RB_DEPTHCONTROL normalized_depth_control) const; // If draw_util::IsRasterizationPotentiallyDone is false, the pixel shader @@ -290,8 +291,11 @@ 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 bool GetGeometryShaderKey( + PipelineGeometryShader geometry_shader_type, + DxbcShaderTranslator::Modification vertex_shader_modification, + DxbcShaderTranslator::Modification pixel_shader_modification, + GeometryShaderKey& key_out); static void CreateDxbcGeometryShader(GeometryShaderKey key, std::vector& shader_out); const std::vector& GetGeometryShader(GeometryShaderKey key); diff --git a/src/xenia/gpu/dxbc_shader_translator.cc b/src/xenia/gpu/dxbc_shader_translator.cc index 41b868a18..e87a18724 100644 --- a/src/xenia/gpu/dxbc_shader_translator.cc +++ b/src/xenia/gpu/dxbc_shader_translator.cc @@ -108,6 +108,8 @@ uint64_t DxbcShaderTranslator::GetDefaultVertexShaderModification( shader_modification.vertex.dynamic_addressable_register_count = dynamic_addressable_register_count; shader_modification.vertex.host_vertex_shader_type = host_vertex_shader_type; + shader_modification.vertex.interpolator_mask = + (UINT32_C(1) << xenos::kMaxInterpolators) - 1; return shader_modification.value; } @@ -116,6 +118,8 @@ uint64_t DxbcShaderTranslator::GetDefaultPixelShaderModification( Modification shader_modification; shader_modification.pixel.dynamic_addressable_register_count = dynamic_addressable_register_count; + shader_modification.pixel.interpolator_mask = + (UINT32_C(1) << xenos::kMaxInterpolators) - 1; shader_modification.pixel.depth_stencil_mode = Modification::DepthStencilMode::kNoModifiers; return shader_modification.value; @@ -136,6 +140,15 @@ void DxbcShaderTranslator::Reset() { system_constants_used_ = 0; + out_reg_vs_interpolators_ = UINT32_MAX; + out_reg_vs_position_ = UINT32_MAX; + out_reg_vs_clip_cull_distances_ = UINT32_MAX; + out_reg_vs_point_size_ = UINT32_MAX; + in_reg_ps_interpolators_ = UINT32_MAX; + in_reg_ps_point_coordinates_ = UINT32_MAX; + in_reg_ps_position_ = UINT32_MAX; + in_reg_ps_front_face_sample_index_ = UINT32_MAX; + in_domain_location_used_ = 0; in_primitive_id_used_ = false; in_control_point_index_used_ = false; @@ -384,17 +397,14 @@ void DxbcShaderTranslator::StartVertexShader_LoadVertexIndex() { // Check if the closing vertex of a non-indexed line loop is being processed. a_.OpINE( - index_dest, - dxbc::Src::V1D(uint32_t(InOutRegister::kVSInVertexIndex), - dxbc::Src::kXXXX), + index_dest, dxbc::Src::V1D(kInRegisterVSVertexIndex, 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::V1D(uint32_t(InOutRegister::kVSInVertexIndex), - dxbc::Src::kXXXX), + dxbc::Src::V1D(kInRegisterVSVertexIndex, dxbc::Src::kXXXX), index_src); { @@ -453,12 +463,21 @@ void DxbcShaderTranslator::StartVertexOrDomainShader() { bool uses_register_dynamic_addressing = current_shader().uses_register_dynamic_addressing(); - // Zero the interpolators. - for (uint32_t i = 0; i < xenos::kMaxInterpolators; ++i) { - a_.OpMov(dxbc::Dest::O(uint32_t(InOutRegister::kVSDSOutInterpolators) + i), + // Zero general-purpose registers to prevent crashes when the game + // references them after only initializing them conditionally. + for (uint32_t i = 0; i < register_count(); ++i) { + a_.OpMov(uses_register_dynamic_addressing ? dxbc::Dest::X(0, i) + : dxbc::Dest::R(i), dxbc::Src::LF(0.0f)); } + // Zero the interpolators. + uint32_t interpolator_count = + xe::bit_count(GetModificationInterpolatorMask()); + for (uint32_t i = 0; i < interpolator_count; ++i) { + a_.OpMov(dxbc::Dest::O(out_reg_vs_interpolators_ + i), dxbc::Src::LF(0.0f)); + } + // Remember that x# are only accessible via mov load or store - use a // temporary variable if need to do any computations! Shader::HostVertexShaderType host_vertex_shader_type = @@ -486,9 +505,8 @@ void DxbcShaderTranslator::StartVertexOrDomainShader() { in_control_point_index_used_ = true; for (uint32_t i = 0; i < 3; ++i) { a_.OpMov(control_point_index_dest.Mask(1 << i), - dxbc::Src::VICP( - i, uint32_t(InOutRegister::kDSInControlPointIndex), - dxbc::Src::kXXXX)); + dxbc::Src::VICP(i, kInRegisterDSControlPointIndex, + dxbc::Src::kXXXX)); } } } @@ -560,20 +578,18 @@ void DxbcShaderTranslator::StartVertexOrDomainShader() { // r1.y for r0.x * r0.y // r1.z for (1 - r0.x) * r0.y in_control_point_index_used_ = true; - a_.OpMov( - uses_register_dynamic_addressing ? dxbc::Dest::X(0, 0, 0b0100) - : dxbc::Dest::R(0, 0b0100), - dxbc::Src::VICP(0, uint32_t(InOutRegister::kDSInControlPointIndex), - dxbc::Src::kXXXX)); + a_.OpMov(uses_register_dynamic_addressing ? dxbc::Dest::X(0, 0, 0b0100) + : dxbc::Dest::R(0, 0b0100), + dxbc::Src::VICP(0, kInRegisterDSControlPointIndex, + dxbc::Src::kXXXX)); if (register_count() >= 2) { dxbc::Dest r1_dest(uses_register_dynamic_addressing ? dxbc::Dest::X(0, 1) : dxbc::Dest::R(1)); for (uint32_t i = 0; i < 3; ++i) { a_.OpMov(r1_dest.Mask(1 << i), - dxbc::Src::VICP( - 1 + i, uint32_t(InOutRegister::kDSInControlPointIndex), - dxbc::Src::kXXXX)); + dxbc::Src::VICP(1 + i, kInRegisterDSControlPointIndex, + dxbc::Src::kXXXX)); } } } @@ -650,8 +666,8 @@ 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::V1D( - uint32_t(InOutRegister::kPSInPosition), dxbc::Src::kZZZZ)); + dxbc::Src in_position_z( + dxbc::Src::V1D(in_reg_ps_position_, dxbc::Src::kZZZZ)); in_position_used_ |= 0b0100; a_.OpDerivRTXCoarse(dxbc::Dest::R(system_temp_depth_stencil_, 0b0001), in_position_z); @@ -668,186 +684,174 @@ void DxbcShaderTranslator::StartPixelShader() { bool uses_register_dynamic_addressing = current_shader().uses_register_dynamic_addressing(); + Modification shader_modification = GetDxbcShaderModification(); - uint32_t interpolator_count = - std::min(xenos::kMaxInterpolators, register_count()); - if (interpolator_count != 0) { - // Copy interpolants to GPRs. - uint32_t centroid_temp = - uses_register_dynamic_addressing ? PushSystemTemp() : UINT32_MAX; - dxbc::Src sampling_pattern_src(LoadSystemConstant( - SystemConstants::Index::kInterpolatorSamplingPattern, - offsetof(SystemConstants, interpolator_sampling_pattern), - dxbc::Src::kXXXX)); - for (uint32_t i = 0; i < interpolator_count; ++i) { - // With GPR dynamic addressing, first evaluate to centroid_temp r#, then - // store to the x#. - uint32_t centroid_register = - uses_register_dynamic_addressing ? centroid_temp : i; - // Check if the input needs to be interpolated at center (if the bit is - // set). - a_.OpAnd(dxbc::Dest::R(centroid_register, 0b0001), sampling_pattern_src, - dxbc::Src::LU(uint32_t(1) << i)); - a_.OpIf(bool(xenos::SampleLocation::kCenter), - dxbc::Src::R(centroid_register, dxbc::Src::kXXXX)); - // At center. - a_.OpMov(uses_register_dynamic_addressing ? dxbc::Dest::X(0, i) - : dxbc::Dest::R(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::V1D(uint32_t(InOutRegister::kPSInInterpolators) + i)); - if (uses_register_dynamic_addressing) { - a_.OpMov(dxbc::Dest::X(0, i), dxbc::Src::R(centroid_register)); - } - a_.OpEndIf(); - } - if (centroid_temp != UINT32_MAX) { - PopSystemTemp(); - } + // param_gen_interpolator is already 4 bits, no need for an interpolator count + // safety check. + uint32_t param_gen_interpolator = + (shader_modification.pixel.param_gen_enable && + shader_modification.pixel.param_gen_interpolator < register_count()) + ? shader_modification.pixel.param_gen_interpolator + : UINT32_MAX; - // Write pixel parameters - screen (XY absolute value) and point sprite (ZW - // absolute value) coordinates, facing (X sign bit) - to the specified - // interpolator register (ps_param_gen). - dxbc::Src param_gen_index_src(LoadSystemConstant( - SystemConstants::Index::kPSParamGen, - offsetof(SystemConstants, ps_param_gen), dxbc::Src::kXXXX)); - uint32_t param_gen_temp = PushSystemTemp(); - // Check if pixel parameters need to be written. - a_.OpULT(dxbc::Dest::R(param_gen_temp, 0b0001), param_gen_index_src, - dxbc::Src::LU(interpolator_count)); - a_.OpIf(true, dxbc::Src::R(param_gen_temp, dxbc::Src::kXXXX)); - { - // XY - floored pixel position (Direct3D VPOS) in the absolute value, - // faceness as X sign bit, whether is a point primitive as Y sign bit. - // Using Z as scratch register now. - // ZW - [0, 1] UV within a point sprite in the absolute value, whether is - // a line primitive as Z sign bit. - // Pixel position. - // Get XY address of the current host pixel as float (no matter whether - // the position is pixel-rate or sample-rate also due to float24 depth - // conversion requirements, it will be rounded the same). Rounding down, - // and taking the absolute value (because the sign bit of X stores the - // faceness), so in case the host GPU for some reason has quads used for - // derivative calculation at odd locations, the left and top edges will - // have correct derivative magnitude and LODs. - in_position_used_ |= 0b0011; - a_.OpRoundNI(dxbc::Dest::R(param_gen_temp, 0b0011), - 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); - if (resolution_scaled_axes) { - // Revert resolution scale - after truncating, so if the pixel position - // is passed to tfetch (assuming the game doesn't round it by itself), - // it will be sampled with higher resolution too. - a_.OpMul(dxbc::Dest::R(param_gen_temp, resolution_scaled_axes), - dxbc::Src::R(param_gen_temp), - dxbc::Src::LF(1.0f / draw_resolution_scale_x_, - 1.0f / draw_resolution_scale_y_, 1.0f, 1.0f)); - } + // Zero general-purpose registers to prevent crashes when the game + // references them after only initializing them conditionally, and copy + // interpolants to GPRs. + uint32_t interpolator_mask = GetModificationInterpolatorMask(); + for (uint32_t i = 0; i < register_count(); ++i) { + if (i == param_gen_interpolator) { + continue; + } + a_.OpMov( + uses_register_dynamic_addressing ? dxbc::Dest::X(0, i) + : dxbc::Dest::R(i), + (i < xenos::kMaxInterpolators && + (interpolator_mask & (UINT32_C(1) << i))) + ? dxbc::Src::V1D( + in_reg_ps_interpolators_ + + xe::bit_count((interpolator_mask & (UINT32_C(1) << i)) - 1)) + : dxbc::Src::LF(0.0f)); + } + + // Write the pixel parameters - screen (XY absolute value) and point sprite + // (ZW absolute value) coordinates, facing (X sign bit) - to the specified + // interpolator register (PsParamGen). The negate modified in DXBC flips the + // sign bit. + if (param_gen_interpolator != UINT32_MAX) { + uint32_t param_gen_temp = uses_register_dynamic_addressing + ? PushSystemTemp() + : param_gen_interpolator; + // X - pixel X .0 in the magnitude, is back-facing in the sign bit. + // Y - pixel Y .0 in the magnitude, is point in the sign bit. + // Pixel position. + // Get the XY address of the current host pixel as float (no matter whether + // the position is pixel-rate or sample-rate also due to float24 depth + // conversion requirements, it will be rounded the same). Rounding down, and + // taking the absolute value (because the sign bit of X stores the + // faceness), so in case the host GPU for some reason has quads used for + // derivative calculation at odd locations, the left and top edges will have + // correct derivative magnitude and LODs. + in_position_used_ |= 0b0011; + a_.OpRoundNI(dxbc::Dest::R(param_gen_temp, 0b0011), + dxbc::Src::V1D(in_reg_ps_position_)); + uint32_t resolution_scaled_axes = + uint32_t(draw_resolution_scale_x_ > 1) | + (uint32_t(draw_resolution_scale_y_ > 1) << 1); + if (resolution_scaled_axes) { + // Revert resolution scale - after truncating, so if the pixel position + // is passed to tfetch (assuming the game doesn't round it by itself), + // it will be sampled with higher resolution too. + a_.OpMul(dxbc::Dest::R(param_gen_temp, resolution_scaled_axes), + dxbc::Src::R(param_gen_temp), + dxbc::Src::LF(1.0f / draw_resolution_scale_x_, + 1.0f / draw_resolution_scale_y_, 1.0f, 1.0f)); + } + // Take the absolute value of the position and apply the point flag. + if (shader_modification.pixel.param_gen_point) { + a_.OpMov(dxbc::Dest::R(param_gen_temp, 0b0001), + dxbc::Src::R(param_gen_temp, dxbc::Src::kXXXX).Abs()); + a_.OpMov(dxbc::Dest::R(param_gen_temp, 0b0010), + -(dxbc::Src::R(param_gen_temp, dxbc::Src::kYYYY).Abs())); + } else { a_.OpMov(dxbc::Dest::R(param_gen_temp, 0b0011), dxbc::Src::R(param_gen_temp).Abs()); - // Faceness. - // Check if faceness applies to the current primitive type. - a_.OpAnd(dxbc::Dest::R(param_gen_temp, 0b0100), LoadFlagsSystemConstant(), - dxbc::Src::LU(kSysFlag_PrimitivePolygonal)); - a_.OpIf(true, dxbc::Src::R(param_gen_temp, dxbc::Src::kZZZZ)); - { - // 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::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. + } + // Faceness. + // Check if faceness applies to the current primitive type. + // Using Z as a temporary (not written yet). + a_.OpAnd(dxbc::Dest::R(param_gen_temp, 0b0100), LoadFlagsSystemConstant(), + dxbc::Src::LU(kSysFlag_PrimitivePolygonal)); + a_.OpIf(true, dxbc::Src::R(param_gen_temp, dxbc::Src::kZZZZ)); + { + // 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::V1D(in_reg_ps_front_face_sample_index_, dxbc::Src::kXXXX), + dxbc::Src::R(param_gen_temp, dxbc::Src::kXXXX), + -dxbc::Src::R(param_gen_temp, dxbc::Src::kXXXX)); + } + a_.OpEndIf(); + if (shader_modification.pixel.param_gen_point) { + // A point - not a line (the upper bit of Z is 0). + // ZW - point sprite coordinates. // Saturate to avoid negative point coordinates if the center of the pixel // is not covered, and extrapolation is done. + assert_true(in_reg_ps_point_coordinates_ != UINT32_MAX); a_.OpMov(dxbc::Dest::R(param_gen_temp, 0b1100), - dxbc::Src::V1D(uint32_t(InOutRegister::kPSInPointParameters), - 0b0100 << 4), - true); - // Primitive type. - { - uint32_t param_gen_primitive_type_temp = PushSystemTemp(); - a_.OpUBFE(dxbc::Dest::R(param_gen_primitive_type_temp, 0b0011), - dxbc::Src::LU(1), - dxbc::Src::LU(kSysFlag_PrimitivePoint_Shift, - kSysFlag_PrimitiveLine_Shift, 0, 0), - LoadFlagsSystemConstant()); - a_.OpBFI(dxbc::Dest::R(param_gen_temp, 0b0110), dxbc::Src::LU(1), - dxbc::Src::LU(31), - dxbc::Src::R(param_gen_primitive_type_temp, 0b0100 << 2), - dxbc::Src::R(param_gen_temp)); - // Release param_gen_primitive_type_temp. - PopSystemTemp(); - } - // TODO(Triang3l): Point / line primitive type flags to the sign bits. - // Write ps_param_gen to the specified GPR. - dxbc::Src param_gen_src(dxbc::Src::R(param_gen_temp)); - if (uses_register_dynamic_addressing) { - // Copy the GPR number to r# for relative addressing. - uint32_t param_gen_copy_temp = PushSystemTemp(); - a_.OpMov(dxbc::Dest::R(param_gen_copy_temp, 0b0001), - param_gen_index_src); - // Write to the GPR. - a_.OpMov(dxbc::Dest::X(0, dxbc::Index(param_gen_copy_temp, 0)), - param_gen_src); - // Release param_gen_copy_temp. - PopSystemTemp(); - } else { - if (interpolator_count == 1) { - a_.OpMov(dxbc::Dest::R(0), param_gen_src); - } else { - // Write to the r# using binary search. - uint32_t param_gen_copy_temp = PushSystemTemp(); - auto param_gen_copy_node = [&](uint32_t low, uint32_t high, - const auto& self) -> void { - assert_true(low < high); - uint32_t mid = low + (high - low + 1) / 2; - a_.OpULT(dxbc::Dest::R(param_gen_copy_temp, 0b0001), - param_gen_index_src, dxbc::Src::LU(mid)); - a_.OpIf(true, dxbc::Src::R(param_gen_copy_temp, dxbc::Src::kXXXX)); - { - if (low + 1 == mid) { - a_.OpMov(dxbc::Dest::R(low), param_gen_src); - } else { - self(low, mid - 1, self); - } - } - a_.OpElse(); - { - if (mid == high) { - a_.OpMov(dxbc::Dest::R(mid), param_gen_src); - } else { - self(mid, high, self); - } - } - a_.OpEndIf(); - }; - param_gen_copy_node(0, interpolator_count - 1, param_gen_copy_node); - // Release param_gen_copy_temp. - PopSystemTemp(); - } - } + dxbc::Src::V1D(in_reg_ps_point_coordinates_, 0b0100 << 4), true); + } else { + // No point coordinates. + // Z - is line in the sign bit. + // W - nothing. + a_.OpUBFE(dxbc::Dest::R(param_gen_temp, 0b0100), dxbc::Src::LU(1), + dxbc::Src::LU(kSysFlag_PrimitiveLine_Shift), + LoadFlagsSystemConstant()); + a_.OpIShL(dxbc::Dest::R(param_gen_temp, 0b0100), + dxbc::Src::R(param_gen_temp, dxbc::Src::kZZZZ), + dxbc::Src::LU(31)); + a_.OpMov(dxbc::Dest::R(param_gen_temp, 0b1000), dxbc::Src::LF(0.0f)); + } + // With dynamic register addressing, write the PsParamGen to the GPR. + if (uses_register_dynamic_addressing) { + a_.OpMov(dxbc::Dest::X(0, param_gen_interpolator), + dxbc::Src::R(param_gen_temp)); + // Release param_gen_temp. + PopSystemTemp(); } - // Close the ps_param_gen check. - a_.OpEndIf(); - // Release param_gen_temp. - PopSystemTemp(); } } void DxbcShaderTranslator::StartTranslation() { + // Set up the input and output registers. + Modification shader_modification = GetDxbcShaderModification(); + uint32_t interpolator_register_mask = GetModificationInterpolatorMask(); + uint32_t interpolator_register_count = + xe::bit_count(interpolator_register_mask); + if (is_vertex_shader()) { + uint32_t out_reg_index = 0; + // Interpolators. + if (interpolator_register_count) { + out_reg_vs_interpolators_ = out_reg_index; + out_reg_index += interpolator_register_count; + } + // Position. + out_reg_vs_position_ = out_reg_index; + ++out_reg_index; + // Clip and cull distances. + uint32_t clip_and_cull_distance_count = + shader_modification.GetVertexClipDistanceCount() + + shader_modification.GetVertexCullDistanceCount(); + if (clip_and_cull_distance_count) { + out_reg_vs_clip_cull_distances_ = out_reg_index; + out_reg_index += (clip_and_cull_distance_count + 3) >> 2; + } + // Point size. + if (shader_modification.vertex.output_point_size) { + out_reg_vs_point_size_ = out_reg_index; + ++out_reg_index; + } + } else if (is_pixel_shader()) { + uint32_t in_reg_index = 0; + // Interpolators. + if (interpolator_register_count) { + in_reg_ps_interpolators_ = in_reg_index; + in_reg_index += interpolator_register_count; + } + // Point coordinates. + if (shader_modification.pixel.param_gen_point) { + in_reg_ps_point_coordinates_ = in_reg_index; + ++in_reg_index; + } + // Position. + in_reg_ps_position_ = in_reg_index; + ++in_reg_index; + // System inputs. + in_reg_ps_front_face_sample_index_ = in_reg_index; + ++in_reg_index; + } + // Allocate global system temporary registers that may also be used in the // epilogue. if (is_vertex_shader()) { @@ -931,16 +935,6 @@ void DxbcShaderTranslator::StartTranslation() { system_temp_loop_count_ = PushSystemTemp(0b1111); system_temp_grad_h_lod_ = PushSystemTemp(0b1111); system_temp_grad_v_vfetch_address_ = PushSystemTemp(0b1111); - - // Zero general-purpose registers to prevent crashes when the game - // references them after only initializing them conditionally. - for (uint32_t i = is_pixel_shader() ? xenos::kMaxInterpolators : 0; - i < register_count(); ++i) { - a_.OpMov(current_shader().uses_register_dynamic_addressing() - ? dxbc::Dest::X(0, i) - : dxbc::Dest::R(i), - dxbc::Src::LF(0.0f)); - } } // Write stage-specific prologue. @@ -1002,35 +996,29 @@ void DxbcShaderTranslator::CompleteVertexOrDomainShader() { dxbc::Src::R(system_temp_position_, dxbc::Src::kWWWW)); a_.OpEndIf(); - // Zero-initialize SV_ClipDistance# (for user clip planes) and SV_CullDistance - // (for vertex kill) in case they're not needed. - a_.OpMov(dxbc::Dest::O(uint32_t(InOutRegister::kVSDSOutClipDistance0123)), - dxbc::Src::LF(0.0f)); - a_.OpMov(dxbc::Dest::O( - uint32_t(InOutRegister::kVSDSOutClipDistance45AndCullDistance), - 0b0111), - dxbc::Src::LF(0.0f)); + Modification shader_modification = GetDxbcShaderModification(); + uint32_t clip_distance_next_component = 0; + uint32_t cull_distance_next_component = + shader_modification.GetVertexClipDistanceCount(); + // Clip against user clip planes. - // Not possible to handle UCP_CULL_ONLY_ENA with the same shader though, since - // there can be only 8 SV_ClipDistance + SV_CullDistance values at most, but - // 12 would be needed. - for (uint32_t i = 0; i < 6; ++i) { - // Check if the clip plane is enabled - this `if` is needed, as opposed to - // just zeroing the clip planes in the constants, so Infinity and NaN in the - // position won't have any effect caused by this if clip planes are - // disabled. - a_.OpAnd(temp_x_dest, flags_src, - dxbc::Src::LU(kSysFlag_UserClipPlane0 << i)); - a_.OpIf(true, temp_x_src); - a_.OpDP4(dxbc::Dest::O( - uint32_t(InOutRegister::kVSDSOutClipDistance0123) + (i >> 2), - 1 << (i & 3)), - dxbc::Src::R(system_temp_position_), - LoadSystemConstant(SystemConstants::Index::kUserClipPlanes, - offsetof(SystemConstants, user_clip_planes) + - sizeof(float) * 4 * i, - dxbc::Src::kXYZW)); - a_.OpEndIf(); + uint32_t& ucp_clip_cull_distance_next_component_ref = + shader_modification.vertex.user_clip_plane_cull + ? cull_distance_next_component + : clip_distance_next_component; + for (uint32_t i = 0; i < shader_modification.vertex.user_clip_plane_count; + ++i) { + a_.OpDP4( + dxbc::Dest::O(out_reg_vs_clip_cull_distances_ + + (ucp_clip_cull_distance_next_component_ref >> 2), + UINT32_C(1) + << (ucp_clip_cull_distance_next_component_ref & 3)), + dxbc::Src::R(system_temp_position_), + LoadSystemConstant( + SystemConstants::Index::kUserClipPlanes, + offsetof(SystemConstants, user_clip_planes) + sizeof(float) * 4 * i, + dxbc::Src::kXYZW)); + ++ucp_clip_cull_distance_next_component_ref; } // Apply scale for guest to host viewport and clip space conversion. Also, if @@ -1048,51 +1036,48 @@ void DxbcShaderTranslator::CompleteVertexOrDomainShader() { dxbc::Src::R(system_temp_position_, dxbc::Src::kWWWW), dxbc::Src::R(system_temp_position_)); - // Assuming SV_CullDistance was zeroed earlier in this function. // Kill the primitive if needed - check if the shader wants to kill (bits - // 0:30 of the vertex kill register are not zero). - a_.OpAnd(temp_x_dest, - dxbc::Src::R(system_temp_point_size_edge_flag_kill_vertex_, - dxbc::Src::kZZZZ), - dxbc::Src::LU(UINT32_C(0x7FFFFFFF))); - a_.OpIf(true, temp_x_src); - { - // Extract the killing condition. - a_.OpAnd(temp_x_dest, flags_src, - dxbc::Src::LU(kSysFlag_KillIfAnyVertexKilled)); - a_.OpIf(true, temp_x_src); - { - // Kill the primitive if any vertex is killed - write NaN to position. - a_.OpMov(dxbc::Dest::R(system_temp_position_, 0b1000), - dxbc::Src::LF(std::nanf(""))); - } - a_.OpElse(); - { - // Kill the primitive if all vertices are killed - set SV_CullDistance to - // negative. - a_.OpMov( - dxbc::Dest::O( - uint32_t(InOutRegister::kVSDSOutClipDistance45AndCullDistance), - 0b0100), - dxbc::Src::LF(-1.0f)); - } - a_.OpEndIf(); + // 0:30 of the vertex kill register are not zero - using `and`, not abs or + // especially 0.0f comparison, to avoid potential denormal flushing). + bool shader_writes_vertex_kill = + (current_shader().writes_point_size_edge_flag_kill_vertex() & 0b100) != 0; + if (shader_writes_vertex_kill) { + a_.OpAnd(temp_x_dest, + dxbc::Src::R(system_temp_point_size_edge_flag_kill_vertex_, + dxbc::Src::kZZZZ), + dxbc::Src::LU(UINT32_C(0x7FFFFFFF))); + } + if (shader_modification.vertex.vertex_kill_and) { + // AND operator - write an SV_CullDistance. + dxbc::Dest vertex_kill_dest(dxbc::Dest::O( + out_reg_vs_clip_cull_distances_ + (cull_distance_next_component >> 2), + UINT32_C(1) << (cull_distance_next_component & 3))); + if (shader_writes_vertex_kill) { + a_.OpMovC(vertex_kill_dest, temp_x_src, dxbc::Src::LF(-1.0f), + dxbc::Src::LF(0.0f)); + } else { + a_.OpMov(vertex_kill_dest, dxbc::Src::LF(0.0f)); + } + ++cull_distance_next_component; + } else { + // OR operator - set the position to NaN. + if (shader_writes_vertex_kill) { + a_.OpMovC(dxbc::Dest::R(system_temp_position_, 0b1000), temp_x_src, + dxbc::Src::LF(std::nanf("")), + dxbc::Src::R(system_temp_position_, dxbc::Src::kWWWW)); + } } - a_.OpEndIf(); // Write the position to the output. - a_.OpMov(dxbc::Dest::O(uint32_t(InOutRegister::kVSDSOutPosition)), + a_.OpMov(dxbc::Dest::O(out_reg_vs_position_), dxbc::Src::R(system_temp_position_)); - // Zero the point coordinate (will be set in the geometry shader if needed) - // and write the point size. - a_.OpMov( - dxbc::Dest::O(uint32_t(InOutRegister::kVSDSOutPointParameters), 0b0011), - dxbc::Src::LF(0.0f)); - a_.OpMov( - dxbc::Dest::O(uint32_t(InOutRegister::kVSDSOutPointParameters), 0b0100), - dxbc::Src::R(system_temp_point_size_edge_flag_kill_vertex_, - dxbc::Src::kXXXX)); + // Write the point size. + if (out_reg_vs_point_size_ != UINT32_MAX) { + a_.OpMov(dxbc::Dest::O(out_reg_vs_point_size_, 0b0001), + dxbc::Src::R(system_temp_point_size_edge_flag_kill_vertex_, + dxbc::Src::kXXXX)); + } // Release temp. PopSystemTemp(); @@ -1528,10 +1513,15 @@ void DxbcShaderTranslator::StoreResult(const InstructionResult& result, dest = dxbc::Dest::R(result.storage_index); } break; - case InstructionStorageTarget::kInterpolator: - dest = dxbc::Dest::O(uint32_t(InOutRegister::kVSDSOutInterpolators) + - result.storage_index); - break; + case InstructionStorageTarget::kInterpolator: { + uint32_t interpolator_mask = GetModificationInterpolatorMask(); + uint32_t interpolator_bit = UINT32_C(1) << result.storage_index; + if (interpolator_mask & interpolator_bit) { + dest = dxbc::Dest::O( + out_reg_vs_interpolators_ + + xe::bit_count(interpolator_mask & (interpolator_bit - 1))); + } + } break; case InstructionStorageTarget::kPosition: dest = dxbc::Dest::R(system_temp_position_); break; @@ -2112,20 +2102,19 @@ const DxbcShaderTranslator::SystemConstantRdef {"xe_point_screen_diameter_to_ndc_radius", ShaderRdefTypeIndex::kFloat2, sizeof(float) * 2}, - {"xe_interpolator_sampling_pattern", ShaderRdefTypeIndex::kUint, - sizeof(uint32_t)}, - {"xe_ps_param_gen", ShaderRdefTypeIndex::kUint, sizeof(uint32_t)}, - {"xe_sample_count_log2", ShaderRdefTypeIndex::kUint2, - sizeof(uint32_t) * 2}, - {"xe_texture_swizzled_signs", ShaderRdefTypeIndex::kUint4Array2, sizeof(uint32_t) * 4 * 2}, {"xe_textures_resolved", ShaderRdefTypeIndex::kUint, sizeof(uint32_t)}, + {"xe_sample_count_log2", ShaderRdefTypeIndex::kUint2, + sizeof(uint32_t) * 2}, {"xe_alpha_test_reference", ShaderRdefTypeIndex::kFloat, sizeof(float)}, + {"xe_alpha_to_mask", ShaderRdefTypeIndex::kUint, sizeof(uint32_t)}, {"xe_edram_32bpp_tile_pitch_dwords_scaled", ShaderRdefTypeIndex::kUint, sizeof(uint32_t)}, + {"xe_edram_depth_base_dwords_scaled", ShaderRdefTypeIndex::kUint, + sizeof(uint32_t), sizeof(uint32_t)}, {"xe_color_exp_bias", ShaderRdefTypeIndex::kFloat4, sizeof(float) * 4}, @@ -2134,9 +2123,6 @@ const DxbcShaderTranslator::SystemConstantRdef {"xe_edram_poly_offset_back", ShaderRdefTypeIndex::kFloat2, sizeof(float) * 2}, - {"xe_edram_depth_base_dwords_scaled", ShaderRdefTypeIndex::kUint, - sizeof(uint32_t), sizeof(float) * 3}, - {"xe_edram_stencil", ShaderRdefTypeIndex::kUint4Array2, sizeof(uint32_t) * 4 * 2}, @@ -2761,7 +2747,7 @@ void DxbcShaderTranslator::WriteInputSignature() { shader_object_.data() + vertex_id_position); vertex_id.system_value = dxbc::Name::kVertexID; vertex_id.component_type = dxbc::SignatureRegisterComponentType::kUInt32; - vertex_id.register_index = uint32_t(InOutRegister::kVSInVertexIndex); + vertex_id.register_index = kInRegisterVSVertexIndex; vertex_id.mask = 0b0001; vertex_id.always_reads_mask = (register_count() >= 1) ? 0b0001 : 0b0000; } @@ -2790,8 +2776,7 @@ void DxbcShaderTranslator::WriteInputSignature() { shader_object_.data() + control_point_index_position); control_point_index.component_type = dxbc::SignatureRegisterComponentType::kFloat32; - control_point_index.register_index = - uint32_t(InOutRegister::kDSInControlPointIndex); + control_point_index.register_index = kInRegisterDSControlPointIndex; control_point_index.mask = 0b0001; control_point_index.always_reads_mask = in_control_point_index_used_ ? 0b0001 : 0b0000; @@ -2807,49 +2792,50 @@ void DxbcShaderTranslator::WriteInputSignature() { } semantic_offset += dxbc::AppendAlignedString(shader_object_, "XEVERTEXID"); } else if (is_pixel_shader()) { - // Written dynamically, so assume it's always used if it can be written to - // any interpolator register. - bool param_gen_used = !is_depth_only_pixel_shader_ && register_count() != 0; - // Intepolators (TEXCOORD#). size_t interpolator_position = shader_object_.size(); + uint32_t interpolator_mask = GetModificationInterpolatorMask(); + uint32_t interpolator_count = xe::bit_count(interpolator_mask); shader_object_.resize(shader_object_.size() + - xenos::kMaxInterpolators * kParameterDwords); - parameter_count += xenos::kMaxInterpolators; + interpolator_count * kParameterDwords); + parameter_count += interpolator_count; { auto interpolators = reinterpret_cast( shader_object_.data() + interpolator_position); - for (uint32_t i = 0; i < xenos::kMaxInterpolators; ++i) { - dxbc::SignatureParameter& interpolator = interpolators[i]; - interpolator.semantic_index = i; + uint32_t used_interpolator_index = 0; + uint32_t interpolators_remaining = interpolator_mask; + uint32_t interpolator_index; + while ( + xe::bit_scan_forward(interpolators_remaining, &interpolator_index)) { + interpolators_remaining &= ~(UINT32_C(1) << interpolator_index); + dxbc::SignatureParameter& interpolator = + interpolators[used_interpolator_index]; + interpolator.semantic_index = used_interpolator_index; interpolator.component_type = dxbc::SignatureRegisterComponentType::kFloat32; interpolator.register_index = - uint32_t(InOutRegister::kPSInInterpolators) + i; + in_reg_ps_interpolators_ + used_interpolator_index; interpolator.mask = 0b1111; - // Interpolators are copied to GPRs in the beginning of the shader. If - // there's a register to copy to, this interpolator is used. interpolator.always_reads_mask = - (!is_depth_only_pixel_shader_ && i < register_count()) ? 0b1111 - : 0b0000; + interpolator_index < register_count() ? 0b1111 : 0b0000; + ++used_interpolator_index; } } - // Point parameters for ps_param_gen - coordinate on the point and point - // size as a float3 TEXCOORD (but the size in Z is not needed). - size_t point_parameters_position = shader_object_.size(); - shader_object_.resize(shader_object_.size() + kParameterDwords); - ++parameter_count; - { - auto& point_parameters = *reinterpret_cast( - shader_object_.data() + point_parameters_position); - point_parameters.semantic_index = kPointParametersTexCoord; - point_parameters.component_type = - dxbc::SignatureRegisterComponentType::kFloat32; - point_parameters.register_index = - uint32_t(InOutRegister::kPSInPointParameters); - point_parameters.mask = 0b0111; - point_parameters.always_reads_mask = param_gen_used ? 0b0011 : 0b0000; + // Point coordinates for PsParamGen (XESPRITETEXCOORD). + size_t point_coordinates_position = shader_object_.size(); + if (in_reg_ps_point_coordinates_ != UINT32_MAX) { + shader_object_.resize(shader_object_.size() + kParameterDwords); + ++parameter_count; + { + auto& point_coordinates = *reinterpret_cast( + shader_object_.data() + point_coordinates_position); + point_coordinates.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + point_coordinates.register_index = in_reg_ps_point_coordinates_; + point_coordinates.mask = 0b0011; + point_coordinates.always_reads_mask = 0b0011; + } } // Pixel position (SV_Position). @@ -2861,7 +2847,7 @@ void DxbcShaderTranslator::WriteInputSignature() { shader_object_.data() + position_position); position.system_value = dxbc::Name::kPosition; position.component_type = dxbc::SignatureRegisterComponentType::kFloat32; - position.register_index = uint32_t(InOutRegister::kPSInPosition); + position.register_index = in_reg_ps_position_; position.mask = 0b1111; position.always_reads_mask = in_position_used_; } @@ -2876,8 +2862,7 @@ void DxbcShaderTranslator::WriteInputSignature() { is_front_face.system_value = dxbc::Name::kIsFrontFace; is_front_face.component_type = dxbc::SignatureRegisterComponentType::kUInt32; - is_front_face.register_index = - uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex); + is_front_face.register_index = in_reg_ps_front_face_sample_index_; is_front_face.mask = 0b0001; is_front_face.always_reads_mask = in_front_face_used_ ? 0b0001 : 0b0000; } @@ -2895,8 +2880,7 @@ void DxbcShaderTranslator::WriteInputSignature() { sample_index.system_value = dxbc::Name::kSampleIndex; sample_index.component_type = dxbc::SignatureRegisterComponentType::kUInt32; - sample_index.register_index = - uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex); + sample_index.register_index = in_reg_ps_front_face_sample_index_; sample_index.mask = 0b0010; sample_index.always_reads_mask = 0b0010; } @@ -2905,17 +2889,21 @@ void DxbcShaderTranslator::WriteInputSignature() { // Semantic names. uint32_t semantic_offset = uint32_t((shader_object_.size() - blob_position) * sizeof(uint32_t)); - { + if (interpolator_count) { auto interpolators = reinterpret_cast( shader_object_.data() + interpolator_position); - for (uint32_t i = 0; i < xenos::kMaxInterpolators; ++i) { + for (uint32_t i = 0; i < interpolator_count; ++i) { interpolators[i].semantic_name_ptr = semantic_offset; } - auto& point_parameters = *reinterpret_cast( - shader_object_.data() + point_parameters_position); - point_parameters.semantic_name_ptr = semantic_offset; + semantic_offset += dxbc::AppendAlignedString(shader_object_, "TEXCOORD"); + } + if (in_reg_ps_point_coordinates_ != UINT32_MAX) { + auto& point_coordinates = *reinterpret_cast( + shader_object_.data() + point_coordinates_position); + point_coordinates.semantic_name_ptr = semantic_offset; + semantic_offset += + dxbc::AppendAlignedString(shader_object_, "XESPRITETEXCOORD"); } - semantic_offset += dxbc::AppendAlignedString(shader_object_, "TEXCOORD"); { auto& position = *reinterpret_cast( shader_object_.data() + position_position); @@ -3074,43 +3062,29 @@ void DxbcShaderTranslator::WriteOutputSignature() { constexpr size_t kParameterDwords = sizeof(dxbc::SignatureParameter) / sizeof(uint32_t); + Modification shader_modification = GetDxbcShaderModification(); + if (is_vertex_shader()) { // Intepolators (TEXCOORD#). size_t interpolator_position = shader_object_.size(); + uint32_t interpolator_count = + xe::bit_count(GetModificationInterpolatorMask()); shader_object_.resize(shader_object_.size() + - xenos::kMaxInterpolators * kParameterDwords); - parameter_count += xenos::kMaxInterpolators; + interpolator_count * kParameterDwords); + parameter_count += interpolator_count; { auto interpolators = reinterpret_cast( shader_object_.data() + interpolator_position); - for (uint32_t i = 0; i < xenos::kMaxInterpolators; ++i) { + for (uint32_t i = 0; i < interpolator_count; ++i) { dxbc::SignatureParameter& interpolator = interpolators[i]; interpolator.semantic_index = i; interpolator.component_type = dxbc::SignatureRegisterComponentType::kFloat32; - interpolator.register_index = - uint32_t(InOutRegister::kVSDSOutInterpolators) + i; + interpolator.register_index = out_reg_vs_interpolators_ + i; interpolator.mask = 0b1111; } } - // Point parameters - coordinate on the point and point size as a float3 - // TEXCOORD. Always used because reset to (0, 0, -1). - size_t point_parameters_position = shader_object_.size(); - shader_object_.resize(shader_object_.size() + kParameterDwords); - ++parameter_count; - { - auto& point_parameters = *reinterpret_cast( - shader_object_.data() + point_parameters_position); - point_parameters.semantic_index = kPointParametersTexCoord; - point_parameters.component_type = - dxbc::SignatureRegisterComponentType::kFloat32; - point_parameters.register_index = - uint32_t(InOutRegister::kVSDSOutPointParameters); - point_parameters.mask = 0b0111; - point_parameters.never_writes_mask = 0b1000; - } - // Position (SV_Position). size_t position_position = shader_object_.size(); shader_object_.resize(shader_object_.size() + kParameterDwords); @@ -3120,91 +3094,136 @@ void DxbcShaderTranslator::WriteOutputSignature() { shader_object_.data() + position_position); position.system_value = dxbc::Name::kPosition; position.component_type = dxbc::SignatureRegisterComponentType::kFloat32; - position.register_index = uint32_t(InOutRegister::kVSDSOutPosition); + position.register_index = out_reg_vs_position_; position.mask = 0b1111; } // Clip (SV_ClipDistance) and cull (SV_CullDistance) distances. - size_t clip_distance_0123_position = shader_object_.size(); - shader_object_.resize(shader_object_.size() + kParameterDwords); - ++parameter_count; - { - auto& clip_distance_0123 = *reinterpret_cast( - shader_object_.data() + clip_distance_0123_position); - clip_distance_0123.system_value = dxbc::Name::kClipDistance; - clip_distance_0123.component_type = - dxbc::SignatureRegisterComponentType::kFloat32; - clip_distance_0123.register_index = - uint32_t(InOutRegister::kVSDSOutClipDistance0123); - clip_distance_0123.mask = 0b1111; + size_t clip_and_cull_distance_position = shader_object_.size(); + uint32_t clip_distance_count = + shader_modification.GetVertexClipDistanceCount(); + uint32_t cull_distance_count = + shader_modification.GetVertexCullDistanceCount(); + uint32_t clip_and_cull_distance_count = + clip_distance_count + cull_distance_count; + uint32_t clip_distance_parameter_count = 0; + uint32_t cull_distance_parameter_count = 0; + for (uint32_t i = 0; i < clip_and_cull_distance_count; i += 4) { + uint32_t clip_cull_distance_register = + out_reg_vs_clip_cull_distances_ + (i >> 2); + if (i < clip_distance_count) { + shader_object_.resize(shader_object_.size() + kParameterDwords); + ++parameter_count; + { + auto& clip_distance = *reinterpret_cast( + shader_object_.data() + + (shader_object_.size() - kParameterDwords)); + clip_distance.semantic_index = clip_distance_parameter_count; + clip_distance.system_value = dxbc::Name::kClipDistance; + clip_distance.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + clip_distance.register_index = clip_cull_distance_register; + uint8_t clip_distance_mask = + (UINT8_C(1) << std::min(clip_distance_count - i, UINT32_C(4))) - + 1; + clip_distance.mask = clip_distance_mask; + clip_distance.never_writes_mask = clip_distance_mask ^ 0b1111; + } + ++clip_distance_parameter_count; + } + if (cull_distance_count && i + 4 > clip_distance_count) { + shader_object_.resize(shader_object_.size() + kParameterDwords); + ++parameter_count; + { + auto& cull_distance = *reinterpret_cast( + shader_object_.data() + + (shader_object_.size() - kParameterDwords)); + cull_distance.semantic_index = cull_distance_parameter_count; + cull_distance.system_value = dxbc::Name::kCullDistance; + cull_distance.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + cull_distance.register_index = clip_cull_distance_register; + uint8_t cull_distance_mask = + (UINT8_C(1) << std::min(cull_distance_count - i, UINT32_C(4))) - + 1; + if (i < clip_distance_count) { + cull_distance_mask &= + ~((UINT8_C(1) << (clip_distance_count - i)) - 1); + } + cull_distance.mask = cull_distance_mask; + cull_distance.never_writes_mask = cull_distance_mask ^ 0b1111; + } + ++cull_distance_parameter_count; + } } - size_t clip_distance_45_position = shader_object_.size(); - shader_object_.resize(shader_object_.size() + kParameterDwords); - ++parameter_count; - { - auto& clip_distance_45 = *reinterpret_cast( - shader_object_.data() + clip_distance_45_position); - clip_distance_45.semantic_index = 1; - clip_distance_45.system_value = dxbc::Name::kClipDistance; - clip_distance_45.component_type = - dxbc::SignatureRegisterComponentType::kFloat32; - clip_distance_45.register_index = - uint32_t(InOutRegister::kVSDSOutClipDistance45AndCullDistance); - clip_distance_45.mask = 0b0011; - clip_distance_45.never_writes_mask = 0b1100; - } - size_t cull_distance_position = shader_object_.size(); - shader_object_.resize(shader_object_.size() + kParameterDwords); - ++parameter_count; - { - auto& cull_distance = *reinterpret_cast( - shader_object_.data() + cull_distance_position); - cull_distance.system_value = dxbc::Name::kCullDistance; - cull_distance.component_type = - dxbc::SignatureRegisterComponentType::kFloat32; - cull_distance.register_index = - uint32_t(InOutRegister::kVSDSOutClipDistance45AndCullDistance); - cull_distance.mask = 0b0100; - cull_distance.never_writes_mask = 0b1011; + + // Point size (XEPSIZE). Always used because reset to -1. + size_t point_size_position = shader_object_.size(); + if (out_reg_vs_point_size_ != UINT32_MAX) { + shader_object_.resize(shader_object_.size() + kParameterDwords); + ++parameter_count; + { + auto& point_size = *reinterpret_cast( + shader_object_.data() + point_size_position); + point_size.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + point_size.register_index = out_reg_vs_point_size_; + point_size.mask = 0b0001; + point_size.never_writes_mask = 0b1110; + } } // Semantic names. uint32_t semantic_offset = uint32_t((shader_object_.size() - blob_position) * sizeof(uint32_t)); - { - auto interpolators = reinterpret_cast( - shader_object_.data() + interpolator_position); - for (uint32_t i = 0; i < xenos::kMaxInterpolators; ++i) { - interpolators[i].semantic_name_ptr = semantic_offset; + if (interpolator_count) { + { + auto interpolators = reinterpret_cast( + shader_object_.data() + interpolator_position); + for (uint32_t i = 0; i < interpolator_count; ++i) { + interpolators[i].semantic_name_ptr = semantic_offset; + } } - auto& point_parameters = *reinterpret_cast( - shader_object_.data() + point_parameters_position); - point_parameters.semantic_name_ptr = semantic_offset; + semantic_offset += dxbc::AppendAlignedString(shader_object_, "TEXCOORD"); } - semantic_offset += dxbc::AppendAlignedString(shader_object_, "TEXCOORD"); { auto& position = *reinterpret_cast( shader_object_.data() + position_position); position.semantic_name_ptr = semantic_offset; } semantic_offset += dxbc::AppendAlignedString(shader_object_, "SV_Position"); - { - auto& clip_distance_0123 = *reinterpret_cast( - shader_object_.data() + clip_distance_0123_position); - clip_distance_0123.semantic_name_ptr = semantic_offset; - auto& clip_distance_45 = *reinterpret_cast( - shader_object_.data() + clip_distance_45_position); - clip_distance_45.semantic_name_ptr = semantic_offset; + if (clip_distance_parameter_count) { + { + auto clip_distances = reinterpret_cast( + shader_object_.data() + clip_and_cull_distance_position); + for (uint32_t i = 0; i < clip_distance_parameter_count; ++i) { + clip_distances[i].semantic_name_ptr = semantic_offset; + } + } + semantic_offset += + dxbc::AppendAlignedString(shader_object_, "SV_ClipDistance"); } - semantic_offset += - dxbc::AppendAlignedString(shader_object_, "SV_ClipDistance"); - { - auto& cull_distance = *reinterpret_cast( - shader_object_.data() + cull_distance_position); - cull_distance.semantic_name_ptr = semantic_offset; + if (cull_distance_parameter_count) { + { + auto cull_distances = + reinterpret_cast( + shader_object_.data() + clip_and_cull_distance_position) + + clip_distance_parameter_count; + for (uint32_t i = 0; i < cull_distance_parameter_count; ++i) { + cull_distances[i].semantic_name_ptr = semantic_offset; + } + } + semantic_offset += + dxbc::AppendAlignedString(shader_object_, "SV_CullDistance"); + } + if (out_reg_vs_point_size_ != UINT32_MAX) { + { + auto& point_size = *reinterpret_cast( + shader_object_.data() + point_size_position); + point_size.semantic_name_ptr = semantic_offset; + } + semantic_offset += dxbc::AppendAlignedString(shader_object_, "XEPSIZE"); } - semantic_offset += - dxbc::AppendAlignedString(shader_object_, "SV_CullDistance"); } else if (is_pixel_shader()) { if (!edram_rov_used_) { uint32_t color_targets_written = current_shader().writes_color_targets(); @@ -3250,8 +3269,6 @@ void DxbcShaderTranslator::WriteOutputSignature() { } // Depth (SV_Depth or SV_DepthLessEqual). - Modification::DepthStencilMode depth_stencil_mode = - GetDxbcShaderModification().pixel.depth_stencil_mode; size_t depth_position = SIZE_MAX; if (current_shader().writes_depth() || DSV_IsWritingFloat24Depth()) { depth_position = shader_object_.size(); @@ -3296,7 +3313,7 @@ void DxbcShaderTranslator::WriteOutputSignature() { } const char* depth_semantic_name; if (!current_shader().writes_depth() && - GetDxbcShaderModification().pixel.depth_stencil_mode == + shader_modification.pixel.depth_stencil_mode == Modification::DepthStencilMode::kFloat24Truncating) { depth_semantic_name = "SV_DepthLessEqual"; } else { @@ -3550,60 +3567,82 @@ void DxbcShaderTranslator::WriteShaderCode() { "StartVertexOrDomainShader"); } ao_.OpDclInput(dxbc::Dest::VICP( - control_point_array_size, - uint32_t(InOutRegister::kDSInControlPointIndex), 0b0001)); + control_point_array_size, kInRegisterDSControlPointIndex, 0b0001)); } } else { if (register_count()) { // Unswapped vertex index input (only X component). - ao_.OpDclInputSGV( - dxbc::Dest::V1D(uint32_t(InOutRegister::kVSInVertexIndex), 0b0001), - dxbc::Name::kVertexID); + ao_.OpDclInputSGV(dxbc::Dest::V1D(kInRegisterVSVertexIndex, 0b0001), + dxbc::Name::kVertexID); } } // Interpolator output. - for (uint32_t i = 0; i < xenos::kMaxInterpolators; ++i) { - ao_.OpDclOutput( - dxbc::Dest::O(uint32_t(InOutRegister::kVSDSOutInterpolators) + i)); + uint32_t interpolator_count = + xe::bit_count(GetModificationInterpolatorMask()); + for (uint32_t i = 0; i < interpolator_count; ++i) { + ao_.OpDclOutput(dxbc::Dest::O(out_reg_vs_interpolators_ + i)); } - // Point parameters output. - ao_.OpDclOutput(dxbc::Dest::O( - uint32_t(InOutRegister::kVSDSOutPointParameters), 0b0111)); // Position output. - ao_.OpDclOutputSIV(dxbc::Dest::O(uint32_t(InOutRegister::kVSDSOutPosition)), + ao_.OpDclOutputSIV(dxbc::Dest::O(out_reg_vs_position_), dxbc::Name::kPosition); - // Clip distance outputs. - for (uint32_t i = 0; i < 2; ++i) { - ao_.OpDclOutputSIV( - dxbc::Dest::O(uint32_t(InOutRegister::kVSDSOutClipDistance0123) + i, - i ? 0b0011 : 0b1111), - dxbc::Name::kClipDistance); + // Clip and cull distance outputs. + uint32_t clip_distance_count = + shader_modification.GetVertexClipDistanceCount(); + uint32_t cull_distance_count = + shader_modification.GetVertexCullDistanceCount(); + uint32_t clip_and_cull_distance_count = + clip_distance_count + cull_distance_count; + for (uint32_t i = 0; i < clip_and_cull_distance_count; i += 4) { + if (i < clip_distance_count) { + ao_.OpDclOutputSIV( + dxbc::Dest::O(out_reg_vs_clip_cull_distances_ + (i >> 2), + (UINT32_C(1) + << std::min(clip_distance_count - i, UINT32_C(4))) - + 1), + dxbc::Name::kClipDistance); + } + if (cull_distance_count && i + 4 > clip_distance_count) { + uint32_t cull_distance_mask = + (UINT32_C(1) << std::min(clip_and_cull_distance_count - i, + UINT32_C(4))) - + 1; + if (i < clip_distance_count) { + cull_distance_mask &= + ~((UINT32_C(1) << (clip_distance_count - i)) - 1); + } + ao_.OpDclOutputSIV( + dxbc::Dest::O(out_reg_vs_clip_cull_distances_ + (i >> 2), + cull_distance_mask), + dxbc::Name::kCullDistance); + } + } + // Point size output. + if (out_reg_vs_point_size_ != UINT32_MAX) { + ao_.OpDclOutput(dxbc::Dest::O(out_reg_vs_point_size_, 0b0001)); } - // Cull distance output. - ao_.OpDclOutputSIV( - dxbc::Dest::O( - uint32_t(InOutRegister::kVSDSOutClipDistance45AndCullDistance), - 0b0100), - dxbc::Name::kCullDistance); } else if (is_pixel_shader()) { bool is_writing_float24_depth = DSV_IsWritingFloat24Depth(); bool shader_writes_depth = current_shader().writes_depth(); // Interpolator input. - if (!is_depth_only_pixel_shader_) { - uint32_t interpolator_count = - std::min(xenos::kMaxInterpolators, register_count()); - for (uint32_t i = 0; i < interpolator_count; ++i) { - ao_.OpDclInputPS( - dxbc::InterpolationMode::kLinear, - 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::V1D(uint32_t(InOutRegister::kPSInPointParameters), - 0b0011)); + uint32_t interpolator_register_index = in_reg_ps_interpolators_; + uint32_t interpolators_remaining = GetModificationInterpolatorMask(); + uint32_t interpolator_index; + while (xe::bit_scan_forward(interpolators_remaining, &interpolator_index)) { + interpolators_remaining &= ~(UINT32_C(1) << interpolator_index); + if (interpolator_index >= register_count()) { + break; } + ao_.OpDclInputPS((shader_modification.pixel.interpolators_centroid & + (UINT32_C(1) << interpolator_index)) + ? dxbc::InterpolationMode::kLinearCentroid + : dxbc::InterpolationMode::kLinear, + dxbc::Dest::V1D(interpolator_register_index)); + ++interpolator_register_index; + } + if (in_reg_ps_point_coordinates_ != UINT32_MAX) { + // Point coordinates input. + ao_.OpDclInputPS(dxbc::InterpolationMode::kLinear, + dxbc::Dest::V1D(in_reg_ps_point_coordinates_, 0b0011)); } if (in_position_used_) { // Position input (XY needed for ps_param_gen, Z needed for non-ROV @@ -3618,8 +3657,7 @@ void DxbcShaderTranslator::WriteShaderCode() { (is_writing_float24_depth && !shader_writes_depth) ? dxbc::InterpolationMode::kLinearNoPerspectiveSample : dxbc::InterpolationMode::kLinearNoPerspective, - dxbc::Dest::V1D(uint32_t(InOutRegister::kPSInPosition), - in_position_used_), + dxbc::Dest::V1D(in_reg_ps_position_, in_position_used_), dxbc::Name::kPosition); } bool sample_rate_memexport = @@ -3632,10 +3670,9 @@ void DxbcShaderTranslator::WriteShaderCode() { uint32_t(in_front_face_used_) | (uint32_t(sample_rate_memexport) << 1); if (front_face_and_sample_index_mask) { // Is front face, sample index. - ao_.OpDclInputPSSGV( - dxbc::Dest::V1D(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - front_face_and_sample_index_mask), - dxbc::Name::kIsFrontFace); + ao_.OpDclInputPSSGV(dxbc::Dest::V1D(in_reg_ps_front_face_sample_index_, + front_face_and_sample_index_mask), + dxbc::Name::kIsFrontFace); } if (edram_rov_used_) { // Sample coverage input. diff --git a/src/xenia/gpu/dxbc_shader_translator.h b/src/xenia/gpu/dxbc_shader_translator.h index 7a7392c3f..8754aa55f 100644 --- a/src/xenia/gpu/dxbc_shader_translator.h +++ b/src/xenia/gpu/dxbc_shader_translator.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. * ****************************************************************************** */ @@ -55,11 +55,65 @@ class DxbcShaderTranslator : public ShaderTranslator { bool force_emit_source_map = false); ~DxbcShaderTranslator() override; + // Stage linkage ordering and rules (must be respected not only within the + // DxbcShaderTranslator, but also by everything else between the VS and the + // PS, such as geometry shaders for primitive types, and built-in pixel + // shaders for processing the fragment depth when there's no guest pixel + // shader): + // + // Note that VS means the guest VS here - can be VS or DS on the host. RS + // means the fixed-function rasterizer. + // + // The beginning of the parameters must match between the output of the + // producing stage and the input of the consuming stage, while the tail can be + // stage-specific or cut off. + // + // - Interpolators (TEXCOORD) - VS > GS > RS > PS, used interpolators are all + // unconditionally referenced in all these stages. + // - Point coordinates (XESPRITETEXCOORD) - GS > RS > PS, must be present in + // none or in all, if drawing points, and PsParamGen is used. + // - Position (SV_Position) - VS > GS > RS > PS, used in PS if actually needed + // for something (PsParamGen, alpha to coverage when oC0 is written, depth + // conversion, ROV render backend), the presence in PS depends on the usage + // within the PS, not on linkage, therefore it's the last in PS so it can be + // dropped from PS without effect on linkage. + // - Clip distances (SV_ClipDistance) - VS > GS > RS. + // - Cull distances (SV_CullDistance) - VS > RS or VS > GS. + // - Vertex kill AND operator (SV_CullDistance) - VS > RS or VS > GS. + // - Point size (XEPSIZE) - VS > GS. + // + // Therefore, for the direct VS > PS path, the parameters may be the + // following: + // - Shared between VS and PS: + // - Interpolators (TEXCOORD). + // - Position (SV_Position). + // - VS output only: + // - Clip distances (SV_ClipDistance). + // - Cull distances (SV_CullDistance). + // - Vertex kill AND operator (SV_CullDistance). + // + // When a GS is also used, the path between the VS and the GS is: + // - Shared between VS and GS: + // - Interpolators (TEXCOORD). + // - Position (SV_Position). + // - Clip distances (SV_ClipDistance). + // - Cull distances (SV_CullDistance). + // - Vertex kill AND operator (SV_CullDistance). + // - Point size (XEPSIZE). + // + // Then, between GS and PS, it's: + // - Shared between GS and PS: + // - Interpolators (TEXCOORD). + // - Point coordinates (XESPRITETEXCOORD). + // - Position (SV_Position). + // - GS output only: + // - Clip distances (SV_ClipDistance). + union Modification { // If anything in this is structure is changed in a way not compatible with // the previous layout, invalidate the pipeline storages by increasing this // version number (0xYYYYMMDD)! - static constexpr uint32_t kVersion = 0x20210425; + static constexpr uint32_t kVersion = 0x20220720; enum class DepthStencilMode : uint32_t { kNoModifiers, @@ -89,22 +143,55 @@ class DxbcShaderTranslator : public ShaderTranslator { uint64_t value; struct VertexShaderModification { + // uint32_t 0. + // Interpolators written by the vertex shader and needed by the pixel + // shader. + uint32_t interpolator_mask : xenos::kMaxInterpolators; + uint32_t user_clip_plane_count : 3; + uint32_t user_clip_plane_cull : 1; + // Whether vertex killing with the "and" operator is used, and one more + // SV_CullDistance needs to be written. + uint32_t vertex_kill_and : 1; + uint32_t output_point_size : 1; // Dynamically indexable register count from SQ_PROGRAM_CNTL. uint32_t dynamic_addressable_register_count : 8; + uint32_t : 2; + // uint32_t 1. // Pipeline stage and input configuration. Shader::HostVertexShaderType host_vertex_shader_type : Shader::kHostVertexShaderTypeBitCount; } vertex; struct PixelShaderModification { + // uint32_t 0. + // Interpolators written by the vertex shader and needed by the pixel + // shader. + uint32_t interpolator_mask : xenos::kMaxInterpolators; + uint32_t interpolators_centroid : xenos::kMaxInterpolators; + // uint32_t 1. // Dynamically indexable register count from SQ_PROGRAM_CNTL. + uint32_t param_gen_enable : 1; + uint32_t param_gen_interpolator : 4; + // If param_gen_enable is set, this must be set for point primitives, and + // must not be set for other primitive types - enables the point sprite + // coordinates input, and also effects the flag bits in PsParamGen. + uint32_t param_gen_point : 1; uint32_t dynamic_addressable_register_count : 8; // Non-ROV - depth / stencil output mode. DepthStencilMode depth_stencil_mode : 2; } pixel; - Modification(uint64_t modification_value = 0) : value(modification_value) { + explicit Modification(uint64_t modification_value = 0) + : value(modification_value) { static_assert_size(*this, sizeof(value)); } + + uint32_t GetVertexClipDistanceCount() const { + return vertex.user_clip_plane_cull ? 0 : vertex.user_clip_plane_count; + } + uint32_t GetVertexCullDistanceCount() const { + return (vertex.user_clip_plane_cull ? vertex.user_clip_plane_count : 0) + + vertex.vertex_kill_and; + } }; // Constant buffer bindings in space 0. @@ -122,15 +209,7 @@ class DxbcShaderTranslator : public ShaderTranslator { kSysFlag_XYDividedByW_Shift, kSysFlag_ZDividedByW_Shift, kSysFlag_WNotReciprocal_Shift, - kSysFlag_UserClipPlane0_Shift, - kSysFlag_UserClipPlane1_Shift, - kSysFlag_UserClipPlane2_Shift, - kSysFlag_UserClipPlane3_Shift, - kSysFlag_UserClipPlane4_Shift, - kSysFlag_UserClipPlane5_Shift, - kSysFlag_KillIfAnyVertexKilled_Shift, kSysFlag_PrimitivePolygonal_Shift, - kSysFlag_PrimitivePoint_Shift, kSysFlag_PrimitiveLine_Shift, kSysFlag_DepthFloat24_Shift, kSysFlag_AlphaPassIfLess_Shift, @@ -167,15 +246,7 @@ class DxbcShaderTranslator : public ShaderTranslator { kSysFlag_XYDividedByW = 1u << kSysFlag_XYDividedByW_Shift, kSysFlag_ZDividedByW = 1u << kSysFlag_ZDividedByW_Shift, kSysFlag_WNotReciprocal = 1u << kSysFlag_WNotReciprocal_Shift, - kSysFlag_UserClipPlane0 = 1u << kSysFlag_UserClipPlane0_Shift, - kSysFlag_UserClipPlane1 = 1u << kSysFlag_UserClipPlane1_Shift, - kSysFlag_UserClipPlane2 = 1u << kSysFlag_UserClipPlane2_Shift, - kSysFlag_UserClipPlane3 = 1u << kSysFlag_UserClipPlane3_Shift, - kSysFlag_UserClipPlane4 = 1u << kSysFlag_UserClipPlane4_Shift, - kSysFlag_UserClipPlane5 = 1u << kSysFlag_UserClipPlane5_Shift, - kSysFlag_KillIfAnyVertexKilled = 1u << kSysFlag_KillIfAnyVertexKilled_Shift, kSysFlag_PrimitivePolygonal = 1u << kSysFlag_PrimitivePolygonal_Shift, - kSysFlag_PrimitivePoint = 1u << kSysFlag_PrimitivePoint_Shift, kSysFlag_PrimitiveLine = 1u << kSysFlag_PrimitiveLine_Shift, kSysFlag_DepthFloat24 = 1u << kSysFlag_DepthFloat24_Shift, kSysFlag_AlphaPassIfLess = 1u << kSysFlag_AlphaPassIfLess_Shift, @@ -247,12 +318,6 @@ class DxbcShaderTranslator : public ShaderTranslator { // for the host viewport. float point_screen_diameter_to_ndc_radius[2]; - uint32_t interpolator_sampling_pattern; - uint32_t ps_param_gen; - // Log2 of X and Y sample size. Used for alpha to mask, and for MSAA with - // ROV, this is used for EDRAM address calculation. - uint32_t sample_count_log2[2]; - // Each byte contains post-swizzle TextureSign values for each of the needed // components of each of the 32 used texture fetch constants. uint32_t texture_swizzled_signs[8]; @@ -260,12 +325,18 @@ class DxbcShaderTranslator : public ShaderTranslator { // Whether the contents of each texture in fetch constants comes from a // resolve operation. uint32_t textures_resolved; + // Log2 of X and Y sample size. Used for alpha to mask, and for MSAA with + // ROV, this is used for EDRAM address calculation. + uint32_t sample_count_log2[2]; float alpha_test_reference; + // If alpha to mask is disabled, the entire alpha_to_mask value must be 0. // If alpha to mask is enabled, bits 0:7 are sample offsets, and bit 8 must // be 1. uint32_t alpha_to_mask; uint32_t edram_32bpp_tile_pitch_dwords_scaled; + uint32_t edram_depth_base_dwords_scaled; + uint32_t padding_edram_depth_base_dwords_scaled; float color_exp_bias[4]; @@ -284,9 +355,6 @@ class DxbcShaderTranslator : public ShaderTranslator { float edram_poly_offset_back[2]; }; - uint32_t edram_depth_base_dwords_scaled; - uint32_t padding_edram_depth_base_dwords_scaled[3]; - // In stencil function/operations (they match the layout of the // function/operations in RB_DEPTHCONTROL): // 0:2 - comparison function (bit 0 - less, bit 1 - equal, bit 2 - greater). @@ -360,24 +428,21 @@ class DxbcShaderTranslator : public ShaderTranslator { kPointConstantDiameter, kPointScreenDiameterToNDCRadius, - kInterpolatorSamplingPattern, - kPSParamGen, - kSampleCountLog2, - kTextureSwizzledSigns, kTexturesResolved, + kSampleCountLog2, kAlphaTestReference, + kAlphaToMask, kEdram32bppTilePitchDwordsScaled, + kEdramDepthBaseDwordsScaled, kColorExpBias, kEdramPolyOffsetFront, kEdramPolyOffsetBack, - kEdramDepthBaseDwordsScaled, - kEdramStencil, kEdramRTBaseDwordsScaled, @@ -579,34 +644,10 @@ class DxbcShaderTranslator : public ShaderTranslator { void ProcessAluInstruction(const ParsedAluInstruction& instr) override; private: - static constexpr uint32_t kPointParametersTexCoord = xenos::kMaxInterpolators; - - enum class InOutRegister : uint32_t { - // IF ANY OF THESE ARE CHANGED, WriteInputSignature and WriteOutputSignature - // MUST BE UPDATED! - kVSInVertexIndex = 0, - - kDSInControlPointIndex = 0, - - kVSDSOutInterpolators = 0, - kVSDSOutPointParameters = kVSDSOutInterpolators + xenos::kMaxInterpolators, - kVSDSOutPosition, - // Clip and cull distances must be tightly packed in Direct3D! - kVSDSOutClipDistance0123, - kVSDSOutClipDistance45AndCullDistance, - // TODO(Triang3l): Use SV_CullDistance instead for - // PA_CL_CLIP_CNTL::UCP_CULL_ONLY_ENA, but can't have more than 8 clip and - // cull distances in total. Currently only using SV_CullDistance for vertex - // kill. - - kPSInInterpolators = 0, - kPSInPointParameters = kPSInInterpolators + xenos::kMaxInterpolators, - kPSInPosition, - // nointerpolation inputs. SV_IsFrontFace (X) is always present for - // ps_param_gen, SV_SampleIndex (Y) is conditional (only for memexport when - // sample-rate shading is otherwise needed anyway due to depth conversion). - kPSInFrontFaceAndSampleIndex, - }; + // IF ANY OF THESE ARE CHANGED, WriteInputSignature and WriteOutputSignature + // MUST BE UPDATED! + static constexpr uint32_t kInRegisterVSVertexIndex = 0; + static constexpr uint32_t kInRegisterDSControlPointIndex = 0; // GetSystemConstantSrc + MarkSystemConstantUsed is for special cases of // building the source unconditionally - in general, LoadSystemConstant must @@ -664,6 +705,12 @@ class DxbcShaderTranslator : public ShaderTranslator { current_shader().implicit_early_z_write_allowed(); } + uint32_t GetModificationInterpolatorMask() const { + Modification modification = GetDxbcShaderModification(); + return is_vertex_shader() ? modification.vertex.interpolator_mask + : modification.pixel.interpolator_mask; + } + // Whether to use switch-case rather than if (pc >= label) for control flow. bool UseSwitchForControlFlow() const; @@ -1042,11 +1089,26 @@ class DxbcShaderTranslator : public ShaderTranslator { // so the remaining ones can be marked as unused in RDEF. uint64_t system_constants_used_; + uint32_t out_reg_vs_interpolators_; + uint32_t out_reg_vs_position_; + // Clip and cull distances must be tightly packed in Direct3D. + // Up to 6 SV_ClipDistances or SV_CullDistances depending on + // user_clip_plane_cull, then one SV_CullDistance if vertex_kill_and is used. + uint32_t out_reg_vs_clip_cull_distances_; + uint32_t out_reg_vs_point_size_; + uint32_t in_reg_ps_interpolators_; + uint32_t in_reg_ps_point_coordinates_; + uint32_t in_reg_ps_position_; + // nointerpolation inputs. SV_IsFrontFace (X) is for non-point PsParamGen, + // SV_SampleIndex (Y) is for memexport when sample-rate shading is otherwise + // needed anyway due to depth conversion. + uint32_t in_reg_ps_front_face_sample_index_; + // Mask of domain location actually used in the domain shader. uint32_t in_domain_location_used_; // Whether the primitive ID has been used in the domain shader. bool in_primitive_id_used_; - // Whether InOutRegister::kDSInControlPointIndex has been used in the shader. + // Whether kInRegisterDSControlPointIndex has been used in the shader. bool in_control_point_index_used_; // Mask of the pixel/sample position actually used in the pixel shader. uint32_t in_position_used_; diff --git a/src/xenia/gpu/dxbc_shader_translator_memexport.cc b/src/xenia/gpu/dxbc_shader_translator_memexport.cc index d34053839..c48facc08 100644 --- a/src/xenia/gpu/dxbc_shader_translator_memexport.cc +++ b/src/xenia/gpu/dxbc_shader_translator_memexport.cc @@ -133,9 +133,8 @@ void DxbcShaderTranslator::ExportToMemory() { // because it's the center and is covered with the half-pixel offset too). // Using control_temp.yz as per-axis temporary variables. in_position_used_ |= resolution_scaled_axes; - a_.OpFToU( - dxbc::Dest::R(control_temp, resolution_scaled_axes << 1), - dxbc::Src::V1D(uint32_t(InOutRegister::kPSInPosition), 0b0100 << 2)); + a_.OpFToU(dxbc::Dest::R(control_temp, resolution_scaled_axes << 1), + dxbc::Src::V1D(in_reg_ps_position_, 0b0100 << 2)); a_.OpUDiv(dxbc::Dest::Null(), dxbc::Dest::R(control_temp, resolution_scaled_axes << 1), dxbc::Src::R(control_temp, 0b1001 << 2), @@ -177,8 +176,7 @@ void DxbcShaderTranslator::ExportToMemory() { a_.OpIEq( dxbc::Dest::R(control_temp, inner_condition_provided ? 0b0010 : 0b0001), - dxbc::Src::V1D(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - dxbc::Src::kYYYY), + dxbc::Src::V1D(in_reg_ps_front_face_sample_index_, 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 3b6c1d6bd..d3065bf10 100644 --- a/src/xenia/gpu/dxbc_shader_translator_om.cc +++ b/src/xenia/gpu/dxbc_shader_translator_om.cc @@ -173,7 +173,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::V1D(uint32_t(InOutRegister::kPSInPosition))); + dxbc::Src::V1D(in_reg_ps_position_)); // 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 @@ -537,8 +537,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::V1D( - uint32_t(InOutRegister::kPSInPosition), dxbc::Src::kZZZZ)); + dxbc::Src in_position_z( + dxbc::Src::V1D(in_reg_ps_position_, 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 @@ -577,9 +577,8 @@ 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::V1D( - uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - dxbc::Src::kXXXX)); + a_.OpIf(true, dxbc::Src::V1D(in_reg_ps_front_face_sample_index_, + dxbc::Src::kXXXX)); // temp.x if early = ddx(z) // temp.y if early = ddy(z) // temp.z = front face polygon offset @@ -881,9 +880,8 @@ 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::V1D( - uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - dxbc::Src::kXXXX)); + a_.OpIf(true, dxbc::Src::V1D(in_reg_ps_front_face_sample_index_, + dxbc::Src::kXXXX)); for (uint32_t j = 0; j < 2; ++j) { if (j) { // Go to the back face. @@ -944,8 +942,7 @@ void DxbcShaderTranslator::ROV_DepthStencilTest() { in_front_face_used_ = true; a_.OpMovC( sample_temp_z_dest, - dxbc::Src::V1D(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - dxbc::Src::kXXXX), + dxbc::Src::V1D(in_reg_ps_front_face_sample_index_, dxbc::Src::kXXXX), LoadSystemConstant( SystemConstants::Index::kEdramStencil, offsetof(SystemConstants, edram_stencil_front_func_ops), @@ -1023,9 +1020,8 @@ void DxbcShaderTranslator::ROV_DepthStencilTest() { a_.OpCase(dxbc::Src::LU(uint32_t(xenos::StencilOp::kReplace))); in_front_face_used_ = true; a_.OpMovC(sample_temp_y_dest, - dxbc::Src::V1D( - uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - dxbc::Src::kXXXX), + dxbc::Src::V1D(in_reg_ps_front_face_sample_index_, + dxbc::Src::kXXXX), LoadSystemConstant( SystemConstants::Index::kEdramStencil, offsetof(SystemConstants, edram_stencil_front_reference), @@ -1087,8 +1083,7 @@ void DxbcShaderTranslator::ROV_DepthStencilTest() { in_front_face_used_ = true; a_.OpMovC( sample_temp_z_dest, - dxbc::Src::V1D(uint32_t(InOutRegister::kPSInFrontFaceAndSampleIndex), - dxbc::Src::kXXXX), + dxbc::Src::V1D(in_reg_ps_front_face_sample_index_, dxbc::Src::kXXXX), LoadSystemConstant( SystemConstants::Index::kEdramStencil, offsetof(SystemConstants, edram_stencil_front_write_mask), @@ -1863,8 +1858,7 @@ void DxbcShaderTranslator::CompletePixelShader_DSV_DepthTo24Bit() { temp = PushSystemTemp(); in_position_used_ |= 0b0100; a_.OpMul(dxbc::Dest::R(temp, 0b0001), - dxbc::Src::V1D(uint32_t(InOutRegister::kPSInPosition), - dxbc::Src::kZZZZ), + dxbc::Src::V1D(in_reg_ps_position_, dxbc::Src::kZZZZ), dxbc::Src::LF(2.0f), true); } @@ -2006,8 +2000,7 @@ void DxbcShaderTranslator::CompletePixelShader_AlphaToMask() { // preserve the idea of dithering. // 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::V1D(uint32_t(InOutRegister::kPSInPosition))); + a_.OpFToU(dxbc::Dest::R(temp, 0b0011), dxbc::Src::V1D(in_reg_ps_position_)); 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, diff --git a/src/xenia/gpu/registers.h b/src/xenia/gpu/registers.h index ec2017185..86b054d57 100644 --- a/src/xenia/gpu/registers.h +++ b/src/xenia/gpu/registers.h @@ -509,6 +509,9 @@ union alignas(uint32_t) PA_CL_CLIP_CNTL { uint32_t z_nan_retain : 1; // +23 uint32_t w_nan_retain : 1; // +24 }; + struct { + uint32_t ucp_ena : 6; + }; static constexpr Register register_index = XE_GPU_REG_PA_CL_CLIP_CNTL; }; static_assert_size(PA_CL_CLIP_CNTL, sizeof(uint32_t)); diff --git a/src/xenia/gpu/shader.h b/src/xenia/gpu/shader.h index fc08b2fd0..f07c0ee97 100644 --- a/src/xenia/gpu/shader.h +++ b/src/xenia/gpu/shader.h @@ -22,6 +22,7 @@ #include "xenia/base/byte_order.h" #include "xenia/base/math.h" #include "xenia/base/string_buffer.h" +#include "xenia/gpu/registers.h" #include "xenia/gpu/ucode.h" #include "xenia/gpu/xenos.h" @@ -652,11 +653,11 @@ void ParseAluInstruction(const ucode::AluInstruction& op, class Shader { public: - // Type of the vertex shader in a D3D11-like rendering pipeline - shader - // interface depends on in, so it must be known at translation time. - // If values are changed, INVALIDATE SHADER STORAGES (increase their version - // constexpr) where those are stored! And check bit count where this is - // packed. This is : uint32_t for simplicity of packing in bit fields. + // Type of the vertex shader on the host - shader interface depends on in, so + // it must be known at translation time. If values are changed, INVALIDATE + // SHADER STORAGES (increase their version constexpr) where those are stored! + // And check bit count where this is packed. This is : uint32_t for simplicity + // of packing in bit fields. enum class HostVertexShaderType : uint32_t { kVertex, @@ -668,9 +669,22 @@ class Shader { kQuadDomainCPIndexed, kQuadDomainPatchIndexed, kDomainEnd, + + // For implementation without unconditional support for memory writes from + // vertex shaders, vertex shader converted to a compute shader doing only + // memory export. + kMemexportCompute, + + // 4 host vertices for 1 guest vertex, for implementations without + // unconditional geometry shader support. + kPointListAsTriangleStrip, + // 3 guest vertices processed by the host shader invocation to choose the + // strip orientation, for implementations without unconditional geometry + // shader support. + kRectangleListAsTriangleStrip, }; // For packing HostVertexShaderType in bit fields. - static constexpr uint32_t kHostVertexShaderTypeBitCount = 3; + static constexpr uint32_t kHostVertexShaderTypeBitCount = 4; static constexpr bool IsHostVertexShaderTypeDomain( HostVertexShaderType host_vertex_shader_type) { @@ -932,6 +946,21 @@ class Shader { return uses_texture_fetch_instruction_results_; } + // Whether each interpolator is written on any execution path. + uint32_t writes_interpolators() const { return writes_interpolators_; } + + // Whether the system vertex shader exports are written on any execution path. + uint32_t writes_point_size_edge_flag_kill_vertex() const { + return writes_point_size_edge_flag_kill_vertex_; + } + + // Returns the mask of the interpolators the pixel shader potentially requires + // from the vertex shader, and also the PsParamGen destination register, or + // UINT32_MAX if it's not needed. + uint32_t GetInterpolatorInputMask(reg::SQ_PROGRAM_CNTL sq_program_cntl, + reg::SQ_CONTEXT_MISC sq_context_misc, + uint32_t& param_gen_pos_out) const; + // True if the shader overrides the pixel depth. bool writes_depth() const { return writes_depth_; } @@ -1018,11 +1047,13 @@ class Shader { std::set label_addresses_; uint32_t cf_pair_index_bound_ = 0; uint32_t register_static_address_bound_ = 0; + uint32_t writes_interpolators_ = 0; + uint32_t writes_point_size_edge_flag_kill_vertex_ = 0; + uint32_t writes_color_targets_ = 0b0000; bool uses_register_dynamic_addressing_ = false; bool kills_pixels_ = false; bool uses_texture_fetch_instruction_results_ = false; bool writes_depth_ = false; - uint32_t writes_color_targets_ = 0b0000; // Modification bits -> translation. std::unordered_map translations_; diff --git a/src/xenia/gpu/shader_translator.cc b/src/xenia/gpu/shader_translator.cc index 4f4c1736c..dc38a42b8 100644 --- a/src/xenia/gpu/shader_translator.cc +++ b/src/xenia/gpu/shader_translator.cc @@ -233,6 +233,26 @@ void Shader::AnalyzeUcode(StringBuffer& ucode_disasm_buffer) { } } +uint32_t Shader::GetInterpolatorInputMask(reg::SQ_PROGRAM_CNTL sq_program_cntl, + reg::SQ_CONTEXT_MISC sq_context_misc, + uint32_t& param_gen_pos_out) const { + assert_true(type() == xenos::ShaderType::kPixel); + uint32_t interpolator_count = std::min( + xenos::kMaxInterpolators, + std::max(register_static_address_bound(), + GetDynamicAddressableRegisterCount(sq_program_cntl.ps_num_reg))); + uint32_t interpolator_mask = (UINT32_C(1) << interpolator_count) - 1; + if (sq_program_cntl.param_gen && + sq_context_misc.param_gen_pos < interpolator_count) { + // Will be overwritten by PsParamGen. + interpolator_mask &= ~(UINT32_C(1) << sq_context_misc.param_gen_pos); + param_gen_pos_out = sq_context_misc.param_gen_pos; + } else { + param_gen_pos_out = UINT32_MAX; + } + return interpolator_mask; +} + void Shader::GatherExecInformation( const ParsedExecInstruction& instr, ucode::VertexFetchInstruction& previous_vfetch_full, @@ -470,7 +490,8 @@ void Shader::GatherFetchResultInformation(const InstructionResult& result) { void Shader::GatherAluResultInformation( const InstructionResult& result, uint32_t memexport_alloc_current_count) { - if (!result.GetUsedWriteMask()) { + uint32_t used_write_mask = result.GetUsedWriteMask(); + if (!used_write_mask) { return; } switch (result.storage_target) { @@ -483,6 +504,12 @@ void Shader::GatherAluResultInformation( uses_register_dynamic_addressing_ = true; } break; + case InstructionStorageTarget::kInterpolator: + writes_interpolators_ |= uint32_t(1) << result.storage_index; + break; + case InstructionStorageTarget::kPointSizeEdgeFlagKillVertex: + writes_point_size_edge_flag_kill_vertex_ |= used_write_mask; + break; case InstructionStorageTarget::kExportData: if (memexport_alloc_current_count > 0 && memexport_alloc_current_count <= Shader::kMaxMemExports) { 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 6ad9c3f3e..65fcd3997 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 @@ -21,25 +21,23 @@ // float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [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] -// 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] +// uint4 xe_texture_swizzled_signs[2];// Offset: 176 Size: 32 [unused] +// uint xe_textures_resolved; // Offset: 208 Size: 4 [unused] +// uint2 xe_sample_count_log2; // Offset: 212 Size: 8 [unused] +// float xe_alpha_test_reference; // Offset: 220 Size: 4 [unused] +// uint xe_alpha_to_mask; // Offset: 224 Size: 4 [unused] +// uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset: 228 Size: 4 [unused] +// uint xe_edram_depth_base_dwords_scaled;// Offset: 232 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] +// uint4 xe_edram_stencil[2]; // Offset: 272 Size: 32 [unused] +// uint4 xe_edram_rt_base_dwords_scaled;// Offset: 304 Size: 16 [unused] +// uint4 xe_edram_rt_format_flags; // Offset: 320 Size: 16 [unused] +// float4 xe_edram_rt_clamp[4]; // Offset: 336 Size: 64 [unused] +// uint4 xe_edram_rt_keep_mask[2]; // Offset: 400 Size: 32 [unused] +// uint4 xe_edram_rt_blend_factors_ops;// Offset: 432 Size: 16 [unused] +// float4 xe_edram_blend_constant; // Offset: 448 Size: 16 [unused] // // } // @@ -121,21 +119,21 @@ ret const BYTE continuous_quad_hs[] = { - 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, + 68, 88, 66, 67, 196, 234, + 51, 156, 242, 124, 98, 132, + 34, 110, 229, 40, 64, 181, + 146, 55, 1, 0, 0, 0, + 160, 13, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, - 232, 10, 0, 0, 28, 11, - 0, 0, 80, 11, 0, 0, - 20, 12, 0, 0, 128, 13, + 108, 10, 0, 0, 160, 10, + 0, 0, 212, 10, 0, 0, + 152, 11, 0, 0, 4, 13, 0, 0, 82, 68, 69, 70, - 168, 10, 0, 0, 1, 0, + 44, 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, 126, 10, + 0, 5, 0, 0, 2, 10, 0, 0, 19, 19, 68, 37, 60, 0, 0, 0, 24, 0, 0, 0, 40, 0, 0, 0, @@ -152,558 +150,537 @@ const BYTE continuous_quad_hs[] = 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, 30, 0, 0, 0, + 144, 0, 0, 0, 208, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 144, 5, + 0, 0, 0, 0, 64, 5, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, + 0, 0, 80, 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, + 0, 0, 116, 5, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, - 232, 5, 0, 0, 0, 0, + 152, 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, + 188, 5, 0, 0, 12, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, 0, 0, 215, 5, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, + 0, 0, 80, 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, + 0, 0, 238, 5, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 80, 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, + 5, 6, 0, 0, 24, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 116, 6, + 0, 0, 0, 0, 36, 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, 0, 0, 72, 6, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 0, 0, - 0, 0, 180, 6, 0, 0, + 0, 0, 100, 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, + 0, 0, 136, 6, 0, 0, 128, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 236, 6, 0, 0, 0, 0, + 156, 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, + 192, 6, 0, 0, 140, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 52, 7, + 0, 0, 0, 0, 228, 6, 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, 0, 0, 8, 7, 0, 0, 144, 0, 0, 0, 12, 0, 0, 0, 0, 0, - 0, 0, 236, 6, 0, 0, + 0, 0, 156, 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, + 0, 0, 22, 7, 0, 0, 156, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 52, 7, 0, 0, 0, 0, + 228, 6, 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, + 51, 7, 0, 0, 160, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 232, 5, + 0, 0, 0, 0, 152, 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, 0, 0, 78, 7, 0, 0, 168, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 232, 5, 0, 0, + 0, 0, 152, 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, 117, 7, 0, 0, + 176, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 152, 7, 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, + 188, 7, 0, 0, 208, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, + 0, 0, 0, 0, 209, 7, + 0, 0, 212, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 116, 6, 0, 0, + 0, 0, 36, 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, 230, 7, 0, 0, + 220, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 44, 8, 0, 0, 0, 0, + 228, 6, 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, + 254, 7, 0, 0, 224, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, 0, 0, 15, 8, 0, 0, 228, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 52, 7, 0, 0, + 0, 0, 80, 5, 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, + 0, 0, 55, 8, 0, 0, 232, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 80, 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, + 89, 8, 0, 0, 240, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 152, 9, + 0, 0, 0, 0, 108, 8, 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, 144, 8, + 0, 0, 0, 1, 0, 0, + 8, 0, 0, 0, 0, 0, + 0, 0, 152, 5, 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, 171, 8, 0, 0, + 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 232, 9, 0, 0, 0, 0, + 152, 5, 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, + 197, 8, 0, 0, 16, 1, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 36, 10, + 0, 0, 0, 0, 216, 8, 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, + 0, 0, 0, 0, 252, 8, + 0, 0, 48, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 152, 9, 0, 0, + 0, 0, 28, 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, 64, 9, 0, 0, + 64, 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 200, 8, 0, 0, 0, 0, + 28, 9, 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, + 89, 9, 0, 0, 80, 1, + 0, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 108, 9, + 0, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 144, 9, + 0, 0, 144, 1, 0, 0, + 32, 0, 0, 0, 0, 0, + 0, 0, 168, 9, 0, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 204, 9, 0, 0, + 176, 1, 0, 0, 16, 0, + 0, 0, 0, 0, 0, 0, + 28, 9, 0, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 234, 9, 0, 0, 192, 1, + 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 108, 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, 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, 73, 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, 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, + 0, 0, 0, 0, 145, 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, 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, + 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, 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, + 29, 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, - 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, 92, 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, 229, 6, 0, 0, + 0, 0, 0, 0, 0, 0, + 149, 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, + 221, 6, 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, 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, + 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, 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, 114, 95, 116, 111, 95, + 110, 100, 99, 95, 114, 97, + 100, 105, 117, 115, 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, 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, - 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, + 143, 7, 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, 115, 97, + 109, 112, 108, 101, 95, 99, + 111, 117, 110, 116, 95, 108, + 111, 103, 50, 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, 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, 99, 111, 108, 111, + 114, 95, 101, 120, 112, 95, + 98, 105, 97, 115, 0, 171, + 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, 92, 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, 115, 116, 101, 110, - 99, 105, 108, 0, 1, 0, + 99, 105, 108, 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, 143, 7, 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, 143, 7, + 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, + 92, 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, + 143, 7, 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, + 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, 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, + 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, 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, 1, 0, 0, + 0, 0, 1, 14, 0, 0, 88, 69, 86, 69, 82, 84, 69, 88, 73, 68, 0, 171, - 79, 83, 71, 78, 44, 0, + 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, 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 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, + 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, - 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, - 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, 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, 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, + 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, - 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, + 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, 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, - 1, 0, 0, 0, 0, 0, - 0, 0, 115, 0, 0, 1, - 153, 0, 0, 2, 4, 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, - 0, 0, 0, 0, 11, 0, + 4, 0, 0, 0, 15, 0, 0, 0, 103, 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, 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, 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, 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, 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, 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, - 2, 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, @@ -711,16 +688,17 @@ 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, - 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, + 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, 3, 0, 0, 0, + 4, 0, 0, 0, 3, 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 bf8d8ac4b..3e6f39bfe 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 @@ -21,25 +21,23 @@ // float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [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] -// 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] +// uint4 xe_texture_swizzled_signs[2];// Offset: 176 Size: 32 [unused] +// uint xe_textures_resolved; // Offset: 208 Size: 4 [unused] +// uint2 xe_sample_count_log2; // Offset: 212 Size: 8 [unused] +// float xe_alpha_test_reference; // Offset: 220 Size: 4 [unused] +// uint xe_alpha_to_mask; // Offset: 224 Size: 4 [unused] +// uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset: 228 Size: 4 [unused] +// uint xe_edram_depth_base_dwords_scaled;// Offset: 232 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] +// uint4 xe_edram_stencil[2]; // Offset: 272 Size: 32 [unused] +// uint4 xe_edram_rt_base_dwords_scaled;// Offset: 304 Size: 16 [unused] +// uint4 xe_edram_rt_format_flags; // Offset: 320 Size: 16 [unused] +// float4 xe_edram_rt_clamp[4]; // Offset: 336 Size: 64 [unused] +// uint4 xe_edram_rt_keep_mask[2]; // Offset: 400 Size: 32 [unused] +// uint4 xe_edram_rt_blend_factors_ops;// Offset: 432 Size: 16 [unused] +// float4 xe_edram_blend_constant; // Offset: 448 Size: 16 [unused] // // } // @@ -112,21 +110,21 @@ ret const BYTE continuous_triangle_hs[] = { - 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, + 68, 88, 66, 67, 40, 16, + 64, 130, 119, 149, 137, 0, + 58, 149, 234, 138, 51, 145, + 29, 76, 1, 0, 0, 0, + 16, 13, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, - 232, 10, 0, 0, 28, 11, - 0, 0, 80, 11, 0, 0, - 228, 11, 0, 0, 240, 12, + 108, 10, 0, 0, 160, 10, + 0, 0, 212, 10, 0, 0, + 104, 11, 0, 0, 116, 12, 0, 0, 82, 68, 69, 70, - 168, 10, 0, 0, 1, 0, + 44, 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, 126, 10, + 0, 5, 0, 0, 2, 10, 0, 0, 19, 19, 68, 37, 60, 0, 0, 0, 24, 0, 0, 0, 40, 0, 0, 0, @@ -143,534 +141,513 @@ const BYTE continuous_triangle_hs[] = 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, 30, 0, 0, 0, + 144, 0, 0, 0, 208, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 144, 5, + 0, 0, 0, 0, 64, 5, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, + 0, 0, 80, 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, + 0, 0, 116, 5, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, - 232, 5, 0, 0, 0, 0, + 152, 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, + 188, 5, 0, 0, 12, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, 0, 0, 215, 5, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, + 0, 0, 80, 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, + 0, 0, 238, 5, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 80, 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, + 5, 6, 0, 0, 24, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 116, 6, + 0, 0, 0, 0, 36, 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, 0, 0, 72, 6, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 0, 0, - 0, 0, 180, 6, 0, 0, + 0, 0, 100, 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, + 0, 0, 136, 6, 0, 0, 128, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 236, 6, 0, 0, 0, 0, + 156, 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, + 192, 6, 0, 0, 140, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 52, 7, + 0, 0, 0, 0, 228, 6, 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, 0, 0, 8, 7, 0, 0, 144, 0, 0, 0, 12, 0, 0, 0, 0, 0, - 0, 0, 236, 6, 0, 0, + 0, 0, 156, 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, + 0, 0, 22, 7, 0, 0, 156, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 52, 7, 0, 0, 0, 0, + 228, 6, 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, + 51, 7, 0, 0, 160, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 232, 5, + 0, 0, 0, 0, 152, 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, 0, 0, 78, 7, 0, 0, 168, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 232, 5, 0, 0, + 0, 0, 152, 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, 117, 7, 0, 0, + 176, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 152, 7, 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, + 188, 7, 0, 0, 208, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, + 0, 0, 0, 0, 209, 7, + 0, 0, 212, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 116, 6, 0, 0, + 0, 0, 36, 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, 230, 7, 0, 0, + 220, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 44, 8, 0, 0, 0, 0, + 228, 6, 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, + 254, 7, 0, 0, 224, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, 0, 0, 15, 8, 0, 0, 228, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 52, 7, 0, 0, + 0, 0, 80, 5, 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, + 0, 0, 55, 8, 0, 0, 232, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 80, 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, + 89, 8, 0, 0, 240, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 152, 9, + 0, 0, 0, 0, 108, 8, 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, 144, 8, + 0, 0, 0, 1, 0, 0, + 8, 0, 0, 0, 0, 0, + 0, 0, 152, 5, 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, 171, 8, 0, 0, + 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 232, 9, 0, 0, 0, 0, + 152, 5, 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, + 197, 8, 0, 0, 16, 1, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 36, 10, + 0, 0, 0, 0, 216, 8, 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, + 0, 0, 0, 0, 252, 8, + 0, 0, 48, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 152, 9, 0, 0, + 0, 0, 28, 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, 64, 9, 0, 0, + 64, 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 200, 8, 0, 0, 0, 0, + 28, 9, 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, + 89, 9, 0, 0, 80, 1, + 0, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 108, 9, + 0, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 144, 9, + 0, 0, 144, 1, 0, 0, + 32, 0, 0, 0, 0, 0, + 0, 0, 168, 9, 0, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 204, 9, 0, 0, + 176, 1, 0, 0, 16, 0, + 0, 0, 0, 0, 0, 0, + 28, 9, 0, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 234, 9, 0, 0, 192, 1, + 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 108, 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, 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, 73, 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, 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, + 0, 0, 0, 0, 145, 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, 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, + 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, 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, + 29, 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, - 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, 92, 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, 229, 6, 0, 0, + 0, 0, 0, 0, 0, 0, + 149, 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, + 221, 6, 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, 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, + 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, 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, 114, 95, 116, 111, 95, + 110, 100, 99, 95, 114, 97, + 100, 105, 117, 115, 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, 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, - 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, + 143, 7, 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, 115, 97, + 109, 112, 108, 101, 95, 99, + 111, 117, 110, 116, 95, 108, + 111, 103, 50, 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, 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, 99, 111, 108, 111, + 114, 95, 101, 120, 112, 95, + 98, 105, 97, 115, 0, 171, + 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, 92, 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, 115, 116, 101, 110, - 99, 105, 108, 0, 1, 0, + 99, 105, 108, 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, 143, 7, 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, 143, 7, + 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, + 92, 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, + 143, 7, 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, + 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, 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, + 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, 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, 1, 0, 0, + 0, 0, 1, 14, 0, 0, 88, 69, 86, 69, 82, 84, 69, 88, 73, 68, 0, 171, - 79, 83, 71, 78, 44, 0, + 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, 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 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, - 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, + 14, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, - 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, + 1, 14, 0, 0, 83, 86, + 95, 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, + 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, 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, 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, 4, - 18, 32, 16, 0, 1, 0, - 0, 0, 18, 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, 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, + 17, 0, 0, 0, 103, 0, + 0, 4, 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, 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, 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, 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, - 2, 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, @@ -678,16 +655,17 @@ const BYTE continuous_triangle_hs[] = 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, + 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 }; 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 dfc49e9d2..8e83c6f7a 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 @@ -21,25 +21,23 @@ // float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [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] -// 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] +// uint4 xe_texture_swizzled_signs[2];// Offset: 176 Size: 32 [unused] +// uint xe_textures_resolved; // Offset: 208 Size: 4 [unused] +// uint2 xe_sample_count_log2; // Offset: 212 Size: 8 [unused] +// float xe_alpha_test_reference; // Offset: 220 Size: 4 [unused] +// uint xe_alpha_to_mask; // Offset: 224 Size: 4 [unused] +// uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset: 228 Size: 4 [unused] +// uint xe_edram_depth_base_dwords_scaled;// Offset: 232 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] +// uint4 xe_edram_stencil[2]; // Offset: 272 Size: 32 [unused] +// uint4 xe_edram_rt_base_dwords_scaled;// Offset: 304 Size: 16 [unused] +// uint4 xe_edram_rt_format_flags; // Offset: 320 Size: 16 [unused] +// float4 xe_edram_rt_clamp[4]; // Offset: 336 Size: 64 [unused] +// uint4 xe_edram_rt_keep_mask[2]; // Offset: 400 Size: 32 [unused] +// uint4 xe_edram_rt_blend_factors_ops;// Offset: 432 Size: 16 [unused] +// float4 xe_edram_blend_constant; // Offset: 448 Size: 16 [unused] // // } // @@ -121,21 +119,21 @@ ret const BYTE discrete_quad_hs[] = { - 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, + 68, 88, 66, 67, 192, 34, + 77, 20, 70, 107, 155, 33, + 163, 40, 168, 219, 244, 3, + 133, 198, 1, 0, 0, 0, + 160, 13, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, - 232, 10, 0, 0, 28, 11, - 0, 0, 80, 11, 0, 0, - 20, 12, 0, 0, 128, 13, + 108, 10, 0, 0, 160, 10, + 0, 0, 212, 10, 0, 0, + 152, 11, 0, 0, 4, 13, 0, 0, 82, 68, 69, 70, - 168, 10, 0, 0, 1, 0, + 44, 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, 126, 10, + 0, 5, 0, 0, 2, 10, 0, 0, 19, 19, 68, 37, 60, 0, 0, 0, 24, 0, 0, 0, 40, 0, 0, 0, @@ -152,558 +150,537 @@ const BYTE discrete_quad_hs[] = 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, 30, 0, 0, 0, + 144, 0, 0, 0, 208, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 144, 5, + 0, 0, 0, 0, 64, 5, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, + 0, 0, 80, 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, + 0, 0, 116, 5, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, - 232, 5, 0, 0, 0, 0, + 152, 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, + 188, 5, 0, 0, 12, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, 0, 0, 215, 5, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, + 0, 0, 80, 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, + 0, 0, 238, 5, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 80, 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, + 5, 6, 0, 0, 24, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 116, 6, + 0, 0, 0, 0, 36, 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, 0, 0, 72, 6, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 0, 0, - 0, 0, 180, 6, 0, 0, + 0, 0, 100, 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, + 0, 0, 136, 6, 0, 0, 128, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 236, 6, 0, 0, 0, 0, + 156, 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, + 192, 6, 0, 0, 140, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 52, 7, + 0, 0, 0, 0, 228, 6, 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, 0, 0, 8, 7, 0, 0, 144, 0, 0, 0, 12, 0, 0, 0, 0, 0, - 0, 0, 236, 6, 0, 0, + 0, 0, 156, 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, + 0, 0, 22, 7, 0, 0, 156, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 52, 7, 0, 0, 0, 0, + 228, 6, 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, + 51, 7, 0, 0, 160, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 232, 5, + 0, 0, 0, 0, 152, 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, 0, 0, 78, 7, 0, 0, 168, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 232, 5, 0, 0, + 0, 0, 152, 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, 117, 7, 0, 0, + 176, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 152, 7, 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, + 188, 7, 0, 0, 208, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, + 0, 0, 0, 0, 209, 7, + 0, 0, 212, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 116, 6, 0, 0, + 0, 0, 36, 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, 230, 7, 0, 0, + 220, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 44, 8, 0, 0, 0, 0, + 228, 6, 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, + 254, 7, 0, 0, 224, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, 0, 0, 15, 8, 0, 0, 228, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 52, 7, 0, 0, + 0, 0, 80, 5, 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, + 0, 0, 55, 8, 0, 0, 232, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 80, 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, + 89, 8, 0, 0, 240, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 152, 9, + 0, 0, 0, 0, 108, 8, 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, 144, 8, + 0, 0, 0, 1, 0, 0, + 8, 0, 0, 0, 0, 0, + 0, 0, 152, 5, 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, 171, 8, 0, 0, + 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 232, 9, 0, 0, 0, 0, + 152, 5, 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, + 197, 8, 0, 0, 16, 1, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 36, 10, + 0, 0, 0, 0, 216, 8, 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, + 0, 0, 0, 0, 252, 8, + 0, 0, 48, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 152, 9, 0, 0, + 0, 0, 28, 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, 64, 9, 0, 0, + 64, 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 200, 8, 0, 0, 0, 0, + 28, 9, 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, + 89, 9, 0, 0, 80, 1, + 0, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 108, 9, + 0, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 144, 9, + 0, 0, 144, 1, 0, 0, + 32, 0, 0, 0, 0, 0, + 0, 0, 168, 9, 0, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 204, 9, 0, 0, + 176, 1, 0, 0, 16, 0, + 0, 0, 0, 0, 0, 0, + 28, 9, 0, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 234, 9, 0, 0, 192, 1, + 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 108, 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, 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, 73, 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, 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, + 0, 0, 0, 0, 145, 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, 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, + 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, 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, + 29, 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, - 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, 92, 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, 229, 6, 0, 0, + 0, 0, 0, 0, 0, 0, + 149, 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, + 221, 6, 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, 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, + 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, 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, 114, 95, 116, 111, 95, + 110, 100, 99, 95, 114, 97, + 100, 105, 117, 115, 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, 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, - 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, + 143, 7, 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, 115, 97, + 109, 112, 108, 101, 95, 99, + 111, 117, 110, 116, 95, 108, + 111, 103, 50, 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, 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, 99, 111, 108, 111, + 114, 95, 101, 120, 112, 95, + 98, 105, 97, 115, 0, 171, + 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, 92, 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, 115, 116, 101, 110, - 99, 105, 108, 0, 1, 0, + 99, 105, 108, 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, 143, 7, 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, 143, 7, + 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, + 92, 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, + 143, 7, 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, + 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, 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, + 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, 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, 1, 0, 0, + 0, 0, 1, 14, 0, 0, 88, 69, 86, 69, 82, 84, 69, 88, 73, 68, 0, 171, - 79, 83, 71, 78, 44, 0, + 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, 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 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, + 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, - 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, - 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, 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, 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, + 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, - 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, + 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, 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, - 1, 0, 0, 0, 0, 0, - 0, 0, 115, 0, 0, 1, - 153, 0, 0, 2, 4, 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, - 0, 0, 0, 0, 11, 0, + 4, 0, 0, 0, 15, 0, 0, 0, 103, 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, 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, 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, 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, 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, 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, - 2, 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, @@ -711,16 +688,17 @@ 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, - 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, + 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, 3, 0, 0, 0, + 1, 0, 0, 0, 3, 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 a386d836a..f2a53e630 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 @@ -21,25 +21,23 @@ // float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [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] -// 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] +// uint4 xe_texture_swizzled_signs[2];// Offset: 176 Size: 32 [unused] +// uint xe_textures_resolved; // Offset: 208 Size: 4 [unused] +// uint2 xe_sample_count_log2; // Offset: 212 Size: 8 [unused] +// float xe_alpha_test_reference; // Offset: 220 Size: 4 [unused] +// uint xe_alpha_to_mask; // Offset: 224 Size: 4 [unused] +// uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset: 228 Size: 4 [unused] +// uint xe_edram_depth_base_dwords_scaled;// Offset: 232 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] +// uint4 xe_edram_stencil[2]; // Offset: 272 Size: 32 [unused] +// uint4 xe_edram_rt_base_dwords_scaled;// Offset: 304 Size: 16 [unused] +// uint4 xe_edram_rt_format_flags; // Offset: 320 Size: 16 [unused] +// float4 xe_edram_rt_clamp[4]; // Offset: 336 Size: 64 [unused] +// uint4 xe_edram_rt_keep_mask[2]; // Offset: 400 Size: 32 [unused] +// uint4 xe_edram_rt_blend_factors_ops;// Offset: 432 Size: 16 [unused] +// float4 xe_edram_blend_constant; // Offset: 448 Size: 16 [unused] // // } // @@ -112,21 +110,21 @@ ret const BYTE discrete_triangle_hs[] = { - 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, + 68, 88, 66, 67, 159, 101, + 17, 163, 1, 25, 162, 203, + 87, 30, 32, 90, 1, 126, + 212, 108, 1, 0, 0, 0, + 16, 13, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, - 232, 10, 0, 0, 28, 11, - 0, 0, 80, 11, 0, 0, - 228, 11, 0, 0, 240, 12, + 108, 10, 0, 0, 160, 10, + 0, 0, 212, 10, 0, 0, + 104, 11, 0, 0, 116, 12, 0, 0, 82, 68, 69, 70, - 168, 10, 0, 0, 1, 0, + 44, 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, 126, 10, + 0, 5, 0, 0, 2, 10, 0, 0, 19, 19, 68, 37, 60, 0, 0, 0, 24, 0, 0, 0, 40, 0, 0, 0, @@ -143,534 +141,513 @@ const BYTE discrete_triangle_hs[] = 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, 30, 0, 0, 0, + 144, 0, 0, 0, 208, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 144, 5, + 0, 0, 0, 0, 64, 5, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, + 0, 0, 80, 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, + 0, 0, 116, 5, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, - 232, 5, 0, 0, 0, 0, + 152, 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, + 188, 5, 0, 0, 12, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, 0, 0, 215, 5, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, + 0, 0, 80, 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, + 0, 0, 238, 5, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 80, 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, + 5, 6, 0, 0, 24, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 116, 6, + 0, 0, 0, 0, 36, 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, 0, 0, 72, 6, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 0, 0, - 0, 0, 180, 6, 0, 0, + 0, 0, 100, 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, + 0, 0, 136, 6, 0, 0, 128, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 236, 6, 0, 0, 0, 0, + 156, 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, + 192, 6, 0, 0, 140, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 52, 7, + 0, 0, 0, 0, 228, 6, 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, 0, 0, 8, 7, 0, 0, 144, 0, 0, 0, 12, 0, 0, 0, 0, 0, - 0, 0, 236, 6, 0, 0, + 0, 0, 156, 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, + 0, 0, 22, 7, 0, 0, 156, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 52, 7, 0, 0, 0, 0, + 228, 6, 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, + 51, 7, 0, 0, 160, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 232, 5, + 0, 0, 0, 0, 152, 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, 0, 0, 78, 7, 0, 0, 168, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 232, 5, 0, 0, + 0, 0, 152, 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, 117, 7, 0, 0, + 176, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 152, 7, 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, + 188, 7, 0, 0, 208, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, + 0, 0, 0, 0, 209, 7, + 0, 0, 212, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 116, 6, 0, 0, + 0, 0, 36, 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, 230, 7, 0, 0, + 220, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 44, 8, 0, 0, 0, 0, + 228, 6, 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, + 254, 7, 0, 0, 224, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, 0, 0, 15, 8, 0, 0, 228, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 52, 7, 0, 0, + 0, 0, 80, 5, 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, + 0, 0, 55, 8, 0, 0, 232, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 80, 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, + 89, 8, 0, 0, 240, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 152, 9, + 0, 0, 0, 0, 108, 8, 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, 144, 8, + 0, 0, 0, 1, 0, 0, + 8, 0, 0, 0, 0, 0, + 0, 0, 152, 5, 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, 171, 8, 0, 0, + 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 232, 9, 0, 0, 0, 0, + 152, 5, 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, + 197, 8, 0, 0, 16, 1, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 36, 10, + 0, 0, 0, 0, 216, 8, 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, + 0, 0, 0, 0, 252, 8, + 0, 0, 48, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 152, 9, 0, 0, + 0, 0, 28, 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, 64, 9, 0, 0, + 64, 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 200, 8, 0, 0, 0, 0, + 28, 9, 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, + 89, 9, 0, 0, 80, 1, + 0, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 108, 9, + 0, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 144, 9, + 0, 0, 144, 1, 0, 0, + 32, 0, 0, 0, 0, 0, + 0, 0, 168, 9, 0, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 204, 9, 0, 0, + 176, 1, 0, 0, 16, 0, + 0, 0, 0, 0, 0, 0, + 28, 9, 0, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 234, 9, 0, 0, 192, 1, + 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 108, 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, 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, 73, 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, 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, + 0, 0, 0, 0, 145, 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, 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, + 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, 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, + 29, 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, - 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, 92, 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, 229, 6, 0, 0, + 0, 0, 0, 0, 0, 0, + 149, 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, + 221, 6, 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, 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, + 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, 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, 114, 95, 116, 111, 95, + 110, 100, 99, 95, 114, 97, + 100, 105, 117, 115, 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, 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, - 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, + 143, 7, 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, 115, 97, + 109, 112, 108, 101, 95, 99, + 111, 117, 110, 116, 95, 108, + 111, 103, 50, 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, 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, 99, 111, 108, 111, + 114, 95, 101, 120, 112, 95, + 98, 105, 97, 115, 0, 171, + 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, 92, 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, 115, 116, 101, 110, - 99, 105, 108, 0, 1, 0, + 99, 105, 108, 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, 143, 7, 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, 143, 7, + 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, + 92, 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, + 143, 7, 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, + 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, 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, + 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, 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, 1, 0, 0, + 0, 0, 1, 14, 0, 0, 88, 69, 86, 69, 82, 84, 69, 88, 73, 68, 0, 171, - 79, 83, 71, 78, 44, 0, + 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, 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 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, - 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, + 14, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, - 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, + 1, 14, 0, 0, 83, 86, + 95, 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, + 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, 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, 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, 4, - 18, 32, 16, 0, 1, 0, - 0, 0, 18, 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, 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, + 17, 0, 0, 0, 103, 0, + 0, 4, 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, 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, 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, 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, - 2, 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, @@ -678,16 +655,17 @@ const BYTE discrete_triangle_hs[] = 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, + 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 }; 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 b93e23695..39f388e92 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 @@ -21,25 +21,23 @@ // float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [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] -// 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] +// uint4 xe_texture_swizzled_signs[2];// Offset: 176 Size: 32 [unused] +// uint xe_textures_resolved; // Offset: 208 Size: 4 [unused] +// uint2 xe_sample_count_log2; // Offset: 212 Size: 8 [unused] +// float xe_alpha_test_reference; // Offset: 220 Size: 4 [unused] +// uint xe_alpha_to_mask; // Offset: 224 Size: 4 [unused] +// uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset: 228 Size: 4 [unused] +// uint xe_edram_depth_base_dwords_scaled;// Offset: 232 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] +// uint4 xe_edram_stencil[2]; // Offset: 272 Size: 32 [unused] +// uint4 xe_edram_rt_base_dwords_scaled;// Offset: 304 Size: 16 [unused] +// uint4 xe_edram_rt_format_flags; // Offset: 320 Size: 16 [unused] +// float4 xe_edram_rt_clamp[4]; // Offset: 336 Size: 64 [unused] +// uint4 xe_edram_rt_keep_mask[2]; // Offset: 400 Size: 32 [unused] +// uint4 xe_edram_rt_blend_factors_ops;// Offset: 432 Size: 16 [unused] +// float4 xe_edram_blend_constant; // Offset: 448 Size: 16 [unused] // // } // @@ -94,21 +92,21 @@ ret const BYTE tessellation_adaptive_vs[] = { - 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, + 68, 88, 66, 67, 124, 10, + 20, 236, 52, 205, 17, 163, + 29, 96, 4, 68, 69, 43, + 2, 171, 1, 0, 0, 0, + 116, 13, 0, 0, 5, 0, 0, 0, 52, 0, 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, + 104, 10, 0, 0, 156, 10, + 0, 0, 212, 10, 0, 0, + 216, 12, 0, 0, 82, 68, + 69, 70, 44, 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, - 126, 10, 0, 0, 19, 19, + 2, 10, 0, 0, 19, 19, 68, 37, 60, 0, 0, 0, 24, 0, 0, 0, 40, 0, 0, 0, 40, 0, 0, 0, @@ -124,559 +122,539 @@ const BYTE tessellation_adaptive_vs[] = 95, 115, 121, 115, 116, 101, 109, 95, 99, 98, 117, 102, 102, 101, 114, 0, 171, 171, - 100, 0, 0, 0, 32, 0, + 100, 0, 0, 0, 30, 0, 0, 0, 144, 0, 0, 0, - 224, 1, 0, 0, 0, 0, + 208, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 144, 5, 0, 0, 0, 0, + 64, 5, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, 0, 0, 116, 5, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 2, 0, - 0, 0, 232, 5, 0, 0, + 0, 0, 152, 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, + 0, 0, 188, 5, 0, 0, 12, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 80, 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, + 215, 5, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 160, 5, + 2, 0, 0, 0, 80, 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, 0, 0, 238, 5, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, + 0, 0, 80, 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, + 0, 0, 5, 6, 0, 0, 24, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 116, 6, 0, 0, 0, 0, + 36, 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, + 72, 6, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, - 0, 0, 0, 0, 180, 6, + 0, 0, 0, 0, 100, 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, 0, 0, 136, 6, 0, 0, 128, 0, 0, 0, 12, 0, 0, 0, 0, 0, - 0, 0, 236, 6, 0, 0, + 0, 0, 156, 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, + 0, 0, 192, 6, 0, 0, 140, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 52, 7, 0, 0, 0, 0, + 228, 6, 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, + 8, 7, 0, 0, 144, 0, 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 236, 6, + 0, 0, 0, 0, 156, 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, 0, 0, 22, 7, 0, 0, 156, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 52, 7, 0, 0, + 0, 0, 228, 6, 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, + 0, 0, 51, 7, 0, 0, 160, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 232, 5, 0, 0, 0, 0, + 152, 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, + 78, 7, 0, 0, 168, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 232, 5, + 0, 0, 0, 0, 152, 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, 0, 0, 117, 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, 152, 7, 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, + 0, 0, 188, 7, 0, 0, + 208, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, + 80, 5, 0, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 209, 7, 0, 0, 212, 0, + 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 36, 6, + 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, 220, 0, 0, 0, + 4, 0, 0, 0, 0, 0, + 0, 0, 228, 6, 0, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 254, 7, 0, 0, 224, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 80, 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, + 15, 8, 0, 0, 228, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 52, 7, + 0, 0, 0, 0, 80, 5, 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, 0, 0, 55, 8, 0, 0, 232, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, + 0, 0, 80, 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, 89, 8, 0, 0, + 240, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 108, 8, 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, + 144, 8, 0, 0, 0, 1, + 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 152, 5, 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, + 0, 0, 0, 0, 171, 8, + 0, 0, 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 232, 5, 0, 0, + 0, 0, 152, 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, 197, 8, 0, 0, + 16, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 232, 5, 0, 0, 0, 0, + 216, 8, 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, + 252, 8, 0, 0, 48, 1, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 152, 9, + 0, 0, 0, 0, 28, 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, + 0, 0, 0, 0, 64, 9, + 0, 0, 64, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 200, 8, 0, 0, + 0, 0, 28, 9, 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, 89, 9, 0, 0, + 80, 1, 0, 0, 64, 0, + 0, 0, 0, 0, 0, 0, + 108, 9, 0, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 144, 9, 0, 0, 144, 1, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 168, 9, + 0, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 204, 9, + 0, 0, 176, 1, 0, 0, + 16, 0, 0, 0, 0, 0, + 0, 0, 28, 9, 0, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 234, 9, 0, 0, + 192, 1, 0, 0, 16, 0, + 0, 0, 0, 0, 0, 0, + 108, 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, 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, + 0, 0, 0, 0, 0, 0, + 73, 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, + 145, 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, 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, 29, 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, - 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, + 92, 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, - 4, 0, 6, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 172, 6, 0, 0, + 0, 0, 149, 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, 221, 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, + 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, 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, + 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, 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, + 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, 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, + 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, 37, 8, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, + 0, 0, 143, 7, 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, + 115, 97, 109, 112, 108, 101, + 95, 99, 111, 117, 110, 116, + 95, 108, 111, 103, 50, 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, + 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, 171, 1, 0, 19, 0, + 0, 120, 101, 95, 99, 111, + 108, 111, 114, 95, 101, 120, + 112, 95, 98, 105, 97, 115, + 0, 171, 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, 37, 8, + 0, 0, 0, 0, 92, 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, 115, 116, + 101, 110, 99, 105, 108, 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, 143, 7, 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, + 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, + 0, 0, 0, 0, 0, 0, + 143, 7, 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, + 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, 92, 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, 143, 7, 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, 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, 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, - 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, + 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, - 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, + 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, 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, 0, 0, 10, 16, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 8, 0, 0, 0, - 85, 0, 0, 7, 66, 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, 1, 64, 0, 0, - 8, 0, 0, 0, 1, 0, - 0, 10, 82, 0, 16, 0, - 0, 0, 0, 0, 6, 2, + 0, 0, 21, 0, 0, 1, + 31, 0, 4, 3, 26, 0, 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, + 85, 0, 0, 7, 34, 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, 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, + 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, + 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, 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, 26, 128, + 48, 0, 0, 0, 0, 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, - 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, @@ -687,6 +665,5 @@ 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 d8e448333..bace06328 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 @@ -21,25 +21,23 @@ // float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [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] -// 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] +// uint4 xe_texture_swizzled_signs[2];// Offset: 176 Size: 32 [unused] +// uint xe_textures_resolved; // Offset: 208 Size: 4 [unused] +// uint2 xe_sample_count_log2; // Offset: 212 Size: 8 [unused] +// float xe_alpha_test_reference; // Offset: 220 Size: 4 [unused] +// uint xe_alpha_to_mask; // Offset: 224 Size: 4 [unused] +// uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset: 228 Size: 4 [unused] +// uint xe_edram_depth_base_dwords_scaled;// Offset: 232 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] +// uint4 xe_edram_stencil[2]; // Offset: 272 Size: 32 [unused] +// uint4 xe_edram_rt_base_dwords_scaled;// Offset: 304 Size: 16 [unused] +// uint4 xe_edram_rt_format_flags; // Offset: 320 Size: 16 [unused] +// float4 xe_edram_rt_clamp[4]; // Offset: 336 Size: 64 [unused] +// uint4 xe_edram_rt_keep_mask[2]; // Offset: 400 Size: 32 [unused] +// uint4 xe_edram_rt_blend_factors_ops;// Offset: 432 Size: 16 [unused] +// float4 xe_edram_blend_constant; // Offset: 448 Size: 16 [unused] // // } // @@ -96,21 +94,21 @@ ret const BYTE tessellation_indexed_vs[] = { - 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, + 68, 88, 66, 67, 72, 50, + 55, 79, 78, 232, 44, 71, + 22, 110, 232, 129, 83, 139, + 178, 150, 1, 0, 0, 0, + 168, 13, 0, 0, 5, 0, 0, 0, 52, 0, 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, + 104, 10, 0, 0, 156, 10, + 0, 0, 208, 10, 0, 0, + 12, 13, 0, 0, 82, 68, + 69, 70, 44, 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, - 126, 10, 0, 0, 19, 19, + 2, 10, 0, 0, 19, 19, 68, 37, 60, 0, 0, 0, 24, 0, 0, 0, 40, 0, 0, 0, 40, 0, 0, 0, @@ -126,570 +124,549 @@ const BYTE tessellation_indexed_vs[] = 95, 115, 121, 115, 116, 101, 109, 95, 99, 98, 117, 102, 102, 101, 114, 0, 171, 171, - 100, 0, 0, 0, 32, 0, + 100, 0, 0, 0, 30, 0, 0, 0, 144, 0, 0, 0, - 224, 1, 0, 0, 0, 0, + 208, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 144, 5, 0, 0, 0, 0, + 64, 5, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, + 0, 0, 0, 0, 80, 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, 0, 0, 116, 5, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 232, 5, 0, 0, + 0, 0, 152, 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, + 0, 0, 188, 5, 0, 0, 12, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 80, 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, + 215, 5, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 160, 5, + 2, 0, 0, 0, 80, 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, 0, 0, 238, 5, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 2, 0, - 0, 0, 160, 5, 0, 0, + 0, 0, 80, 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, + 0, 0, 5, 6, 0, 0, 24, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, - 116, 6, 0, 0, 0, 0, + 36, 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, + 72, 6, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, - 0, 0, 0, 0, 180, 6, + 0, 0, 0, 0, 100, 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, 0, 0, 136, 6, 0, 0, 128, 0, 0, 0, 12, 0, 0, 0, 0, 0, - 0, 0, 236, 6, 0, 0, + 0, 0, 156, 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, + 0, 0, 192, 6, 0, 0, 140, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 52, 7, 0, 0, 0, 0, + 228, 6, 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, + 8, 7, 0, 0, 144, 0, 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 236, 6, + 0, 0, 0, 0, 156, 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, 0, 0, 22, 7, 0, 0, 156, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 52, 7, 0, 0, + 0, 0, 228, 6, 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, + 0, 0, 51, 7, 0, 0, 160, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 232, 5, 0, 0, 0, 0, + 152, 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, + 78, 7, 0, 0, 168, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 232, 5, + 0, 0, 0, 0, 152, 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, 0, 0, 117, 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, 152, 7, 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, + 0, 0, 188, 7, 0, 0, + 208, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, + 80, 5, 0, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 209, 7, 0, 0, 212, 0, + 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 36, 6, + 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, 220, 0, 0, 0, + 4, 0, 0, 0, 0, 0, + 0, 0, 228, 6, 0, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 254, 7, 0, 0, 224, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 80, 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, + 15, 8, 0, 0, 228, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 52, 7, + 0, 0, 0, 0, 80, 5, 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, 0, 0, 55, 8, 0, 0, 232, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, + 0, 0, 80, 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, 89, 8, 0, 0, + 240, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, + 108, 8, 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, + 144, 8, 0, 0, 0, 1, + 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 152, 5, 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, + 0, 0, 0, 0, 171, 8, + 0, 0, 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 232, 5, 0, 0, + 0, 0, 152, 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, 197, 8, 0, 0, + 16, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 232, 5, 0, 0, 0, 0, + 216, 8, 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, + 252, 8, 0, 0, 48, 1, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 152, 9, + 0, 0, 0, 0, 28, 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, + 0, 0, 0, 0, 64, 9, + 0, 0, 64, 1, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 200, 8, 0, 0, + 0, 0, 28, 9, 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, 89, 9, 0, 0, + 80, 1, 0, 0, 64, 0, + 0, 0, 0, 0, 0, 0, + 108, 9, 0, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 144, 9, 0, 0, 144, 1, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 168, 9, + 0, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 204, 9, + 0, 0, 176, 1, 0, 0, + 16, 0, 0, 0, 0, 0, + 0, 0, 28, 9, 0, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 234, 9, 0, 0, + 192, 1, 0, 0, 16, 0, + 0, 0, 0, 0, 0, 0, + 108, 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, 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, + 0, 0, 0, 0, 0, 0, + 73, 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, + 145, 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, 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, 29, 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, - 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, + 92, 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, - 4, 0, 6, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 172, 6, 0, 0, + 0, 0, 149, 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, 221, 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, + 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, 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, + 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, 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, + 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, 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, + 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, 37, 8, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, + 0, 0, 143, 7, 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, + 115, 97, 109, 112, 108, 101, + 95, 99, 111, 117, 110, 116, + 95, 108, 111, 103, 50, 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, + 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, 171, 1, 0, 19, 0, + 0, 120, 101, 95, 99, 111, + 108, 111, 114, 95, 101, 120, + 112, 95, 98, 105, 97, 115, + 0, 171, 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, 37, 8, + 0, 0, 0, 0, 92, 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, 115, 116, + 101, 110, 99, 105, 108, 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, 143, 7, 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, + 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, + 0, 0, 0, 0, 0, 0, + 143, 7, 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, + 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, 92, 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, 143, 7, 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, 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, - 44, 0, 0, 0, 1, 0, - 0, 0, 8, 0, 0, 0, - 32, 0, 0, 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, 1, 0, 0, 0, + 2, 64, 0, 0, 1, 0, + 0, 0, 2, 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, + 0, 0, 60, 0, 0, 7, + 50, 0, 16, 0, 0, 0, + 0, 0, 150, 5, 16, 0, + 0, 0, 0, 0, 70, 0, 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, + 31, 0, 4, 3, 10, 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, + 41, 0, 0, 7, 18, 0, 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, + 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, 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, - 0, 0, 10, 16, 16, 0, - 0, 0, 0, 0, 1, 64, - 0, 0, 8, 0, 0, 0, - 1, 0, 0, 10, 82, 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, - 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, + 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, 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, + 30, 0, 0, 9, 18, 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, + 0, 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, - 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, 30, 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, - 26, 128, 48, 0, 0, 0, + 42, 128, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 7, 18, 0, 16, 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, - 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, + 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, - 4, 0, 0, 0, 7, 0, - 0, 0, 2, 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, 1, 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, @@ -699,5 +676,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/xenos_draw.hlsli b/src/xenia/gpu/shaders/xenos_draw.hlsli index 53843e83e..840662e27 100644 --- a/src/xenia/gpu/shaders/xenos_draw.hlsli +++ b/src/xenia/gpu/shaders/xenos_draw.hlsli @@ -21,24 +21,21 @@ cbuffer xe_system_cbuffer : register(b0) { float2 xe_point_constant_diameter; float2 xe_point_screen_diameter_to_ndc_radius; - uint xe_interpolator_sampling_pattern; - uint xe_ps_param_gen; - uint2 xe_sample_count_log2; - uint4 xe_texture_swizzled_signs[2]; uint xe_textures_resolved; + uint2 xe_sample_count_log2; float xe_alpha_test_reference; + uint xe_alpha_to_mask; uint xe_edram_32bpp_tile_pitch_dwords_scaled; + uint xe_edram_depth_base_dwords_scaled; float4 xe_color_exp_bias; float2 xe_edram_poly_offset_front; float2 xe_edram_poly_offset_back; - uint xe_edram_depth_base_dwords_scaled; - uint4 xe_edram_stencil[2]; uint4 xe_edram_rt_base_dwords_scaled; diff --git a/src/xenia/gpu/spirv_shader_translator.cc b/src/xenia/gpu/spirv_shader_translator.cc index 22c6c8a0a..2d574bc47 100644 --- a/src/xenia/gpu/spirv_shader_translator.cc +++ b/src/xenia/gpu/spirv_shader_translator.cc @@ -17,6 +17,7 @@ #include #include +#include "third_party/fmt/include/fmt/format.h" #include "third_party/glslang/SPIRV/GLSL.std.450.h" #include "xenia/base/assert.h" #include "xenia/base/math.h" @@ -105,6 +106,8 @@ void SpirvShaderTranslator::Reset() { input_fragment_coord_ = spv::NoResult; input_front_facing_ = spv::NoResult; + std::fill(input_output_interpolators_.begin(), + input_output_interpolators_.end(), spv::NoResult); sampler_bindings_.clear(); texture_bindings_.clear(); @@ -161,8 +164,6 @@ void SpirvShaderTranslator::StartTranslation() { type_float2_ = builder_->makeVectorType(type_float_, 2); type_float3_ = builder_->makeVectorType(type_float_, 3); type_float4_ = builder_->makeVectorType(type_float_, 4); - type_interpolators_ = builder_->makeArrayType( - type_float4_, builder_->makeUintConstant(xenos::kMaxInterpolators), 0); const_int_0_ = builder_->makeIntConstant(0); id_vector_temp_.clear(); @@ -449,22 +450,12 @@ void SpirvShaderTranslator::StartTranslation() { var_main_tfetch_gradients_v_ = builder_->createVariable( spv::NoPrecision, spv::StorageClassFunction, type_float3_, "xe_var_tfetch_gradients_v", const_float3_0_); - uint32_t register_array_size = register_count(); - if (register_array_size) { - id_vector_temp_.clear(); - id_vector_temp_.reserve(register_array_size); - // TODO(Triang3l): In PS, only need to initialize starting from the - // interpolators, probably manually. But likely not very important - the - // compiler in the driver will likely eliminate that write. - for (uint32_t i = 0; i < register_array_size; ++i) { - id_vector_temp_.push_back(const_float4_0_); - } + if (register_count()) { spv::Id type_register_array = builder_->makeArrayType( - type_float4_, builder_->makeUintConstant(register_array_size), 0); - var_main_registers_ = builder_->createVariable( - spv::NoPrecision, spv::StorageClassFunction, type_register_array, - "xe_var_registers", - builder_->makeCompositeConstant(type_register_array, id_vector_temp_)); + type_float4_, builder_->makeUintConstant(register_count()), 0); + var_main_registers_ = + builder_->createVariable(spv::NoPrecision, spv::StorageClassFunction, + type_register_array, "xe_var_registers"); } // Write the execution model-specific prologue with access to variables in the @@ -1068,15 +1059,24 @@ void SpirvShaderTranslator::StartVertexOrTessEvalShaderBeforeMain() { main_interface_.push_back(input_vertex_index_); } - // Create the interpolator output. - input_output_interpolators_ = - builder_->createVariable(spv::NoPrecision, spv::StorageClassOutput, - type_interpolators_, "xe_out_interpolators"); - builder_->addDecoration(input_output_interpolators_, spv::DecorationLocation, - 0); - builder_->addDecoration(input_output_interpolators_, - spv::DecorationInvariant); - main_interface_.push_back(input_output_interpolators_); + // Create the interpolator outputs. + { + uint32_t interpolator_location = 0; + uint32_t interpolators_remaining = GetModificationInterpolatorMask(); + uint32_t interpolator_index; + while (xe::bit_scan_forward(interpolators_remaining, &interpolator_index)) { + interpolators_remaining &= ~(UINT32_C(1) << interpolator_index); + spv::Id interpolator = builder_->createVariable( + spv::NoPrecision, spv::StorageClassOutput, type_float4_, + fmt::format("xe_out_interpolator_{}", interpolator_index).c_str()); + input_output_interpolators_[interpolator_index] = interpolator; + builder_->addDecoration(interpolator, spv::DecorationLocation, + int(interpolator_location)); + builder_->addDecoration(interpolator, spv::DecorationInvariant); + main_interface_.push_back(interpolator); + ++interpolator_location; + } + } // Create the gl_PerVertex output for used system outputs. std::vector struct_per_vertex_members; @@ -1103,14 +1103,26 @@ void SpirvShaderTranslator::StartVertexOrTessEvalShaderInMain() { spv::NoPrecision, spv::StorageClassFunction, type_float3_, "xe_var_point_size_edge_flag_kill_vertex"); - // Zero the interpolators. - for (uint32_t i = 0; i < xenos::kMaxInterpolators; ++i) { + // Zero general-purpose registers to prevent crashes when the game + // references them after only initializing them conditionally. + for (uint32_t i = 0; i < register_count(); ++i) { id_vector_temp_.clear(); id_vector_temp_.push_back(builder_->makeIntConstant(int(i))); - builder_->createStore(const_float4_0_, - builder_->createAccessChain( - spv::StorageClassOutput, - input_output_interpolators_, id_vector_temp_)); + builder_->createStore( + const_float4_0_, + builder_->createAccessChain(spv::StorageClassFunction, + var_main_registers_, id_vector_temp_)); + } + + // Zero the interpolators. + { + uint32_t interpolators_remaining = GetModificationInterpolatorMask(); + uint32_t interpolator_index; + while (xe::bit_scan_forward(interpolators_remaining, &interpolator_index)) { + interpolators_remaining &= ~(UINT32_C(1) << interpolator_index); + builder_->createStore(const_float4_0_, + input_output_interpolators_[interpolator_index]); + } } // Load the vertex index or the tessellation parameters. @@ -1284,13 +1296,28 @@ void SpirvShaderTranslator::CompleteVertexOrTessEvalShaderInMain() { } void SpirvShaderTranslator::StartFragmentShaderBeforeMain() { - // Interpolator input. - input_output_interpolators_ = - builder_->createVariable(spv::NoPrecision, spv::StorageClassInput, - type_interpolators_, "xe_in_interpolators"); - builder_->addDecoration(input_output_interpolators_, spv::DecorationLocation, - 0); - main_interface_.push_back(input_output_interpolators_); + // Interpolator inputs. + Modification shader_modification = GetSpirvShaderModification(); + { + uint32_t interpolator_location = 0; + uint32_t interpolators_remaining = GetModificationInterpolatorMask(); + uint32_t interpolator_index; + while (xe::bit_scan_forward(interpolators_remaining, &interpolator_index)) { + interpolators_remaining &= ~(UINT32_C(1) << interpolator_index); + spv::Id interpolator = builder_->createVariable( + spv::NoPrecision, spv::StorageClassInput, type_float4_, + fmt::format("xe_in_interpolator_{}", interpolator_index).c_str()); + input_output_interpolators_[interpolator_index] = interpolator; + builder_->addDecoration(interpolator, spv::DecorationLocation, + int(interpolator_location)); + if (shader_modification.pixel.interpolators_centroid & + (UINT32_C(1) << interpolator_index)) { + builder_->addDecoration(interpolator, spv::DecorationCentroid); + } + main_interface_.push_back(interpolator); + ++interpolator_location; + } + } bool param_gen_needed = GetPsParamGenInterpolator() != UINT32_MAX; @@ -1346,22 +1373,22 @@ void SpirvShaderTranslator::StartFragmentShaderBeforeMain() { void SpirvShaderTranslator::StartFragmentShaderInMain() { uint32_t param_gen_interpolator = GetPsParamGenInterpolator(); - // Copy the interpolators to general-purpose registers. - // TODO(Triang3l): Centroid. - uint32_t interpolator_count = - std::min(xenos::kMaxInterpolators, register_count()); - for (uint32_t i = 0; i < interpolator_count; ++i) { + // Zero general-purpose registers to prevent crashes when the game + // references them after only initializing them conditionally, and copy + // interpolants to GPRs. + uint32_t interpolator_mask = GetModificationInterpolatorMask(); + for (uint32_t i = 0; i < register_count(); ++i) { if (i == param_gen_interpolator) { continue; } id_vector_temp_.clear(); - // Register array element. id_vector_temp_.push_back(builder_->makeIntConstant(int(i))); builder_->createStore( - builder_->createLoad(builder_->createAccessChain( - spv::StorageClassInput, - input_output_interpolators_, id_vector_temp_), - spv::NoPrecision), + (i < xenos::kMaxInterpolators && + (interpolator_mask & (UINT32_C(1) << i))) + ? builder_->createLoad(input_output_interpolators_[i], + spv::NoPrecision) + : const_float4_0_, builder_->createAccessChain(spv::StorageClassFunction, var_main_registers_, id_vector_temp_)); } @@ -1836,15 +1863,11 @@ void SpirvShaderTranslator::StoreResult(const InstructionResult& result, target_pointer = builder_->createAccessChain( spv::StorageClassFunction, var_main_registers_, id_vector_temp_util_); } break; - case InstructionStorageTarget::kInterpolator: + case InstructionStorageTarget::kInterpolator: { assert_true(is_vertex_shader()); - id_vector_temp_util_.clear(); - id_vector_temp_util_.push_back( - builder_->makeIntConstant(int(result.storage_index))); - target_pointer = builder_->createAccessChain(spv::StorageClassOutput, - input_output_interpolators_, - id_vector_temp_util_); - break; + target_pointer = input_output_interpolators_[result.storage_index]; + // Unused interpolators are spv::NoResult in input_output_interpolators_. + } break; case InstructionStorageTarget::kPosition: assert_true(is_vertex_shader()); id_vector_temp_util_.clear(); diff --git a/src/xenia/gpu/spirv_shader_translator.h b/src/xenia/gpu/spirv_shader_translator.h index 18afaff79..1f26d0887 100644 --- a/src/xenia/gpu/spirv_shader_translator.h +++ b/src/xenia/gpu/spirv_shader_translator.h @@ -34,7 +34,7 @@ class SpirvShaderTranslator : public ShaderTranslator { // TODO(Triang3l): Change to 0xYYYYMMDD once it's out of the rapid // prototyping stage (easier to do small granular updates with an // incremental counter). - static constexpr uint32_t kVersion = 4; + static constexpr uint32_t kVersion = 5; enum class DepthStencilMode : uint32_t { kNoModifiers, @@ -46,6 +46,10 @@ class SpirvShaderTranslator : public ShaderTranslator { }; struct { + // uint32_t 0. + // Interpolators written by the vertex shader and needed by the pixel + // shader. + uint32_t interpolator_mask : xenos::kMaxInterpolators; // Dynamically indexable register count from SQ_PROGRAM_CNTL. uint32_t dynamic_addressable_register_count : 8; // Pipeline stage and input configuration. @@ -53,6 +57,12 @@ class SpirvShaderTranslator : public ShaderTranslator { : Shader::kHostVertexShaderTypeBitCount; } vertex; struct PixelShaderModification { + // uint32_t 0. + // Interpolators written by the vertex shader and needed by the pixel + // shader. + uint32_t interpolator_mask : xenos::kMaxInterpolators; + uint32_t interpolators_centroid : xenos::kMaxInterpolators; + // uint32_t 1. // Dynamically indexable register count from SQ_PROGRAM_CNTL. uint32_t dynamic_addressable_register_count : 8; uint32_t param_gen_enable : 1; @@ -66,7 +76,10 @@ class SpirvShaderTranslator : public ShaderTranslator { } pixel; uint64_t value = 0; - Modification(uint64_t modification_value = 0) : value(modification_value) {} + explicit Modification(uint64_t modification_value = 0) + : value(modification_value) { + static_assert_size(*this, sizeof(value)); + } }; enum : uint32_t { @@ -346,6 +359,12 @@ class SpirvShaderTranslator : public ShaderTranslator { current_shader().implicit_early_z_write_allowed(); } + uint32_t GetModificationInterpolatorMask() const { + Modification modification = GetSpirvShaderModification(); + return is_vertex_shader() ? modification.vertex.interpolator_mask + : modification.pixel.interpolator_mask; + } + // Returns UINT32_MAX if PsParamGen doesn't need to be written. uint32_t GetPsParamGenInterpolator() const; @@ -529,8 +548,6 @@ class SpirvShaderTranslator : public ShaderTranslator { spv::Id type_float_vectors_[4]; }; - spv::Id type_interpolators_; - spv::Id const_int_0_; spv::Id const_int4_0_; spv::Id const_uint_0_; @@ -591,12 +608,16 @@ class SpirvShaderTranslator : public ShaderTranslator { // PS, only when needed - bool. spv::Id input_front_facing_; - // VS output or PS input, only when needed - type_interpolators_. - // The Qualcomm Adreno driver has strict requirements for stage linkage - if - // this is an array in one stage, it must be an array in the other (in case of - // Xenia, including geometry shaders); it must not be an array in one and just - // elements in consecutive locations in another. - spv::Id input_output_interpolators_; + // VS output or PS input, only the ones that are needed (spv::NoResult for the + // unneeded interpolators), indexed by the guest interpolator index - float4. + // The Qualcomm Adreno driver has strict requirements for stage linkage - as + // Xenia uses separate variables, not an array (so the interpolation + // qualifiers can be applied to each element separately), the interpolators + // must also be separate variables in the other stage, including the geometry + // shader (not just an array assuming that consecutive locations will be + // linked as consecutive array elements, on Qualcomm, they won't be linked at + // all). + std::array input_output_interpolators_; enum OutputPerVertexMember : unsigned int { kOutputPerVertexMemberPosition, diff --git a/src/xenia/gpu/vulkan/vulkan_command_processor.cc b/src/xenia/gpu/vulkan/vulkan_command_processor.cc index 89e43479a..4ad3642e0 100644 --- a/src/xenia/gpu/vulkan/vulkan_command_processor.cc +++ b/src/xenia/gpu/vulkan/vulkan_command_processor.cc @@ -2135,11 +2135,12 @@ bool VulkanCommandProcessor::IssueDraw(xenos::PrimitiveType prim_type, } // TODO(Triang3l): Memory export. - reg::RB_DEPTHCONTROL normalized_depth_control = - draw_util::GetNormalizedDepthControl(regs); - uint32_t normalized_color_mask = - pixel_shader ? draw_util::GetNormalizedColorMask( - regs, pixel_shader->writes_color_targets()) + uint32_t ps_param_gen_pos = UINT32_MAX; + uint32_t interpolator_mask = + pixel_shader ? (vertex_shader->writes_interpolators() & + pixel_shader->GetInterpolatorInputMask( + regs.Get(), + regs.Get(), ps_param_gen_pos)) : 0; PrimitiveProcessor::ProcessingResult primitive_processing_result; @@ -2177,11 +2178,11 @@ bool VulkanCommandProcessor::IssueDraw(xenos::PrimitiveType prim_type, // Shader modifications. vertex_shader_modification = pipeline_cache_->GetCurrentVertexShaderModification( - *vertex_shader, - primitive_processing_result.host_vertex_shader_type); + *vertex_shader, primitive_processing_result.host_vertex_shader_type, + interpolator_mask); pixel_shader_modification = pixel_shader ? pipeline_cache_->GetCurrentPixelShaderModification( - *pixel_shader, normalized_color_mask) + *pixel_shader, interpolator_mask, ps_param_gen_pos) : SpirvShaderTranslator::Modification(0); // Translate the shaders now to obtain the sampler bindings. @@ -2270,6 +2271,12 @@ bool VulkanCommandProcessor::IssueDraw(xenos::PrimitiveType prim_type, } // Set up the render targets - this may perform dispatches and draws. + reg::RB_DEPTHCONTROL normalized_depth_control = + draw_util::GetNormalizedDepthControl(regs); + uint32_t normalized_color_mask = + pixel_shader ? draw_util::GetNormalizedColorMask( + regs, pixel_shader->writes_color_targets()) + : 0; if (!render_target_cache_->Update(is_rasterization_done, normalized_depth_control, normalized_color_mask, *vertex_shader)) { diff --git a/src/xenia/gpu/vulkan/vulkan_pipeline_cache.cc b/src/xenia/gpu/vulkan/vulkan_pipeline_cache.cc index 39decc091..df7156b08 100644 --- a/src/xenia/gpu/vulkan/vulkan_pipeline_cache.cc +++ b/src/xenia/gpu/vulkan/vulkan_pipeline_cache.cc @@ -16,6 +16,7 @@ #include #include +#include "third_party/fmt/include/fmt/format.h" #include "third_party/glslang/SPIRV/SpvBuilder.h" #include "xenia/base/assert.h" #include "xenia/base/logging.h" @@ -116,43 +117,56 @@ VulkanShader* VulkanPipelineCache::LoadShader(xenos::ShaderType shader_type, SpirvShaderTranslator::Modification VulkanPipelineCache::GetCurrentVertexShaderModification( - const Shader& shader, - Shader::HostVertexShaderType host_vertex_shader_type) const { + const Shader& shader, Shader::HostVertexShaderType host_vertex_shader_type, + uint32_t interpolator_mask) const { assert_true(shader.type() == xenos::ShaderType::kVertex); assert_true(shader.is_ucode_analyzed()); const auto& regs = register_file_; + auto sq_program_cntl = regs.Get(); - return SpirvShaderTranslator::Modification( + + SpirvShaderTranslator::Modification modification( shader_translator_->GetDefaultVertexShaderModification( - shader.GetDynamicAddressableRegisterCount(sq_program_cntl.vs_num_reg), + shader.GetDynamicAddressableRegisterCount( + regs.Get().vs_num_reg), host_vertex_shader_type)); + + modification.vertex.interpolator_mask = interpolator_mask; + + return modification; } SpirvShaderTranslator::Modification VulkanPipelineCache::GetCurrentPixelShaderModification( - const Shader& shader, uint32_t normalized_color_mask) const { + const Shader& shader, uint32_t interpolator_mask, + uint32_t param_gen_pos) const { assert_true(shader.type() == xenos::ShaderType::kPixel); assert_true(shader.is_ucode_analyzed()); const auto& regs = register_file_; - auto sq_program_cntl = regs.Get(); SpirvShaderTranslator::Modification modification( shader_translator_->GetDefaultPixelShaderModification( shader.GetDynamicAddressableRegisterCount( - sq_program_cntl.ps_num_reg))); + regs.Get().ps_num_reg))); - if (sq_program_cntl.param_gen) { - auto sq_context_misc = regs.Get(); - if (sq_context_misc.param_gen_pos < - std::min(std::max(modification.pixel.dynamic_addressable_register_count, - shader.register_static_address_bound()), - xenos::kMaxInterpolators)) { - modification.pixel.param_gen_enable = 1; - modification.pixel.param_gen_interpolator = sq_context_misc.param_gen_pos; - auto vgt_draw_initiator = regs.Get(); - modification.pixel.param_gen_point = uint32_t( - vgt_draw_initiator.prim_type == xenos::PrimitiveType::kPointList); - } + modification.pixel.interpolator_mask = interpolator_mask; + modification.pixel.interpolators_centroid = + interpolator_mask & + ~xenos::GetInterpolatorSamplingPattern( + regs.Get().msaa_samples, + regs.Get().sc_sample_cntl, + regs.Get().sampling_pattern); + + if (param_gen_pos < xenos::kMaxInterpolators) { + modification.pixel.param_gen_enable = 1; + modification.pixel.param_gen_interpolator = param_gen_pos; + modification.pixel.param_gen_point = + uint32_t(regs.Get().prim_type == + xenos::PrimitiveType::kPointList); + } else { + modification.pixel.param_gen_enable = 0; + modification.pixel.param_gen_interpolator = 0; + modification.pixel.param_gen_point = 0; } using DepthStencilMode = @@ -267,7 +281,10 @@ bool VulkanPipelineCache::ConfigurePipeline( } VkShaderModule geometry_shader = VK_NULL_HANDLE; GeometryShaderKey geometry_shader_key; - if (GetGeometryShaderKey(description.geometry_shader, geometry_shader_key)) { + if (GetGeometryShaderKey( + description.geometry_shader, + SpirvShaderTranslator::Modification(vertex_shader->modification()), + geometry_shader_key)) { geometry_shader = GetGeometryShader(geometry_shader_key); if (geometry_shader == VK_NULL_HANDLE) { return false; @@ -796,20 +813,28 @@ bool VulkanPipelineCache::ArePipelineRequirementsMet( } bool VulkanPipelineCache::GetGeometryShaderKey( - PipelineGeometryShader geometry_shader_type, GeometryShaderKey& key_out) { + PipelineGeometryShader geometry_shader_type, + SpirvShaderTranslator::Modification vertex_shader_modification, + 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 */ 0; - key.user_clip_plane_cull = 0; - key.has_vertex_kill_and = /* 1 */ 0; - key.has_point_size = /* 1 */ 0; - key.has_point_coordinates = /* 1 */ 0; + // TODO(Triang3l): Once all needed inputs and outputs are added, uncomment the + // real counts here. + key.interpolator_count = + xe::bit_count(vertex_shader_modification.vertex.interpolator_mask); + key.user_clip_plane_count = + /* vertex_shader_modification.vertex.user_clip_plane_count */ 0; + key.user_clip_plane_cull = + /* vertex_shader_modification.vertex.user_clip_plane_cull */ 0; + key.has_vertex_kill_and = + /* vertex_shader_modification.vertex.vertex_kill_and */ 0; + key.has_point_size = + /* vertex_shader_modification.vertex.output_point_size */ 0; + key.has_point_coordinates = + /* pixel_shader_modification.pixel.param_gen_point */ 0; key_out = key; return true; } @@ -887,12 +912,6 @@ VkShaderModule VulkanPipelineCache::GetGeometryShader(GeometryShaderKey key) { ? builder.makeArrayType( type_float, builder.makeUintConstant(cull_distance_count), 0) : spv::NoType; - spv::Id type_interpolators = - key.interpolator_count - ? builder.makeArrayType( - type_float4, builder.makeUintConstant(key.interpolator_count), - 0) - : spv::NoType; spv::Id type_point_coordinates = key.has_point_coordinates ? builder.makeVectorType(type_float, 2) : spv::NoType; @@ -958,15 +977,16 @@ VkShaderModule VulkanPipelineCache::GetGeometryShader(GeometryShaderKey key) { type_array_in_gl_per_vertex, "gl_in"); main_interface.push_back(in_gl_per_vertex); - // Interpolators output. - spv::Id out_interpolators = spv::NoResult; - if (key.interpolator_count) { - out_interpolators = - builder.createVariable(spv::NoPrecision, spv::StorageClassOutput, - type_interpolators, "xe_out_interpolators"); - builder.addDecoration(out_interpolators, spv::DecorationLocation, 0); - builder.addDecoration(out_interpolators, spv::DecorationInvariant); - main_interface.push_back(out_interpolators); + // Interpolators outputs. + std::array out_interpolators; + for (uint32_t i = 0; i < key.interpolator_count; ++i) { + spv::Id out_interpolator = builder.createVariable( + spv::NoPrecision, spv::StorageClassOutput, type_float4, + fmt::format("xe_out_interpolator_{}", i).c_str()); + out_interpolators[i] = out_interpolator; + builder.addDecoration(out_interpolator, spv::DecorationLocation, i); + builder.addDecoration(out_interpolator, spv::DecorationInvariant); + main_interface.push_back(out_interpolator); } // Point coordinate output. @@ -981,16 +1001,17 @@ VkShaderModule VulkanPipelineCache::GetGeometryShader(GeometryShaderKey key) { main_interface.push_back(out_point_coordinates); } - // Interpolator input. - spv::Id in_interpolators = spv::NoResult; - if (key.interpolator_count) { - in_interpolators = builder.createVariable( + // Interpolator inputs. + std::array in_interpolators; + for (uint32_t i = 0; i < key.interpolator_count; ++i) { + spv::Id in_interpolator = builder.createVariable( spv::NoPrecision, spv::StorageClassInput, - builder.makeArrayType(type_interpolators, - const_input_primitive_vertex_count, 0), - "xe_in_interpolators"); - builder.addDecoration(in_interpolators, spv::DecorationLocation, 0); - main_interface.push_back(in_interpolators); + builder.makeArrayType(type_float4, const_input_primitive_vertex_count, + 0), + fmt::format("xe_in_interpolator_{}", i).c_str()); + in_interpolators[i] = in_interpolator; + builder.addDecoration(in_interpolator, spv::DecorationLocation, i); + main_interface.push_back(in_interpolator); } // Point size input. @@ -1295,15 +1316,15 @@ VkShaderModule VulkanPipelineCache::GetGeometryShader(GeometryShaderKey key) { for (uint32_t i = 0; i < 3; ++i) { spv::Id vertex_index = vertex_indices[i]; // Interpolators. - if (key.interpolator_count) { - id_vector_temp.clear(); - id_vector_temp.push_back(vertex_index); + id_vector_temp.clear(); + id_vector_temp.push_back(vertex_index); + for (uint32_t j = 0; j < key.interpolator_count; ++j) { builder.createStore( - builder.createLoad( - builder.createAccessChain(spv::StorageClassInput, - in_interpolators, id_vector_temp), - spv::NoPrecision), - out_interpolators); + builder.createLoad(builder.createAccessChain( + spv::StorageClassInput, + in_interpolators[j], id_vector_temp), + spv::NoPrecision), + out_interpolators[j]); } // Point coordinates. if (key.has_point_coordinates) { @@ -1350,13 +1371,11 @@ VkShaderModule VulkanPipelineCache::GetGeometryShader(GeometryShaderKey key) { // Construct the fourth vertex. // Interpolators. for (uint32_t i = 0; i < key.interpolator_count; ++i) { - spv::Id const_int_i = builder.makeIntConstant(int32_t(i)); + spv::Id in_interpolator = in_interpolators[i]; id_vector_temp.clear(); - id_vector_temp.reserve(2); id_vector_temp.push_back(vertex_indices[0]); - id_vector_temp.push_back(const_int_i); spv::Id vertex_interpolator_v0 = builder.createLoad( - builder.createAccessChain(spv::StorageClassInput, in_interpolators, + builder.createAccessChain(spv::StorageClassInput, in_interpolator, id_vector_temp), spv::NoPrecision); id_vector_temp[0] = vertex_indices[1]; @@ -1364,7 +1383,7 @@ VkShaderModule VulkanPipelineCache::GetGeometryShader(GeometryShaderKey key) { spv::OpFSub, type_float4, builder.createLoad( builder.createAccessChain(spv::StorageClassInput, - in_interpolators, id_vector_temp), + in_interpolator, id_vector_temp), spv::NoPrecision), vertex_interpolator_v0); builder.addDecoration(vertex_interpolator_v01, @@ -1374,16 +1393,11 @@ VkShaderModule VulkanPipelineCache::GetGeometryShader(GeometryShaderKey key) { spv::OpFAdd, type_float4, vertex_interpolator_v01, builder.createLoad( builder.createAccessChain(spv::StorageClassInput, - in_interpolators, id_vector_temp), + in_interpolator, id_vector_temp), spv::NoPrecision)); builder.addDecoration(vertex_interpolator_v3, spv::DecorationNoContraction); - id_vector_temp.clear(); - id_vector_temp.push_back(const_int_i); - builder.createStore( - vertex_interpolator_v3, - builder.createAccessChain(spv::StorageClassOutput, - out_interpolators, id_vector_temp)); + builder.createStore(vertex_interpolator_v3, out_interpolators[i]); } // Point coordinates. if (key.has_point_coordinates) { @@ -1489,15 +1503,15 @@ VkShaderModule VulkanPipelineCache::GetGeometryShader(GeometryShaderKey key) { spv::Id const_vertex_index = builder.makeIntConstant(int32_t(i ^ (i >> 1))); // Interpolators. - if (key.interpolator_count) { - id_vector_temp.clear(); - id_vector_temp.push_back(const_vertex_index); + id_vector_temp.clear(); + id_vector_temp.push_back(const_vertex_index); + for (uint32_t j = 0; j < key.interpolator_count; ++j) { builder.createStore( - builder.createLoad( - builder.createAccessChain(spv::StorageClassInput, - in_interpolators, id_vector_temp), - spv::NoPrecision), - out_interpolators); + builder.createLoad(builder.createAccessChain( + spv::StorageClassInput, + in_interpolators[j], id_vector_temp), + spv::NoPrecision), + out_interpolators[j]); } // Point coordinates. if (key.has_point_coordinates) { diff --git a/src/xenia/gpu/vulkan/vulkan_pipeline_cache.h b/src/xenia/gpu/vulkan/vulkan_pipeline_cache.h index 141d756c8..e967a1415 100644 --- a/src/xenia/gpu/vulkan/vulkan_pipeline_cache.h +++ b/src/xenia/gpu/vulkan/vulkan_pipeline_cache.h @@ -70,9 +70,11 @@ class VulkanPipelineCache { // have microcode analyzed. SpirvShaderTranslator::Modification GetCurrentVertexShaderModification( const Shader& shader, - Shader::HostVertexShaderType host_vertex_shader_type) const; + Shader::HostVertexShaderType host_vertex_shader_type, + uint32_t interpolator_mask) const; SpirvShaderTranslator::Modification GetCurrentPixelShaderModification( - const Shader& shader, uint32_t normalized_color_mask) const; + const Shader& shader, uint32_t interpolator_mask, + uint32_t param_gen_pos) const; bool EnsureShadersTranslated(VulkanShader::VulkanTranslation* vertex_shader, VulkanShader::VulkanTranslation* pixel_shader); @@ -262,8 +264,10 @@ class VulkanPipelineCache { // Whether the pipeline for the given description is supported by the device. bool ArePipelineRequirementsMet(const PipelineDescription& description) const; - static bool GetGeometryShaderKey(PipelineGeometryShader geometry_shader_type, - GeometryShaderKey& key_out); + static bool GetGeometryShaderKey( + PipelineGeometryShader geometry_shader_type, + SpirvShaderTranslator::Modification vertex_shader_modification, + GeometryShaderKey& key_out); VkShaderModule GetGeometryShader(GeometryShaderKey key); // Can be called from creation threads - all needed data must be fully set up