3a9af9681c
Even as of Metal 2.1, MSL still doesn't support arrays of buffers directly. Therefore, we must manually expand them. In the prologue, we define arrays holding the argument pointers; these arrays are what the transpiled code ends up referencing. We might be able to do similar things for textures and samplers prior to MSL 2.0. Speaking of which, also enable texture arrays on iOS MSL 1.2.
36 lines
910 B
GLSL
36 lines
910 B
GLSL
#include <metal_stdlib>
|
|
#include <simd/simd.h>
|
|
|
|
using namespace metal;
|
|
|
|
struct storage_block
|
|
{
|
|
uint4 baz;
|
|
int2 quux;
|
|
};
|
|
|
|
struct constant_block
|
|
{
|
|
float4 foo;
|
|
int bar;
|
|
};
|
|
|
|
vertex void main0(device storage_block* storage_0 [[buffer(0)]], device storage_block* storage_1 [[buffer(1)]], constant constant_block* constants_0 [[buffer(2)]], constant constant_block* constants_1 [[buffer(3)]], constant constant_block* constants_2 [[buffer(4)]], constant constant_block* constants_3 [[buffer(5)]], array<texture2d<int>, 3> images [[texture(0)]])
|
|
{
|
|
device storage_block* storage[] =
|
|
{
|
|
storage_0,
|
|
storage_1,
|
|
};
|
|
constant constant_block* constants[] =
|
|
{
|
|
constants_0,
|
|
constants_1,
|
|
constants_2,
|
|
constants_3,
|
|
};
|
|
storage[0]->baz = uint4(constants[3]->foo);
|
|
storage[1]->quux = images[2].read(uint2(int2(constants[1]->bar))).xy;
|
|
}
|
|
|