shader: Implement ClipDistance

This commit is contained in:
FernandoS27 2021-03-30 21:52:06 +02:00 committed by ameerj
parent 67afdaf566
commit 0c4cf3b9eb
5 changed files with 36 additions and 0 deletions

View File

@ -176,6 +176,9 @@ void EmitContext::DefineCommonTypes(const Info& info) {
AddCapability(spv::Capability::Float64); AddCapability(spv::Capability::Float64);
F64.Define(*this, TypeFloat(64), "f64"); F64.Define(*this, TypeFloat(64), "f64");
} }
if (info.stores_clip_distance) {
Array8F32 = Name(TypeArray(F32[1], Constant(U32[1], 8)), "array_8_f32");
}
} }
void EmitContext::DefineCommonConstants() { void EmitContext::DefineCommonConstants() {
@ -502,6 +505,12 @@ void EmitContext::DefineOutputs(const Info& info) {
} }
output_point_size = DefineOutput(*this, F32[1], spv::BuiltIn::PointSize); output_point_size = DefineOutput(*this, F32[1], spv::BuiltIn::PointSize);
} }
if (info.stores_clip_distance) {
if (stage == Stage::Fragment) {
throw NotImplementedException("Storing PointSize in Fragment stage");
}
clip_distances = DefineOutput(*this, Array8F32, spv::BuiltIn::ClipDistance);
}
for (size_t i = 0; i < info.stores_generics.size(); ++i) { for (size_t i = 0; i < info.stores_generics.size(); ++i) {
if (info.stores_generics[i]) { if (info.stores_generics[i]) {
output_generics[i] = DefineOutput(*this, F32[4]); output_generics[i] = DefineOutput(*this, F32[4]);

View File

@ -67,6 +67,8 @@ public:
VectorTypes F16; VectorTypes F16;
VectorTypes F64; VectorTypes F64;
Id Array8F32{};
Id true_value{}; Id true_value{};
Id false_value{}; Id false_value{};
Id u32_zero_value{}; Id u32_zero_value{};
@ -105,6 +107,7 @@ public:
Id base_vertex{}; Id base_vertex{};
Id front_face{}; Id front_face{};
Id point_coord{}; Id point_coord{};
Id clip_distances{};
Id fswzadd_lut_a{}; Id fswzadd_lut_a{};
Id fswzadd_lut_b{}; Id fswzadd_lut_b{};

View File

@ -44,6 +44,19 @@ Id OutputAttrPointer(EmitContext& ctx, IR::Attribute attr) {
case IR::Attribute::PositionZ: case IR::Attribute::PositionZ:
case IR::Attribute::PositionW: case IR::Attribute::PositionW:
return ctx.OpAccessChain(ctx.output_f32, ctx.output_position, element_id()); return ctx.OpAccessChain(ctx.output_f32, ctx.output_position, element_id());
case IR::Attribute::ClipDistance0:
case IR::Attribute::ClipDistance1:
case IR::Attribute::ClipDistance2:
case IR::Attribute::ClipDistance3:
case IR::Attribute::ClipDistance4:
case IR::Attribute::ClipDistance5:
case IR::Attribute::ClipDistance6:
case IR::Attribute::ClipDistance7: {
const u32 base{static_cast<u32>(IR::Attribute::ClipDistance0)};
const u32 index{static_cast<u32>(attr) - base};
const Id clip_num{ctx.Constant(ctx.U32[1], index)};
return ctx.OpAccessChain(ctx.output_f32, ctx.clip_distances, clip_num);
}
default: default:
throw NotImplementedException("Read attribute {}", attr); throw NotImplementedException("Read attribute {}", attr);
} }

View File

@ -71,6 +71,16 @@ void SetAttribute(Info& info, IR::Attribute attribute) {
case IR::Attribute::PositionW: case IR::Attribute::PositionW:
info.stores_position = true; info.stores_position = true;
break; break;
case IR::Attribute::ClipDistance0:
case IR::Attribute::ClipDistance1:
case IR::Attribute::ClipDistance2:
case IR::Attribute::ClipDistance3:
case IR::Attribute::ClipDistance4:
case IR::Attribute::ClipDistance5:
case IR::Attribute::ClipDistance6:
case IR::Attribute::ClipDistance7:
info.stores_clip_distance = true;
break;
default: default:
throw NotImplementedException("Set attribute {}", attribute); throw NotImplementedException("Set attribute {}", attribute);
} }

View File

@ -81,6 +81,7 @@ struct Info {
std::array<bool, 32> stores_generics{}; std::array<bool, 32> stores_generics{};
bool stores_position{}; bool stores_position{};
bool stores_point_size{}; bool stores_point_size{};
bool stores_clip_distance{};
bool uses_fp16{}; bool uses_fp16{};
bool uses_fp64{}; bool uses_fp64{};