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