diff --git a/OSBindings/Mac/Clock Signal/ScanTarget/CSScanTarget.mm b/OSBindings/Mac/Clock Signal/ScanTarget/CSScanTarget.mm index 5b761be0e..11e47d1e6 100644 --- a/OSBindings/Mac/Clock Signal/ScanTarget/CSScanTarget.mm +++ b/OSBindings/Mac/Clock Signal/ScanTarget/CSScanTarget.mm @@ -129,6 +129,7 @@ struct Uniforms { __fp16 outputAlpha; __fp16 outputGamma; __fp16 outputMultiplier; + __fp16 weightedMixAlpha; }; // Kernel sizes above and in the shaders themselves assume a maximum filter kernel size. @@ -273,6 +274,7 @@ using BufferingScanTarget = Outputs::Display::BufferingScanTarget; - (void)setAlpha { static constexpr float alpha = 0.64f; self.uniforms->outputAlpha = __fp16(std::sqrt(alpha)); + self.uniforms->weightedMixAlpha = __fp16(alpha); } - (nonnull instancetype)initWithView:(nonnull MTKView *)view { @@ -931,6 +933,7 @@ using BufferingScanTarget = Outputs::Display::BufferingScanTarget; [encoder setFragmentTexture:_frameBuffers[_fieldIndex ^ 1] atIndex:0]; [encoder setVertexTexture:_frameBuffers[_fieldIndex] atIndex:1]; [encoder setFragmentTexture:_frameBuffers[_fieldIndex] atIndex:1]; + [encoder setFragmentBuffer:_uniformsBuffer offset:0 atIndex:0]; [encoder drawPrimitives:MTLPrimitiveTypeTriangleStrip vertexStart:0 vertexCount:4]; [encoder endEncoding]; diff --git a/OSBindings/Mac/Clock Signal/ScanTarget/Shaders/CopiesAndFills.metal b/OSBindings/Mac/Clock Signal/ScanTarget/Shaders/CopiesAndFills.metal index d33385458..5e32ac4af 100644 --- a/OSBindings/Mac/Clock Signal/ScanTarget/Shaders/CopiesAndFills.metal +++ b/OSBindings/Mac/Clock Signal/ScanTarget/Shaders/CopiesAndFills.metal @@ -69,6 +69,7 @@ fragment half4 interpolateEqualMixFragment( fragment half4 weightedMixFragment( const CopyInterpolator vert [[stage_in]], + const constant Uniforms &uniforms [[buffer(0)]], const metal::texture2d texture1 [[texture(0)]], const metal::texture2d texture2 [[texture(1)]] ) { @@ -76,12 +77,13 @@ fragment half4 weightedMixFragment( metal::mix( texture1.sample(nearestSampler, vert.textureCoordinates), texture2.sample(nearestSampler, vert.textureCoordinates), - 0.64 + uniforms.weightedMixAlpha ); } fragment half4 interpolateWeightedMixFragment( const CopyInterpolator vert [[stage_in]], + const constant Uniforms &uniforms [[buffer(0)]], const metal::texture2d texture1 [[texture(0)]], const metal::texture2d texture2 [[texture(1)]] ) { @@ -89,7 +91,7 @@ fragment half4 interpolateWeightedMixFragment( metal::mix( texture1.sample(linearSampler, vert.textureCoordinates), texture2.sample(linearSampler, vert.textureCoordinates), - 0.64 + uniforms.weightedMixAlpha ); } diff --git a/OSBindings/Mac/Clock Signal/ScanTarget/Shaders/uniforms.hpp b/OSBindings/Mac/Clock Signal/ScanTarget/Shaders/uniforms.hpp index 0ee6bd112..4a12df756 100644 --- a/OSBindings/Mac/Clock Signal/ScanTarget/Shaders/uniforms.hpp +++ b/OSBindings/Mac/Clock Signal/ScanTarget/Shaders/uniforms.hpp @@ -44,4 +44,7 @@ struct Uniforms { // Sets a brightness multiplier for output colours. half outputMultiplier; + + // Sets the opacity used by the weighted-mix copy shaders. + half weightedMixAlpha; };