Merge pull request #1498 from cdavis5e/msl-swizzle-arrayed-nonconstant
MSL: Don't remove periods from swizzle buffer index exprs.
This commit is contained in:
commit
a57b4b1b2e
@ -0,0 +1,105 @@
|
|||||||
|
#pragma clang diagnostic ignored "-Wmissing-prototypes"
|
||||||
|
|
||||||
|
#include <metal_stdlib>
|
||||||
|
#include <simd/simd.h>
|
||||||
|
|
||||||
|
using namespace metal;
|
||||||
|
|
||||||
|
struct UBO
|
||||||
|
{
|
||||||
|
uint index;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct UBO2
|
||||||
|
{
|
||||||
|
uint index2;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct spvDescriptorSetBuffer0
|
||||||
|
{
|
||||||
|
array<texture2d<float>, 4> uSampler [[id(0)]];
|
||||||
|
array<sampler, 4> uSamplerSmplr [[id(4)]];
|
||||||
|
constant UBO* uUBO [[id(8)]];
|
||||||
|
constant UBO2* m_50 [[id(9)]];
|
||||||
|
constant uint* spvSwizzleConstants [[id(10)]];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct main0_out
|
||||||
|
{
|
||||||
|
float4 FragColor [[color(0)]];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct main0_in
|
||||||
|
{
|
||||||
|
float2 vUV [[user(locn0)]];
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T> struct spvRemoveReference { typedef T type; };
|
||||||
|
template<typename T> struct spvRemoveReference<thread T&> { typedef T type; };
|
||||||
|
template<typename T> struct spvRemoveReference<thread T&&> { typedef T type; };
|
||||||
|
template<typename T> inline constexpr thread T&& spvForward(thread typename spvRemoveReference<T>::type& x)
|
||||||
|
{
|
||||||
|
return static_cast<thread T&&>(x);
|
||||||
|
}
|
||||||
|
template<typename T> inline constexpr thread T&& spvForward(thread typename spvRemoveReference<T>::type&& x)
|
||||||
|
{
|
||||||
|
return static_cast<thread T&&>(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class spvSwizzle : uint
|
||||||
|
{
|
||||||
|
none = 0,
|
||||||
|
zero,
|
||||||
|
one,
|
||||||
|
red,
|
||||||
|
green,
|
||||||
|
blue,
|
||||||
|
alpha
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T spvGetSwizzle(vec<T, 4> x, T c, spvSwizzle s)
|
||||||
|
{
|
||||||
|
switch (s)
|
||||||
|
{
|
||||||
|
case spvSwizzle::none:
|
||||||
|
return c;
|
||||||
|
case spvSwizzle::zero:
|
||||||
|
return 0;
|
||||||
|
case spvSwizzle::one:
|
||||||
|
return 1;
|
||||||
|
case spvSwizzle::red:
|
||||||
|
return x.r;
|
||||||
|
case spvSwizzle::green:
|
||||||
|
return x.g;
|
||||||
|
case spvSwizzle::blue:
|
||||||
|
return x.b;
|
||||||
|
case spvSwizzle::alpha:
|
||||||
|
return x.a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrapper function that swizzles texture samples and fetches.
|
||||||
|
template<typename T>
|
||||||
|
inline vec<T, 4> spvTextureSwizzle(vec<T, 4> x, uint s)
|
||||||
|
{
|
||||||
|
if (!s)
|
||||||
|
return x;
|
||||||
|
return vec<T, 4>(spvGetSwizzle(x, x.r, spvSwizzle((s >> 0) & 0xFF)), spvGetSwizzle(x, x.g, spvSwizzle((s >> 8) & 0xFF)), spvGetSwizzle(x, x.b, spvSwizzle((s >> 16) & 0xFF)), spvGetSwizzle(x, x.a, spvSwizzle((s >> 24) & 0xFF)));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T spvTextureSwizzle(T x, uint s)
|
||||||
|
{
|
||||||
|
return spvTextureSwizzle(vec<T, 4>(x, 0, 0, 1), s).x;
|
||||||
|
}
|
||||||
|
|
||||||
|
fragment main0_out main0(main0_in in [[stage_in]], constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]], constant uint* spvSwizzleConstants [[buffer(30)]])
|
||||||
|
{
|
||||||
|
main0_out out = {};
|
||||||
|
constant uint* spvDescriptorSet0_uSamplerSwzl = &spvDescriptorSet0.spvSwizzleConstants[0];
|
||||||
|
out.FragColor = spvTextureSwizzle(spvDescriptorSet0.uSampler[(*spvDescriptorSet0.uUBO).index].sample(spvDescriptorSet0.uSamplerSmplr[(*spvDescriptorSet0.uUBO).index], in.vUV), spvDescriptorSet0_uSamplerSwzl[(*spvDescriptorSet0.uUBO).index]);
|
||||||
|
out.FragColor += spvTextureSwizzle(spvDescriptorSet0.uSampler[(*spvDescriptorSet0.m_50).index2].sample(spvDescriptorSet0.uSamplerSmplr[(*spvDescriptorSet0.m_50).index2], in.vUV), spvDescriptorSet0_uSamplerSwzl[(*spvDescriptorSet0.m_50).index2]);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,96 @@
|
|||||||
|
#pragma clang diagnostic ignored "-Wmissing-prototypes"
|
||||||
|
|
||||||
|
#include <metal_stdlib>
|
||||||
|
#include <simd/simd.h>
|
||||||
|
|
||||||
|
using namespace metal;
|
||||||
|
|
||||||
|
struct UBO
|
||||||
|
{
|
||||||
|
uint index;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct UBO2
|
||||||
|
{
|
||||||
|
uint index2;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct main0_out
|
||||||
|
{
|
||||||
|
float4 FragColor [[color(0)]];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct main0_in
|
||||||
|
{
|
||||||
|
float2 vUV [[user(locn0)]];
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T> struct spvRemoveReference { typedef T type; };
|
||||||
|
template<typename T> struct spvRemoveReference<thread T&> { typedef T type; };
|
||||||
|
template<typename T> struct spvRemoveReference<thread T&&> { typedef T type; };
|
||||||
|
template<typename T> inline constexpr thread T&& spvForward(thread typename spvRemoveReference<T>::type& x)
|
||||||
|
{
|
||||||
|
return static_cast<thread T&&>(x);
|
||||||
|
}
|
||||||
|
template<typename T> inline constexpr thread T&& spvForward(thread typename spvRemoveReference<T>::type&& x)
|
||||||
|
{
|
||||||
|
return static_cast<thread T&&>(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class spvSwizzle : uint
|
||||||
|
{
|
||||||
|
none = 0,
|
||||||
|
zero,
|
||||||
|
one,
|
||||||
|
red,
|
||||||
|
green,
|
||||||
|
blue,
|
||||||
|
alpha
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T spvGetSwizzle(vec<T, 4> x, T c, spvSwizzle s)
|
||||||
|
{
|
||||||
|
switch (s)
|
||||||
|
{
|
||||||
|
case spvSwizzle::none:
|
||||||
|
return c;
|
||||||
|
case spvSwizzle::zero:
|
||||||
|
return 0;
|
||||||
|
case spvSwizzle::one:
|
||||||
|
return 1;
|
||||||
|
case spvSwizzle::red:
|
||||||
|
return x.r;
|
||||||
|
case spvSwizzle::green:
|
||||||
|
return x.g;
|
||||||
|
case spvSwizzle::blue:
|
||||||
|
return x.b;
|
||||||
|
case spvSwizzle::alpha:
|
||||||
|
return x.a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrapper function that swizzles texture samples and fetches.
|
||||||
|
template<typename T>
|
||||||
|
inline vec<T, 4> spvTextureSwizzle(vec<T, 4> x, uint s)
|
||||||
|
{
|
||||||
|
if (!s)
|
||||||
|
return x;
|
||||||
|
return vec<T, 4>(spvGetSwizzle(x, x.r, spvSwizzle((s >> 0) & 0xFF)), spvGetSwizzle(x, x.g, spvSwizzle((s >> 8) & 0xFF)), spvGetSwizzle(x, x.b, spvSwizzle((s >> 16) & 0xFF)), spvGetSwizzle(x, x.a, spvSwizzle((s >> 24) & 0xFF)));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T spvTextureSwizzle(T x, uint s)
|
||||||
|
{
|
||||||
|
return spvTextureSwizzle(vec<T, 4>(x, 0, 0, 1), s).x;
|
||||||
|
}
|
||||||
|
|
||||||
|
fragment main0_out main0(main0_in in [[stage_in]], constant uint* spvSwizzleConstants [[buffer(30)]], constant UBO& uUBO [[buffer(0)]], constant UBO2& _50 [[buffer(1)]], array<texture2d<float>, 4> uSampler [[texture(0)]], array<sampler, 4> uSamplerSmplr [[sampler(0)]])
|
||||||
|
{
|
||||||
|
main0_out out = {};
|
||||||
|
constant uint* uSamplerSwzl = &spvSwizzleConstants[0];
|
||||||
|
out.FragColor = spvTextureSwizzle(uSampler[uUBO.index].sample(uSamplerSmplr[uUBO.index], in.vUV), uSamplerSwzl[uUBO.index]);
|
||||||
|
out.FragColor += spvTextureSwizzle(uSampler[_50.index2].sample(uSamplerSmplr[_50.index2], in.vUV), uSamplerSwzl[_50.index2]);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,117 @@
|
|||||||
|
#pragma clang diagnostic ignored "-Wmissing-prototypes"
|
||||||
|
|
||||||
|
#include <metal_stdlib>
|
||||||
|
#include <simd/simd.h>
|
||||||
|
|
||||||
|
using namespace metal;
|
||||||
|
|
||||||
|
struct UBO
|
||||||
|
{
|
||||||
|
uint index;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct UBO2
|
||||||
|
{
|
||||||
|
uint index2;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct spvDescriptorSetBuffer0
|
||||||
|
{
|
||||||
|
array<texture2d<float>, 4> uSampler [[id(0)]];
|
||||||
|
array<sampler, 4> uSamplerSmplr [[id(4)]];
|
||||||
|
constant UBO* uUBO [[id(8)]];
|
||||||
|
constant UBO2* m_50 [[id(9)]];
|
||||||
|
constant uint* spvSwizzleConstants [[id(10)]];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct main0_out
|
||||||
|
{
|
||||||
|
float4 FragColor [[color(0)]];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct main0_in
|
||||||
|
{
|
||||||
|
float2 vUV [[user(locn0)]];
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T> struct spvRemoveReference { typedef T type; };
|
||||||
|
template<typename T> struct spvRemoveReference<thread T&> { typedef T type; };
|
||||||
|
template<typename T> struct spvRemoveReference<thread T&&> { typedef T type; };
|
||||||
|
template<typename T> inline constexpr thread T&& spvForward(thread typename spvRemoveReference<T>::type& x)
|
||||||
|
{
|
||||||
|
return static_cast<thread T&&>(x);
|
||||||
|
}
|
||||||
|
template<typename T> inline constexpr thread T&& spvForward(thread typename spvRemoveReference<T>::type&& x)
|
||||||
|
{
|
||||||
|
return static_cast<thread T&&>(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class spvSwizzle : uint
|
||||||
|
{
|
||||||
|
none = 0,
|
||||||
|
zero,
|
||||||
|
one,
|
||||||
|
red,
|
||||||
|
green,
|
||||||
|
blue,
|
||||||
|
alpha
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T spvGetSwizzle(vec<T, 4> x, T c, spvSwizzle s)
|
||||||
|
{
|
||||||
|
switch (s)
|
||||||
|
{
|
||||||
|
case spvSwizzle::none:
|
||||||
|
return c;
|
||||||
|
case spvSwizzle::zero:
|
||||||
|
return 0;
|
||||||
|
case spvSwizzle::one:
|
||||||
|
return 1;
|
||||||
|
case spvSwizzle::red:
|
||||||
|
return x.r;
|
||||||
|
case spvSwizzle::green:
|
||||||
|
return x.g;
|
||||||
|
case spvSwizzle::blue:
|
||||||
|
return x.b;
|
||||||
|
case spvSwizzle::alpha:
|
||||||
|
return x.a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrapper function that swizzles texture samples and fetches.
|
||||||
|
template<typename T>
|
||||||
|
inline vec<T, 4> spvTextureSwizzle(vec<T, 4> x, uint s)
|
||||||
|
{
|
||||||
|
if (!s)
|
||||||
|
return x;
|
||||||
|
return vec<T, 4>(spvGetSwizzle(x, x.r, spvSwizzle((s >> 0) & 0xFF)), spvGetSwizzle(x, x.g, spvSwizzle((s >> 8) & 0xFF)), spvGetSwizzle(x, x.b, spvSwizzle((s >> 16) & 0xFF)), spvGetSwizzle(x, x.a, spvSwizzle((s >> 24) & 0xFF)));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T spvTextureSwizzle(T x, uint s)
|
||||||
|
{
|
||||||
|
return spvTextureSwizzle(vec<T, 4>(x, 0, 0, 1), s).x;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline __attribute__((always_inline))
|
||||||
|
float4 sample_in_func(thread const array<texture2d<float>, 4> uSampler, thread const array<sampler, 4> uSamplerSmplr, constant uint* uSamplerSwzl, constant UBO& uUBO, thread float2& vUV)
|
||||||
|
{
|
||||||
|
return spvTextureSwizzle(uSampler[uUBO.index].sample(uSamplerSmplr[uUBO.index], vUV), uSamplerSwzl[uUBO.index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline __attribute__((always_inline))
|
||||||
|
float4 sample_single_in_func(thread const texture2d<float> s, thread const sampler sSmplr, constant uint& sSwzl, thread float2& vUV)
|
||||||
|
{
|
||||||
|
return spvTextureSwizzle(s.sample(sSmplr, vUV), sSwzl);
|
||||||
|
}
|
||||||
|
|
||||||
|
fragment main0_out main0(main0_in in [[stage_in]], constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]], constant uint* spvSwizzleConstants [[buffer(30)]])
|
||||||
|
{
|
||||||
|
main0_out out = {};
|
||||||
|
constant uint* spvDescriptorSet0_uSamplerSwzl = &spvDescriptorSet0.spvSwizzleConstants[0];
|
||||||
|
out.FragColor = sample_in_func(spvDescriptorSet0.uSampler, spvDescriptorSet0.uSamplerSmplr, spvDescriptorSet0_uSamplerSwzl, (*spvDescriptorSet0.uUBO), in.vUV);
|
||||||
|
out.FragColor += sample_single_in_func(spvDescriptorSet0.uSampler[(*spvDescriptorSet0.m_50).index2], spvDescriptorSet0.uSamplerSmplr[(*spvDescriptorSet0.m_50).index2], spvDescriptorSet0_uSamplerSwzl[(*spvDescriptorSet0.m_50).index2], in.vUV);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,108 @@
|
|||||||
|
#pragma clang diagnostic ignored "-Wmissing-prototypes"
|
||||||
|
|
||||||
|
#include <metal_stdlib>
|
||||||
|
#include <simd/simd.h>
|
||||||
|
|
||||||
|
using namespace metal;
|
||||||
|
|
||||||
|
struct UBO
|
||||||
|
{
|
||||||
|
uint index;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct UBO2
|
||||||
|
{
|
||||||
|
uint index2;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct main0_out
|
||||||
|
{
|
||||||
|
float4 FragColor [[color(0)]];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct main0_in
|
||||||
|
{
|
||||||
|
float2 vUV [[user(locn0)]];
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T> struct spvRemoveReference { typedef T type; };
|
||||||
|
template<typename T> struct spvRemoveReference<thread T&> { typedef T type; };
|
||||||
|
template<typename T> struct spvRemoveReference<thread T&&> { typedef T type; };
|
||||||
|
template<typename T> inline constexpr thread T&& spvForward(thread typename spvRemoveReference<T>::type& x)
|
||||||
|
{
|
||||||
|
return static_cast<thread T&&>(x);
|
||||||
|
}
|
||||||
|
template<typename T> inline constexpr thread T&& spvForward(thread typename spvRemoveReference<T>::type&& x)
|
||||||
|
{
|
||||||
|
return static_cast<thread T&&>(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class spvSwizzle : uint
|
||||||
|
{
|
||||||
|
none = 0,
|
||||||
|
zero,
|
||||||
|
one,
|
||||||
|
red,
|
||||||
|
green,
|
||||||
|
blue,
|
||||||
|
alpha
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T spvGetSwizzle(vec<T, 4> x, T c, spvSwizzle s)
|
||||||
|
{
|
||||||
|
switch (s)
|
||||||
|
{
|
||||||
|
case spvSwizzle::none:
|
||||||
|
return c;
|
||||||
|
case spvSwizzle::zero:
|
||||||
|
return 0;
|
||||||
|
case spvSwizzle::one:
|
||||||
|
return 1;
|
||||||
|
case spvSwizzle::red:
|
||||||
|
return x.r;
|
||||||
|
case spvSwizzle::green:
|
||||||
|
return x.g;
|
||||||
|
case spvSwizzle::blue:
|
||||||
|
return x.b;
|
||||||
|
case spvSwizzle::alpha:
|
||||||
|
return x.a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrapper function that swizzles texture samples and fetches.
|
||||||
|
template<typename T>
|
||||||
|
inline vec<T, 4> spvTextureSwizzle(vec<T, 4> x, uint s)
|
||||||
|
{
|
||||||
|
if (!s)
|
||||||
|
return x;
|
||||||
|
return vec<T, 4>(spvGetSwizzle(x, x.r, spvSwizzle((s >> 0) & 0xFF)), spvGetSwizzle(x, x.g, spvSwizzle((s >> 8) & 0xFF)), spvGetSwizzle(x, x.b, spvSwizzle((s >> 16) & 0xFF)), spvGetSwizzle(x, x.a, spvSwizzle((s >> 24) & 0xFF)));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T spvTextureSwizzle(T x, uint s)
|
||||||
|
{
|
||||||
|
return spvTextureSwizzle(vec<T, 4>(x, 0, 0, 1), s).x;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline __attribute__((always_inline))
|
||||||
|
float4 sample_in_func(thread const array<texture2d<float>, 4> uSampler, thread const array<sampler, 4> uSamplerSmplr, constant uint* uSamplerSwzl, constant UBO& uUBO, thread float2& vUV)
|
||||||
|
{
|
||||||
|
return spvTextureSwizzle(uSampler[uUBO.index].sample(uSamplerSmplr[uUBO.index], vUV), uSamplerSwzl[uUBO.index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline __attribute__((always_inline))
|
||||||
|
float4 sample_single_in_func(thread const texture2d<float> s, thread const sampler sSmplr, constant uint& sSwzl, thread float2& vUV)
|
||||||
|
{
|
||||||
|
return spvTextureSwizzle(s.sample(sSmplr, vUV), sSwzl);
|
||||||
|
}
|
||||||
|
|
||||||
|
fragment main0_out main0(main0_in in [[stage_in]], constant uint* spvSwizzleConstants [[buffer(30)]], constant UBO& uUBO [[buffer(0)]], constant UBO2& _50 [[buffer(1)]], array<texture2d<float>, 4> uSampler [[texture(0)]], array<sampler, 4> uSamplerSmplr [[sampler(0)]])
|
||||||
|
{
|
||||||
|
main0_out out = {};
|
||||||
|
constant uint* uSamplerSwzl = &spvSwizzleConstants[0];
|
||||||
|
out.FragColor = sample_in_func(uSampler, uSamplerSmplr, uSamplerSwzl, uUBO, in.vUV);
|
||||||
|
out.FragColor += sample_single_in_func(uSampler[_50.index2], uSamplerSmplr[_50.index2], uSamplerSwzl[_50.index2], in.vUV);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(set = 0, binding = 0) uniform sampler2D uSampler[4];
|
||||||
|
layout(set = 0, binding = 1) uniform sampler2D uSamp;
|
||||||
|
|
||||||
|
layout(set = 0, binding = 2) uniform UBO
|
||||||
|
{
|
||||||
|
uint index;
|
||||||
|
} uUBO;
|
||||||
|
|
||||||
|
layout(set = 0, binding = 3) uniform UBO2
|
||||||
|
{
|
||||||
|
uint index2;
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 vUV;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 FragColor;
|
||||||
|
|
||||||
|
vec4 sample_in_func()
|
||||||
|
{
|
||||||
|
return texture(uSampler[uUBO.index], vUV);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 sample_single_in_func(sampler2D s)
|
||||||
|
{
|
||||||
|
return texture(s, vUV);
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
FragColor = sample_in_func();
|
||||||
|
FragColor += sample_single_in_func(uSampler[index2]);
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(set = 0, binding = 0) uniform sampler2D uSampler[4];
|
||||||
|
layout(set = 0, binding = 1) uniform sampler2D uSamp;
|
||||||
|
|
||||||
|
layout(set = 0, binding = 2) uniform UBO
|
||||||
|
{
|
||||||
|
uint index;
|
||||||
|
} uUBO;
|
||||||
|
|
||||||
|
layout(set = 0, binding = 3) uniform UBO2
|
||||||
|
{
|
||||||
|
uint index2;
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 vUV;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 FragColor;
|
||||||
|
|
||||||
|
vec4 sample_in_func()
|
||||||
|
{
|
||||||
|
return texture(uSampler[uUBO.index], vUV);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 sample_single_in_func(sampler2D s)
|
||||||
|
{
|
||||||
|
return texture(s, vUV);
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
FragColor = sample_in_func();
|
||||||
|
FragColor += sample_single_in_func(uSampler[index2]);
|
||||||
|
}
|
@ -8976,9 +8976,9 @@ string CompilerMSL::to_swizzle_expression(uint32_t id)
|
|||||||
auto index = expr.find_first_of('[');
|
auto index = expr.find_first_of('[');
|
||||||
|
|
||||||
// If an image is part of an argument buffer translate this to a legal identifier.
|
// If an image is part of an argument buffer translate this to a legal identifier.
|
||||||
for (auto &c : expr)
|
string::size_type period = 0;
|
||||||
if (c == '.')
|
while ((period = expr.find_first_of('.', period)) != string::npos && period < index)
|
||||||
c = '_';
|
expr[period] = '_';
|
||||||
|
|
||||||
if (index == string::npos)
|
if (index == string::npos)
|
||||||
return expr + swizzle_name_suffix;
|
return expr + swizzle_name_suffix;
|
||||||
|
Loading…
Reference in New Issue
Block a user