// 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.control;

using zx;

@transport("Banjo")
@banjo_layout("ddk-protocol")
protocol GoldfishControl {
    /// Get color buffer for VMO. Fails if VMO is not associated with a color
    /// buffer.
    GetColorBuffer(resource struct {
        vmo zx.handle:VMO;
    }) -> (struct {
        ret zx.status;
        cb uint32;
    });

    /// Create a sync fence on goldfish control device. The fence `event`
    /// argument will signal its peer once all the graphics work already queued
    /// on the EGL display context associated with the device when it is created
    /// has finished.
    /// Returns ZX_ERR_INTERNAL if the device cannot create a fence or cannot
    /// trigger the wait.
    CreateSyncFence(resource struct {
        event zx.handle:EVENTPAIR;
    }) -> (struct {
        ret zx.status;
    });

    /// Connect a channel to a goldfish-pipe FIDL server.
    ConnectToPipeDevice(resource struct {
        channel zx.handle:CHANNEL;
    }) -> (struct {
        ret zx.status;
    });
};
