From 8e1b0529e62f39f2051ec813f99fd682d1a43b5f Mon Sep 17 00:00:00 2001 From: Zhixing Zhang Date: Wed, 21 Dec 2022 04:05:15 -0800 Subject: [PATCH] Supporting gl_PointCoord (#2180) --- src/back/glsl/mod.rs | 1 + src/back/hlsl/conv.rs | 2 +- src/back/msl/mod.rs | 1 + src/back/spv/writer.rs | 1 + src/front/glsl/variables.rs | 10 ++++++++++ src/front/spv/convert.rs | 1 + src/lib.rs | 1 + src/valid/interface.rs | 9 +++++++++ 8 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/back/glsl/mod.rs b/src/back/glsl/mod.rs index 72a5d46f77..ca708ff7a8 100644 --- a/src/back/glsl/mod.rs +++ b/src/back/glsl/mod.rs @@ -3723,6 +3723,7 @@ const fn glsl_built_in( Bi::VertexIndex => "uint(gl_VertexID)", // fragment Bi::FragDepth => "gl_FragDepth", + Bi::PointCoord => "gl_PointCoord", Bi::FrontFacing => "gl_FrontFacing", Bi::PrimitiveIndex => "uint(gl_PrimitiveID)", Bi::SampleIndex => "gl_SampleID", diff --git a/src/back/hlsl/conv.rs b/src/back/hlsl/conv.rs index 525930e1cf..886b250b30 100644 --- a/src/back/hlsl/conv.rs +++ b/src/back/hlsl/conv.rs @@ -177,7 +177,7 @@ impl crate::BuiltIn { Self::BaseInstance | Self::BaseVertex | Self::WorkGroupSize => { return Err(Error::Unimplemented(format!("builtin {:?}", self))) } - Self::ViewIndex => { + Self::ViewIndex | Self::PointCoord => { return Err(Error::Custom(format!("Unsupported builtin {:?}", self))) } }) diff --git a/src/back/msl/mod.rs b/src/back/msl/mod.rs index a8ed2dd0d5..5b3a50d6e7 100644 --- a/src/back/msl/mod.rs +++ b/src/back/msl/mod.rs @@ -391,6 +391,7 @@ impl ResolvedBinding { Bi::VertexIndex => "vertex_id", // fragment Bi::FragDepth => "depth(any)", + Bi::PointCoord => "point_coord", Bi::FrontFacing => "front_facing", Bi::PrimitiveIndex => "primitive_id", Bi::SampleIndex => "sample_id", diff --git a/src/back/spv/writer.rs b/src/back/spv/writer.rs index 59fe739f2c..4303006bf6 100644 --- a/src/back/spv/writer.rs +++ b/src/back/spv/writer.rs @@ -1231,6 +1231,7 @@ impl Writer { Bi::VertexIndex => BuiltIn::VertexIndex, // fragment Bi::FragDepth => BuiltIn::FragDepth, + Bi::PointCoord => BuiltIn::PointCoord, Bi::FrontFacing => BuiltIn::FrontFacing, Bi::PrimitiveIndex => { self.require_any( diff --git a/src/front/glsl/variables.rs b/src/front/glsl/variables.rs index 1634fb40cb..c174c9acf4 100644 --- a/src/front/glsl/variables.rs +++ b/src/front/glsl/variables.rs @@ -128,6 +128,16 @@ impl Parser { mutable: false, storage: StorageQualifier::Input, }, + "gl_PointCoord" => BuiltInData { + inner: TypeInner::Vector { + size: VectorSize::Bi, + kind: ScalarKind::Float, + width: 4, + }, + builtin: BuiltIn::PointCoord, + mutable: false, + storage: StorageQualifier::Input, + }, "gl_GlobalInvocationID" | "gl_NumWorkGroups" | "gl_WorkGroupSize" diff --git a/src/front/spv/convert.rs b/src/front/spv/convert.rs index 128f7ceaef..af7d2b0836 100644 --- a/src/front/spv/convert.rs +++ b/src/front/spv/convert.rs @@ -137,6 +137,7 @@ pub(super) fn map_builtin(word: spirv::Word, invariant: bool) -> Result crate::BuiltIn::VertexIndex, // fragment Some(Bi::FragDepth) => crate::BuiltIn::FragDepth, + Some(Bi::PointCoord) => crate::BuiltIn::PointCoord, Some(Bi::FrontFacing) => crate::BuiltIn::FrontFacing, Some(Bi::PrimitiveId) => crate::BuiltIn::PrimitiveIndex, Some(Bi::SampleId) => crate::BuiltIn::SampleIndex, diff --git a/src/lib.rs b/src/lib.rs index 4b1e7e576c..65f018948f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -340,6 +340,7 @@ pub enum BuiltIn { VertexIndex, // fragment FragDepth, + PointCoord, FrontFacing, PrimitiveIndex, SampleIndex, diff --git a/src/valid/interface.rs b/src/valid/interface.rs index f153964417..fdc1cf43ed 100644 --- a/src/valid/interface.rs +++ b/src/valid/interface.rs @@ -177,6 +177,15 @@ impl VaryingContext<'_> { width, }, ), + Bi::PointCoord => ( + self.stage == St::Fragment && !self.output, + *ty_inner + == Ti::Vector { + size: Vs::Bi, + kind: Sk::Float, + width, + }, + ), Bi::Position { .. } => ( match self.stage { St::Vertex => self.output,