| // Copyright 2018 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.sysmem; |
| |
| // Allocates system memory buffers. |
| // |
| // Needs Layout = "Simple" because used with "FIDL Simple C Bindings". |
| [Discoverable, Layout = "Simple"] |
| protocol Allocator { |
| // Allocates a BufferCollection on behalf of a single client (aka initiator) |
| // who is also the only participant (from the point of view of sysmem). |
| // |
| // This call exists mainly for temp/testing purposes. This call skips the |
| // BufferCollectionToken stage, so there's no way to allow another |
| // participant to specify its constraints. |
| // |
| // Real clients are encouraged to use AllocateSharedCollection() instead, |
| // and to let relevant participants directly convey their own constraints to |
| // sysmem. |
| // |
| // |constraints| indicates constraints on the buffer collection, such as how |
| // many buffers to allocate, buffer size constraints, etc. |
| // |
| // |collection| is the server end of the BufferCollection FIDL channel. The |
| // client can call SetConstraints() and then WaitForBuffersAllocated() on |
| // the client end of this channel to specify constraints and then determine |
| // success/failure and get the BufferCollectionInfo_2 for the |
| // BufferCollection. The client should also keep the client end of |
| // this channel open while using the BufferCollection, and should notice |
| // when this channel closes and stop using the BufferCollection ASAP. |
| AllocateNonSharedCollection(request<BufferCollection> collection); |
| |
| // Creates a logical BufferCollectionToken which can be shared among |
| // participants (using BufferCollectionToken.Duplicate()), and then |
| // converted into a BufferCollection using BindSharedCollection(). |
| // |
| // Success/failure to populate the BufferCollection with buffers is |
| // determined via the BufferCollection interface. |
| AllocateSharedCollection(request<BufferCollectionToken> token_request); |
| |
| // Convert a BufferCollectionToken into a connection to the logical |
| // BufferCollection. The BufferCollection hasn't yet been populated with |
| // buffers - the participant must first also send SetConstraints() via the |
| // client end of buffer_collection. |
| // |
| // All BufferCollectionToken(s) duplicated from a logical |
| // BufferCollectionToken created via AllocateSharedCollection() must be |
| // turned in via BindSharedCollection() before the logical BufferCollection |
| // will be populated with buffers. |
| // |
| // |token| the client endpoint of a channel whose server end was sent to |
| // sysmem using AllocateSharedCollection or whose server end was sent to |
| // sysmem using BufferCollectionToken.Duplicate(). The token is being |
| // "exchanged" for a channel to the logical BufferCollection. |
| // |
| // |buffer_collection| the server end of a BufferCollection channel. The |
| // sender retains the client end as usual. The BufferCollection channel |
| // is a single participant's connection to the logical BufferCollection. |
| // There typically will be other participants with their own |
| // BufferCollection channel to the logical BufferCollection. |
| BindSharedCollection(BufferCollectionToken token, |
| request<BufferCollection> buffer_collection_request); |
| }; |