// Copyright 2016 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.

#include "magma.h"
#include "magma_sysmem.h"
#include "magma_util/dlog.h"
#include "magma_util/macros.h"
#include "platform_buffer.h"
#include "platform_semaphore.h"

#include <unordered_map>

std::unordered_map<uint32_t, magma::PlatformBuffer*> exported_buffers;
std::unordered_map<uint32_t, magma::PlatformSemaphore*> exported_semaphores;

class MockConnection : public magma_connection {
public:
    uint32_t next_context_id() { return next_context_id_++; }

private:
    uint32_t next_context_id_ = 1;
};

magma_status_t magma_create_connection(int32_t fd, magma_connection_t* connection_out)
{
    *connection_out = new MockConnection();
    return MAGMA_STATUS_OK;
}

void magma_release_connection(magma_connection_t connection)
{
    delete static_cast<MockConnection*>(connection);
}

magma_status_t magma_get_error(magma_connection_t connection) { return MAGMA_STATUS_OK; }

magma_status_t magma_query(int32_t fd, uint64_t id, uint64_t* value_out)
{
    switch (id) {
        case MAGMA_QUERY_DEVICE_ID:
            *value_out = 0x1916;
            return MAGMA_STATUS_OK;
        case MAGMA_QUERY_VENDOR_PARAM_0:
            *value_out = (23l << 32) | 8;
            return MAGMA_STATUS_OK;
        case MAGMA_QUERY_VENDOR_PARAM_0 + 1: // gtt size
            *value_out = 1ull << 32;
            return MAGMA_STATUS_OK;
        case MAGMA_QUERY_VENDOR_PARAM_0 + 2: // extra page count
            *value_out = 0;
            return MAGMA_STATUS_OK;
    }
    return MAGMA_STATUS_INVALID_ARGS;
}

magma_status_t magma_query_returns_buffer(int32_t file_descriptor, uint64_t id,
                                          uint32_t* handle_out)
{
    return MAGMA_STATUS_INVALID_ARGS;
}

void magma_create_context(magma_connection_t connection, uint32_t* context_id_out)
{
    *context_id_out = static_cast<MockConnection*>(connection)->next_context_id();
}

void magma_release_context(magma_connection_t connection, uint32_t context_id) {}

magma_status_t magma_create_buffer(magma_connection_t connection, uint64_t size, uint64_t* size_out,
                                   magma_buffer_t* buffer_out)
{
    auto buffer = magma::PlatformBuffer::Create(size, "magma-alloc");
    *buffer_out = reinterpret_cast<magma_buffer_t>(buffer.release());
    *size_out = size;
    return MAGMA_STATUS_OK;
}

void magma_release_buffer(magma_connection_t connection, magma_buffer_t buffer)
{
    delete reinterpret_cast<magma::PlatformBuffer*>(buffer);
}

uint64_t magma_get_buffer_id(magma_buffer_t buffer)
{
    return reinterpret_cast<magma::PlatformBuffer*>(buffer)->id();
}

uint64_t magma_get_buffer_size(magma_buffer_t buffer)
{
    return reinterpret_cast<magma::PlatformBuffer*>(buffer)->size();
}

magma_status_t magma_map(magma_connection_t connection, magma_buffer_t buffer, void** addr_out)
{
    if (!reinterpret_cast<magma::PlatformBuffer*>(buffer)->MapCpu(addr_out))
        return MAGMA_STATUS_MEMORY_ERROR;
    return MAGMA_STATUS_OK;
}

magma_status_t magma_map_aligned(magma_connection_t connection, magma_buffer_t buffer,
                                 uint64_t alignment, void** addr_out)
{
    if (!reinterpret_cast<magma::PlatformBuffer*>(buffer)->MapCpu(addr_out, alignment))
        return MAGMA_STATUS_MEMORY_ERROR;
    return MAGMA_STATUS_OK;
}

magma_status_t magma_unmap(magma_connection_t connection, magma_buffer_t buffer)
{
    if (!reinterpret_cast<magma::PlatformBuffer*>(buffer)->UnmapCpu())
        return MAGMA_STATUS_MEMORY_ERROR;
    return MAGMA_STATUS_OK;
}

magma_status_t magma_set_cache_policy(magma_buffer_t buffer, magma_cache_policy_t policy)
{
    return MAGMA_STATUS_OK;
}

magma_status_t magma_set_buffer_mapping_address_range(magma_buffer_t buffer, uint32_t handle)
{
    return MAGMA_STATUS_OK;
}

magma_status_t magma_create_command_buffer(magma_connection_t connection, uint64_t size,
                                           magma_buffer_t* buffer_out)
{
    uint64_t size_out;
    return magma_create_buffer(connection, size, &size_out, buffer_out);
}

void magma_release_command_buffer(magma_connection_t connection, magma_buffer_t command_buffer)
{
    magma_release_buffer(connection, command_buffer);
}

void magma_submit_command_buffer(magma_connection_t connection, uint64_t command_buffer_id,
                                 uint32_t context_id)
{
    DLOG("magma_system submit command buffer - STUB");
}

void magma_execute_immediate_commands(magma_connection_t connection, uint32_t context_id,
                                      uint64_t command_count,
                                      struct magma_system_inline_command_buffer* command_buffers)
{
}

void magma_execute_immediate_commands2(magma_connection_t connection, uint32_t context_id,
                                       uint64_t command_count,
                                       struct magma_inline_command_buffer* command_buffers)
{
}

magma_status_t magma_export(magma_connection_t connection, magma_buffer_t buffer,
                            uint32_t* buffer_handle_out)
{
    uint32_t handle;
    reinterpret_cast<magma::PlatformBuffer*>(buffer)->duplicate_handle(&handle);
    exported_buffers[handle] = magma::PlatformBuffer::Import(handle).release();
    *buffer_handle_out = handle;
    return MAGMA_STATUS_OK;
}

magma_status_t magma_import(magma_connection_t connection, uint32_t buffer_handle,
                            magma_buffer_t* buffer_out)
{
    *buffer_out = reinterpret_cast<magma_buffer_t>(exported_buffers[buffer_handle]);
    exported_buffers.erase(buffer_handle);
    return MAGMA_STATUS_OK;
}

magma_status_t magma_create_semaphore(magma_connection_t connection,
                                      magma_semaphore_t* semaphore_out)
{
    *semaphore_out =
        reinterpret_cast<magma_semaphore_t>(magma::PlatformSemaphore::Create().release());
    return MAGMA_STATUS_OK;
}

void magma_release_semaphore(magma_connection_t connection, magma_semaphore_t semaphore)
{
    delete reinterpret_cast<magma::PlatformSemaphore*>(semaphore);
}

uint64_t magma_get_semaphore_id(magma_semaphore_t semaphore)
{
    return reinterpret_cast<magma::PlatformSemaphore*>(semaphore)->id();
}

void magma_signal_semaphore(magma_semaphore_t semaphore) {}

void magma_reset_semaphore(magma_semaphore_t semaphore) {}

magma_status_t magma_wait_semaphores(const magma_semaphore_t* semaphore, uint32_t count,
                                     uint64_t timeout, magma_bool_t wait_all)
{
    return MAGMA_STATUS_OK;
}

magma_status_t magma_export_semaphore(magma_connection_t connection, magma_semaphore_t semaphore,
                                      uint32_t* semaphore_handle_out)
{
    uint32_t handle;
    reinterpret_cast<magma::PlatformSemaphore*>(semaphore)->duplicate_handle(&handle);
    exported_semaphores[handle] = magma::PlatformSemaphore::Import(handle).release();
    *semaphore_handle_out = handle;
    return MAGMA_STATUS_OK;
}

magma_status_t magma_import_semaphore(magma_connection_t connection, uint32_t semaphore_handle,
                                      magma_semaphore_t* semaphore_out)
{
    *semaphore_out = reinterpret_cast<magma_semaphore_t>(exported_semaphores[semaphore_handle]);
    exported_semaphores.erase(semaphore_handle);
    return MAGMA_STATUS_OK;
}

void magma_map_buffer_gpu(magma_connection_t connection, magma_buffer_t buffer, uint64_t gpu_va,
                          uint64_t page_offset, uint64_t page_count, uint64_t map_flags)
{
}

void magma_unmap_buffer_gpu(magma_connection_t connection, magma_buffer_t buffer, uint64_t gpu_va)
{
}

uint32_t magma_get_notification_channel_handle(magma_connection_t connection) { return 0; }

magma_status_t magma_read_notification_channel(magma_connection_t connection, void* buffer,
                                               uint64_t buffer_size, uint64_t* buffer_size_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_wait_notification_channel(magma_connection_t connection, int64_t timeout_ns)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_buffer_collection_import(magma_sysmem_connection_t connection, uint32_t handle,
                                              magma_buffer_collection_t* collection_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_sysmem_connection_create(magma_sysmem_connection_t* connection_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

void magma_sysmem_connection_release(magma_sysmem_connection_t connection) {}

void magma_buffer_collection_release(magma_sysmem_connection_t connection,
                                     magma_buffer_collection_t collection)
{
}

magma_status_t
magma_buffer_constraints_create(magma_sysmem_connection_t connection,
                                const magma_buffer_format_constraints_t* buffer_constraints,
                                magma_sysmem_buffer_constraints_t* constraints_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t
magma_buffer_constraints_set_format(magma_sysmem_connection_t connection,
                                    magma_sysmem_buffer_constraints_t constraints, uint32_t index,
                                    const magma_image_format_constraints_t* format_constraints)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

void magma_buffer_constraints_release(magma_sysmem_connection_t connection,
                                      magma_sysmem_buffer_constraints_t constraints)
{
}

magma_status_t
magma_buffer_collection_set_constraints(magma_sysmem_connection_t connection,
                                        magma_buffer_collection_t collection,
                                        magma_sysmem_buffer_constraints_t constraints)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_get_buffer_coherency_domain(magma_buffer_format_description_t description,
                                                 uint32_t* coherency_domain_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t
magma_get_buffer_format_description(const void* image_data, uint64_t image_data_size,
                                    magma_buffer_format_description_t* description_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_get_buffer_format_plane_info(magma_buffer_format_description_t description,
                                                  magma_image_plane_t* image_planes_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t
magma_get_buffer_format_plane_info_with_size(magma_buffer_format_description_t description,
                                             uint32_t width, uint32_t height,
                                             magma_image_plane_t* image_planes_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

void magma_buffer_format_description_release(magma_buffer_format_description_t description) {}

magma_status_t magma_get_buffer_format_modifier(magma_buffer_format_description_t description,
                                                magma_bool_t* has_format_modifier_out,
                                                uint64_t* format_modifier_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_sysmem_get_description_from_collection(
    magma_sysmem_connection_t connection, magma_buffer_collection_t collection,
    magma_buffer_format_description_t* buffer_format_description_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_sysmem_get_buffer_handle_from_collection(magma_sysmem_connection_t connection,
                                                              magma_buffer_collection_t collection,
                                                              uint32_t index,
                                                              uint32_t* buffer_handle_out,
                                                              uint32_t* vmo_offset_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_get_buffer_count(magma_buffer_format_description_t description,
                                      uint32_t* count_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_get_buffer_is_secure(magma_buffer_format_description_t description,
                                          magma_bool_t* is_secure_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_get_buffer_cache_policy(magma_buffer_t buffer,
                                             magma_cache_policy_t* cache_policy_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_get_buffer_is_mappable(magma_buffer_t buffer, uint32_t flags,
                                            magma_bool_t* is_mappable_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_duplicate_handle(uint32_t buffer_handle, uint32_t* buffer_handle_out)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_release_buffer_handle(uint32_t buffer_handle)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

magma_status_t magma_clean_cache(magma_buffer_t buffer, uint64_t offset, uint64_t size,
                                 magma_cache_operation_t operation)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}

void magma_commit_buffer(magma_connection_t connection, magma_buffer_t buffer, uint64_t page_offset,
                         uint64_t page_count)
{
}

magma_status_t magma_map_specific(magma_connection_t connection, magma_buffer_t buffer,
                                  uint64_t addr, uint64_t offset, uint64_t length)
{
    return MAGMA_STATUS_UNIMPLEMENTED;
}
