blob: fc378d603756e0088475af4d1b1f0aad076ea081 [file] [log] [blame]
// 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;
// The contents of this file are not final. Incompatible changes are still
// being made to this file. Do not rely on the contents of this file to provide
// backward compatibility (yet).
//
// TODO(fxbug.dev/34192): Sysmem should use llcpp and FIDL tables. The definitions in
// this file are part of that transition, but the definitions here are not
// final. For now, the definition here is only used internally to sysmem (not
// between processes), and therefore this definition can change for now. Later
// after we're happy with this representation, we'll create
// fuchsia.sysmem2.BufferCollection.SetConstraints() which will accept
// constraints as defined here.
type VmoBuffer = resource table {
/// The same VMO can be used by more than one CodecBuffer (only of the same
/// buffer_lifetime_ordinal), but each vmo handle must be a separate handle.
///
/// |vmo| can be un-set if a participant has no usage which requires a
/// VMO handle.
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.
2: vmo_usable_start uint64;
/// In some cases, we have a physically separate aux buffer that is a
/// logical shadow of the main buffer. The main use case so far is DRM L1
/// where we can have a clear aux buffer that has meaningful bytes only for
/// the portions of the input which are clear (not protected). The
/// protected portions will be set to a byte value that will prevent start
/// code emulation (0xFF will work for most video formats).
///
/// |aux_vmo| will be un-set if there are no aux buffers, or in the same
/// cases that |vmo| can be un-set.
3: aux_vmo zx.handle:VMO;
};
const MAX_COUNT_BUFFER_COLLECTION_INFO_BUFFERS uint32 = 128;
/// Information about a buffer collection and its buffers.
// TODO(fxbug.dev/32119): provide a way for clients to receive this table instead of the
// struct fuchsia.sysmem.BufferCollectionInfo_2.
type BufferCollectionInfo = resource table {
/// These settings apply to all the buffers in the initial buffer allocation.
/// This must be set.
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.
2: buffers vector<VmoBuffer>:MAX_COUNT_BUFFER_COLLECTION_INFO_BUFFERS;
};
/// These settings and constraints apply to all the buffers in the collection.
type SingleBufferSettings = table {
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.
type BufferMemorySettings = table {
1: size_bytes uint32;
2: is_physically_contiguous bool;
3: is_secure bool;
4: coherency_domain CoherencyDomain;
/// The specific heap from which buffers are allocated.
/// See above in this file for heap identifier values.
5: heap HeapType;
};