sdl

FORK: Simple Directmedia Layer
git clone https://git.neptards.moe/neptards/sdl.git
Log | Files | Refs

SDL_shaders_metal.metal (3796B)


      1 #include <metal_texture>
      2 #include <metal_matrix>
      3 
      4 using namespace metal;
      5 
      6 struct SolidVertexInput
      7 {
      8     float2 position [[attribute(0)]];
      9 };
     10 
     11 struct SolidVertexOutput
     12 {
     13     float4 position [[position]];
     14     float pointSize [[point_size]];
     15 };
     16 
     17 vertex SolidVertexOutput SDL_Solid_vertex(SolidVertexInput in [[stage_in]],
     18                                           constant float4x4 &projection [[buffer(2)]],
     19                                           constant float4x4 &transform [[buffer(3)]])
     20 {
     21     SolidVertexOutput v;
     22     v.position = (projection * transform) * float4(in.position, 0.0f, 1.0f);
     23     v.pointSize = 1.0f;
     24     return v;
     25 }
     26 
     27 fragment float4 SDL_Solid_fragment(const device float4 &col [[buffer(0)]])
     28 {
     29     return col;
     30 }
     31 
     32 struct CopyVertexInput
     33 {
     34     float2 position [[attribute(0)]];
     35     float2 texcoord [[attribute(1)]];
     36 };
     37 
     38 struct CopyVertexOutput
     39 {
     40     float4 position [[position]];
     41     float2 texcoord;
     42 };
     43 
     44 vertex CopyVertexOutput SDL_Copy_vertex(CopyVertexInput in [[stage_in]],
     45                                         constant float4x4 &projection [[buffer(2)]],
     46                                         constant float4x4 &transform [[buffer(3)]])
     47 {
     48     CopyVertexOutput v;
     49     v.position = (projection * transform) * float4(in.position, 0.0f, 1.0f);
     50     v.texcoord = in.texcoord;
     51     return v;
     52 }
     53 
     54 fragment float4 SDL_Copy_fragment(CopyVertexOutput vert [[stage_in]],
     55                                   const device float4 &col [[buffer(0)]],
     56                                   texture2d<float> tex [[texture(0)]],
     57                                   sampler s [[sampler(0)]])
     58 {
     59     return tex.sample(s, vert.texcoord) * col;
     60 }
     61 
     62 struct YUVDecode
     63 {
     64     float3 offset;
     65     float3 Rcoeff;
     66     float3 Gcoeff;
     67     float3 Bcoeff;
     68 };
     69 
     70 fragment float4 SDL_YUV_fragment(CopyVertexOutput vert [[stage_in]],
     71                                  const device float4 &col [[buffer(0)]],
     72                                  constant YUVDecode &decode [[buffer(1)]],
     73                                  texture2d<float> texY [[texture(0)]],
     74                                  texture2d_array<float> texUV [[texture(1)]],
     75                                  sampler s [[sampler(0)]])
     76 {
     77     float3 yuv;
     78     yuv.x = texY.sample(s, vert.texcoord).r;
     79     yuv.y = texUV.sample(s, vert.texcoord, 0).r;
     80     yuv.z = texUV.sample(s, vert.texcoord, 1).r;
     81 
     82     yuv += decode.offset;
     83 
     84     return col * float4(dot(yuv, decode.Rcoeff), dot(yuv, decode.Gcoeff), dot(yuv, decode.Bcoeff), 1.0);
     85 }
     86 
     87 fragment float4 SDL_NV12_fragment(CopyVertexOutput vert [[stage_in]],
     88                                  const device float4 &col [[buffer(0)]],
     89                                  constant YUVDecode &decode [[buffer(1)]],
     90                                  texture2d<float> texY [[texture(0)]],
     91                                  texture2d<float> texUV [[texture(1)]],
     92                                  sampler s [[sampler(0)]])
     93 {
     94     float3 yuv;
     95     yuv.x = texY.sample(s, vert.texcoord).r;
     96     yuv.yz = texUV.sample(s, vert.texcoord).rg;
     97 
     98     yuv += decode.offset;
     99 
    100     return col * float4(dot(yuv, decode.Rcoeff), dot(yuv, decode.Gcoeff), dot(yuv, decode.Bcoeff), 1.0);
    101 }
    102 
    103 fragment float4 SDL_NV21_fragment(CopyVertexOutput vert [[stage_in]],
    104                                  const device float4 &col [[buffer(0)]],
    105                                  constant YUVDecode &decode [[buffer(1)]],
    106                                  texture2d<float> texY [[texture(0)]],
    107                                  texture2d<float> texUV [[texture(1)]],
    108                                  sampler s [[sampler(0)]])
    109 {
    110     float3 yuv;
    111     yuv.x = texY.sample(s, vert.texcoord).r;
    112     yuv.yz = texUV.sample(s, vert.texcoord).gr;
    113 
    114     yuv += decode.offset;
    115 
    116     return col * float4(dot(yuv, decode.Rcoeff), dot(yuv, decode.Gcoeff), dot(yuv, decode.Bcoeff), 1.0);
    117 }