Metal: Add atomicExchange and mat3x4 support

This commit is contained in:
Clément Foucault
2023-05-05 16:15:02 +02:00
parent 9654b96ffa
commit c796cbebef

View File

@@ -34,6 +34,7 @@ using mat4x3 = float4x3;
using mat4x4 = float4x4;
using mat2 = float2x2;
using mat3 = float3x3;
using mat3x4 = float3x4;
using mat4 = float4x4;
using ivec2 = int2;
using ivec3 = int3;
@@ -158,6 +159,10 @@ template<typename T> T atomicXor(threadgroup T &mem, T data)
{
return atomic_fetch_xor_explicit((threadgroup _atomic<T> *)&mem, data, memory_order_relaxed);
}
template<typename T> T atomicExchange(threadgroup T &mem, T data)
{
return atomic_exchange_explicit((threadgroup _atomic<T> *)&mem, data, memory_order_relaxed);
}
/* Device memory. */
template<typename T> T atomicMax(device T &mem, T data)
@@ -188,6 +193,10 @@ template<typename T> T atomicXor(device T &mem, T data)
{
return atomic_fetch_xor_explicit((device _atomic<T> *)&mem, data, memory_order_relaxed);
}
template<typename T> T atomicExchange(device T &mem, T data)
{
return atomic_exchange_explicit((device _atomic<T> *)&mem, data, memory_order_relaxed);
}
/* Unblock texture atomic compilation.
* TODO(Metal): This is not correct for global atomic behaviour, but will be safe within a single
@@ -1503,6 +1512,10 @@ mat3 MAT3x3(mat4 m)
{
return mat3(m[0].xyz, m[1].xyz, m[2].xyz);
}
mat3 MAT3x3(mat3x4 m)
{
return mat3(m[0].xyz, m[1].xyz, m[2].xyz);
}
mat3 MAT3x3(mat2 m)
{
return mat3(vec3(m[0].xy, 0.0), vec3(m[1].xy, 0.0), vec3(0.0, 0.0, 1.0));
@@ -1541,6 +1554,10 @@ mat4 MAT4x4(mat3 m)
return mat4(
vec4(m[0].xyz, 0.0), vec4(m[1].xyz, 0.0), vec4(m[2].xyz, 0.0), vec4(0.0, 0.0, 0.0, 1.0));
}
mat4 MAT4x4(mat3x4 m)
{
return mat4(m[0], m[1], m[2], vec4(0.0, 0.0, 0.0, 1.0));
}
mat4 MAT4x4(mat2 m)
{
return mat4(vec4(m[0].xy, 0.0, 0.0),
@@ -1549,6 +1566,42 @@ mat4 MAT4x4(mat2 m)
vec4(0.0, 0.0, 0.0, 1.0));
}
mat3x4 MAT3x4(vec4 a, vec4 b, vec4 c)
{
return mat3x4(a, b, c);
}
mat3x4 MAT3x4(float a1,
float a2,
float a3,
float a4,
float b1,
float b2,
float b3,
float b4,
float c1,
float c2,
float c3,
float c4)
{
return mat3x4(
vec4(a1, a2, a3, a4), vec4(b1, b2, b3, b4), vec4(c1, c2, c3, c4));
}
mat3x4 MAT3x4(float f)
{
return mat3x4(f);
}
mat3x4 MAT3x4(mat3 m)
{
return mat3x4(
vec4(m[0].xyz, 0.0), vec4(m[1].xyz, 0.0), vec4(m[2].xyz, 0.0));
}
mat3x4 MAT3x4(mat2 m)
{
return mat3x4(vec4(m[0].xy, 0.0, 0.0),
vec4(m[1].xy, 0.0, 0.0),
vec4(0.0, 0.0, 1.0, 0.0));
}
#define MAT2 MAT2x2
#define MAT3 MAT3x3
#define MAT4 MAT4x4