| // 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 <stddef.h> |
| #include <stdint.h> |
| |
| #include <vector> |
| |
| #include "build/build_config.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 <lib/zx/eventpair.h> |
| #include <lib/zx/vmo.h> |
| #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 |
| }; |
| |
| 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<NativePixmapPlane> 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) |
| // Sysmem buffer collection handle. The other end of the eventpair is owned |
| // by the SysmemBufferCollection instance in the GPU process. It will destroy |
| // itself when all handles for the collection are dropped. Eventpair is used |
| // here because they are dupable, nun-fungible and unique. |
| zx::eventpair buffer_collection_handle; |
| 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_ |