blob: 7c00348f5178fe8117bdb68f6330cffdb1ad2428 [file] [log] [blame]
// Copyright 2019 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.hardware.goldfish;
using zx;
enum BufferHandleType : uint32 {
INVALID = 0;
BUFFER = 1;
COLOR_BUFFER = 2;
};
/// Color buffer formats.
///
/// Goldfish control device accepts GL format values as "internalFormat"
/// argument when creating color buffers. All format types should be
/// defined using their format definitions in GL headers.
enum ColorBufferFormatType : uint32 {
// Equals to GL_LUMINANCE
LUMINANCE = 0x1909;
// Equals to GL_RG
RG = 0x8227;
// Equals to GL_RGBA
RGBA = 0x1908;
// Equals to GL_BGRA
BGRA = 0x80E1;
};
/// Memory property flags for color buffers and data buffers.
///
/// `MEMORY_PROPERTY_DEVICE_LOCAL` corresponds to Vulkan's memory property
/// `VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT`. Memory allocated with this type
/// is the most efficient for device access.
const uint32 MEMORY_PROPERTY_DEVICE_LOCAL = 0x00000001;
/// `MEMORY_PROPERTY_HOST_VISIBLE` corresponds to Vulkan's memory property
/// `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT`. Memory allocated with this type
/// can be mapped for host access using `vkMapMemory()`.
const uint32 MEMORY_PROPERTY_HOST_VISIBLE = 0x00000002;
/// Input arguments of `ControlDevice.CreateColorBuffer2()` method.
/// Includes necessary properties of a Vulkan-backed color buffer.
table CreateColorBuffer2Params {
/// Width of the color buffer (unit: pixel).
///
/// This argument is mandatory. `CreateColorBuffer2()` method returns
/// `ZX_ERR_INVALID_ARGS` if `width` is missing.
1: uint32 width;
/// Height of the color buffer (unit: pixel).
///
/// This argument is mandatory. `CreateColorBuffer2()` method returns
/// `ZX_ERR_INVALID_ARGS` if `height` is missing.
2: uint32 height;
/// Color format type of the color buffer.
///
/// This argument is mandatory. `CreateColorBuffer2()` method returns
/// `ZX_ERR_INVALID_ARGS` if `format` is missing.
3: ColorBufferFormatType format;
/// Memory property flags the color buffer should support. Only bits
/// from `fuchsia.hardware.goldfish.MEMORY_PROPERTY_*` are allowed.
///
/// This argument is mandatory. `CreateColorBuffer2()` method returns
/// `ZX_ERR_INVALID_ARGS` if `memory_property` is missing.
4: uint32 memory_property;
/// Goldfish address space device allocates a physical memory address
/// for each host-visible color buffer. This address is mapped to a
/// corresponding hardware address when that host-visible
/// color buffer is created, and is unmapped when the color buffer is
/// torn down.
///
/// This field stores the physical memory address allocated by address
/// space device.
///
/// If `memory_property` has the bit `MEMORY_PROPERTY_HOST_VISIBLE` set,
/// this argument is mandatory. If `physical_address` is missing,
/// `CreateColorBuffer2()` returns `ZX_ERR_INVALID_ARGS`.
///
/// If `memory_property` doesn't have the `MEMORY_PROPERTY_HOST_VISIBLE`
/// bit, this argument is ignored.
5: uint64 physical_address;
};
/// Input arguments of `ControlDevice.CreateBuffer2()` method.
/// Includes necessary properties of a Vulkan-backed data buffer.
table CreateBuffer2Params {
/// Size of the buffer (unit: byte).
///
/// This argument is mandatory. `CreateBuffer2()` method returns
/// `ZX_ERR_INVALID_ARGS` if `size` is missing.
1: uint64 size;
/// Memory property flags the buffer should support. Only bits
/// from `fuchsia.hardware.goldfish.MEMORY_PROPERTY_*` are allowed.
///
/// This argument is mandatory. `CreateBuffer2()` method returns
/// `ZX_ERR_INVALID_ARGS` if `memory_property` is missing.
2: uint32 memory_property;
/// Goldfish address space device allocates a physical memory address
/// for each host-visible buffer. This address is mapped to a
/// corresponding hardware address when that host-visible buffer is
/// created, and is unmapped when the buffer is torn down.
///
/// This field stores the physical memory address allocated by address
/// space device.
///
/// If `memory_property` has the bit `MEMORY_PROPERTY_HOST_VISIBLE` set,
/// this argument is mandatory. If `physical_address` is missing,
/// `CreateBuffer2()` returns `ZX_ERR_INVALID_ARGS`.
///
/// If `memory_property` doesn't have the `MEMORY_PROPERTY_HOST_VISIBLE`
/// bit, this argument is ignored.
3: uint64 physical_address;
};
/// Basic info of a control device buffer handle.
table BufferHandleInfo {
// The ColorBuffer/Buffer ID.
1: uint32 id;
// Type of the buffer handle.
2: BufferHandleType type;
// Memory property flags the buffer should support. Only bits
// from `fuchsia.hardware.goldfish.MEMORY_PROPERTY_*` are allowed.
3: uint32 memory_property;
};
/// Interface for the Goldfish control driver providing color buffers and
/// data buffers.
protocol ControlDevice {
/// Create shared color buffer. Color buffer is automatically freed when
/// all references to `vmo` have been closed. Fails if VMO is not
/// associated with goldfish heap memory.
///
/// Arguments
/// Refer to `CreateColorBuffer2Params` for input arguments.
///
/// Return value
/// `res`: `ZX_ERR_ALREADY_EXISTS` if a buffer or color buffer has
/// already been created for this VMO.
/// `ZX_ERR_INVALID_ARGS` if arguments are invalid.
/// (see `CreateColorBuffer2Params`)
/// Otherwise returns `ZX_OK`.
/// `hw_address_page_offset`: memory page offset of the buffer's
/// hardware-mapped memory. For color buffers with HOST_VISIBLE
/// memory property bits, this value is a non-negative
/// integer in [0, 4095]. For non-HOST_VISIBLE memory or
/// failed allocation, this value is negative.
CreateColorBuffer2(zx.handle:VMO vmo,
CreateColorBuffer2Params create_params)
-> (zx.status res, int32 hw_address_page_offset);
/// Create shared data buffer. Buffer is automatically freed when
/// all references to `vmo` have been closed. Fails if VMO is not
/// associated with goldfish heap memory.
///
/// Arguments
/// Refer to `CreateBuffer2Params` for input arguments.
///
/// Return value
/// Error:
/// - `ZX_ERR_ALREADY_EXISTS` if a buffer or color buffer has
/// already been created for this VMO.
/// - `ZX_ERR_INVALID_ARGS` if arguments are invalid.
/// (see `CreateBuffer2Params`)
///
/// `hw_address_page_offset`:
/// Memory page offset of the buffer's hardware-mapped memory.
/// For buffers with HOST_VISIBLE memory property bits, this
/// value is a non-negative integer in [0, 4095]. For
/// non-HOST_VISIBLE memory, this value is negative.
CreateBuffer2(zx.handle:VMO vmo, CreateBuffer2Params create_params)
-> (int32 hw_address_page_offset) error zx.status;
/// Get a buffer handle for VMO and the type of the handle.
/// Fails if VMO is not associated with neither a color buffer nor a buffer.
///
/// Deprecated. Use `GetBufferHandleInfo()` instead.
[Deprecated]
GetBufferHandle(zx.handle:VMO vmo)
-> (zx.status res, uint32 id, BufferHandleType type);
/// Get the info of buffer handle from a given VMO.
///
/// Return value
/// Error:
/// - `ZX_ERR_INVALID_ARGS` if given `vmo` is invalid.
/// - `ZX_ERR_NOT_FOUND` if `vmo` is not associated with any created
/// goldfish Buffer or ColorBuffer.
///
/// `info`: a BufferHandleInfo object containing the buffer id, type
/// and memory information.
GetBufferHandleInfo(zx.handle:VMO vmo) -> (BufferHandleInfo info) error zx.status;
/// Create a sync fence on goldfish control device. Client pass half of an
/// eventpair to this method, and `event` will signal its peer when all the
/// graphics work already queued on the EGL display context associated with
/// the control device when it is created has finished.
///
/// Errors:
/// - ZX_ERR_INTERNAL if device fail to create the fence or fail to
/// trigger the wait.
CreateSyncFence(zx.handle:EVENTPAIR event) -> () error zx.status;
};