core: refactor and improve surface commit (#9805)
* make CHLBufferReference not a SP anymore
* copy over release and acquire points in CHLBufferReference
* use CHLBufferReference in screencopy and toplevel export
TODO: use CHLBufferReference in direct scanout properly
the only problem is the scanout buffer release timing,
specifically the onBackendRelease mechanism
* cleanup SSurfaceState and surface pending commit tracking
* move surface code from DRMSyncobj, and move acquire to SSurfaceState
* use queue for comitted pending surface states like proto says
"The content update is placed in a queue until it becomes active." - wl_surface::commit
* drop, not release, prev buffer if 2nd buffer wl_surface.attach is sent
"A wl_buffer that has been attached and then replaced by another attach instead of committed will not receive a release event, and is not used by the compositor." - wl_surface::attach
This commit is contained in:
parent
70ae99f521
commit
da86db43d4
15 changed files with 285 additions and 223 deletions
|
|
@ -5,14 +5,11 @@
|
|||
#include "../helpers/sync/SyncReleaser.hpp"
|
||||
#include "linux-drm-syncobj-v1.hpp"
|
||||
#include "../helpers/signal/Signal.hpp"
|
||||
#include "types/SurfaceState.hpp"
|
||||
#include <hyprutils/os/FileDescriptor.hpp>
|
||||
#include <list>
|
||||
|
||||
class CWLSurfaceResource;
|
||||
class CDRMSyncobjTimelineResource;
|
||||
class CSyncTimeline;
|
||||
struct SSurfaceState;
|
||||
|
||||
class CDRMSyncPointState {
|
||||
public:
|
||||
|
|
@ -28,6 +25,10 @@ class CDRMSyncPointState {
|
|||
Hyprutils::OS::CFileDescriptor exportAsFD();
|
||||
void signal();
|
||||
|
||||
operator bool() const {
|
||||
return m_timeline;
|
||||
}
|
||||
|
||||
private:
|
||||
SP<CSyncTimeline> m_timeline = {};
|
||||
uint64_t m_point = 0;
|
||||
|
|
@ -38,19 +39,15 @@ class CDRMSyncPointState {
|
|||
class CDRMSyncobjSurfaceResource {
|
||||
public:
|
||||
CDRMSyncobjSurfaceResource(UP<CWpLinuxDrmSyncobjSurfaceV1>&& resource_, SP<CWLSurfaceResource> surface_);
|
||||
~CDRMSyncobjSurfaceResource();
|
||||
|
||||
bool protocolError();
|
||||
bool good();
|
||||
|
||||
private:
|
||||
void removeAllWaiters();
|
||||
WP<CWLSurfaceResource> surface;
|
||||
UP<CWpLinuxDrmSyncobjSurfaceV1> resource;
|
||||
|
||||
CDRMSyncPointState pendingAcquire;
|
||||
CDRMSyncPointState pendingRelease;
|
||||
std::vector<SP<SSurfaceState>> pendingStates;
|
||||
|
||||
struct {
|
||||
CHyprSignalListener surfacePrecommit;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue