e5fa7edfd6
Relaxed block layout relaxed the restrictions on vector alignment, allowing them to be aligned on scalar boundaries. Scalar block layout relaxes this further, allowing *any* member to be aligned on a scalar boundary. The requirement that a vector not improperly straddle a 16-byte boundary is also relaxed. I've also added a test showing that `std430` layout works with UBOs. I'm troubled by the dual meaning of the `Packed` extended decoration. In some instances (struct, `float[]`, and `vec2[]` members), it actually means the exact opposite, that the member needs extra padding. This is especially problematic for `vec2[]`, because now we need to distinguish the two cases by checking the array stride. I wonder if this should actually be split into two decorations.
37 lines
577 B
GLSL
37 lines
577 B
GLSL
#include <metal_stdlib>
|
|
#include <simd/simd.h>
|
|
|
|
using namespace metal;
|
|
|
|
struct UBO
|
|
{
|
|
float a[1];
|
|
float2 b[2];
|
|
};
|
|
|
|
struct UBOEnhancedLayout
|
|
{
|
|
float c[1];
|
|
float2 d[2];
|
|
char _m2_pad[9976];
|
|
float e;
|
|
};
|
|
|
|
struct main0_out
|
|
{
|
|
float FragColor [[color(0)]];
|
|
};
|
|
|
|
struct main0_in
|
|
{
|
|
int vIndex [[user(locn0)]];
|
|
};
|
|
|
|
fragment main0_out main0(main0_in in [[stage_in]], constant UBO& _17 [[buffer(0)]], constant UBOEnhancedLayout& _30 [[buffer(1)]])
|
|
{
|
|
main0_out out = {};
|
|
out.FragColor = (_17.a[in.vIndex] + _30.c[in.vIndex]) + _30.e;
|
|
return out;
|
|
}
|
|
|