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

@transport("Syscall")
closed protocol Framebuffer {
    /// ## Summary
    ///
    /// TODO(https://fxbug.dev/42108078)
    ///
    /// ## Declaration
    ///
    /// ```c
    /// #include <zircon/syscalls.h>
    ///
    /// zx_status_t zx_framebuffer_get_info(zx_handle_t resource,
    ///                                     uint32_t* format,
    ///                                     uint32_t* width,
    ///                                     uint32_t* height,
    ///                                     uint32_t* stride);
    /// ```
    ///
    /// ## Description
    ///
    /// TODO(https://fxbug.dev/42108078)
    ///
    /// ## Rights
    ///
    /// *resource* must have resource kind `ZX_RSRC_KIND_SYSTEM` and resource
    /// base `ZX_RSRC_SYSTEM_FRAMEBUFFER_BASE`.
    ///
    /// ## Return value
    ///
    /// TODO(https://fxbug.dev/42108078)
    ///
    /// ## Errors
    ///
    /// TODO(https://fxbug.dev/42108078)
    ///
    /// ## See also
    ///
    /// TODO(https://fxbug.dev/42108078)
    strict GetInfo(resource struct {
        resource Handle:RESOURCE;
    }) -> (struct {
        format uint32;
        width uint32;
        height uint32;
        stride uint32;
    }) error Status;

    // TODO(https://fxbug.dev/42107929): vmo ZX_OBJ_TYPE_VMO; No rights required?
    /// ## Summary
    ///
    /// TODO(https://fxbug.dev/42108078)
    ///
    /// ## Declaration
    ///
    /// ```c
    /// #include <zircon/syscalls.h>
    ///
    /// zx_status_t zx_framebuffer_set_range(zx_handle_t resource,
    ///                                      zx_handle_t vmo,
    ///                                      uint32_t len,
    ///                                      uint32_t format,
    ///                                      uint32_t width,
    ///                                      uint32_t height,
    ///                                      uint32_t stride);
    /// ```
    ///
    /// ## Description
    ///
    /// TODO(https://fxbug.dev/42108078)
    ///
    /// ## Rights
    ///
    /// *resource* must have resource kind `ZX_RSRC_KIND_SYSTEM` and resource
    /// base `ZX_RSRC_SYSTEM_FRAMEBUFFER_BASE`.
    ///
    /// ## Return value
    ///
    /// TODO(https://fxbug.dev/42108078)
    ///
    /// ## Errors
    ///
    /// TODO(https://fxbug.dev/42108078)
    ///
    /// ## See also
    ///
    /// TODO(https://fxbug.dev/42108078)
    strict SetRange(resource struct {
        resource Handle:RESOURCE;
        vmo Handle:VMO;
        len uint32;
        format uint32;
        width uint32;
        height uint32;
        stride uint32;
    }) -> () error Status;
};
