mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-01-09 16:38:06 -05:00
The Vulkan decoration rules require us to distinguish vertex shader inputs, fragment shader inputs, and everything else, so just pass the stage to `Writer::write_varying`. Together with the SPIRV storage class, this is sufficient to distinguish all the cases in a way that closely follows the spec language.
This commit is contained in:
@@ -340,21 +340,16 @@ impl Writer {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if let Some(ref mut iface) = interface {
|
if let Some(ref mut iface) = interface {
|
||||||
use crate::ShaderStage;
|
|
||||||
let interpolation_decoration = match iface.stage {
|
|
||||||
ShaderStage::Vertex | ShaderStage::Compute => false,
|
|
||||||
ShaderStage::Fragment => true,
|
|
||||||
};
|
|
||||||
let id = if let Some(ref binding) = argument.binding {
|
let id = if let Some(ref binding) = argument.binding {
|
||||||
let name = argument.name.as_deref();
|
let name = argument.name.as_deref();
|
||||||
|
|
||||||
let varying_id = self.write_varying(
|
let varying_id = self.write_varying(
|
||||||
ir_module,
|
ir_module,
|
||||||
|
iface.stage,
|
||||||
class,
|
class,
|
||||||
name,
|
name,
|
||||||
argument.ty,
|
argument.ty,
|
||||||
binding,
|
binding,
|
||||||
interpolation_decoration,
|
|
||||||
)?;
|
)?;
|
||||||
iface.varying_ids.push(varying_id);
|
iface.varying_ids.push(varying_id);
|
||||||
let id = self.id_gen.next();
|
let id = self.id_gen.next();
|
||||||
@@ -373,11 +368,11 @@ impl Writer {
|
|||||||
let binding = member.binding.as_ref().unwrap();
|
let binding = member.binding.as_ref().unwrap();
|
||||||
let varying_id = self.write_varying(
|
let varying_id = self.write_varying(
|
||||||
ir_module,
|
ir_module,
|
||||||
|
iface.stage,
|
||||||
class,
|
class,
|
||||||
name,
|
name,
|
||||||
member.ty,
|
member.ty,
|
||||||
binding,
|
binding,
|
||||||
interpolation_decoration,
|
|
||||||
)?;
|
)?;
|
||||||
iface.varying_ids.push(varying_id);
|
iface.varying_ids.push(varying_id);
|
||||||
let id = self.id_gen.next();
|
let id = self.id_gen.next();
|
||||||
@@ -426,11 +421,6 @@ impl Writer {
|
|||||||
let return_type_id = match ir_function.result {
|
let return_type_id = match ir_function.result {
|
||||||
Some(ref result) => {
|
Some(ref result) => {
|
||||||
if let Some(ref mut iface) = interface {
|
if let Some(ref mut iface) = interface {
|
||||||
use crate::ShaderStage;
|
|
||||||
let interpolation_decoration = match iface.stage {
|
|
||||||
ShaderStage::Fragment | ShaderStage::Compute => false,
|
|
||||||
ShaderStage::Vertex => true,
|
|
||||||
};
|
|
||||||
let mut has_point_size = false;
|
let mut has_point_size = false;
|
||||||
let class = spirv::StorageClass::Output;
|
let class = spirv::StorageClass::Output;
|
||||||
if let Some(ref binding) = result.binding {
|
if let Some(ref binding) = result.binding {
|
||||||
@@ -439,11 +429,11 @@ impl Writer {
|
|||||||
let type_id = self.get_type_id(LookupType::Handle(result.ty));
|
let type_id = self.get_type_id(LookupType::Handle(result.ty));
|
||||||
let varying_id = self.write_varying(
|
let varying_id = self.write_varying(
|
||||||
ir_module,
|
ir_module,
|
||||||
|
iface.stage,
|
||||||
class,
|
class,
|
||||||
None,
|
None,
|
||||||
result.ty,
|
result.ty,
|
||||||
binding,
|
binding,
|
||||||
interpolation_decoration,
|
|
||||||
)?;
|
)?;
|
||||||
iface.varying_ids.push(varying_id);
|
iface.varying_ids.push(varying_id);
|
||||||
ep_context.results.push(ResultMember {
|
ep_context.results.push(ResultMember {
|
||||||
@@ -462,11 +452,11 @@ impl Writer {
|
|||||||
*binding == crate::Binding::BuiltIn(crate::BuiltIn::PointSize);
|
*binding == crate::Binding::BuiltIn(crate::BuiltIn::PointSize);
|
||||||
let varying_id = self.write_varying(
|
let varying_id = self.write_varying(
|
||||||
ir_module,
|
ir_module,
|
||||||
|
iface.stage,
|
||||||
class,
|
class,
|
||||||
name,
|
name,
|
||||||
member.ty,
|
member.ty,
|
||||||
binding,
|
binding,
|
||||||
interpolation_decoration,
|
|
||||||
)?;
|
)?;
|
||||||
iface.varying_ids.push(varying_id);
|
iface.varying_ids.push(varying_id);
|
||||||
ep_context.results.push(ResultMember {
|
ep_context.results.push(ResultMember {
|
||||||
@@ -1150,11 +1140,11 @@ impl Writer {
|
|||||||
fn write_varying(
|
fn write_varying(
|
||||||
&mut self,
|
&mut self,
|
||||||
ir_module: &crate::Module,
|
ir_module: &crate::Module,
|
||||||
|
stage: crate::ShaderStage,
|
||||||
class: spirv::StorageClass,
|
class: spirv::StorageClass,
|
||||||
debug_name: Option<&str>,
|
debug_name: Option<&str>,
|
||||||
ty: Handle<crate::Type>,
|
ty: Handle<crate::Type>,
|
||||||
binding: &crate::Binding,
|
binding: &crate::Binding,
|
||||||
interpolation_decoration: bool,
|
|
||||||
) -> Result<Word, Error> {
|
) -> Result<Word, Error> {
|
||||||
let id = self.id_gen.next();
|
let id = self.id_gen.next();
|
||||||
let pointer_type_id = self.get_pointer_id(&ir_module.types, ty, class)?;
|
let pointer_type_id = self.get_pointer_id(&ir_module.types, ty, class)?;
|
||||||
@@ -1180,7 +1170,12 @@ impl Writer {
|
|||||||
} => {
|
} => {
|
||||||
self.decorate(id, Decoration::Location, &[location]);
|
self.decorate(id, Decoration::Location, &[location]);
|
||||||
|
|
||||||
if interpolation_decoration {
|
// The Vulkan spec says: VUID-StandaloneSpirv-Flat-06202
|
||||||
|
//
|
||||||
|
// > The Flat, NoPerspective, Sample, and Centroid decorations
|
||||||
|
// > must not be used on variables with the Input storage class in
|
||||||
|
// > a vertex shader
|
||||||
|
if class != spirv::StorageClass::Input || stage != crate::ShaderStage::Vertex {
|
||||||
match interpolation {
|
match interpolation {
|
||||||
// Perspective-correct interpolation is the default in SPIR-V.
|
// Perspective-correct interpolation is the default in SPIR-V.
|
||||||
None | Some(crate::Interpolation::Perspective) => (),
|
None | Some(crate::Interpolation::Perspective) => (),
|
||||||
@@ -1271,17 +1266,19 @@ impl Writer {
|
|||||||
// > Any variable with integer or double-precision floating-
|
// > Any variable with integer or double-precision floating-
|
||||||
// > point type and with Input storage class in a fragment
|
// > point type and with Input storage class in a fragment
|
||||||
// > shader, must be decorated Flat
|
// > shader, must be decorated Flat
|
||||||
let is_flat = match ir_module.types[ty].inner {
|
if class == spirv::StorageClass::Input && stage == crate::ShaderStage::Fragment {
|
||||||
crate::TypeInner::Scalar { kind, .. }
|
let is_flat = match ir_module.types[ty].inner {
|
||||||
| crate::TypeInner::Vector { kind, .. } => match kind {
|
crate::TypeInner::Scalar { kind, .. }
|
||||||
Sk::Uint | Sk::Sint | Sk::Bool => true,
|
| crate::TypeInner::Vector { kind, .. } => match kind {
|
||||||
Sk::Float => false,
|
Sk::Uint | Sk::Sint | Sk::Bool => true,
|
||||||
},
|
Sk::Float => false,
|
||||||
_ => false,
|
},
|
||||||
};
|
_ => false,
|
||||||
|
};
|
||||||
|
|
||||||
if is_flat {
|
if is_flat {
|
||||||
self.decorate(id, Decoration::Flat, &[]);
|
self.decorate(id, Decoration::Flat, &[]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,7 +98,6 @@ OpDecorate %78 Binding 3
|
|||||||
OpDecorate %79 Block
|
OpDecorate %79 Block
|
||||||
OpMemberDecorate %79 0 Offset 0
|
OpMemberDecorate %79 0 Offset 0
|
||||||
OpDecorate %228 BuiltIn VertexIndex
|
OpDecorate %228 BuiltIn VertexIndex
|
||||||
OpDecorate %228 Flat
|
|
||||||
OpDecorate %231 BuiltIn Position
|
OpDecorate %231 BuiltIn Position
|
||||||
OpDecorate %273 Location 0
|
OpDecorate %273 Location 0
|
||||||
%2 = OpTypeVoid
|
%2 = OpTypeVoid
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ OpDecorate %26 DescriptorSet 0
|
|||||||
OpDecorate %26 Binding 2
|
OpDecorate %26 Binding 2
|
||||||
OpDecorate %19 Block
|
OpDecorate %19 Block
|
||||||
OpDecorate %48 BuiltIn GlobalInvocationId
|
OpDecorate %48 BuiltIn GlobalInvocationId
|
||||||
OpDecorate %48 Flat
|
|
||||||
%2 = OpTypeVoid
|
%2 = OpTypeVoid
|
||||||
%4 = OpTypeInt 32 0
|
%4 = OpTypeInt 32 0
|
||||||
%3 = OpConstant %4 1500
|
%3 = OpConstant %4 1500
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ OpDecorate %11 DescriptorSet 0
|
|||||||
OpDecorate %11 Binding 0
|
OpDecorate %11 Binding 0
|
||||||
OpDecorate %9 Block
|
OpDecorate %9 Block
|
||||||
OpDecorate %46 BuiltIn GlobalInvocationId
|
OpDecorate %46 BuiltIn GlobalInvocationId
|
||||||
OpDecorate %46 Flat
|
|
||||||
%2 = OpTypeVoid
|
%2 = OpTypeVoid
|
||||||
%4 = OpTypeInt 32 0
|
%4 = OpTypeInt 32 0
|
||||||
%3 = OpConstant %4 0
|
%3 = OpConstant %4 0
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ OpMemoryModel Logical GLSL450
|
|||||||
OpEntryPoint GLCompute %44 "main" %41
|
OpEntryPoint GLCompute %44 "main" %41
|
||||||
OpExecutionMode %44 LocalSize 1 1 1
|
OpExecutionMode %44 LocalSize 1 1 1
|
||||||
OpDecorate %41 BuiltIn GlobalInvocationId
|
OpDecorate %41 BuiltIn GlobalInvocationId
|
||||||
OpDecorate %41 Flat
|
|
||||||
%2 = OpTypeVoid
|
%2 = OpTypeVoid
|
||||||
%4 = OpTypeInt 32 1
|
%4 = OpTypeInt 32 1
|
||||||
%3 = OpConstant %4 1
|
%3 = OpConstant %4 1
|
||||||
|
|||||||
@@ -95,9 +95,7 @@ OpDecorate %68 Binding 2
|
|||||||
OpDecorate %70 DescriptorSet 1
|
OpDecorate %70 DescriptorSet 1
|
||||||
OpDecorate %70 Binding 3
|
OpDecorate %70 Binding 3
|
||||||
OpDecorate %73 BuiltIn LocalInvocationId
|
OpDecorate %73 BuiltIn LocalInvocationId
|
||||||
OpDecorate %73 Flat
|
|
||||||
OpDecorate %119 BuiltIn LocalInvocationId
|
OpDecorate %119 BuiltIn LocalInvocationId
|
||||||
OpDecorate %119 Flat
|
|
||||||
OpDecorate %140 BuiltIn Position
|
OpDecorate %140 BuiltIn Position
|
||||||
OpDecorate %193 BuiltIn Position
|
OpDecorate %193 BuiltIn Position
|
||||||
OpDecorate %222 Location 0
|
OpDecorate %222 Location 0
|
||||||
|
|||||||
@@ -16,15 +16,10 @@ OpDecorate %16 ArrayStride 4
|
|||||||
OpMemberDecorate %18 0 Offset 0
|
OpMemberDecorate %18 0 Offset 0
|
||||||
OpMemberDecorate %19 0 Offset 0
|
OpMemberDecorate %19 0 Offset 0
|
||||||
OpDecorate %23 BuiltIn GlobalInvocationId
|
OpDecorate %23 BuiltIn GlobalInvocationId
|
||||||
OpDecorate %23 Flat
|
|
||||||
OpDecorate %26 BuiltIn LocalInvocationId
|
OpDecorate %26 BuiltIn LocalInvocationId
|
||||||
OpDecorate %26 Flat
|
|
||||||
OpDecorate %28 BuiltIn LocalInvocationIndex
|
OpDecorate %28 BuiltIn LocalInvocationIndex
|
||||||
OpDecorate %28 Flat
|
|
||||||
OpDecorate %31 BuiltIn WorkgroupId
|
OpDecorate %31 BuiltIn WorkgroupId
|
||||||
OpDecorate %31 Flat
|
|
||||||
OpDecorate %33 BuiltIn NumWorkgroups
|
OpDecorate %33 BuiltIn NumWorkgroups
|
||||||
OpDecorate %33 Flat
|
|
||||||
%2 = OpTypeVoid
|
%2 = OpTypeVoid
|
||||||
%4 = OpTypeFloat 32
|
%4 = OpTypeFloat 32
|
||||||
%3 = OpConstant %4 1.0
|
%3 = OpConstant %4 1.0
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ OpDecorate %34 BuiltIn SampleMask
|
|||||||
OpDecorate %34 Flat
|
OpDecorate %34 Flat
|
||||||
OpDecorate %36 BuiltIn FragDepth
|
OpDecorate %36 BuiltIn FragDepth
|
||||||
OpDecorate %38 BuiltIn SampleMask
|
OpDecorate %38 BuiltIn SampleMask
|
||||||
OpDecorate %38 Flat
|
|
||||||
OpDecorate %40 Location 0
|
OpDecorate %40 Location 0
|
||||||
%2 = OpTypeVoid
|
%2 = OpTypeVoid
|
||||||
%4 = OpTypeFloat 32
|
%4 = OpTypeFloat 32
|
||||||
|
|||||||
@@ -15,9 +15,7 @@ OpDecorate %16 ArrayStride 4
|
|||||||
OpMemberDecorate %18 0 Offset 0
|
OpMemberDecorate %18 0 Offset 0
|
||||||
OpMemberDecorate %19 0 Offset 0
|
OpMemberDecorate %19 0 Offset 0
|
||||||
OpDecorate %21 BuiltIn VertexIndex
|
OpDecorate %21 BuiltIn VertexIndex
|
||||||
OpDecorate %21 Flat
|
|
||||||
OpDecorate %24 BuiltIn InstanceIndex
|
OpDecorate %24 BuiltIn InstanceIndex
|
||||||
OpDecorate %24 Flat
|
|
||||||
OpDecorate %26 Location 10
|
OpDecorate %26 Location 10
|
||||||
OpDecorate %28 Invariant
|
OpDecorate %28 Invariant
|
||||||
OpDecorate %28 BuiltIn Position
|
OpDecorate %28 BuiltIn Position
|
||||||
|
|||||||
@@ -15,9 +15,7 @@ OpDecorate %16 ArrayStride 4
|
|||||||
OpMemberDecorate %18 0 Offset 0
|
OpMemberDecorate %18 0 Offset 0
|
||||||
OpMemberDecorate %19 0 Offset 0
|
OpMemberDecorate %19 0 Offset 0
|
||||||
OpDecorate %24 BuiltIn VertexIndex
|
OpDecorate %24 BuiltIn VertexIndex
|
||||||
OpDecorate %24 Flat
|
|
||||||
OpDecorate %28 BuiltIn InstanceIndex
|
OpDecorate %28 BuiltIn InstanceIndex
|
||||||
OpDecorate %28 Flat
|
|
||||||
OpDecorate %30 Invariant
|
OpDecorate %30 Invariant
|
||||||
OpDecorate %30 BuiltIn Position
|
OpDecorate %30 BuiltIn Position
|
||||||
OpDecorate %32 BuiltIn PointSize
|
OpDecorate %32 BuiltIn PointSize
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ OpExtension "SPV_KHR_multiview"
|
|||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint Vertex %8 "main" %5
|
OpEntryPoint Vertex %8 "main" %5
|
||||||
OpDecorate %5 BuiltIn ViewIndex
|
OpDecorate %5 BuiltIn ViewIndex
|
||||||
OpDecorate %5 Flat
|
|
||||||
%2 = OpTypeVoid
|
%2 = OpTypeVoid
|
||||||
%3 = OpTypeInt 32 1
|
%3 = OpTypeInt 32 1
|
||||||
%6 = OpTypePointer Input %3
|
%6 = OpTypePointer Input %3
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ OpDecorate %22 Binding 1
|
|||||||
OpDecorate %24 DescriptorSet 0
|
OpDecorate %24 DescriptorSet 0
|
||||||
OpDecorate %24 Binding 2
|
OpDecorate %24 Binding 2
|
||||||
OpDecorate %32 BuiltIn VertexIndex
|
OpDecorate %32 BuiltIn VertexIndex
|
||||||
OpDecorate %32 Flat
|
|
||||||
OpDecorate %35 BuiltIn Position
|
OpDecorate %35 BuiltIn Position
|
||||||
OpDecorate %37 Location 0
|
OpDecorate %37 Location 0
|
||||||
OpDecorate %83 BuiltIn FragCoord
|
OpDecorate %83 BuiltIn FragCoord
|
||||||
|
|||||||
Reference in New Issue
Block a user