// Copyright 2018 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.gpu.magma;

using zx;

[Layout = "Simple"]
protocol Device {
    // Get a parameter.
    Query(uint64 query_id) -> (uint64 result);

    // Get the magma ipc channels.
    Connect(uint64 client_id) -> (handle<channel> primary_channel, handle<channel> notification_channel);

    // Dumps driver and hardware state.
    DumpState(uint32 dump_type);

    // For testing only.
    TestRestart();
};

// Primary declarations.
const uint32 kReceiveBufferSize = 2048;

protocol Primary {
    // Imports a buffer for use in the system driver.
    ImportBuffer(handle<vmo> buffer);

    // Destroys the buffer with |buffer_id| within this connection.
    ReleaseBuffer(zx.koid buffer_id);

    // Imports an object for use in the system driver.
    ImportObject(handle object, uint32 object_type);

    // Destroys the object with |object_id| within this connection.
    ReleaseObject(zx.koid object_id, uint32 object_type);

    // Creates context |context_id|.
    CreateContext(uint32 context_id);

    // Destroys context |context_id|.
    DestroyContext(uint32 context_id);

    // Submits a command buffer for execution on the GPU.
    // Note that the buffer referred to by |command_buffer| must contain a valid
    // magma_system_command_buffer and all associated data structures
    // Transfers ownership of |command_buffer|.
    ExecuteCommandBuffer(handle command_buffer, uint32 context_id);

    // Submits a series of commands for execution on the GPU without using a command buffer.
    ExecuteImmediateCommands(uint32 context_id,
                             bytes:kReceiveBufferSize command_data,
                             vector<zx.koid> semaphores);

    // Retrieve the current magma error status.
    GetError() -> (int32 magma_status);

    // Maps |page_count| pages of |buffer| from |page_offset| onto the GPU in the connection's
    // address space at |gpu_va|.  |flags| is a set of flags from MAGMA_GPU_MAP_FLAGS that
    // specify how the GPU can access the buffer.
    MapBufferGpu(zx.koid buffer_id, uint64 gpu_va, uint64 page_offset,
                 uint64 page_count, uint64 flags);

    // Releases the mapping at |gpu_va| from the GPU.
    // Buffers will also be implicitly unmapped when released.
    UnmapBufferGpu(zx.koid buffer_id, uint64 gpu_va);

    // Ensures that |page_count| pages starting at |page_offset| from the beginning of the
    // buffer are backed by physical memory.
    CommitBuffer(zx.koid buffer_id, uint64 page_offset, uint64 page_count);
};
