| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| library fuchsia.sysmem2; |
| |
| using zx; |
| |
| @available(added=19) |
| type VmoBuffer = resource table { |
| /// `vmo` can be un-set if a participant has only |
| /// [`fuchsia.sysmem2/BufferUsage.none`] set to `NONE_USAGE` (explicitly or |
| /// implicitly by [`fuchsia.sysmem2/BufferCollection.SetConstraints`] |
| /// without `constraints` set). |
| 1: vmo zx.Handle:VMO; |
| |
| /// Offset within the VMO of the first usable byte. Must be < the VMO's size |
| /// in bytes, and leave sufficient room for BufferMemorySettings.size_bytes |
| /// before the end of the VMO. |
| /// |
| /// Currently sysmem will always set this field to 0, and in future, sysmem |
| /// won't set this field to a non-zero value unless all participants have |
| /// explicitly indicated support for non-zero vmo_usable_start (this |
| /// mechanism does not exist as of this comment). A participant that hasn't |
| /// explicitly indicated support for non-zero vmo_usable_start (all current |
| /// clients) should implicitly assume this field is set to 0 without |
| /// actually checking this field. |
| 2: vmo_usable_start uint64; |
| |
| /// This field is set iff `vmo` is a sysmem weak VMO handle. The client must |
| /// keep `close_weak_asap` around for as long as `vmo`, and must notice |
| /// `ZX_EVENTPAIR_PEER_CLOSED`. If that signal occurs, the client must close |
| /// `vmo` asap. Not doing so is considered a VMO leak by the client and in |
| /// that case sysmem will eventually complain loudly via syslog (currently |
| /// 5s later). |
| 3: close_weak_asap zx.Handle:EVENTPAIR; |
| }; |
| |
| /// The maximum entries that can be in the |
| /// [`fuchsia.sysmem2/BufferCollectionInfo.buffers`] field. |
| @available(added=19) |
| const MAX_COUNT_BUFFER_COLLECTION_INFO_BUFFERS uint32 = 128; |
| |
| /// Information about a buffer collection and its buffers. |
| @available(added=19) |
| type BufferCollectionInfo = resource table { |
| /// These settings apply to all the buffers in the initial buffer |
| /// allocation. |
| /// |
| /// This field will always be set by sysmem. |
| 1: settings SingleBufferSettings; |
| |
| /// VMO handles (and vmo_usable_start offset) for each buffer in the |
| /// collection. |
| /// |
| /// The size of this vector is the buffer_count (buffer_count is not sent |
| /// separately). |
| /// |
| /// All buffer VMO handles have identical size and access rights. The size |
| /// is in settings.buffer_settings.size_bytes. |
| /// |
| /// The VMO access rights are determined based on the usages which the |
| /// client specified when allocating the buffer collection. For example, a |
| /// client which expressed a read-only usage will receive VMOs without write |
| /// rights. In addition, the rights can be attenuated by the parameter to |
| /// BufferCollectionToken.Duplicate() calls. |
| /// |
| /// This field will always have VmoBuffer(s) in it, even if the participant |
| /// specifies usage whieh does not require VMO handles. This permits such a |
| /// participant to know the vmo_usable_start values, in case that's of any |
| /// use to the participant. |
| /// |
| /// This field will always be set by sysmem, even if the participant doesn't |
| /// specify any buffer usage (but the [`fuchsia.sysmem2/VmoBuffer.vmo`] |
| /// sub-field within this field won't be set in that case). |
| 2: buffers vector<VmoBuffer>:MAX_COUNT_BUFFER_COLLECTION_INFO_BUFFERS; |
| |
| /// This number is unique among all logical buffer collections per boot. |
| /// |
| /// This ID number will be the same for all BufferCollectionToken(s), |
| /// BufferCollection(s), and BufferCollectionTokenGroup(s) associated with |
| /// the same logical buffer collection (derived from the same root token |
| /// created with fuchsia.sysmem2.Allocator.CreateSharedCollection, or with |
| /// CreateNonSharedCollection). |
| /// |
| /// The same ID can be retrieved from a BufferCollectionToken, |
| /// BufferCollection, or BufferCollectionTokenGroup using |
| /// GetBufferCollectionId (at the cost of a round-trip to sysmem and back). |
| /// |
| /// This field will always be set by sysmem. |
| 3: buffer_collection_id uint64; |
| }; |
| |
| /// These settings and constraints apply to all the buffers in the collection. |
| @available(added=19) |
| type SingleBufferSettings = table { |
| /// This field will always be set by sysmem. |
| 1: buffer_settings BufferMemorySettings; |
| |
| /// Buffers holding data that is not uncompressed image data will not have |
| /// this field set. Buffers holding data that is uncompressed image data |
| /// _may_ have this field set. |
| /// |
| /// At least for now, changing the PixelFormat requires re-allocating |
| /// buffers. |
| /// |
| /// If un-set, there are no image format constraints. |
| 2: image_format_constraints ImageFormatConstraints; |
| }; |
| |
| /// These are memory-related settings for all buffers of a buffer collection. |
| @available(added=19) |
| type BufferMemorySettings = table { |
| /// This field will always be set by sysmem. |
| 1: size_bytes uint64; |
| /// This field will always be set by sysmem. |
| 2: is_physically_contiguous bool; |
| /// This field will always be set by sysmem. |
| 3: is_secure bool; |
| /// This field will always be set by sysmem. |
| 4: coherency_domain CoherencyDomain; |
| /// The specific heap from which buffers are allocated. |
| /// |
| /// This field will always be set by sysmem. |
| 5: heap Heap; |
| }; |