// Copyright 2021 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.opencl.loader;

using zx;

type Features = flexible bits {
    /// Implements Get().
    GET = 1;
    /// Implements ConnectToDeviceFs().
    CONNECT_TO_DEVICE_FS = 2;
    /// Implements ConnectToManifestFs().
    CONNECT_TO_MANIFEST_FS = 4;
};

type ConnectToManifestOptions = flexible bits {
    /// Wait for the loader to finish processing current ICD loading/unloading
    /// operations before completing the connection.
    WAIT_FOR_IDLE = 1;
};

/// Service to provide opencl libraries to the loader.
@discoverable
closed protocol Loader {
    /// Requests a client driver library with the given name from the opencl loader
    /// service. Returns a VMO suitable for loading as a dynamic library on
    /// success, a null handle on failure.
    strict Get(struct {
        name string:64;
    }) -> (resource struct {
        lib zx.Handle:<VMO, optional>;
    });

    /// Connects to a FS serving fuchsia.io containing all OpenCL ICD manifests.
    /// Manifests will always appear in this directory after the relevant device
    /// appears in `ConnectToDeviceFs()`.
    strict ConnectToManifestFs(resource struct {
        options ConnectToManifestOptions;
        channel zx.Handle:CHANNEL;
    });

    /// Connects to a FS serving fuchsia.io containing all device nodes
    /// potentially relevant to ICDs.  /dev/<devname> will be served under
    /// <devname> in this directory.
    strict ConnectToDeviceFs(resource struct {
        channel zx.Handle:CHANNEL;
    });

    /// Returns the set of features the loader service supports.
    strict GetSupportedFeatures() -> (struct {
        features Features;
    });
};
