summaryrefslogtreecommitdiffstats
path: root/widget/gtk/WaylandBuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/gtk/WaylandBuffer.h')
-rw-r--r--widget/gtk/WaylandBuffer.h140
1 files changed, 140 insertions, 0 deletions
diff --git a/widget/gtk/WaylandBuffer.h b/widget/gtk/WaylandBuffer.h
new file mode 100644
index 0000000000..34bdb87ff5
--- /dev/null
+++ b/widget/gtk/WaylandBuffer.h
@@ -0,0 +1,140 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef _MOZILLA_WIDGET_GTK_WAYLAND_BUFFER_H
+#define _MOZILLA_WIDGET_GTK_WAYLAND_BUFFER_H
+
+#include "DMABufSurface.h"
+#include "GLContext.h"
+#include "MozFramebuffer.h"
+#include "mozilla/gfx/2D.h"
+#include "mozilla/gfx/Types.h"
+#include "mozilla/Mutex.h"
+#include "nsTArray.h"
+#include "nsWaylandDisplay.h"
+#include "base/shared_memory.h"
+
+namespace mozilla::widget {
+
+// Allocates and owns shared memory for Wayland drawing surface
+class WaylandShmPool {
+ public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WaylandShmPool);
+
+ static RefPtr<WaylandShmPool> Create(nsWaylandDisplay* aWaylandDisplay,
+ int aSize);
+
+ wl_shm_pool* GetShmPool() { return mShmPool; };
+ void* GetImageData();
+
+ private:
+ WaylandShmPool() = default;
+ ~WaylandShmPool();
+
+ wl_shm_pool* mShmPool = nullptr;
+ void* mImageData = nullptr;
+ UniquePtr<base::SharedMemory> mShm;
+ int mSize = 0;
+};
+
+class WaylandBuffer {
+ public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WaylandBuffer);
+
+ void AttachAndCommit(wl_surface* aSurface);
+ virtual wl_buffer* GetWlBuffer() = 0;
+ virtual already_AddRefed<gfx::DrawTarget> Lock() { return nullptr; };
+ virtual void* GetImageData() { return nullptr; }
+ virtual GLuint GetTexture() { return 0; }
+ virtual void DestroyGLResources(){};
+
+ LayoutDeviceIntSize GetSize() { return mSize; };
+ bool IsMatchingSize(const LayoutDeviceIntSize& aSize) {
+ return aSize == mSize;
+ }
+ bool IsAttached() { return mAttached; }
+ static gfx::SurfaceFormat GetSurfaceFormat() { return mFormat; }
+
+ static void BufferReleaseCallbackHandler(void* aData, wl_buffer* aBuffer);
+ void SetBufferReleaseFunc(void (*aBufferReleaseFunc)(void* aData,
+ wl_buffer* aBuffer)) {
+ mBufferReleaseFunc = aBufferReleaseFunc;
+ }
+ void SetBufferReleaseData(void* aBufferReleaseData) {
+ mBufferReleaseData = aBufferReleaseData;
+ }
+
+ protected:
+ explicit WaylandBuffer(const LayoutDeviceIntSize& aSize);
+ virtual ~WaylandBuffer() = default;
+
+ void BufferReleaseCallbackHandler(wl_buffer* aBuffer);
+
+ LayoutDeviceIntSize mSize;
+ bool mAttached = false;
+ void (*mBufferReleaseFunc)(void* aData, wl_buffer* aBuffer) = nullptr;
+ void* mBufferReleaseData = nullptr;
+ static gfx::SurfaceFormat mFormat;
+};
+
+// Holds actual graphics data for wl_surface
+class WaylandBufferSHM final : public WaylandBuffer {
+ public:
+ static RefPtr<WaylandBufferSHM> Create(const LayoutDeviceIntSize& aSize);
+
+ wl_buffer* GetWlBuffer() override { return mWLBuffer; };
+ already_AddRefed<gfx::DrawTarget> Lock() override;
+ void* GetImageData() override { return mShmPool->GetImageData(); }
+
+ void Clear();
+ size_t GetBufferAge() { return mBufferAge; };
+ RefPtr<WaylandShmPool> GetShmPool() { return mShmPool; }
+
+ void IncrementBufferAge() { mBufferAge++; };
+ void ResetBufferAge() { mBufferAge = 0; };
+
+#ifdef MOZ_LOGGING
+ void DumpToFile(const char* aHint);
+#endif
+
+ private:
+ explicit WaylandBufferSHM(const LayoutDeviceIntSize& aSize);
+ ~WaylandBufferSHM() override;
+
+ // WaylandShmPoolMB provides actual shared memory we draw into
+ RefPtr<WaylandShmPool> mShmPool;
+
+ // wl_buffer is a wayland object that encapsulates the shared memory
+ // and passes it to wayland compositor by wl_surface object.
+ wl_buffer* mWLBuffer = nullptr;
+
+ size_t mBufferAge = 0;
+
+#ifdef MOZ_LOGGING
+ static int mDumpSerial;
+ static char* mDumpDir;
+#endif
+};
+
+class WaylandBufferDMABUF final : public WaylandBuffer {
+ public:
+ static RefPtr<WaylandBufferDMABUF> Create(const LayoutDeviceIntSize& aSize,
+ gl::GLContext* aGL);
+
+ wl_buffer* GetWlBuffer() override { return mDMABufSurface->GetWlBuffer(); };
+ GLuint GetTexture() override { return mDMABufSurface->GetTexture(); };
+ void DestroyGLResources() override { mDMABufSurface->ReleaseTextures(); };
+
+ private:
+ explicit WaylandBufferDMABUF(const LayoutDeviceIntSize& aSize);
+ ~WaylandBufferDMABUF() = default;
+
+ RefPtr<DMABufSurfaceRGBA> mDMABufSurface;
+};
+
+} // namespace mozilla::widget
+
+#endif // _MOZILLA_WIDGET_GTK_WAYLAND_BUFFER_H