Add METAL shaders

This commit is contained in:
Sylvain Becker 2021-03-16 15:44:33 +01:00
parent 1e77dae7b7
commit 2d01573bb9
1 changed files with 14 additions and 11 deletions

View File

@ -6,11 +6,13 @@ using namespace metal;
struct SolidVertexInput struct SolidVertexInput
{ {
float2 position [[attribute(0)]]; float2 position [[attribute(0)]];
float4 color [[attribute(1)]];
}; };
struct SolidVertexOutput struct SolidVertexOutput
{ {
float4 position [[position]]; float4 position [[position]];
float4 color;
float pointSize [[point_size]]; float pointSize [[point_size]];
}; };
@ -20,24 +22,27 @@ vertex SolidVertexOutput SDL_Solid_vertex(SolidVertexInput in [[stage_in]],
{ {
SolidVertexOutput v; SolidVertexOutput v;
v.position = (projection * transform) * float4(in.position, 0.0f, 1.0f); v.position = (projection * transform) * float4(in.position, 0.0f, 1.0f);
v.color = in.color;
v.pointSize = 1.0f; v.pointSize = 1.0f;
return v; return v;
} }
fragment float4 SDL_Solid_fragment(const device float4 &col [[buffer(0)]]) fragment float4 SDL_Solid_fragment(SolidVertexInput in [[stage_in]])
{ {
return col; return in.color;
} }
struct CopyVertexInput struct CopyVertexInput
{ {
float2 position [[attribute(0)]]; float2 position [[attribute(0)]];
float2 texcoord [[attribute(1)]]; float4 color [[attribute(1)]];
float2 texcoord [[attribute(2)]];
}; };
struct CopyVertexOutput struct CopyVertexOutput
{ {
float4 position [[position]]; float4 position [[position]];
float4 color;
float2 texcoord; float2 texcoord;
}; };
@ -47,16 +52,16 @@ vertex CopyVertexOutput SDL_Copy_vertex(CopyVertexInput in [[stage_in]],
{ {
CopyVertexOutput v; CopyVertexOutput v;
v.position = (projection * transform) * float4(in.position, 0.0f, 1.0f); v.position = (projection * transform) * float4(in.position, 0.0f, 1.0f);
v.color = in.color;
v.texcoord = in.texcoord; v.texcoord = in.texcoord;
return v; return v;
} }
fragment float4 SDL_Copy_fragment(CopyVertexOutput vert [[stage_in]], fragment float4 SDL_Copy_fragment(CopyVertexOutput vert [[stage_in]],
const device float4 &col [[buffer(0)]],
texture2d<float> tex [[texture(0)]], texture2d<float> tex [[texture(0)]],
sampler s [[sampler(0)]]) sampler s [[sampler(0)]])
{ {
return tex.sample(s, vert.texcoord) * col; return tex.sample(s, vert.texcoord) * vert.color;
} }
struct YUVDecode struct YUVDecode
@ -68,7 +73,6 @@ struct YUVDecode
}; };
fragment float4 SDL_YUV_fragment(CopyVertexOutput vert [[stage_in]], fragment float4 SDL_YUV_fragment(CopyVertexOutput vert [[stage_in]],
const device float4 &col [[buffer(0)]],
constant YUVDecode &decode [[buffer(1)]], constant YUVDecode &decode [[buffer(1)]],
texture2d<float> texY [[texture(0)]], texture2d<float> texY [[texture(0)]],
texture2d_array<float> texUV [[texture(1)]], texture2d_array<float> texUV [[texture(1)]],
@ -81,11 +85,10 @@ fragment float4 SDL_YUV_fragment(CopyVertexOutput vert [[stage_in]],
yuv += decode.offset; yuv += decode.offset;
return col * float4(dot(yuv, decode.Rcoeff), dot(yuv, decode.Gcoeff), dot(yuv, decode.Bcoeff), 1.0); return vert.color * float4(dot(yuv, decode.Rcoeff), dot(yuv, decode.Gcoeff), dot(yuv, decode.Bcoeff), 1.0);
} }
fragment float4 SDL_NV12_fragment(CopyVertexOutput vert [[stage_in]], fragment float4 SDL_NV12_fragment(CopyVertexOutput vert [[stage_in]],
const device float4 &col [[buffer(0)]],
constant YUVDecode &decode [[buffer(1)]], constant YUVDecode &decode [[buffer(1)]],
texture2d<float> texY [[texture(0)]], texture2d<float> texY [[texture(0)]],
texture2d<float> texUV [[texture(1)]], texture2d<float> texUV [[texture(1)]],
@ -97,11 +100,10 @@ fragment float4 SDL_NV12_fragment(CopyVertexOutput vert [[stage_in]],
yuv += decode.offset; yuv += decode.offset;
return col * float4(dot(yuv, decode.Rcoeff), dot(yuv, decode.Gcoeff), dot(yuv, decode.Bcoeff), 1.0); return vert.color * float4(dot(yuv, decode.Rcoeff), dot(yuv, decode.Gcoeff), dot(yuv, decode.Bcoeff), 1.0);
} }
fragment float4 SDL_NV21_fragment(CopyVertexOutput vert [[stage_in]], fragment float4 SDL_NV21_fragment(CopyVertexOutput vert [[stage_in]],
const device float4 &col [[buffer(0)]],
constant YUVDecode &decode [[buffer(1)]], constant YUVDecode &decode [[buffer(1)]],
texture2d<float> texY [[texture(0)]], texture2d<float> texY [[texture(0)]],
texture2d<float> texUV [[texture(1)]], texture2d<float> texUV [[texture(1)]],
@ -113,5 +115,6 @@ fragment float4 SDL_NV21_fragment(CopyVertexOutput vert [[stage_in]],
yuv += decode.offset; yuv += decode.offset;
return col * float4(dot(yuv, decode.Rcoeff), dot(yuv, decode.Gcoeff), dot(yuv, decode.Bcoeff), 1.0); return vert.color * float4(dot(yuv, decode.Rcoeff), dot(yuv, decode.Gcoeff), dot(yuv, decode.Bcoeff), 1.0);
} }