1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-07-17 13:29:02 +00:00
CLK/OSBindings/Mac/Clock Signal/ScanTarget/ScanTarget.metal
Thomas Harte 4421acef34 Gets some uniforms in on the action.
With some effort towards scans, but incompletely so.
2020-08-07 21:19:17 -04:00

64 lines
1.9 KiB
Metal

//
// ScanTarget.metal
// Clock Signal
//
// Created by Thomas Harte on 04/08/2020.
// Copyright © 2020 Thomas Harte. All rights reserved.
//
#include <metal_stdlib>
using namespace metal;
// These two structs are the same, but defined separately as an artefact
// of my learning process, and the fact that they soon won't be.
struct Uniforms {
// This is used to scale scan positions, i.e. it provides the range
// for mapping from scan-style integer positions into eye space.
int2 scale [[attribute(0)]];
// This provides the intended width of a scan, in eye-coordinate terms.
float lineWidth [[attribute(1)]];
};
// This is intended to match `Scan` as defined by the BufferingScanTarget.
// Fields have been combined as necessary to make them all at least four
// bytes in size, since that is the required attribute alignment in Swift.
struct Scan {
uint32_t startPosition [[attribute(0)]];
uint32_t startOffsetAndAngle [[attribute(1)]];
uint32_t startCycles [[attribute(2)]];
uint32_t endPosition [[attribute(3)]];
uint32_t endOffsetAndAngle [[attribute(4)]];
uint32_t endCycles [[attribute(5)]];
uint32_t compositeAmplitude [[attribute(6)]];
uint32_t dataYAndLine [[attribute(7)]];
};
// This is a custom thing defining one corner of a quad.
struct QuadInputVertex {
float2 position [[attribute(0)]];
};
struct ColouredVertex {
float4 position [[position]];
};
// MARK: - Scan shaders; these do final output to the display.
vertex ColouredVertex scanVertexMain( QuadInputVertex vert [[stage_in]],
constant Uniforms &uniforms [[buffer(1)]],
constant Scan *scans [[buffer(2)]],
ushort instance [[instance_id]]) {
ColouredVertex output;
output.position = float4(vert.position * uniforms.lineWidth, 0.0, 1.0);
return output;
}
fragment float4 scanFragmentMain(ColouredVertex vert [[stage_in]]) {
return float4(1.0);
}