surfacestate: track and apply updated state

fixes #9729
This commit is contained in:
Vaxry 2025-03-26 15:11:19 +00:00
parent 1c2b9a9ce3
commit 0cd04bd666
4 changed files with 85 additions and 20 deletions

View file

@ -56,3 +56,37 @@ void SSurfaceState::reset() {
offset = {};
size = {};
}
void SSurfaceState::updateFrom(SSurfaceState& ref) {
updated = ref.updated;
if (ref.updated & SURFACE_UPDATED_BUFFER) {
*this = ref;
ref.damage.clear();
ref.bufferDamage.clear();
ref.buffer.reset();
} else {
if (ref.updated & SURFACE_UPDATED_DAMAGE) {
damage = ref.damage;
bufferDamage = ref.bufferDamage;
}
if (ref.updated & SURFACE_UPDATED_INPUT)
input = ref.input;
if (ref.updated & SURFACE_UPDATED_OPAQUE)
opaque = ref.opaque;
if (ref.updated & SURFACE_UPDATED_OFFSET)
offset = ref.offset;
if (ref.updated & SURFACE_UPDATED_SCALE)
scale = ref.scale;
if (ref.updated & SURFACE_UPDATED_VIEWPORT)
viewport = ref.viewport;
if (ref.updated & SURFACE_UPDATED_TRANSFORM)
transform = ref.transform;
}
}

View file

@ -7,6 +7,17 @@ class CHLBufferReference;
class CTexture;
struct SSurfaceState {
enum eUpdatedProperties : uint8_t {
SURFACE_UPDATED_OPAQUE = 1 << 0,
SURFACE_UPDATED_INPUT = 1 << 1,
SURFACE_UPDATED_DAMAGE = 1 << 2,
SURFACE_UPDATED_SCALE = 1 << 3,
SURFACE_UPDATED_BUFFER = 1 << 4,
SURFACE_UPDATED_OFFSET = 1 << 5,
SURFACE_UPDATED_VIEWPORT = 1 << 6,
SURFACE_UPDATED_TRANSFORM = 1 << 7,
};
CRegion opaque, input = CBox{{}, {INT32_MAX, INT32_MAX}}, damage, bufferDamage = CBox{{}, {INT32_MAX, INT32_MAX}} /* initial damage */;
wl_output_transform transform = WL_OUTPUT_TRANSFORM_NORMAL;
int scale = 1;
@ -20,12 +31,15 @@ struct SSurfaceState {
Vector2D destination;
CBox source;
} viewport;
bool rejected = false;
bool newBuffer = false;
bool rejected = false;
uint8_t updated = 0; // eUpdatedProperties. Stores what the last update changed
Vector2D sourceSize();
// Translates damage into bufferDamage, clearing damage and returning the updated bufferDamage
CRegion accumulateBufferDamage();
void updateSynchronousTexture(SP<CTexture> lastTexture);
void reset();
// updates this state from a reference state. Mutates the reference state. If a new buffer is committed,
// reference state gets its damage and buffer cleared.
void updateFrom(SSurfaceState& ref);
};