summaryrefslogtreecommitdiff
path: root/D147720.diff
diff options
context:
space:
mode:
Diffstat (limited to 'D147720.diff')
-rw-r--r--D147720.diff73
1 files changed, 73 insertions, 0 deletions
diff --git a/D147720.diff b/D147720.diff
new file mode 100644
index 0000000..9287f44
--- /dev/null
+++ b/D147720.diff
@@ -0,0 +1,73 @@
+diff --git a/widget/gtk/DMABufSurface.h b/widget/gtk/DMABufSurface.h
+--- a/widget/gtk/DMABufSurface.h
++++ b/widget/gtk/DMABufSurface.h
+@@ -146,11 +146,16 @@
+ DMABufSurface(SurfaceType aSurfaceType);
+
+ protected:
+ virtual bool Create(const mozilla::layers::SurfaceDescriptor& aDesc) = 0;
+
++ // Import global ref count from IPC by file descriptor.
+ void GlobalRefCountImport(int aFd);
++ // Export global ref count by file descriptor. This adds global ref count
++ // reference to the surface.
++ // It's used when dmabuf surface is shared with another process via. IPC.
++ int GlobalRefCountExport();
+ void GlobalRefCountDelete();
+
+ void ReleaseDMABuf();
+
+ void* MapInternal(uint32_t aX, uint32_t aY, uint32_t aWidth, uint32_t aHeight,
+diff --git a/widget/gtk/DMABufSurface.cpp b/widget/gtk/DMABufSurface.cpp
+--- a/widget/gtk/DMABufSurface.cpp
++++ b/widget/gtk/DMABufSurface.cpp
+@@ -105,11 +105,21 @@
+ }
+
+ void DMABufSurface::GlobalRefCountImport(int aFd) {
+ MOZ_ASSERT(!mGlobalRefCountFd);
+ mGlobalRefCountFd = aFd;
+- GlobalRefAdd();
++ MOZ_DIAGNOSTIC_ASSERT(IsGlobalRefSet(),
++ "We're importing unreferenced surface!");
++}
++
++int DMABufSurface::GlobalRefCountExport() {
++ if (mGlobalRefCountFd) {
++ MOZ_DIAGNOSTIC_ASSERT(IsGlobalRefSet(),
++ "We're exporting unreferenced surface!");
++ GlobalRefAdd();
++ }
++ return mGlobalRefCountFd;
+ }
+
+ void DMABufSurface::GlobalRefCountDelete() {
+ if (mGlobalRefCountFd) {
+ GlobalRefRelease();
+@@ -475,11 +485,11 @@
+ if (mSync) {
+ fenceFDs.AppendElement(ipc::FileDescriptor(mSyncFd));
+ }
+
+ if (mGlobalRefCountFd) {
+- refCountFDs.AppendElement(ipc::FileDescriptor(mGlobalRefCountFd));
++ refCountFDs.AppendElement(ipc::FileDescriptor(GlobalRefCountExport()));
+ }
+
+ aOutDescriptor = SurfaceDescriptorDMABuf(
+ mSurfaceType, modifiers, mGbmBufferFlags, fds, width, height, width,
+ height, format, strides, offsets, GetYUVColorSpace(), mColorRange,
+@@ -1118,11 +1128,11 @@
+ if (mSync) {
+ fenceFDs.AppendElement(ipc::FileDescriptor(mSyncFd));
+ }
+
+ if (mGlobalRefCountFd) {
+- refCountFDs.AppendElement(ipc::FileDescriptor(mGlobalRefCountFd));
++ refCountFDs.AppendElement(ipc::FileDescriptor(GlobalRefCountExport()));
+ }
+
+ aOutDescriptor = SurfaceDescriptorDMABuf(
+ mSurfaceType, modifiers, 0, fds, width, height, widthBytes, heightBytes,
+ format, strides, offsets, GetYUVColorSpace(), mColorRange, fenceFDs, mUID,
+
bgstack15