1#include <metal_stdlib>
2#include "shaders.h"
3
4using namespace metal;
5
6float4 coloru_to_colorf(uchar4 coloru) {
7 return float4(coloru) / float4(0xff, 0xff, 0xff, 0xff);
8}
9
10struct QuadFragmentInput {
11 float4 position [[position]];
12 GPUIQuad quad;
13};
14
15vertex QuadFragmentInput quad_vertex(
16 uint unit_vertex_id [[vertex_id]],
17 uint quad_id [[instance_id]],
18 constant float2 *unit_vertices [[buffer(GPUIQuadInputIndexVertices)]],
19 constant GPUIQuad *quads [[buffer(GPUIQuadInputIndexQuads)]],
20 constant GPUIQuadUniforms *uniforms [[buffer(GPUIQuadInputIndexUniforms)]]
21) {
22 float2 unit_vertex = unit_vertices[unit_vertex_id];
23 GPUIQuad quad = quads[quad_id];
24 float2 position = unit_vertex * quad.size + quad.origin;
25 float4 device_position = float4(position / uniforms->viewport_size * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
26
27 return QuadFragmentInput {
28 device_position,
29 quad,
30 };
31}
32
33fragment float4 quad_fragment(QuadFragmentInput input [[stage_in]]) {
34 return coloru_to_colorf(input.quad.background_color);
35}