mirror of
https://github.com/gfx-rs/wgpu.git
synced 2025-12-08 21:26:17 +00:00
[naga msl-out] Add padding to end of structs if required
This commit is contained in:
parent
5f8d408fb8
commit
d811258424
@ -4470,6 +4470,16 @@ impl<W: Write> Writer<W> {
|
||||
}
|
||||
}
|
||||
}
|
||||
if last_offset < span {
|
||||
let pad = span - last_offset;
|
||||
writeln!(
|
||||
self.out,
|
||||
"{}char _pad{}[{}];",
|
||||
back::INDENT,
|
||||
members.len(),
|
||||
pad
|
||||
)?;
|
||||
}
|
||||
writeln!(self.out, "}};")?;
|
||||
}
|
||||
_ => {
|
||||
|
||||
@ -12,6 +12,7 @@ struct gl_PerVertex {
|
||||
float gl_PointSize;
|
||||
type_3 gl_ClipDistance;
|
||||
type_3 gl_CullDistance;
|
||||
char _pad4[4];
|
||||
};
|
||||
struct VertexOutput {
|
||||
metal::float2 member;
|
||||
|
||||
@ -12,6 +12,7 @@ struct type_4 {
|
||||
float member_1;
|
||||
type_3 member_2;
|
||||
type_3 member_3;
|
||||
char _pad4[4];
|
||||
};
|
||||
|
||||
void function(
|
||||
|
||||
@ -7,6 +7,7 @@ using metal::uint;
|
||||
struct OurVertexShaderOutput {
|
||||
metal::float4 position;
|
||||
metal::float2 texcoord;
|
||||
char _pad2[8];
|
||||
};
|
||||
|
||||
struct vsInput {
|
||||
|
||||
@ -16,6 +16,7 @@ struct GlobalConst {
|
||||
};
|
||||
struct AlignedWrapper {
|
||||
int value;
|
||||
char _pad1[4];
|
||||
};
|
||||
struct type_6 {
|
||||
metal::float2x2 inner[2];
|
||||
@ -35,6 +36,7 @@ struct Bar {
|
||||
char _pad4[4];
|
||||
type_10 arr;
|
||||
type_11 data;
|
||||
char _pad6[8];
|
||||
};
|
||||
struct Baz {
|
||||
metal::float3x2 m;
|
||||
|
||||
@ -13,10 +13,12 @@ struct type_4 {
|
||||
struct _atomic_compare_exchange_resultSint4_ {
|
||||
int old_value;
|
||||
bool exchanged;
|
||||
char _pad2[3];
|
||||
};
|
||||
struct _atomic_compare_exchange_resultUint4_ {
|
||||
uint old_value;
|
||||
bool exchanged;
|
||||
char _pad2[3];
|
||||
};
|
||||
|
||||
template <typename A>
|
||||
|
||||
@ -14,10 +14,12 @@ struct Struct {
|
||||
struct _atomic_compare_exchange_resultUint4_ {
|
||||
uint old_value;
|
||||
bool exchanged;
|
||||
char _pad2[3];
|
||||
};
|
||||
struct _atomic_compare_exchange_resultSint4_ {
|
||||
int old_value;
|
||||
bool exchanged;
|
||||
char _pad2[3];
|
||||
};
|
||||
|
||||
template <typename A>
|
||||
|
||||
@ -18,6 +18,7 @@ struct Globals {
|
||||
metal::float4 v;
|
||||
metal::float3x4 m;
|
||||
type_4 d;
|
||||
char _pad4[12];
|
||||
};
|
||||
|
||||
float index_array(
|
||||
|
||||
@ -24,6 +24,7 @@ struct Globals {
|
||||
metal::float4 v;
|
||||
metal::float3x4 m;
|
||||
type_4 d;
|
||||
char _pad4[12];
|
||||
};
|
||||
|
||||
float index_array(
|
||||
|
||||
@ -7,6 +7,7 @@ using metal::uint;
|
||||
struct Foo {
|
||||
metal::float4 a;
|
||||
int b;
|
||||
char _pad2[12];
|
||||
};
|
||||
struct type_6 {
|
||||
metal::float2x2 inner[1];
|
||||
|
||||
@ -12,6 +12,7 @@ struct PushConstants {
|
||||
struct FragmentIn {
|
||||
metal::float4 color;
|
||||
uint primitive_index;
|
||||
char _pad2[12];
|
||||
};
|
||||
|
||||
struct main_Input {
|
||||
|
||||
@ -19,6 +19,7 @@ struct FragmentOutputVec2Scalar {
|
||||
float scalarf;
|
||||
int scalari;
|
||||
uint scalaru;
|
||||
char _pad6[4];
|
||||
};
|
||||
|
||||
struct main_vec4vec3_Output {
|
||||
|
||||
@ -21,6 +21,7 @@ struct UniformCompatible {
|
||||
metal::long3 val_i64_3_;
|
||||
metal::long4 val_i64_4_;
|
||||
ulong final_value;
|
||||
char _pad12[24];
|
||||
};
|
||||
struct type_11 {
|
||||
ulong inner[2];
|
||||
|
||||
@ -7,6 +7,7 @@ using metal::uint;
|
||||
struct VertexOutput {
|
||||
metal::float4 position;
|
||||
float _varying;
|
||||
char _pad2[12];
|
||||
};
|
||||
struct FragmentOutput {
|
||||
float depth;
|
||||
|
||||
@ -18,6 +18,7 @@ struct FragmentInput {
|
||||
float perspective_centroid;
|
||||
float perspective_sample;
|
||||
float perspective_center;
|
||||
char _pad12[4];
|
||||
};
|
||||
|
||||
struct vert_mainOutput {
|
||||
|
||||
@ -18,6 +18,7 @@ struct FragmentInput {
|
||||
float perspective_centroid;
|
||||
float perspective_sample;
|
||||
float perspective_center;
|
||||
char _pad11[4];
|
||||
};
|
||||
|
||||
struct vert_mainOutput {
|
||||
|
||||
@ -13,11 +13,13 @@ struct VertexOutput {
|
||||
metal::float4 position;
|
||||
metal::float4 color;
|
||||
metal::float2 texcoord;
|
||||
char _pad3[8];
|
||||
};
|
||||
struct VertexInput {
|
||||
metal::float4 position;
|
||||
metal::float3 normal;
|
||||
metal::float2 texcoord;
|
||||
char _pad3[8];
|
||||
};
|
||||
float unpackFloat32_(uint b0, uint b1, uint b2, uint b3) {
|
||||
return as_type<float>(b3 << 24 | b2 << 16 | b1 << 8 | b0);
|
||||
|
||||
@ -7,6 +7,7 @@ using metal::uint;
|
||||
struct _atomic_compare_exchange_resultUint4_ {
|
||||
uint old_value;
|
||||
bool exchanged;
|
||||
char _pad2[3];
|
||||
};
|
||||
|
||||
template <typename A>
|
||||
|
||||
@ -10,6 +10,7 @@ struct S {
|
||||
struct Test {
|
||||
S a;
|
||||
float b;
|
||||
char _pad2[12];
|
||||
};
|
||||
struct type_2 {
|
||||
metal::float3 inner[2];
|
||||
@ -17,10 +18,12 @@ struct type_2 {
|
||||
struct Test2_ {
|
||||
type_2 a;
|
||||
float b;
|
||||
char _pad2[12];
|
||||
};
|
||||
struct Test3_ {
|
||||
metal::float4x3 a;
|
||||
float b;
|
||||
char _pad2[12];
|
||||
};
|
||||
|
||||
struct vertex_Output {
|
||||
|
||||
@ -211,7 +211,7 @@ fn create_struct_layout_tests(storage_type: InputStorageType) -> Vec<ShaderTest>
|
||||
|
||||
// Test for https://github.com/gfx-rs/wgpu/issues/5262.
|
||||
//
|
||||
// The struct is supposed to have a size of 32 and alignment of 16, but on metal, it has size 24.
|
||||
// The struct is supposed to have a size of 32 and alignment of 16.
|
||||
for ty in ["f32", "u32", "i32"] {
|
||||
let header = format!("struct Inner {{ vec: vec3<{ty}>, scalar1: u32, scalar2: u32 }}");
|
||||
let members = String::from("arr: array<Inner, 2>");
|
||||
@ -238,8 +238,7 @@ fn create_struct_layout_tests(storage_type: InputStorageType) -> Vec<ShaderTest>
|
||||
&input_values,
|
||||
&[0, 1, 2, 3, 4, 8, 9, 10, 11, 12],
|
||||
)
|
||||
.header(header)
|
||||
.failures(Backends::METAL),
|
||||
.header(header),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user