// 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;
};
