writer/hlsl: Implement interpolate attributes
Bug: tint:746 Change-Id: I3133a756d1fe830c0baf45a1251acea9511d92b1 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/56246 Kokoro: Kokoro <noreply+kokoro@google.com> Auto-Submit: James Price <jrprice@google.com> Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
parent
f8e0b7dbf1
commit
0dd41c62cf
|
@ -2212,6 +2212,35 @@ std::string GeneratorImpl::builtin_to_attribute(ast::Builtin builtin) const {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string GeneratorImpl::interpolation_to_modifiers(
|
||||||
|
ast::InterpolationType type,
|
||||||
|
ast::InterpolationSampling sampling) const {
|
||||||
|
std::string modifiers;
|
||||||
|
switch (type) {
|
||||||
|
case ast::InterpolationType::kPerspective:
|
||||||
|
modifiers += "linear ";
|
||||||
|
break;
|
||||||
|
case ast::InterpolationType::kLinear:
|
||||||
|
modifiers += "noperspective ";
|
||||||
|
break;
|
||||||
|
case ast::InterpolationType::kFlat:
|
||||||
|
modifiers += "nointerpolation ";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (sampling) {
|
||||||
|
case ast::InterpolationSampling::kCentroid:
|
||||||
|
modifiers += "centroid ";
|
||||||
|
break;
|
||||||
|
case ast::InterpolationSampling::kSample:
|
||||||
|
modifiers += "sample ";
|
||||||
|
break;
|
||||||
|
case ast::InterpolationSampling::kCenter:
|
||||||
|
case ast::InterpolationSampling::kNone:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return modifiers;
|
||||||
|
}
|
||||||
|
|
||||||
bool GeneratorImpl::EmitEntryPointFunction(ast::Function* func) {
|
bool GeneratorImpl::EmitEntryPointFunction(ast::Function* func) {
|
||||||
auto* func_sem = builder_.Sem().Get(func);
|
auto* func_sem = builder_.Sem().Get(func);
|
||||||
|
|
||||||
|
@ -2737,10 +2766,8 @@ bool GeneratorImpl::EmitStructType(const sem::Struct* str) {
|
||||||
auto* ty = mem->Type();
|
auto* ty = mem->Type();
|
||||||
|
|
||||||
auto out = line();
|
auto out = line();
|
||||||
if (!EmitTypeAndName(out, ty, ast::StorageClass::kNone,
|
|
||||||
ast::Access::kReadWrite, name)) {
|
std::string pre, post;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto* deco : mem->Declaration()->decorations()) {
|
for (auto* deco : mem->Declaration()->decorations()) {
|
||||||
if (auto* location = deco->As<ast::LocationDecoration>()) {
|
if (auto* location = deco->As<ast::LocationDecoration>()) {
|
||||||
|
@ -2752,16 +2779,16 @@ bool GeneratorImpl::EmitStructType(const sem::Struct* str) {
|
||||||
|
|
||||||
if (pipeline_stage_uses.count(
|
if (pipeline_stage_uses.count(
|
||||||
sem::PipelineStageUsage::kVertexInput)) {
|
sem::PipelineStageUsage::kVertexInput)) {
|
||||||
out << " : TEXCOORD" + std::to_string(location->value());
|
post += " : TEXCOORD" + std::to_string(location->value());
|
||||||
} else if (pipeline_stage_uses.count(
|
} else if (pipeline_stage_uses.count(
|
||||||
sem::PipelineStageUsage::kVertexOutput)) {
|
sem::PipelineStageUsage::kVertexOutput)) {
|
||||||
out << " : TEXCOORD" + std::to_string(location->value());
|
post += " : TEXCOORD" + std::to_string(location->value());
|
||||||
} else if (pipeline_stage_uses.count(
|
} else if (pipeline_stage_uses.count(
|
||||||
sem::PipelineStageUsage::kFragmentInput)) {
|
sem::PipelineStageUsage::kFragmentInput)) {
|
||||||
out << " : TEXCOORD" + std::to_string(location->value());
|
post += " : TEXCOORD" + std::to_string(location->value());
|
||||||
} else if (pipeline_stage_uses.count(
|
} else if (pipeline_stage_uses.count(
|
||||||
sem::PipelineStageUsage::kFragmentOutput)) {
|
sem::PipelineStageUsage::kFragmentOutput)) {
|
||||||
out << " : SV_Target" + std::to_string(location->value());
|
post += " : SV_Target" + std::to_string(location->value());
|
||||||
} else {
|
} else {
|
||||||
TINT_ICE(Writer, diagnostics_)
|
TINT_ICE(Writer, diagnostics_)
|
||||||
<< "invalid use of location decoration";
|
<< "invalid use of location decoration";
|
||||||
|
@ -2772,13 +2799,25 @@ bool GeneratorImpl::EmitStructType(const sem::Struct* str) {
|
||||||
diagnostics_.add_error(diag::System::Writer, "unsupported builtin");
|
diagnostics_.add_error(diag::System::Writer, "unsupported builtin");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
out << " : " << attr;
|
post += " : " + attr;
|
||||||
} else if (deco->Is<ast::InterpolateDecoration>()) {
|
} else if (auto* interpolate = deco->As<ast::InterpolateDecoration>()) {
|
||||||
TINT_UNIMPLEMENTED(Writer, diagnostics_) << "interpolate decoration";
|
auto mod = interpolation_to_modifiers(interpolate->type(),
|
||||||
|
interpolate->sampling());
|
||||||
|
if (mod.empty()) {
|
||||||
|
diagnostics_.add_error(diag::System::Writer,
|
||||||
|
"unsupported interpolation");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
pre += mod;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out << ";";
|
out << pre;
|
||||||
|
if (!EmitTypeAndName(out, ty, ast::StorageClass::kNone,
|
||||||
|
ast::Access::kReadWrite, name)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
out << post << ";";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -353,6 +353,14 @@ class GeneratorImpl : public TextGenerator {
|
||||||
/// @returns the string name of the builtin or blank on error
|
/// @returns the string name of the builtin or blank on error
|
||||||
std::string builtin_to_attribute(ast::Builtin builtin) const;
|
std::string builtin_to_attribute(ast::Builtin builtin) const;
|
||||||
|
|
||||||
|
/// Converts interpolation attributes to a HLSL modifiers
|
||||||
|
/// @param type the interpolation type
|
||||||
|
/// @param sampling the interpolation sampling
|
||||||
|
/// @returns the string name of the attribute or blank on error
|
||||||
|
std::string interpolation_to_modifiers(
|
||||||
|
ast::InterpolationType type,
|
||||||
|
ast::InterpolationSampling sampling) const;
|
||||||
|
|
||||||
/// Generate a unique name
|
/// Generate a unique name
|
||||||
/// @param prefix the name prefix
|
/// @param prefix the name prefix
|
||||||
/// @returns a unique name
|
/// @returns a unique name
|
||||||
|
|
|
@ -1,10 +1,22 @@
|
||||||
SKIP: FAILED
|
struct tint_symbol_1 {
|
||||||
|
float none : TEXCOORD0;
|
||||||
../../src/writer/hlsl/generator_impl.cc:2862 internal compiler error: TINT_UNIMPLEMENTED interpolate decoration
|
nointerpolation float flat : TEXCOORD1;
|
||||||
********************************************************************
|
linear float perspective_center : TEXCOORD2;
|
||||||
* The tint shader compiler has encountered an unexpected error. *
|
linear centroid float perspective_centroid : TEXCOORD3;
|
||||||
* *
|
linear sample float perspective_sample : TEXCOORD4;
|
||||||
* Please help us fix this issue by submitting a bug report at *
|
noperspective float linear_center : TEXCOORD5;
|
||||||
* crbug.com/tint with the source program that triggered the bug. *
|
noperspective centroid float linear_centroid : TEXCOORD6;
|
||||||
********************************************************************
|
noperspective sample float linear_sample : TEXCOORD7;
|
||||||
|
};
|
||||||
|
|
||||||
|
void main(tint_symbol_1 tint_symbol) {
|
||||||
|
const float none = tint_symbol.none;
|
||||||
|
const float flat = tint_symbol.flat;
|
||||||
|
const float perspective_center = tint_symbol.perspective_center;
|
||||||
|
const float perspective_centroid = tint_symbol.perspective_centroid;
|
||||||
|
const float perspective_sample = tint_symbol.perspective_sample;
|
||||||
|
const float linear_center = tint_symbol.linear_center;
|
||||||
|
const float linear_centroid = tint_symbol.linear_centroid;
|
||||||
|
const float linear_sample = tint_symbol.linear_sample;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
|
@ -1,10 +1,25 @@
|
||||||
SKIP: FAILED
|
struct In {
|
||||||
|
float none;
|
||||||
../../src/writer/hlsl/generator_impl.cc:2862 internal compiler error: TINT_UNIMPLEMENTED interpolate decoration
|
float flat;
|
||||||
********************************************************************
|
float perspective_center;
|
||||||
* The tint shader compiler has encountered an unexpected error. *
|
float perspective_centroid;
|
||||||
* *
|
float perspective_sample;
|
||||||
* Please help us fix this issue by submitting a bug report at *
|
float linear_center;
|
||||||
* crbug.com/tint with the source program that triggered the bug. *
|
float linear_centroid;
|
||||||
********************************************************************
|
float linear_sample;
|
||||||
|
};
|
||||||
|
struct tint_symbol_2 {
|
||||||
|
float none : TEXCOORD0;
|
||||||
|
nointerpolation float flat : TEXCOORD1;
|
||||||
|
linear float perspective_center : TEXCOORD2;
|
||||||
|
linear centroid float perspective_centroid : TEXCOORD3;
|
||||||
|
linear sample float perspective_sample : TEXCOORD4;
|
||||||
|
noperspective float linear_center : TEXCOORD5;
|
||||||
|
noperspective centroid float linear_centroid : TEXCOORD6;
|
||||||
|
noperspective sample float linear_sample : TEXCOORD7;
|
||||||
|
};
|
||||||
|
|
||||||
|
void main(tint_symbol_2 tint_symbol_1) {
|
||||||
|
const In tint_symbol = {tint_symbol_1.none, tint_symbol_1.flat, tint_symbol_1.perspective_center, tint_symbol_1.perspective_centroid, tint_symbol_1.perspective_sample, tint_symbol_1.linear_center, tint_symbol_1.linear_centroid, tint_symbol_1.linear_sample};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
|
@ -1,10 +1,28 @@
|
||||||
SKIP: FAILED
|
struct Out {
|
||||||
|
float4 pos;
|
||||||
../../src/writer/hlsl/generator_impl.cc:2862 internal compiler error: TINT_UNIMPLEMENTED interpolate decoration
|
float none;
|
||||||
********************************************************************
|
float flat;
|
||||||
* The tint shader compiler has encountered an unexpected error. *
|
float perspective_center;
|
||||||
* *
|
float perspective_centroid;
|
||||||
* Please help us fix this issue by submitting a bug report at *
|
float perspective_sample;
|
||||||
* crbug.com/tint with the source program that triggered the bug. *
|
float linear_center;
|
||||||
********************************************************************
|
float linear_centroid;
|
||||||
|
float linear_sample;
|
||||||
|
};
|
||||||
|
struct tint_symbol {
|
||||||
|
float none : TEXCOORD0;
|
||||||
|
nointerpolation float flat : TEXCOORD1;
|
||||||
|
linear float perspective_center : TEXCOORD2;
|
||||||
|
linear centroid float perspective_centroid : TEXCOORD3;
|
||||||
|
linear sample float perspective_sample : TEXCOORD4;
|
||||||
|
noperspective float linear_center : TEXCOORD5;
|
||||||
|
noperspective centroid float linear_centroid : TEXCOORD6;
|
||||||
|
noperspective sample float linear_sample : TEXCOORD7;
|
||||||
|
float4 pos : SV_Position;
|
||||||
|
};
|
||||||
|
|
||||||
|
tint_symbol main() {
|
||||||
|
const Out tint_symbol_1 = {float4(0.0f, 0.0f, 0.0f, 0.0f), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
|
||||||
|
const tint_symbol tint_symbol_2 = {tint_symbol_1.none, tint_symbol_1.flat, tint_symbol_1.perspective_center, tint_symbol_1.perspective_centroid, tint_symbol_1.perspective_sample, tint_symbol_1.linear_center, tint_symbol_1.linear_centroid, tint_symbol_1.linear_sample, tint_symbol_1.pos};
|
||||||
|
return tint_symbol_2;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue