Tint: Support `clip_distances` on HLSL This patch implements the translation of built-in value `clip_distances` on HLSL. We should take different ways to do the translation according to the array length of `clip_distances`: - Array length is 1: float clipDistance : SV_ClipDistance0 - Array length is 2 to 4: floatN clipDistance : SV_ClipDistance0 - Array length is 5: float4 clipDistance : SV_ClipDistance0 float clipDistance1 : SV_ClipDistance1 - Array length is 6 to 8: float4 clipDistance : SV_ClipDistance0 floatN clipDistance1 : SV_ClipDistance1 To correctly translate in HLSL backend we have to use `core::BuiltinValue::kClipDistances` as `SV_ClipDistance0` and the internal attribute `HLSLClipDistance1` as `SV_ClipDistance1`. Bug: chromium:358408571 Change-Id: I5d0843cc846190c60a028e48fb8e13ae9a88a5bb Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/203775 Reviewed-by: James Price <jrprice@google.com> Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc index e7fd33a..ce29693 100644 --- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc +++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
@@ -397,6 +397,7 @@ wgsl::Extension::kChromiumExperimentalPushConstant, wgsl::Extension::kChromiumExperimentalSubgroups, wgsl::Extension::kChromiumInternalGraphite, + wgsl::Extension::kClipDistances, wgsl::Extension::kF16, wgsl::Extension::kDualSourceBlending, wgsl::Extension::kSubgroups, @@ -445,7 +446,7 @@ // instead of true structure. // Structures used as uniform buffer are read from an array of // vectors instead of true structure. - return EmitStructType(current_buffer_, ty); + return EmitStructType(current_buffer_, ty, str->members); } return true; }, @@ -3635,6 +3636,8 @@ return "SV_SampleIndex"; case core::BuiltinValue::kSampleMask: return "SV_Coverage"; + case core::BuiltinValue::kClipDistances: + return "SV_ClipDistance0"; default: break; } @@ -4590,16 +4593,24 @@ return true; } -bool ASTPrinter::EmitStructType(TextBuffer* b, const core::type::Struct* str) { +bool ASTPrinter::EmitStructType(TextBuffer* b, + const core::type::Struct* str, + VectorRef<const ast::StructMember*> ast_struct_members) { auto it = emitted_structs_.emplace(str); if (!it.second) { return true; } + const auto struct_type_members = str->Members(); + size_t struct_type_member_length = struct_type_members.Length(); + TINT_ASSERT(ast_struct_members.IsEmpty() || + (struct_type_member_length == ast_struct_members.Length())); + Line(b) << "struct " << StructName(str) << " {"; { ScopedIndent si(b); - for (auto* mem : str->Members()) { + for (size_t i = 0; i < struct_type_member_length; ++i) { + auto* mem = struct_type_members[i]; auto mem_name = mem->Name().Name(); auto* ty = mem->Type(); auto out = Line(b); @@ -4655,6 +4666,11 @@ // See discussion here: https://github.com/gpuweb/gpuweb/issues/893 pre += "precise "; } + if (!ast_struct_members.IsEmpty() && + ast::HasAttribute<ast::transform::CanonicalizeEntryPointIO::HLSLClipDistance1>( + ast_struct_members[i]->attributes)) { + post += " : SV_ClipDistance1"; + } out << pre; if (!EmitTypeAndName(out, ty, core::AddressSpace::kUndefined, core::Access::kReadWrite,
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h index 3a16948..81ebfd7 100644 --- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h +++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h
@@ -462,8 +462,11 @@ /// this function will simply return `true` without emitting anything. /// @param buffer the text buffer that the type declaration will be written to /// @param ty the struct to generate + /// @param ast_struct_members the definition of struct members in the AST if not empty. /// @returns true if the struct is emitted - bool EmitStructType(TextBuffer* buffer, const core::type::Struct* ty); + bool EmitStructType(TextBuffer* buffer, + const core::type::Struct* ty, + VectorRef<const ast::StructMember*> ast_struct_members = Empty); /// Handles a unary op expression /// @param out the output stream /// @param expr the expression to emit
diff --git a/src/tint/lang/wgsl/ast/disable_validation_attribute.cc b/src/tint/lang/wgsl/ast/disable_validation_attribute.cc index 1e607bb..59f1ad2 100644 --- a/src/tint/lang/wgsl/ast/disable_validation_attribute.cc +++ b/src/tint/lang/wgsl/ast/disable_validation_attribute.cc
@@ -60,6 +60,8 @@ return "disable_validation__ignore_pointer_aliasing"; case DisabledValidation::kIgnoreStructMemberLimit: return "disable_validation__ignore_struct_member"; + case DisabledValidation::kIgnoreClipDistancesType: + return "disable_validation__ignore_clip_distances_type"; } return "<invalid>"; }
diff --git a/src/tint/lang/wgsl/ast/disable_validation_attribute.h b/src/tint/lang/wgsl/ast/disable_validation_attribute.h index 4591ba9..c6127bc 100644 --- a/src/tint/lang/wgsl/ast/disable_validation_attribute.h +++ b/src/tint/lang/wgsl/ast/disable_validation_attribute.h
@@ -60,6 +60,9 @@ kIgnorePointerAliasing, /// When applied to a struct, validation of max number of members is skipped. kIgnoreStructMemberLimit, + /// When applied to a struct member, validation of the type of the builtin `clip_distances` is + /// skipped. + kIgnoreClipDistancesType, }; /// An internal attribute used to tell the validator to ignore specific
diff --git a/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.cc b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.cc index c9361e9..e31f686 100644 --- a/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.cc +++ b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.cc
@@ -49,6 +49,7 @@ TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::CanonicalizeEntryPointIO); TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::CanonicalizeEntryPointIO::Config); TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::CanonicalizeEntryPointIO::HLSLWaveIntrinsic); +TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::CanonicalizeEntryPointIO::HLSLClipDistance1); namespace tint::ast::transform { @@ -165,7 +166,8 @@ Hashmap<const BuiltinAttribute*, core::BuiltinValue, 16> builtin_attrs; /// A map of builtin values to HLSL wave intrinsic functions. Hashmap<core::BuiltinValue, Symbol, 2> wave_intrinsics; - /// The array length of the struct member with builtin attribute `clip_distances`. + /// The array length of the struct member with builtin attribute `clip_distances`. Now it is + /// only set and used on HLSL and MSL backends. uint32_t clip_distances_size = 0; /// Constructor @@ -409,7 +411,7 @@ core::InterpolationSampling::kUndefined)); } - if (cfg.shader_style == ShaderStyle::kMsl && + if ((cfg.shader_style == ShaderStyle::kMsl || cfg.shader_style == ShaderStyle::kHlsl) && func_ast->PipelineStage() == PipelineStage::kVertex && builtin_attr == core::BuiltinValue::kClipDistances) { const auto* arrayType = type->As<core::type::Array>(); @@ -676,6 +678,127 @@ wrapper_ep_parameters.Push(param); } + /// Get an existing member symbol from a set of member names or create a new symbol + /// @param member_names the set of the existing member names + /// @param symbol_name the name of the symbol + /// @returns the symbol that represents the member name we want + Symbol GetOrCreateMemberName(std::unordered_set<std::string>* member_names, + std::string symbol_name) { + Symbol member_name; + if (member_names->count(symbol_name)) { + member_name = b.Symbols().New(symbol_name); + } else { + member_name = b.Symbols().Register(symbol_name); + } + member_names->insert(member_name.Name()); + return member_name; + } + + /// Handle `clip_distances` in MSL + /// @param assignments the assignments to the members of the output wrapper struct + /// @param member_names the set that contains all the member names in the output wrapper struct + /// @param clip_distances_inner_array_name the `clip_distances` member in inner struct + /// @param wrapper_struct_name the name of the output wrapper struct + /// @param old_struct_member the information of the old output wrapper struct member + void HandleClipDistancesInMSL(tint::Vector<const Statement*, 8>* assignments, + std::unordered_set<std::string>* member_names, + const Symbol& clip_distances_inner_array_name, + const Symbol& wrapper_struct_name, + const OutputValue& old_struct_member) { + auto new_member = GetOrCreateMemberName(member_names, "clip_distance"); + + for (uint32_t i = 0; i < clip_distances_size; ++i) { + assignments->Push( + b.Assign(b.IndexAccessor(b.MemberAccessor(wrapper_struct_name, new_member), u32(i)), + b.IndexAccessor(clip_distances_inner_array_name, u32(i)))); + } + wrapper_struct_output_members.Push({ + /* member */ b.Member(new_member, old_struct_member.type, + std::move(old_struct_member.attributes)), + /* location */ std::nullopt, + /* blend_src */ std::nullopt, + /* color */ std::nullopt, + }); + } + + /// Handle `clip_distances` in HLSL + /// @param assignments the assignments to the members of the output wrapper struct + /// @param member_names the set that contains all the member names in the output wrapper struct + /// @param clip_distances_inner_array_name the `clip_distances` member in inner struct + /// @param wrapper_struct_name the symbol of the output wrapper struct + /// @param old_struct_member_attributes the attributes of the old `clip_distances` member + void HandleClipDistancesInHLSL( + tint::Vector<const Statement*, 8>* assignments, + std::unordered_set<std::string>* member_names, + const Symbol& clip_distances_inner_array_name, + const Symbol& wrapper_struct_name, + tint::Vector<const Attribute*, 8>&& old_struct_member_attributes) { + auto TranslateClipDistancesIntoF32 = + [&](const Symbol& new_member, core::u32 inner_array_index, + tint::VectorRef<const ast::Attribute*>&& new_member_attributes) { + assignments->Push( + b.Assign(b.MemberAccessor(wrapper_struct_name, new_member), + b.IndexAccessor(clip_distances_inner_array_name, inner_array_index))); + wrapper_struct_output_members.Push({ + /* member */ b.Member(new_member, b.ty.f32(), std::move(new_member_attributes)), + /* location */ std::nullopt, + /* blend_src */ std::nullopt, + /* color */ std::nullopt, + }); + }; + + auto TranslateClipDistancesIntoVector = + [&](const Symbol& new_member, uint32_t vector_size, + tint::VectorRef<const ast::Attribute*>&& new_member_attributes) { + for (uint32_t i = 0; i < vector_size; ++i) { + assignments->Push(b.Assign( + b.IndexAccessor(b.MemberAccessor(wrapper_struct_name, new_member), u32(i)), + b.IndexAccessor(clip_distances_inner_array_name, u32(i)))); + } + wrapper_struct_output_members.Push({ + /* member */ b.Member(new_member, b.ty.vec(b.ty.f32(), vector_size), + std::move(new_member_attributes)), + /* location */ std::nullopt, + /* blend_src */ std::nullopt, + /* color */ std::nullopt, + }); + }; + + // float clip_distance_0 : SV_ClipDistance0; + auto attribute_vector_0 = std::move(old_struct_member_attributes); + attribute_vector_0.Push(b.Disable(ast::DisabledValidation::kIgnoreClipDistancesType)); + auto new_member_0 = GetOrCreateMemberName(member_names, "clip_distance_0"); + if (clip_distances_size == 1u) { + TranslateClipDistancesIntoF32(new_member_0, 0_u, std::move(attribute_vector_0)); + return; + } + + // floatN clip_distance_0 : SV_ClipDistance0; + uint32_t clip_distance0_size = std::min(clip_distances_size, 4u); + TranslateClipDistancesIntoVector(new_member_0, clip_distance0_size, + std::move(attribute_vector_0)); + + // It is enough to just generate SV_ClipDistance0. + if (clip_distances_size <= 4u) { + return; + } + + // float clip_distance_1 : SV_ClipDistance1; + auto attribute_vector_1 = + Vector{b.ASTNodes().Create<HLSLClipDistance1>(b.ID(), b.AllocateNodeID())}; + auto new_member_1 = GetOrCreateMemberName(member_names, "clip_distance_1"); + + if (clip_distances_size == 5u) { + TranslateClipDistancesIntoF32(new_member_1, 4_u, std::move(attribute_vector_1)); + return; + } + + // floatN clip_distance_1 : SV_ClipDistance1; + uint32_t clip_distances1_size = clip_distances_size - 4u; + TranslateClipDistancesIntoVector(new_member_1, clip_distances1_size, + std::move(attribute_vector_1)); + } + /// Create and return the wrapper function's struct result object. /// @returns the struct type Struct* CreateOutputStruct() { @@ -686,29 +809,39 @@ // Create the struct members and their corresponding assignment statements. std::unordered_set<std::string> member_names; for (auto& outval : wrapper_output_values) { - // Use the original output name, unless that is already taken. - Symbol name; - if (member_names.count(outval.name)) { - name = b.Symbols().New(outval.name); - } else { - name = b.Symbols().Register(outval.name); - } - member_names.insert(name.Name()); - auto* builtin_attribute = GetAttribute<BuiltinAttribute>(outval.attributes); - if (cfg.shader_style == ShaderStyle::kMsl && builtin_attribute != nullptr && + if ((cfg.shader_style == ShaderStyle::kMsl || cfg.shader_style == ShaderStyle::kHlsl) && + builtin_attribute != nullptr && builtin_attribute->builtin == core::BuiltinValue::kClipDistances) { Symbol clip_distances_inner_array = b.Symbols().New("tmp_inner_clip_distances"); - assignments.Push(b.Decl(b.Let(clip_distances_inner_array, outval.value))); - for (uint32_t i = 0; i < clip_distances_size; ++i) { - assignments.Push( - b.Assign(b.IndexAccessor(b.MemberAccessor(wrapper_result, name), u32(i)), - b.IndexAccessor(clip_distances_inner_array, u32(i)))); + + switch (cfg.shader_style) { + case ShaderStyle::kMsl: + assignments.Push(b.Decl(b.Let(clip_distances_inner_array, outval.value))); + HandleClipDistancesInMSL(&assignments, &member_names, + clip_distances_inner_array, wrapper_result, + outval); + break; + case ShaderStyle::kHlsl: + // Consume outval.type in the let statement as in HLSL `SV_ClipDistance` + // always has different type. + assignments.Push( + b.Decl(b.Let(clip_distances_inner_array, outval.type, outval.value))); + HandleClipDistancesInHLSL(&assignments, &member_names, + clip_distances_inner_array, wrapper_result, + std::move(outval.attributes)); + break; + default: + break; } - } else { - assignments.Push(b.Assign(b.MemberAccessor(wrapper_result, name), outval.value)); + continue; } + // Use the original output name, unless that is already taken. + Symbol name = GetOrCreateMemberName(&member_names, outval.name); + + assignments.Push(b.Assign(b.MemberAccessor(wrapper_result, name), outval.value)); + wrapper_struct_output_members.Push({ /* member */ b.Member(name, outval.type, std::move(outval.attributes)), /* location */ outval.location, @@ -1068,4 +1201,19 @@ ctx.dst->ID(), ctx.dst->AllocateNodeID(), op); } +CanonicalizeEntryPointIO::HLSLClipDistance1::HLSLClipDistance1(GenerationID pid, NodeID nid) + : Base(pid, nid, Empty) {} + +CanonicalizeEntryPointIO::HLSLClipDistance1::~HLSLClipDistance1() = default; + +std::string CanonicalizeEntryPointIO::HLSLClipDistance1::InternalName() const { + return "SV_ClipDistance1"; +} + +const CanonicalizeEntryPointIO::HLSLClipDistance1* +CanonicalizeEntryPointIO::HLSLClipDistance1::Clone(ast::CloneContext& ctx) const { + return ctx.dst->ASTNodes().Create<CanonicalizeEntryPointIO::HLSLClipDistance1>( + ctx.dst->ID(), ctx.dst->AllocateNodeID()); +} + } // namespace tint::ast::transform
diff --git a/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.h b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.h index 9899e3d5..928fe56 100644 --- a/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.h +++ b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.h
@@ -185,6 +185,25 @@ const Op op; }; + /// HLSLClipDistance1 is an InternalAttribute that is used to represent `SV_ClipDistance1`. + class HLSLClipDistance1 final : public Castable<HLSLClipDistance1, InternalAttribute> { + public: + /// Constructor + /// @param pid the identifier of the program that owns this node + /// @param nid the unique node identifier + HLSLClipDistance1(GenerationID pid, NodeID nid); + /// Destructor + ~HLSLClipDistance1() override; + + /// @copydoc InternalAttribute::InternalName + std::string InternalName() const override; + + /// Performs a deep clone of this object using the program::CloneContext `ctx`. + /// @param ctx the clone context + /// @return the newly cloned object + const HLSLClipDistance1* Clone(CloneContext& ctx) const override; + }; + /// Constructor CanonicalizeEntryPointIO(); ~CanonicalizeEntryPointIO() override;
diff --git a/src/tint/lang/wgsl/resolver/validator.cc b/src/tint/lang/wgsl/resolver/validator.cc index 4cf6a62..9056664 100644 --- a/src/tint/lang/wgsl/resolver/validator.cc +++ b/src/tint/lang/wgsl/resolver/validator.cc
@@ -984,7 +984,8 @@ bool Validator::BuiltinAttribute(const ast::BuiltinAttribute* attr, const core::type::Type* storage_ty, ast::PipelineStage stage, - const bool is_input) const { + const bool is_input, + const bool ignore_clip_distances_type_validation) const { auto* type = storage_ty->UnwrapRef(); bool is_stage_mismatch = false; bool is_output = !is_input; @@ -1128,7 +1129,8 @@ return false; } auto* arr = type->As<sem::Array>(); - if (!(arr && arr->ElemType()->Is<core::type::F32>() && + if (!ignore_clip_distances_type_validation && + !(arr && arr->ElemType()->Is<core::type::F32>() && arr->ConstantCount().has_value() && *arr->ConstantCount() <= kMaxClipDistancesSize)) { AddError(attr->source) @@ -1346,6 +1348,8 @@ const ast::BlendSrcAttribute* blend_src_attribute = nullptr; const ast::InterpolateAttribute* interpolate_attribute = nullptr; const ast::InvariantAttribute* invariant_attribute = nullptr; + bool ignore_clip_distances_type = + IsValidationDisabled(attrs, ast::DisabledValidation::kIgnoreClipDistancesType); for (auto* attr : attrs) { bool ok = Switch( attr, // @@ -1370,9 +1374,9 @@ return false; } - if (!BuiltinAttribute( - builtin_attr, ty, stage, - /* is_input */ param_or_ret == ParamOrRetType::kParameter)) { + if (!BuiltinAttribute(builtin_attr, ty, stage, + /* is_input */ param_or_ret == ParamOrRetType::kParameter, + ignore_clip_distances_type)) { return false; } builtins.Add(builtin); @@ -2509,6 +2513,8 @@ const ast::ColorAttribute* color_attribute = nullptr; const ast::InvariantAttribute* invariant_attribute = nullptr; const ast::InterpolateAttribute* interpolate_attribute = nullptr; + bool ignore_clip_distances_type = IsValidationDisabled( + member->Declaration()->attributes, ast::DisabledValidation::kIgnoreClipDistancesType); for (auto* attr : member->Declaration()->attributes) { bool ok = Switch( attr, // @@ -2533,7 +2539,7 @@ }, [&](const ast::BuiltinAttribute* builtin_attr) { if (!BuiltinAttribute(builtin_attr, member->Type(), stage, - /* is_input */ false)) { + /* is_input */ false, ignore_clip_distances_type)) { return false; } if (builtin_attr->builtin == core::BuiltinValue::kPosition) {
diff --git a/src/tint/lang/wgsl/resolver/validator.h b/src/tint/lang/wgsl/resolver/validator.h index 82f3112..1db8f64 100644 --- a/src/tint/lang/wgsl/resolver/validator.h +++ b/src/tint/lang/wgsl/resolver/validator.h
@@ -254,11 +254,13 @@ /// @param storage_type the attribute storage type /// @param stage the current pipeline stage /// @param is_input true if this is an input attribute + /// @param ignore_clip_distances_type_validation true if ignore type check on clip_distances /// @returns true on success, false otherwise. bool BuiltinAttribute(const ast::BuiltinAttribute* attr, const core::type::Type* storage_type, ast::PipelineStage stage, - const bool is_input) const; + const bool is_input, + const bool ignore_clip_distances_type_validation = false) const; /// Validates a continue statement /// @param stmt the continue statement to validate
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.dxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.dxc.hlsl index 6d69a54..8a9a6d3 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.dxc.hlsl +++ b/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.dxc.hlsl
@@ -1,23 +1,22 @@ -SKIP: FAILED - - -enable clip_distances; - struct VertexOutputs { - @builtin(position) - position : vec4<f32>, - @builtin(clip_distances) - clipDistance : array<f32, 1>, + float4 position; + float clipDistance[1]; +}; +struct tint_symbol { + float4 position : SV_Position; + float clip_distance_0 : SV_ClipDistance0; +}; + +VertexOutputs main_inner() { + VertexOutputs tint_symbol_1 = {float4(1.0f, 2.0f, 3.0f, 4.0f), (float[1])0}; + return tint_symbol_1; } -@vertex -fn main() -> VertexOutputs { - return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0), array<f32, 1>(0.0)); +tint_symbol main() { + VertexOutputs inner_result = main_inner(); + tint_symbol wrapper_result = (tint_symbol)0; + wrapper_result.position = inner_result.position; + float tmp_inner_clip_distances[1] = inner_result.clipDistance; + wrapper_result.clip_distance_0 = tmp_inner_clip_distances[0u]; + return wrapper_result; } - -Failed to generate: <dawn>/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl:1:8 error: HLSL backend does not support extension 'clip_distances' -enable clip_distances; - ^^^^^^^^^^^^^^ - - -tint executable returned error: exit status 1
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.fxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.fxc.hlsl index 6d69a54..8a9a6d3 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.fxc.hlsl +++ b/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.fxc.hlsl
@@ -1,23 +1,22 @@ -SKIP: FAILED - - -enable clip_distances; - struct VertexOutputs { - @builtin(position) - position : vec4<f32>, - @builtin(clip_distances) - clipDistance : array<f32, 1>, + float4 position; + float clipDistance[1]; +}; +struct tint_symbol { + float4 position : SV_Position; + float clip_distance_0 : SV_ClipDistance0; +}; + +VertexOutputs main_inner() { + VertexOutputs tint_symbol_1 = {float4(1.0f, 2.0f, 3.0f, 4.0f), (float[1])0}; + return tint_symbol_1; } -@vertex -fn main() -> VertexOutputs { - return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0), array<f32, 1>(0.0)); +tint_symbol main() { + VertexOutputs inner_result = main_inner(); + tint_symbol wrapper_result = (tint_symbol)0; + wrapper_result.position = inner_result.position; + float tmp_inner_clip_distances[1] = inner_result.clipDistance; + wrapper_result.clip_distance_0 = tmp_inner_clip_distances[0u]; + return wrapper_result; } - -Failed to generate: <dawn>/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl:1:8 error: HLSL backend does not support extension 'clip_distances' -enable clip_distances; - ^^^^^^^^^^^^^^ - - -tint executable returned error: exit status 1
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.glsl b/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.glsl index 7d7ee00..1db6fd3 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.glsl +++ b/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.glsl
@@ -19,3 +19,5 @@ enable clip_distances; ^^^^^^^^^^^^^^ + +tint executable returned error: exit status 1
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.ir.msl b/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.ir.msl index 10e52d9..af78b72 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.ir.msl +++ b/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.ir.msl
@@ -1,5 +1,3 @@ -SKIP: FAILED - #include <metal_stdlib> using namespace metal; @@ -33,10 +31,3 @@ VertexOutputs const v = tint_symbol_inner(); return tint_symbol_outputs{.VertexOutputs_position=v.position, .VertexOutputs_clipDistance=v.clipDistance}; } -program_source:23:53: error: type 'tint_array<float, 1>' is not valid for attribute 'clip_distance' - tint_array<float, 1> VertexOutputs_clipDistance [[clip_distance]]; - ^~~~~~~~~~~~~ -program_source:30:8: error: invalid return type 'tint_symbol_outputs' for vertex function -vertex tint_symbol_outputs tint_symbol() { - ^ -
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.msl b/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.msl index fd5ca23..05ce84e 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.msl +++ b/test/tint/extensions/clip_distances/clip_distances_size_1.wgsl.expected.msl
@@ -21,7 +21,7 @@ struct tint_symbol_1 { float4 position [[position]]; - float clipDistance [[clip_distance]] [1]; + float clip_distance [[clip_distance]] [1]; }; VertexOutputs tint_symbol_inner() { @@ -34,7 +34,7 @@ tint_symbol_1 wrapper_result = {}; wrapper_result.position = inner_result.position; tint_array<float, 1> const tmp_inner_clip_distances = inner_result.clipDistance; - wrapper_result.clipDistance[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance[0u] = tmp_inner_clip_distances[0u]; return wrapper_result; }
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl new file mode 100644 index 0000000..5e0487b --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl
@@ -0,0 +1,13 @@ +enable clip_distances; + +struct VertexOutputs { + @builtin(position) + position : vec4<f32>, + @builtin(clip_distances) + clipDistance : array<f32, 3>, +} + +@vertex +fn main() -> VertexOutputs { + return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0), array<f32, 3>(0.0, 0.0, 0.0)); +}
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.dxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000..8b76aeb --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,24 @@ +struct VertexOutputs { + float4 position; + float clipDistance[3]; +}; +struct tint_symbol { + float4 position : SV_Position; + float3 clip_distance_0 : SV_ClipDistance0; +}; + +VertexOutputs main_inner() { + VertexOutputs tint_symbol_1 = {float4(1.0f, 2.0f, 3.0f, 4.0f), (float[3])0}; + return tint_symbol_1; +} + +tint_symbol main() { + VertexOutputs inner_result = main_inner(); + tint_symbol wrapper_result = (tint_symbol)0; + wrapper_result.position = inner_result.position; + float tmp_inner_clip_distances[3] = inner_result.clipDistance; + wrapper_result.clip_distance_0[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance_0[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance_0[2u] = tmp_inner_clip_distances[2u]; + return wrapper_result; +}
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.fxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000..8b76aeb --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,24 @@ +struct VertexOutputs { + float4 position; + float clipDistance[3]; +}; +struct tint_symbol { + float4 position : SV_Position; + float3 clip_distance_0 : SV_ClipDistance0; +}; + +VertexOutputs main_inner() { + VertexOutputs tint_symbol_1 = {float4(1.0f, 2.0f, 3.0f, 4.0f), (float[3])0}; + return tint_symbol_1; +} + +tint_symbol main() { + VertexOutputs inner_result = main_inner(); + tint_symbol wrapper_result = (tint_symbol)0; + wrapper_result.position = inner_result.position; + float tmp_inner_clip_distances[3] = inner_result.clipDistance; + wrapper_result.clip_distance_0[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance_0[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance_0[2u] = tmp_inner_clip_distances[2u]; + return wrapper_result; +}
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.glsl b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.glsl new file mode 100644 index 0000000..39bbe86 --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.glsl
@@ -0,0 +1,23 @@ +SKIP: FAILED + + +enable clip_distances; + +struct VertexOutputs { + @builtin(position) + position : vec4<f32>, + @builtin(clip_distances) + clipDistance : array<f32, 3>, +} + +@vertex +fn tint_symbol() -> VertexOutputs { + return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0), array<f32, 3>(0.0, 0.0, 0.0)); +} + +Failed to generate: <dawn>/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl:1:8 error: GLSL backend does not support extension 'clip_distances' +enable clip_distances; + ^^^^^^^^^^^^^^ + + +tint executable returned error: exit status 1
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.ir.dxc.hlsl new file mode 100644 index 0000000..b0160ea --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,11 @@ +SKIP: FAILED + +..\..\src\tint\lang\hlsl\writer\raise\shader_io.cc:101 internal compiler error: TINT_UNREACHABLE +******************************************************************** +* The tint shader compiler has encountered an unexpected error. * +* * +* Please help us fix this issue by submitting a bug report at * +* crbug.com/tint with the source program that triggered the bug. * +******************************************************************** + +tint executable returned error: exit status 0xc000001d
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.ir.fxc.hlsl new file mode 100644 index 0000000..b0160ea --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.ir.fxc.hlsl
@@ -0,0 +1,11 @@ +SKIP: FAILED + +..\..\src\tint\lang\hlsl\writer\raise\shader_io.cc:101 internal compiler error: TINT_UNREACHABLE +******************************************************************** +* The tint shader compiler has encountered an unexpected error. * +* * +* Please help us fix this issue by submitting a bug report at * +* crbug.com/tint with the source program that triggered the bug. * +******************************************************************** + +tint executable returned error: exit status 0xc000001d
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.ir.msl b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.ir.msl new file mode 100644 index 0000000..23310a1 --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.ir.msl
@@ -0,0 +1,33 @@ +#include <metal_stdlib> +using namespace metal; + +template<typename T, size_t N> +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +struct VertexOutputs { + float4 position; + tint_array<float, 3> clipDistance; +}; + +struct tint_symbol_outputs { + float4 VertexOutputs_position [[position]]; + tint_array<float, 3> VertexOutputs_clipDistance [[clip_distance]]; +}; + +VertexOutputs tint_symbol_inner() { + return VertexOutputs{.position=float4(1.0f, 2.0f, 3.0f, 4.0f), .clipDistance=tint_array<float, 3>{}}; +} + +vertex tint_symbol_outputs tint_symbol() { + VertexOutputs const v = tint_symbol_inner(); + return tint_symbol_outputs{.VertexOutputs_position=v.position, .VertexOutputs_clipDistance=v.clipDistance}; +}
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.msl b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.msl new file mode 100644 index 0000000..972fd0e --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.msl
@@ -0,0 +1,42 @@ +#include <metal_stdlib> + +using namespace metal; + +template<typename T, size_t N> +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +struct VertexOutputs { + float4 position; + tint_array<float, 3> clipDistance; +}; + +struct tint_symbol_1 { + float4 position [[position]]; + float clip_distance [[clip_distance]] [3]; +}; + +VertexOutputs tint_symbol_inner() { + VertexOutputs const tint_symbol_2 = VertexOutputs{.position=float4(1.0f, 2.0f, 3.0f, 4.0f), .clipDistance=tint_array<float, 3>{}}; + return tint_symbol_2; +} + +vertex tint_symbol_1 tint_symbol() { + VertexOutputs const inner_result = tint_symbol_inner(); + tint_symbol_1 wrapper_result = {}; + wrapper_result.position = inner_result.position; + tint_array<float, 3> const tmp_inner_clip_distances = inner_result.clipDistance; + wrapper_result.clip_distance[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance[2u] = tmp_inner_clip_distances[2u]; + return wrapper_result; +} +
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.spvasm b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.spvasm new file mode 100644 index 0000000..f3e7b9e --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.spvasm
@@ -0,0 +1,59 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 1 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpCapability ClipDistance + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" %main_position_Output %main_clip_distances_Output %main___point_size_Output + OpName %main_position_Output "main_position_Output" + OpName %main_clip_distances_Output "main_clip_distances_Output" + OpName %main___point_size_Output "main___point_size_Output" + OpName %main_inner "main_inner" + OpMemberName %VertexOutputs 0 "position" + OpMemberName %VertexOutputs 1 "clipDistance" + OpName %VertexOutputs "VertexOutputs" + OpName %main "main" + OpDecorate %main_position_Output BuiltIn Position + OpDecorate %_arr_float_uint_3 ArrayStride 4 + OpDecorate %main_clip_distances_Output BuiltIn ClipDistance + OpDecorate %main___point_size_Output BuiltIn PointSize + OpMemberDecorate %VertexOutputs 0 Offset 0 + OpMemberDecorate %VertexOutputs 1 Offset 16 + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 +%_ptr_Output_v4float = OpTypePointer Output %v4float +%main_position_Output = OpVariable %_ptr_Output_v4float Output + %uint = OpTypeInt 32 0 + %uint_3 = OpConstant %uint 3 +%_arr_float_uint_3 = OpTypeArray %float %uint_3 +%_ptr_Output__arr_float_uint_3 = OpTypePointer Output %_arr_float_uint_3 +%main_clip_distances_Output = OpVariable %_ptr_Output__arr_float_uint_3 Output +%_ptr_Output_float = OpTypePointer Output %float +%main___point_size_Output = OpVariable %_ptr_Output_float Output +%VertexOutputs = OpTypeStruct %v4float %_arr_float_uint_3 + %14 = OpTypeFunction %VertexOutputs + %float_1 = OpConstant %float 1 + %float_2 = OpConstant %float 2 + %float_3 = OpConstant %float 3 + %float_4 = OpConstant %float 4 + %17 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4 + %22 = OpConstantNull %_arr_float_uint_3 + %16 = OpConstantComposite %VertexOutputs %17 %22 + %void = OpTypeVoid + %25 = OpTypeFunction %void + %main_inner = OpFunction %VertexOutputs None %14 + %15 = OpLabel + OpReturnValue %16 + OpFunctionEnd + %main = OpFunction %void None %25 + %26 = OpLabel + %27 = OpFunctionCall %VertexOutputs %main_inner + %28 = OpCompositeExtract %v4float %27 0 + OpStore %main_position_Output %28 + %29 = OpCompositeExtract %_arr_float_uint_3 %27 1 + OpStore %main_clip_distances_Output %29 + OpStore %main___point_size_Output %float_1 + OpReturn + OpFunctionEnd
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.wgsl b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.wgsl new file mode 100644 index 0000000..5e0487b --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_3.wgsl.expected.wgsl
@@ -0,0 +1,13 @@ +enable clip_distances; + +struct VertexOutputs { + @builtin(position) + position : vec4<f32>, + @builtin(clip_distances) + clipDistance : array<f32, 3>, +} + +@vertex +fn main() -> VertexOutputs { + return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0), array<f32, 3>(0.0, 0.0, 0.0)); +}
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.dxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.dxc.hlsl index e5d4dce..9d8db76 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.dxc.hlsl +++ b/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.dxc.hlsl
@@ -1,23 +1,25 @@ -SKIP: FAILED - - -enable clip_distances; - struct VertexOutputs { - @builtin(position) - position : vec4<f32>, - @builtin(clip_distances) - clipDistance : array<f32, 4>, + float4 position; + float clipDistance[4]; +}; +struct tint_symbol { + float4 position : SV_Position; + float4 clip_distance_0 : SV_ClipDistance0; +}; + +VertexOutputs main_inner() { + VertexOutputs tint_symbol_1 = {float4(1.0f, 2.0f, 3.0f, 4.0f), (float[4])0}; + return tint_symbol_1; } -@vertex -fn main() -> VertexOutputs { - return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0), array<f32, 4>(0.0, 0.0, 0.0, 0.0)); +tint_symbol main() { + VertexOutputs inner_result = main_inner(); + tint_symbol wrapper_result = (tint_symbol)0; + wrapper_result.position = inner_result.position; + float tmp_inner_clip_distances[4] = inner_result.clipDistance; + wrapper_result.clip_distance_0[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance_0[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance_0[2u] = tmp_inner_clip_distances[2u]; + wrapper_result.clip_distance_0[3u] = tmp_inner_clip_distances[3u]; + return wrapper_result; } - -Failed to generate: <dawn>/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl:1:8 error: HLSL backend does not support extension 'clip_distances' -enable clip_distances; - ^^^^^^^^^^^^^^ - - -tint executable returned error: exit status 1
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.fxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.fxc.hlsl index e5d4dce..9d8db76 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.fxc.hlsl +++ b/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.fxc.hlsl
@@ -1,23 +1,25 @@ -SKIP: FAILED - - -enable clip_distances; - struct VertexOutputs { - @builtin(position) - position : vec4<f32>, - @builtin(clip_distances) - clipDistance : array<f32, 4>, + float4 position; + float clipDistance[4]; +}; +struct tint_symbol { + float4 position : SV_Position; + float4 clip_distance_0 : SV_ClipDistance0; +}; + +VertexOutputs main_inner() { + VertexOutputs tint_symbol_1 = {float4(1.0f, 2.0f, 3.0f, 4.0f), (float[4])0}; + return tint_symbol_1; } -@vertex -fn main() -> VertexOutputs { - return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0), array<f32, 4>(0.0, 0.0, 0.0, 0.0)); +tint_symbol main() { + VertexOutputs inner_result = main_inner(); + tint_symbol wrapper_result = (tint_symbol)0; + wrapper_result.position = inner_result.position; + float tmp_inner_clip_distances[4] = inner_result.clipDistance; + wrapper_result.clip_distance_0[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance_0[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance_0[2u] = tmp_inner_clip_distances[2u]; + wrapper_result.clip_distance_0[3u] = tmp_inner_clip_distances[3u]; + return wrapper_result; } - -Failed to generate: <dawn>/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl:1:8 error: HLSL backend does not support extension 'clip_distances' -enable clip_distances; - ^^^^^^^^^^^^^^ - - -tint executable returned error: exit status 1
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.glsl b/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.glsl index 88551af..e4cdf12 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.glsl +++ b/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.glsl
@@ -19,3 +19,5 @@ enable clip_distances; ^^^^^^^^^^^^^^ + +tint executable returned error: exit status 1
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.ir.msl b/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.ir.msl index 917e0b2..ff0637d 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.ir.msl +++ b/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.ir.msl
@@ -1,5 +1,3 @@ -SKIP: FAILED - #include <metal_stdlib> using namespace metal; @@ -33,10 +31,3 @@ VertexOutputs const v = tint_symbol_inner(); return tint_symbol_outputs{.VertexOutputs_position=v.position, .VertexOutputs_clipDistance=v.clipDistance}; } -program_source:23:53: error: type 'tint_array<float, 4>' is not valid for attribute 'clip_distance' - tint_array<float, 4> VertexOutputs_clipDistance [[clip_distance]]; - ^~~~~~~~~~~~~ -program_source:30:8: error: invalid return type 'tint_symbol_outputs' for vertex function -vertex tint_symbol_outputs tint_symbol() { - ^ -
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.msl b/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.msl index 8f88332..e1c3a43 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.msl +++ b/test/tint/extensions/clip_distances/clip_distances_size_4.wgsl.expected.msl
@@ -21,7 +21,7 @@ struct tint_symbol_1 { float4 position [[position]]; - float clipDistance [[clip_distance]] [4]; + float clip_distance [[clip_distance]] [4]; }; VertexOutputs tint_symbol_inner() { @@ -34,10 +34,10 @@ tint_symbol_1 wrapper_result = {}; wrapper_result.position = inner_result.position; tint_array<float, 4> const tmp_inner_clip_distances = inner_result.clipDistance; - wrapper_result.clipDistance[0u] = tmp_inner_clip_distances[0u]; - wrapper_result.clipDistance[1u] = tmp_inner_clip_distances[1u]; - wrapper_result.clipDistance[2u] = tmp_inner_clip_distances[2u]; - wrapper_result.clipDistance[3u] = tmp_inner_clip_distances[3u]; + wrapper_result.clip_distance[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance[2u] = tmp_inner_clip_distances[2u]; + wrapper_result.clip_distance[3u] = tmp_inner_clip_distances[3u]; return wrapper_result; }
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl new file mode 100644 index 0000000..b82ef45 --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl
@@ -0,0 +1,13 @@ +enable clip_distances; + +struct VertexOutputs { + @builtin(position) + position : vec4<f32>, + @builtin(clip_distances) + clipDistance : array<f32, 5>, +} + +@vertex +fn main() -> VertexOutputs { + return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0), array<f32, 5>(0.0, 0.0, 0.0, 0.0, 0.0)); +}
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.dxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000..398a16a0 --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.dxc.hlsl
@@ -0,0 +1,27 @@ +struct VertexOutputs { + float4 position; + float clipDistance[5]; +}; +struct tint_symbol { + float4 position : SV_Position; + float4 clip_distance_0 : SV_ClipDistance0; + float clip_distance_1 : SV_ClipDistance1; +}; + +VertexOutputs main_inner() { + VertexOutputs tint_symbol_1 = {float4(1.0f, 2.0f, 3.0f, 4.0f), (float[5])0}; + return tint_symbol_1; +} + +tint_symbol main() { + VertexOutputs inner_result = main_inner(); + tint_symbol wrapper_result = (tint_symbol)0; + wrapper_result.position = inner_result.position; + float tmp_inner_clip_distances[5] = inner_result.clipDistance; + wrapper_result.clip_distance_0[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance_0[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance_0[2u] = tmp_inner_clip_distances[2u]; + wrapper_result.clip_distance_0[3u] = tmp_inner_clip_distances[3u]; + wrapper_result.clip_distance_1 = tmp_inner_clip_distances[4u]; + return wrapper_result; +}
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.fxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000..398a16a0 --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.fxc.hlsl
@@ -0,0 +1,27 @@ +struct VertexOutputs { + float4 position; + float clipDistance[5]; +}; +struct tint_symbol { + float4 position : SV_Position; + float4 clip_distance_0 : SV_ClipDistance0; + float clip_distance_1 : SV_ClipDistance1; +}; + +VertexOutputs main_inner() { + VertexOutputs tint_symbol_1 = {float4(1.0f, 2.0f, 3.0f, 4.0f), (float[5])0}; + return tint_symbol_1; +} + +tint_symbol main() { + VertexOutputs inner_result = main_inner(); + tint_symbol wrapper_result = (tint_symbol)0; + wrapper_result.position = inner_result.position; + float tmp_inner_clip_distances[5] = inner_result.clipDistance; + wrapper_result.clip_distance_0[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance_0[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance_0[2u] = tmp_inner_clip_distances[2u]; + wrapper_result.clip_distance_0[3u] = tmp_inner_clip_distances[3u]; + wrapper_result.clip_distance_1 = tmp_inner_clip_distances[4u]; + return wrapper_result; +}
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.glsl b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.glsl new file mode 100644 index 0000000..3801310 --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.glsl
@@ -0,0 +1,23 @@ +SKIP: FAILED + + +enable clip_distances; + +struct VertexOutputs { + @builtin(position) + position : vec4<f32>, + @builtin(clip_distances) + clipDistance : array<f32, 5>, +} + +@vertex +fn tint_symbol() -> VertexOutputs { + return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0), array<f32, 5>(0.0, 0.0, 0.0, 0.0, 0.0)); +} + +Failed to generate: <dawn>/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl:1:8 error: GLSL backend does not support extension 'clip_distances' +enable clip_distances; + ^^^^^^^^^^^^^^ + + +tint executable returned error: exit status 1
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.ir.dxc.hlsl new file mode 100644 index 0000000..b0160ea --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,11 @@ +SKIP: FAILED + +..\..\src\tint\lang\hlsl\writer\raise\shader_io.cc:101 internal compiler error: TINT_UNREACHABLE +******************************************************************** +* The tint shader compiler has encountered an unexpected error. * +* * +* Please help us fix this issue by submitting a bug report at * +* crbug.com/tint with the source program that triggered the bug. * +******************************************************************** + +tint executable returned error: exit status 0xc000001d
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.ir.fxc.hlsl new file mode 100644 index 0000000..b0160ea --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.ir.fxc.hlsl
@@ -0,0 +1,11 @@ +SKIP: FAILED + +..\..\src\tint\lang\hlsl\writer\raise\shader_io.cc:101 internal compiler error: TINT_UNREACHABLE +******************************************************************** +* The tint shader compiler has encountered an unexpected error. * +* * +* Please help us fix this issue by submitting a bug report at * +* crbug.com/tint with the source program that triggered the bug. * +******************************************************************** + +tint executable returned error: exit status 0xc000001d
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.ir.msl b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.ir.msl new file mode 100644 index 0000000..c509098 --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.ir.msl
@@ -0,0 +1,33 @@ +#include <metal_stdlib> +using namespace metal; + +template<typename T, size_t N> +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +struct VertexOutputs { + float4 position; + tint_array<float, 5> clipDistance; +}; + +struct tint_symbol_outputs { + float4 VertexOutputs_position [[position]]; + tint_array<float, 5> VertexOutputs_clipDistance [[clip_distance]]; +}; + +VertexOutputs tint_symbol_inner() { + return VertexOutputs{.position=float4(1.0f, 2.0f, 3.0f, 4.0f), .clipDistance=tint_array<float, 5>{}}; +} + +vertex tint_symbol_outputs tint_symbol() { + VertexOutputs const v = tint_symbol_inner(); + return tint_symbol_outputs{.VertexOutputs_position=v.position, .VertexOutputs_clipDistance=v.clipDistance}; +}
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.msl b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.msl new file mode 100644 index 0000000..872384f --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.msl
@@ -0,0 +1,44 @@ +#include <metal_stdlib> + +using namespace metal; + +template<typename T, size_t N> +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +struct VertexOutputs { + float4 position; + tint_array<float, 5> clipDistance; +}; + +struct tint_symbol_1 { + float4 position [[position]]; + float clip_distance [[clip_distance]] [5]; +}; + +VertexOutputs tint_symbol_inner() { + VertexOutputs const tint_symbol_2 = VertexOutputs{.position=float4(1.0f, 2.0f, 3.0f, 4.0f), .clipDistance=tint_array<float, 5>{}}; + return tint_symbol_2; +} + +vertex tint_symbol_1 tint_symbol() { + VertexOutputs const inner_result = tint_symbol_inner(); + tint_symbol_1 wrapper_result = {}; + wrapper_result.position = inner_result.position; + tint_array<float, 5> const tmp_inner_clip_distances = inner_result.clipDistance; + wrapper_result.clip_distance[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance[2u] = tmp_inner_clip_distances[2u]; + wrapper_result.clip_distance[3u] = tmp_inner_clip_distances[3u]; + wrapper_result.clip_distance[4u] = tmp_inner_clip_distances[4u]; + return wrapper_result; +} +
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.spvasm b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.spvasm new file mode 100644 index 0000000..202845d --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.spvasm
@@ -0,0 +1,59 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 1 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpCapability ClipDistance + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" %main_position_Output %main_clip_distances_Output %main___point_size_Output + OpName %main_position_Output "main_position_Output" + OpName %main_clip_distances_Output "main_clip_distances_Output" + OpName %main___point_size_Output "main___point_size_Output" + OpName %main_inner "main_inner" + OpMemberName %VertexOutputs 0 "position" + OpMemberName %VertexOutputs 1 "clipDistance" + OpName %VertexOutputs "VertexOutputs" + OpName %main "main" + OpDecorate %main_position_Output BuiltIn Position + OpDecorate %_arr_float_uint_5 ArrayStride 4 + OpDecorate %main_clip_distances_Output BuiltIn ClipDistance + OpDecorate %main___point_size_Output BuiltIn PointSize + OpMemberDecorate %VertexOutputs 0 Offset 0 + OpMemberDecorate %VertexOutputs 1 Offset 16 + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 +%_ptr_Output_v4float = OpTypePointer Output %v4float +%main_position_Output = OpVariable %_ptr_Output_v4float Output + %uint = OpTypeInt 32 0 + %uint_5 = OpConstant %uint 5 +%_arr_float_uint_5 = OpTypeArray %float %uint_5 +%_ptr_Output__arr_float_uint_5 = OpTypePointer Output %_arr_float_uint_5 +%main_clip_distances_Output = OpVariable %_ptr_Output__arr_float_uint_5 Output +%_ptr_Output_float = OpTypePointer Output %float +%main___point_size_Output = OpVariable %_ptr_Output_float Output +%VertexOutputs = OpTypeStruct %v4float %_arr_float_uint_5 + %14 = OpTypeFunction %VertexOutputs + %float_1 = OpConstant %float 1 + %float_2 = OpConstant %float 2 + %float_3 = OpConstant %float 3 + %float_4 = OpConstant %float 4 + %17 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4 + %22 = OpConstantNull %_arr_float_uint_5 + %16 = OpConstantComposite %VertexOutputs %17 %22 + %void = OpTypeVoid + %25 = OpTypeFunction %void + %main_inner = OpFunction %VertexOutputs None %14 + %15 = OpLabel + OpReturnValue %16 + OpFunctionEnd + %main = OpFunction %void None %25 + %26 = OpLabel + %27 = OpFunctionCall %VertexOutputs %main_inner + %28 = OpCompositeExtract %v4float %27 0 + OpStore %main_position_Output %28 + %29 = OpCompositeExtract %_arr_float_uint_5 %27 1 + OpStore %main_clip_distances_Output %29 + OpStore %main___point_size_Output %float_1 + OpReturn + OpFunctionEnd
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.wgsl b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.wgsl new file mode 100644 index 0000000..b82ef45 --- /dev/null +++ b/test/tint/extensions/clip_distances/clip_distances_size_5.wgsl.expected.wgsl
@@ -0,0 +1,13 @@ +enable clip_distances; + +struct VertexOutputs { + @builtin(position) + position : vec4<f32>, + @builtin(clip_distances) + clipDistance : array<f32, 5>, +} + +@vertex +fn main() -> VertexOutputs { + return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0), array<f32, 5>(0.0, 0.0, 0.0, 0.0, 0.0)); +}
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.dxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.dxc.hlsl index 33be9e0..a693a6a 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.dxc.hlsl +++ b/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.dxc.hlsl
@@ -1,23 +1,30 @@ -SKIP: FAILED - - -enable clip_distances; - struct VertexOutputs { - @builtin(position) - position : vec4<f32>, - @builtin(clip_distances) - clipDistance : array<f32, 8>, + float4 position; + float clipDistance[8]; +}; +struct tint_symbol { + float4 position : SV_Position; + float4 clip_distance_0 : SV_ClipDistance0; + float4 clip_distance_1 : SV_ClipDistance1; +}; + +VertexOutputs main_inner() { + VertexOutputs tint_symbol_1 = {float4(1.0f, 2.0f, 3.0f, 4.0f), (float[8])0}; + return tint_symbol_1; } -@vertex -fn main() -> VertexOutputs { - return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0), array<f32, 8>(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); +tint_symbol main() { + VertexOutputs inner_result = main_inner(); + tint_symbol wrapper_result = (tint_symbol)0; + wrapper_result.position = inner_result.position; + float tmp_inner_clip_distances[8] = inner_result.clipDistance; + wrapper_result.clip_distance_0[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance_0[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance_0[2u] = tmp_inner_clip_distances[2u]; + wrapper_result.clip_distance_0[3u] = tmp_inner_clip_distances[3u]; + wrapper_result.clip_distance_1[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance_1[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance_1[2u] = tmp_inner_clip_distances[2u]; + wrapper_result.clip_distance_1[3u] = tmp_inner_clip_distances[3u]; + return wrapper_result; } - -Failed to generate: <dawn>/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl:1:8 error: HLSL backend does not support extension 'clip_distances' -enable clip_distances; - ^^^^^^^^^^^^^^ - - -tint executable returned error: exit status 1
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.fxc.hlsl b/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.fxc.hlsl index 33be9e0..a693a6a 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.fxc.hlsl +++ b/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.fxc.hlsl
@@ -1,23 +1,30 @@ -SKIP: FAILED - - -enable clip_distances; - struct VertexOutputs { - @builtin(position) - position : vec4<f32>, - @builtin(clip_distances) - clipDistance : array<f32, 8>, + float4 position; + float clipDistance[8]; +}; +struct tint_symbol { + float4 position : SV_Position; + float4 clip_distance_0 : SV_ClipDistance0; + float4 clip_distance_1 : SV_ClipDistance1; +}; + +VertexOutputs main_inner() { + VertexOutputs tint_symbol_1 = {float4(1.0f, 2.0f, 3.0f, 4.0f), (float[8])0}; + return tint_symbol_1; } -@vertex -fn main() -> VertexOutputs { - return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0), array<f32, 8>(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); +tint_symbol main() { + VertexOutputs inner_result = main_inner(); + tint_symbol wrapper_result = (tint_symbol)0; + wrapper_result.position = inner_result.position; + float tmp_inner_clip_distances[8] = inner_result.clipDistance; + wrapper_result.clip_distance_0[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance_0[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance_0[2u] = tmp_inner_clip_distances[2u]; + wrapper_result.clip_distance_0[3u] = tmp_inner_clip_distances[3u]; + wrapper_result.clip_distance_1[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance_1[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance_1[2u] = tmp_inner_clip_distances[2u]; + wrapper_result.clip_distance_1[3u] = tmp_inner_clip_distances[3u]; + return wrapper_result; } - -Failed to generate: <dawn>/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl:1:8 error: HLSL backend does not support extension 'clip_distances' -enable clip_distances; - ^^^^^^^^^^^^^^ - - -tint executable returned error: exit status 1
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.glsl b/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.glsl index 4eaae78..f89ccc0 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.glsl +++ b/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.glsl
@@ -19,3 +19,5 @@ enable clip_distances; ^^^^^^^^^^^^^^ + +tint executable returned error: exit status 1
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.ir.msl b/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.ir.msl index 9df70b1..d1697c8 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.ir.msl +++ b/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.ir.msl
@@ -1,5 +1,3 @@ -SKIP: FAILED - #include <metal_stdlib> using namespace metal; @@ -33,10 +31,3 @@ VertexOutputs const v = tint_symbol_inner(); return tint_symbol_outputs{.VertexOutputs_position=v.position, .VertexOutputs_clipDistance=v.clipDistance}; } -program_source:23:53: error: type 'tint_array<float, 8>' is not valid for attribute 'clip_distance' - tint_array<float, 8> VertexOutputs_clipDistance [[clip_distance]]; - ^~~~~~~~~~~~~ -program_source:30:8: error: invalid return type 'tint_symbol_outputs' for vertex function -vertex tint_symbol_outputs tint_symbol() { - ^ -
diff --git a/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.msl b/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.msl index 952455e..400aabd 100644 --- a/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.msl +++ b/test/tint/extensions/clip_distances/clip_distances_size_8.wgsl.expected.msl
@@ -21,7 +21,7 @@ struct tint_symbol_1 { float4 position [[position]]; - float clipDistance [[clip_distance]] [8]; + float clip_distance [[clip_distance]] [8]; }; VertexOutputs tint_symbol_inner() { @@ -34,14 +34,14 @@ tint_symbol_1 wrapper_result = {}; wrapper_result.position = inner_result.position; tint_array<float, 8> const tmp_inner_clip_distances = inner_result.clipDistance; - wrapper_result.clipDistance[0u] = tmp_inner_clip_distances[0u]; - wrapper_result.clipDistance[1u] = tmp_inner_clip_distances[1u]; - wrapper_result.clipDistance[2u] = tmp_inner_clip_distances[2u]; - wrapper_result.clipDistance[3u] = tmp_inner_clip_distances[3u]; - wrapper_result.clipDistance[4u] = tmp_inner_clip_distances[4u]; - wrapper_result.clipDistance[5u] = tmp_inner_clip_distances[5u]; - wrapper_result.clipDistance[6u] = tmp_inner_clip_distances[6u]; - wrapper_result.clipDistance[7u] = tmp_inner_clip_distances[7u]; + wrapper_result.clip_distance[0u] = tmp_inner_clip_distances[0u]; + wrapper_result.clip_distance[1u] = tmp_inner_clip_distances[1u]; + wrapper_result.clip_distance[2u] = tmp_inner_clip_distances[2u]; + wrapper_result.clip_distance[3u] = tmp_inner_clip_distances[3u]; + wrapper_result.clip_distance[4u] = tmp_inner_clip_distances[4u]; + wrapper_result.clip_distance[5u] = tmp_inner_clip_distances[5u]; + wrapper_result.clip_distance[6u] = tmp_inner_clip_distances[6u]; + wrapper_result.clip_distance[7u] = tmp_inner_clip_distances[7u]; return wrapper_result; }