core: Don't damage the entire surface every frame (#9763)

* core: Don't damage the entire surface every frame

* core: Damage buffer on dims or transform change

* core: Use guards for scale and tr equality checks
This commit is contained in:
Lee Bousfield 2025-03-28 11:00:39 -05:00 committed by Vaxry
parent 3c36e083f1
commit aa421c2e95

View File

@ -77,6 +77,7 @@ CWLSurfaceResource::CWLSurfaceResource(SP<CWlSurface> resource_) : resource(reso
if (!buffer) { if (!buffer) {
pending.buffer.reset(); pending.buffer.reset();
pending.texture.reset(); pending.texture.reset();
pending.bufferSize = Vector2D{};
} else { } else {
auto res = CWLBufferResource::fromResource(buffer); auto res = CWLBufferResource::fromResource(buffer);
pending.buffer = res && res->buffer ? makeShared<CHLBufferReference>(res->buffer.lock(), self.lock()) : nullptr; pending.buffer = res && res->buffer ? makeShared<CHLBufferReference>(res->buffer.lock(), self.lock()) : nullptr;
@ -85,10 +86,7 @@ CWLSurfaceResource::CWLSurfaceResource(SP<CWlSurface> resource_) : resource(reso
pending.bufferSize = res && res->buffer ? res->buffer->size : Vector2D{}; pending.bufferSize = res && res->buffer ? res->buffer->size : Vector2D{};
} }
Vector2D oldBufSize = current.buffer ? current.bufferSize : Vector2D{}; if (pending.bufferSize != current.bufferSize)
Vector2D newBufSize = pending.buffer ? pending.bufferSize : Vector2D{};
if (oldBufSize != newBufSize || current.buffer != pending.buffer)
pending.bufferDamage = CBox{{}, {INT32_MAX, INT32_MAX}}; pending.bufferDamage = CBox{{}, {INT32_MAX, INT32_MAX}};
}); });
@ -129,12 +127,18 @@ CWLSurfaceResource::CWLSurfaceResource(SP<CWlSurface> resource_) : resource(reso
}); });
resource->setSetBufferScale([this](CWlSurface* r, int32_t scale) { resource->setSetBufferScale([this](CWlSurface* r, int32_t scale) {
pending.updated |= SSurfaceState::eUpdatedProperties::SURFACE_UPDATED_SCALE; if (scale == pending.scale)
return;
pending.updated |= SSurfaceState::eUpdatedProperties::SURFACE_UPDATED_SCALE | SSurfaceState::eUpdatedProperties::SURFACE_UPDATED_DAMAGE;
pending.scale = scale; pending.scale = scale;
pending.bufferDamage = CBox{{}, {INT32_MAX, INT32_MAX}};
}); });
resource->setSetBufferTransform([this](CWlSurface* r, uint32_t tr) { resource->setSetBufferTransform([this](CWlSurface* r, uint32_t tr) {
pending.updated |= SSurfaceState::eUpdatedProperties::SURFACE_UPDATED_TRANSFORM; if (tr == pending.transform)
return;
pending.updated |= SSurfaceState::eUpdatedProperties::SURFACE_UPDATED_TRANSFORM | SSurfaceState::eUpdatedProperties::SURFACE_UPDATED_DAMAGE;
pending.transform = (wl_output_transform)tr; pending.transform = (wl_output_transform)tr;
pending.bufferDamage = CBox{{}, {INT32_MAX, INT32_MAX}};
}); });
resource->setSetInputRegion([this](CWlSurface* r, wl_resource* region) { resource->setSetInputRegion([this](CWlSurface* r, wl_resource* region) {