mirror of
https://github.com/hyprwm/Hyprland.git
synced 2025-05-19 08:30:22 -07:00
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:
parent
3c36e083f1
commit
aa421c2e95
@ -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)
|
||||||
pending.scale = scale;
|
return;
|
||||||
|
pending.updated |= SSurfaceState::eUpdatedProperties::SURFACE_UPDATED_SCALE | SSurfaceState::eUpdatedProperties::SURFACE_UPDATED_DAMAGE;
|
||||||
|
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)
|
||||||
pending.transform = (wl_output_transform)tr;
|
return;
|
||||||
|
pending.updated |= SSurfaceState::eUpdatedProperties::SURFACE_UPDATED_TRANSFORM | SSurfaceState::eUpdatedProperties::SURFACE_UPDATED_DAMAGE;
|
||||||
|
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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user