Merge branch 'master' of https://github.com/xenia-project/xenia into canary_experimental

This commit is contained in:
Gliniak 2022-07-21 18:52:33 +02:00
commit 0c782ade8e
25 changed files with 3393 additions and 3255 deletions

View File

@ -2163,12 +2163,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<reg::SQ_PROGRAM_CNTL>(),
regs.Get<reg::SQ_CONTEXT_MISC>(), 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.
@ -3234,25 +3243,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;
@ -3332,18 +3330,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 = &regs[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 =
&regs[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;
}
}
@ -3394,22 +3398,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<reg::SQ_INTERPOLATOR_CNTL>().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();

View File

@ -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<reg::SQ_PROGRAM_CNTL>();
return DxbcShaderTranslator::Modification(
DxbcShaderTranslator::Modification modification(
shader_translator_->GetDefaultVertexShaderModification(
shader.GetDynamicAddressableRegisterCount(sq_program_cntl.vs_num_reg),
shader.GetDynamicAddressableRegisterCount(
regs.Get<reg::SQ_PROGRAM_CNTL>().vs_num_reg),
host_vertex_shader_type));
modification.vertex.interpolator_mask = interpolator_mask;
auto pa_cl_clip_cntl = regs.Get<reg::PA_CL_CLIP_CNTL>();
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<reg::VGT_DRAW_INITIATOR>().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<reg::SQ_PROGRAM_CNTL>();
DxbcShaderTranslator::Modification modification(
shader_translator_->GetDefaultPixelShaderModification(
shader.GetDynamicAddressableRegisterCount(
sq_program_cntl.ps_num_reg)));
regs.Get<reg::SQ_PROGRAM_CNTL>().ps_num_reg)));
modification.pixel.interpolator_mask = interpolator_mask;
modification.pixel.interpolators_centroid =
interpolator_mask &
~xenos::GetInterpolatorSamplingPattern(
regs.Get<reg::RB_SURFACE_INFO>().msaa_samples,
regs.Get<reg::SQ_CONTEXT_MISC>().sc_sample_cntl,
regs.Get<reg::SQ_INTERPOLATOR_CNTL>().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<reg::VGT_DRAW_INITIATOR>().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<dxbc::Signature*>(
@ -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);
}

View File

@ -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<uint32_t>& shader_out);
const std::vector<uint32_t>& GetGeometryShader(GeometryShaderKey key);

File diff suppressed because it is too large Load Diff

View File

@ -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_;

View File

@ -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.

View File

@ -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,

View File

@ -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));

View File

@ -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<uint32_t> 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<uint64_t, Translation*> translations_;

View File

@ -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) {

File diff suppressed because it is too large Load Diff

View File

@ -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
};

File diff suppressed because it is too large Load Diff

View File

@ -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
};

View File

@ -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
};

File diff suppressed because it is too large Load Diff

View File

@ -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;

View File

@ -17,6 +17,7 @@
#include <utility>
#include <vector>
#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<spv::Id> 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();

View File

@ -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<spv::Id, xenos::kMaxInterpolators> input_output_interpolators_;
enum OutputPerVertexMember : unsigned int {
kOutputPerVertexMemberPosition,

View File

@ -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<reg::SQ_PROGRAM_CNTL>(),
regs.Get<reg::SQ_CONTEXT_MISC>(), 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)) {

View File

@ -16,6 +16,7 @@
#include <memory>
#include <utility>
#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<reg::SQ_PROGRAM_CNTL>();
return SpirvShaderTranslator::Modification(
SpirvShaderTranslator::Modification modification(
shader_translator_->GetDefaultVertexShaderModification(
shader.GetDynamicAddressableRegisterCount(sq_program_cntl.vs_num_reg),
shader.GetDynamicAddressableRegisterCount(
regs.Get<reg::SQ_PROGRAM_CNTL>().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<reg::SQ_PROGRAM_CNTL>();
SpirvShaderTranslator::Modification modification(
shader_translator_->GetDefaultPixelShaderModification(
shader.GetDynamicAddressableRegisterCount(
sq_program_cntl.ps_num_reg)));
regs.Get<reg::SQ_PROGRAM_CNTL>().ps_num_reg)));
if (sq_program_cntl.param_gen) {
auto sq_context_misc = regs.Get<reg::SQ_CONTEXT_MISC>();
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<reg::VGT_DRAW_INITIATOR>();
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<reg::RB_SURFACE_INFO>().msaa_samples,
regs.Get<reg::SQ_CONTEXT_MISC>().sc_sample_cntl,
regs.Get<reg::SQ_INTERPOLATOR_CNTL>().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<reg::VGT_DRAW_INITIATOR>().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<spv::Id, xenos::kMaxInterpolators> 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<spv::Id, xenos::kMaxInterpolators> 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) {

View File

@ -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

19
xb.bat
View File

@ -1,5 +1,5 @@
@ECHO OFF
REM Copyright 2015 Ben Vanik. All Rights Reserved.
REM Copyright 2022 Ben Vanik. All Rights Reserved.
SET "DIR=%~dp0"
@ -7,10 +7,12 @@ REM ============================================================================
REM Environment Validation
REM ============================================================================
SET "PYTHON_MINIMUM_VERSION[0]=3"
SET "PYTHON_MINIMUM_VERSION[1]=6"
CALL :check_python
IF %_RESULT% NEQ 0 (
ECHO.
ECHO Python 3.6+ must be installed and on PATH:
ECHO Python %PYTHON_MINIMUM_VERSION[0]%.%PYTHON_MINIMUM_VERSION[1]%+ must be installed and on PATH:
ECHO https://www.python.org/
GOTO :eof
)
@ -33,9 +35,12 @@ SETLOCAL ENABLEDELAYEDEXPANSION
SET FOUND_PATH=""
SET "CANDIDATE_PATHS[0]=C:\python37\python.exe"
SET "CANDIDATE_PATHS[1]=C:\python36\python.exe"
SET OUTPUT_INDEX=2
SET "CANDIDATE_PATHS[0]=C:\python310\python.exe"
SET "CANDIDATE_PATHS[1]=C:\python39\python.exe"
SET "CANDIDATE_PATHS[2]=C:\python38\python.exe"
SET "CANDIDATE_PATHS[3]=C:\python37\python.exe"
SET "CANDIDATE_PATHS[4]=C:\python%PYTHON_MINIMUM_VERSION[0]%%PYTHON_MINIMUM_VERSION[1]%\python.exe"
SET OUTPUT_INDEX=5
FOR /F "usebackq delims=" %%L IN (`2^>NUL where python3`) DO (
IF %%~zL NEQ 0 (
@ -70,9 +75,9 @@ IF "%FOUND_PATH%"=="" (
GOTO :eof
)
CMD /C ""%FOUND_PATH%" -c "import sys; sys.exit(1 if not sys.version_info[:2] ^>= (3, 6) else 0)"
CMD /C ""%FOUND_PATH%" -c "import sys; sys.exit(1 if not sys.version_info[:2] ^>= (%PYTHON_MINIMUM_VERSION[0]%, %PYTHON_MINIMUM_VERSION[1]%) else 0)"
IF %ERRORLEVEL% NEQ 0 (
ECHO ERROR: Python version mismatch, not at least 3.6.
ECHO ERROR: Python version mismatch, not at least %PYTHON_MINIMUM_VERSION[0]%.%PYTHON_MINIMUM_VERSION[1]%.
ECHO Found Python executable was "%FOUND_PATH%".
ENDLOCAL & SET _RESULT=1
GOTO :eof

23
xb.ps1
View File

@ -5,20 +5,23 @@ function Write-FatalError($message) {
Exit 1
}
$pythonPath = Get-Command python | Select-Object -ExpandProperty Definition
# Check for 'python3' if 'python' isn't found
if ([string]::IsNullOrEmpty($pythonPath)) {
$pythonPath = Get-Command python3 | Select-Object -ExpandProperty Definition
$pythonExecutables = 'python', 'python3'
foreach ($pythonExecutable in $pythonExecutables) {
if (!$pythonPath) {
$pythonPath = powershell -NoLogo -NonInteractive "(Get-Command -ErrorAction SilentlyContinue $pythonexecutable).Definition" # Hack to not give command suggestion
} else {
break
}
}
# Neither found, error and exit
if ([string]::IsNullOrEmpty($pythonPath)) {
Write-FatalError "ERROR: no Python executable found on PATH.`nMake sure you can run 'python' or 'python3' in a Command Prompt."
$pythonMinimumVer = 3,6
if (!$pythonPath) {
Write-FatalError "ERROR: Python $($pythonMinimumVer[0]).$($pythonMinimumVer[1])+ must be installed and on PATH:`nhttps://www.python.org/"
}
python -c "import sys; sys.exit(1 if not sys.version_info[:2] >= (3, 4) else 0)"
& $pythonPath -c "import sys; sys.exit(1 if not sys.version_info[:2] >= ($($pythonMinimumVer[0]), $($pythonMinimumVer[1])) else 0)"
if ($LASTEXITCODE -gt 0) {
Write-FatalError "ERROR: Python version mismatch, not at least 3.4.`nFound Python executable was $($pythonPath)"
Write-FatalError "ERROR: Python version mismatch, not at least $($pythonMinimumVer[0]).$($pythonMinimumVer[1]).`nFound Python executable was `"$($pythonPath)`"."
}
python "$($PSScriptRoot)/xenia-build" $args
& $pythonPath "$($PSScriptRoot)/xenia-build" $args

View File

@ -134,8 +134,9 @@ def main():
print('')
# Check python version.
if not sys.version_info[:2] >= (3, 6):
print('ERROR: Python 3.6+ must be installed and on PATH')
python_minimum_ver=3,6
if not sys.version_info[:2] >= (python_minimum_ver[0], python_minimum_ver[1]):
print('ERROR: Python ', python_minimum_ver[0], '.', python_minimum_ver[1], '+ must be installed and on PATH', sep='')
sys.exit(1)
# Grab Visual Studio version and execute shell to set up environment.
@ -1830,4 +1831,3 @@ class DevenvCommand(Command):
if __name__ == '__main__':
main()