10#include <QMutexLocker>
56 return static_cast<int>(
sizeof(m_data));
59 void write(
char* buffer,
int offset)
const override
61 QMutexLocker lock(&m_mutex);
62 std::memcpy(buffer + offset, &m_data,
sizeof(m_data));
67 return m_dirty.load(std::memory_order_acquire);
72 m_dirty.store(
false, std::memory_order_release);
81 QMutexLocker lock(&m_mutex);
83 if (i < zones.size()) {
85 m_data.zoneRects[i][0] =
static_cast<float>(zone.
rect.x());
86 m_data.zoneRects[i][1] =
static_cast<float>(zone.
rect.y());
87 m_data.zoneRects[i][2] =
static_cast<float>(zone.
rect.width());
88 m_data.zoneRects[i][3] =
static_cast<float>(zone.
rect.height());
89 m_data.zoneFillColors[i][0] =
static_cast<float>(zone.
fillColor.redF());
90 m_data.zoneFillColors[i][1] =
static_cast<float>(zone.
fillColor.greenF());
91 m_data.zoneFillColors[i][2] =
static_cast<float>(zone.
fillColor.blueF());
92 m_data.zoneFillColors[i][3] =
static_cast<float>(zone.
fillColor.alphaF());
93 m_data.zoneBorderColors[i][0] =
static_cast<float>(zone.
borderColor.redF());
94 m_data.zoneBorderColors[i][1] =
static_cast<float>(zone.
borderColor.greenF());
95 m_data.zoneBorderColors[i][2] =
static_cast<float>(zone.
borderColor.blueF());
96 m_data.zoneBorderColors[i][3] =
static_cast<float>(zone.
borderColor.alphaF());
100 m_data.zoneParams[i][3] =
static_cast<float>(zone.
zoneNumber);
102 std::memset(m_data.zoneRects[i], 0,
sizeof(m_data.zoneRects[i]));
103 std::memset(m_data.zoneFillColors[i], 0,
sizeof(m_data.zoneFillColors[i]));
104 std::memset(m_data.zoneBorderColors[i], 0,
sizeof(m_data.zoneBorderColors[i]));
105 std::memset(m_data.zoneParams[i], 0,
sizeof(m_data.zoneParams[i]));
108 m_dirty.store(
true, std::memory_order_release);
140 if (!(scale > 0.0f) || std::isinf(scale)) {
143 QMutexLocker lock(&m_mutex);
147 if (qFuzzyCompare(m_data.zoneScale, scale)) {
150 m_data.zoneScale = scale;
151 m_dirty.store(
true, std::memory_order_release);
157 struct alignas(16) ZoneExtensionData
161 float zoneBorderColors[
MaxZones][4];
168 float zoneScale = 1.0f;
169 float _pad_after_zoneScale[3] = {};
173 "ZoneExtensionData must be MaxZones * 4 arrays * 4 floats, plus the "
174 "zoneScale scalar and its std140 tail pad");
178 static_assert(offsetof(ZoneExtensionData, zoneRects) == 0,
"zoneRects must be first");
179 static_assert(offsetof(ZoneExtensionData, zoneFillColors) ==
sizeof(
float[
MaxZones][4]),
180 "zoneFillColors must follow zoneRects with no gap");
181 static_assert(offsetof(ZoneExtensionData, zoneBorderColors) == 2 *
sizeof(
float[
MaxZones][4]),
182 "zoneBorderColors must follow zoneFillColors with no gap");
183 static_assert(offsetof(ZoneExtensionData, zoneParams) == 3 *
sizeof(
float[
MaxZones][4]),
184 "zoneParams must follow zoneBorderColors with no gap");
185 static_assert(offsetof(ZoneExtensionData, zoneScale) == 4 *
sizeof(
float[
MaxZones][4]),
186 "zoneScale must follow zoneParams with no gap");
190 "ZoneExtensionData size must match ZoneShaderUniforms zone region size");
192 ZoneExtensionData m_data;
193 mutable QMutex m_mutex;
194 std::atomic<bool> m_dirty{
true};
Definition ShaderCompiler.h:15
constexpr int MaxZones
Maximum number of zones the zone-aware UBO supports.
Definition ZoneShaderCommon.h:20
constexpr std::size_t kZoneExtensionBytes
Size of the zone extension region: four vec4[MaxZones] arrays, plus the uZoneScale scalar and the std...
Definition ZoneShaderCommon.h:64
Per-zone payload pushed into the UBO each frame.
Definition ZoneShaderCommon.h:84
float borderWidth
Definition ZoneShaderCommon.h:89
QRectF rect
Definition ZoneShaderCommon.h:85
QColor borderColor
Definition ZoneShaderCommon.h:87
int zoneNumber
Definition ZoneShaderCommon.h:91
QColor fillColor
Definition ZoneShaderCommon.h:86
float borderRadius
Definition ZoneShaderCommon.h:88
bool isHighlighted
Definition ZoneShaderCommon.h:90