// 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.
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(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.
    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
    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.
    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.
    CreateSyncFence(resource struct {
        event zx.handle:EVENTPAIR;
    }) -> (struct {}) error zx.status;
};
