diff --git a/OSBindings/Mac/Clock Signal/ScanTarget/ScanTarget.metal b/OSBindings/Mac/Clock Signal/ScanTarget/ScanTarget.metal index 7bc5f57ef..cab2225de 100644 --- a/OSBindings/Mac/Clock Signal/ScanTarget/ScanTarget.metal +++ b/OSBindings/Mac/Clock Signal/ScanTarget/ScanTarget.metal @@ -60,7 +60,8 @@ constexpr sampler linearSampler( coord::pixel, // MARK: - Structs used for receiving data from the emulation. -// This is intended to match the net effect of `Scan` as defined by the BufferingScanTarget. +// This is intended to match the net effect of `Scan` as defined by the BufferingScanTarget, +// with a couple of added fields. struct Scan { struct EndPoint { uint16_t position[2]; @@ -69,7 +70,10 @@ struct Scan { uint16_t cyclesSinceRetrace; } endPoints[2]; - uint8_t compositeAmplitude; + union { + uint8_t compositeAmplitude; + uint32_t padding; // TODO: reuse some padding as the next two fields, to save two bytes. + }; uint16_t dataY; uint16_t line; }; diff --git a/Outputs/OpenGL/ScanTargetGLSLFragments.cpp b/Outputs/OpenGL/ScanTargetGLSLFragments.cpp index 0404f95e8..bdfd5649a 100644 --- a/Outputs/OpenGL/ScanTargetGLSLFragments.cpp +++ b/Outputs/OpenGL/ScanTargetGLSLFragments.cpp @@ -84,6 +84,11 @@ void ScanTarget::enable_vertex_attributes(ShaderType type, Shader &target) { Scan test_scan; Line test_line; + // Some GPUs require alignment and will need to copy vertex data to a + // shadow buffer otherwise + static_assert(sizeof(Scan) % 4 == 0); + static_assert(sizeof(Line) % 4 == 0); + switch(type) { case ShaderType::Composition: for(int c = 0; c < 2; ++c) { diff --git a/Outputs/ScanTarget.hpp b/Outputs/ScanTarget.hpp index dc4074d95..0a32ac346 100644 --- a/Outputs/ScanTarget.hpp +++ b/Outputs/ScanTarget.hpp @@ -304,7 +304,11 @@ struct ScanTarget { /// For composite video, dictates the amplitude of the colour subcarrier as a proportion of /// the whole, as determined from the colour burst. Will be 0 if there was no colour burst. - uint8_t composite_amplitude; + union { + uint8_t composite_amplitude; + + uint32_t padding; + }; }; /// Requests a new scan to populate.