blob: 78dafe08c18e90dad71dbae1f075c78420ad00e5 [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;
type BufferHandleType = strict enum : 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.
type ColorBufferFormatType = strict enum : 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 MEMORY_PROPERTY_DEVICE_LOCAL uint32 = 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 MEMORY_PROPERTY_HOST_VISIBLE uint32 = 0x00000002;
/// Input arguments of `ControlDevice.CreateColorBuffer2()` method.
/// Includes necessary properties of a Vulkan-backed color buffer.
type CreateColorBuffer2Params = table {
/// Width of the color buffer (unit: pixel).
///
/// This argument is mandatory. `CreateColorBuffer2()` method returns
/// `ZX_ERR_INVALID_ARGS` if `width` is missing.
1: width uint32;
/// Height of the color buffer (unit: pixel).
///
/// This argument is mandatory. `CreateColorBuffer2()` method returns
/// `ZX_ERR_INVALID_ARGS` if `height` is missing.
2: height uint32;
/// Color format type of the color buffer.
///
/// This argument is mandatory. `CreateColorBuffer2()` method returns
/// `ZX_ERR_INVALID_ARGS` if `format` is missing.
3: format ColorBufferFormatType;
/// 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: memory_property uint32;
/// 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: physical_address uint64;
};
/// Input arguments of `ControlDevice.CreateBuffer2()` method.
/// Includes necessary properties of a Vulkan-backed data buffer.
type CreateBuffer2Params = table {
/// Size of the buffer (unit: byte).
///
/// This argument is mandatory. `CreateBuffer2()` method returns
/// `ZX_ERR_INVALID_ARGS` if `size` is missing.
1: size uint64;
/// 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: memory_property uint32;
/// 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: physical_address uint64;
};
/// Basic info of a control device buffer handle.
type BufferHandleInfo = table {
// The ColorBuffer/Buffer ID.
1: id uint32;
// Type of the buffer handle.
2: type BufferHandleType;
// Memory property flags the buffer should support. Only bits
// from `fuchsia.hardware.goldfish.MEMORY_PROPERTY_*` are allowed.
3: memory_property uint32;
};
/// Interface for the Goldfish control driver providing color buffers and
/// data buffers.
closed 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.
strict CreateColorBuffer2(resource struct {
vmo zx.Handle:VMO;
create_params CreateColorBuffer2Params;
}) -> (struct {
res zx.Status;
hw_address_page_offset int32;
});
/// 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.
strict CreateBuffer2(resource struct {
vmo zx.Handle:VMO;
create_params CreateBuffer2Params;
}) -> (struct {
hw_address_page_offset int32;
}) 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
strict GetBufferHandle(resource struct {
vmo zx.Handle:VMO;
}) -> (struct {
res zx.Status;
id uint32;
type BufferHandleType;
});
/// 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.
strict GetBufferHandleInfo(resource struct {
vmo zx.Handle:VMO;
}) -> (struct {
info BufferHandleInfo;
}) 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.
strict CreateSyncFence(resource struct {
event zx.Handle:EVENTPAIR;
}) -> () error zx.Status;
};
service ControlService {
device client_end:ControlDevice;
};