// Copyright 2015 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UI_GFX_NATIVE_PIXMAP_HANDLE_H_ #define UI_GFX_NATIVE_PIXMAP_HANDLE_H_ #include #include #include #include "base/unguessable_token.h" #include "build/build_config.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gfx/buffer_types.h" #include "ui/gfx/gfx_export.h" #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) #include "base/files/scoped_file.h" #endif #if BUILDFLAG(IS_FUCHSIA) #include #endif namespace gfx { class Size; // NativePixmapPlane is used to carry the plane related information for GBM // buffer. More fields can be added if they are plane specific. struct GFX_EXPORT NativePixmapPlane { NativePixmapPlane(); NativePixmapPlane(int stride, int offset, uint64_t size #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) , base::ScopedFD fd #elif BUILDFLAG(IS_FUCHSIA) , zx::vmo vmo #endif ); NativePixmapPlane(NativePixmapPlane&& other); ~NativePixmapPlane(); NativePixmapPlane& operator=(NativePixmapPlane&& other); // The strides and offsets in bytes to be used when accessing the buffers via // a memory mapping. One per plane per entry. uint32_t stride; uint64_t offset; // Size in bytes of the plane. // This is necessary to map the buffers. uint64_t size; #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) // File descriptor for the underlying memory object (usually dmabuf). base::ScopedFD fd; #elif BUILDFLAG(IS_FUCHSIA) zx::vmo vmo; #endif }; #if BUILDFLAG(IS_FUCHSIA) // Buffer collection ID is used to identify sysmem buffer collections across // processes. using SysmemBufferCollectionId = base::UnguessableToken; #endif struct GFX_EXPORT NativePixmapHandle { // This is the same value as DRM_FORMAT_MOD_INVALID, which is not a valid // modifier. We use this to indicate that layout information // (tiling/compression) if any will be communicated out of band. static constexpr uint64_t kNoModifier = 0x00ffffffffffffffULL; NativePixmapHandle(); NativePixmapHandle(NativePixmapHandle&& other); ~NativePixmapHandle(); NativePixmapHandle& operator=(NativePixmapHandle&& other); std::vector planes; #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) // The modifier is retrieved from GBM library and passed to EGL driver. // Generally it's platform specific, and we don't need to modify it in // Chromium code. Also one per plane per entry. uint64_t modifier = kNoModifier; // WebGPU can directly import the handle to create texture from it. bool supports_zero_copy_webgpu_import = false; #endif #if BUILDFLAG(IS_FUCHSIA) absl::optional buffer_collection_id; uint32_t buffer_index = 0; // Set to true for sysmem buffers which are initialized with RAM coherency // domain. This means that clients that write to the buffers must flush CPU // cache. bool ram_coherency = false; #endif }; // Returns an instance of |handle| which can be sent over IPC. This duplicates // the file-handles, so that the IPC code take ownership of them, without // invalidating |handle|. GFX_EXPORT NativePixmapHandle CloneHandleForIPC(const NativePixmapHandle& handle); // Returns true iff the plane metadata (number of planes, plane size, offset, // and stride) in |handle| corresponds to a buffer that can store an image of // |size| and |format|. This function does not check the plane handles, so even // if this function returns true, it's not guaranteed that the memory objects // referenced by |handle| are consistent with the plane metadata. If // |assume_single_memory_object| is true, this function assumes that all planes // in |handle| reference the same memory object and that all planes are // contained in the range [0, last plane's offset + last plane's size) (and the // plane metadata is validated against this assumption). // // If this function returns true, the caller may make the following additional // assumptions: // // - The stride of each plane can fit in an int (and also in a size_t). // - If |assume_single_memory_object| is true: // - The offset and size of each plane can fit in a size_t. // - The result of offset + size for each plane does not overflow and can fit // in a size_t. GFX_EXPORT bool CanFitImageForSizeAndFormat( const gfx::NativePixmapHandle& handle, const gfx::Size& size, gfx::BufferFormat format, bool assume_single_memory_object); } // namespace gfx #endif // UI_GFX_NATIVE_PIXMAP_HANDLE_H_