1
0
Fork 0
firefox/widget/gtk/DMABufFormats.h
Daniel Baumann 5e9a113729
Adding upstream version 140.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-25 09:37:52 +02:00

134 lines
4 KiB
C++

/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:expandtab:shiftwidth=2:tabstop=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 __MOZ_DMABUF_FORMATS_H__
#define __MOZ_DMABUF_FORMATS_H__
#include "nsTArray.h"
#ifdef MOZ_WAYLAND
struct zwp_linux_dmabuf_v1;
struct zwp_linux_dmabuf_feedback_v1;
struct wl_surface;
#endif
namespace mozilla::widget {
class DMABufFormatTable;
class DMABufFeedback;
#ifndef DRM_FORMAT_MOD_INVALID
# define DRM_FORMAT_MOD_INVALID ((1ULL << 56) - 1)
#endif
// DRMFormat (fourcc) and available modifiers for it.
// Modifiers are sorted from the most preffered one.
class DRMFormat final {
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(DRMFormat)
explicit DRMFormat(uint32_t aFormat) : mFormat(aFormat) {};
DRMFormat(uint32_t aFormat, uint64_t aModifier) : mFormat(aFormat) {
mModifiers.AppendElement(aModifier);
}
DRMFormat(uint32_t aFormat, const nsTArray<uint64_t>& aModifiers)
: mFormat(aFormat), mModifiers(aModifiers.Clone()) {};
DRMFormat(const DRMFormat& aSrc)
: mFormat(aSrc.mFormat), mModifiers(aSrc.mModifiers.Clone()) {}
uint32_t GetFormat() const { return mFormat; }
bool Matches(uint32_t aFormat) const { return mFormat == aFormat; }
bool IsFormatModifierSupported(uint64_t aModifier) const {
return mModifiers.Contains(aModifier);
}
void AddModifier(uint64_t aModifier) {
MOZ_ASSERT(!IsFormatModifierSupported(aModifier), "Added modifier twice?");
mModifiers.AppendElement(aModifier);
}
bool UseModifiers() const {
// Don't use modifiers if we don't have any or we have an invalid one.
return !(mModifiers.IsEmpty() || (mModifiers.Length() == 1 ||
mModifiers[0] == DRM_FORMAT_MOD_INVALID));
}
const uint64_t* GetModifiers(uint32_t& aModifiersNum) {
aModifiersNum = mModifiers.Length();
return mModifiers.Elements();
}
nsTArray<uint64_t>* GetModifiers() { return &mModifiers; }
private:
~DRMFormat() = default;
uint32_t mFormat = 0;
AutoTArray<uint64_t, 15> mModifiers;
};
class DMABufFormats;
using DMABufFormatsCallback = std::function<void(DMABufFormats*)>;
class DMABufFormats final {
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(DMABufFormats)
#ifdef MOZ_WAYLAND
void InitFeedback(zwp_linux_dmabuf_v1* aDMABuf,
const DMABufFormatsCallback& aFormatRefreshCB,
wl_surface* aSurface = nullptr);
void InitV3(zwp_linux_dmabuf_v1* aDMABuf);
void InitV3Done();
#endif
DMABufFeedback* GetDMABufFeedback() { return mDMABufFeedback.get(); }
DMABufFeedback* GetPendingDMABufFeedback();
void PendingDMABufFeedbackDone();
DRMFormat* GetFormat(uint32_t aFormat, bool aRequestScanoutFormat = false);
DMABufFormats();
void EnsureBasicFormats();
private:
~DMABufFormats();
DMABufFormatsCallback mFormatRefreshCallback;
#ifdef MOZ_WAYLAND
zwp_linux_dmabuf_feedback_v1* mWaylandFeedback = nullptr;
#endif
UniquePtr<DMABufFeedback> mDMABufFeedback;
UniquePtr<DMABufFeedback> mPendingDMABufFeedback;
};
#ifdef MOZ_WAYLAND
RefPtr<DMABufFormats> CreateDMABufFeedbackFormats(
wl_surface* aSurface,
const std::function<void(DMABufFormats*)>& aFormatRefreshCB = nullptr);
#endif
class GlobalDMABufFormats final {
public:
DRMFormat* GetDRMFormat(int32_t aFOURCCFormat);
GlobalDMABufFormats();
private:
void LoadFormatModifiers();
void SetModifiersToGfxVars();
void GetModifiersFromGfxVars();
// Formats passed to RDD process to WebGL process
// where we can't get formats/modifiers from Wayland display.
// RGBA formats are mandatory, YUV ones are optional.
RefPtr<DRMFormat> mFormatRGBA;
RefPtr<DRMFormat> mFormatRGBX;
RefPtr<DRMFormat> mFormatP010;
RefPtr<DRMFormat> mFormatNV12;
};
GlobalDMABufFormats* GetGlobalDMABufFormats();
} // namespace mozilla::widget
#endif // __MOZ_DMABUF_FORMATS_H__