| // 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. |
| |
| #ifndef GARNET_LIB_MAGMA_SRC_MAGMA_UTIL_PLATFORM_PLATFORM_CONNECTION_H_ |
| #define GARNET_LIB_MAGMA_SRC_MAGMA_UTIL_PLATFORM_PLATFORM_CONNECTION_H_ |
| |
| #include "magma.h" |
| #include "magma_util/macros.h" |
| #include "magma_util/status.h" |
| #include "msd_defs.h" |
| #include "platform_buffer.h" |
| #include "platform_event.h" |
| #include "platform_object.h" |
| #include "platform_semaphore.h" |
| #include "platform_thread.h" |
| |
| #include <memory> |
| |
| namespace magma { |
| |
| class PlatformConnection { |
| public: |
| class Delegate { |
| public: |
| virtual ~Delegate() {} |
| virtual bool ImportBuffer(uint32_t handle, uint64_t* buffer_id_out) = 0; |
| virtual bool ReleaseBuffer(uint64_t buffer_id) = 0; |
| |
| virtual bool ImportObject(uint32_t handle, PlatformObject::Type object_type) = 0; |
| virtual bool ReleaseObject(uint64_t object_id, PlatformObject::Type object_type) = 0; |
| |
| virtual bool CreateContext(uint32_t context_id) = 0; |
| virtual bool DestroyContext(uint32_t context_id) = 0; |
| |
| virtual magma::Status ExecuteCommandBuffer(uint32_t command_buffer_handle, |
| uint32_t context_id) = 0; |
| |
| virtual bool MapBufferGpu(uint64_t buffer_id, uint64_t gpu_va, uint64_t page_offset, |
| uint64_t page_count, uint64_t flags) = 0; |
| virtual bool UnmapBufferGpu(uint64_t buffer_id, uint64_t gpu_va) = 0; |
| virtual bool CommitBuffer(uint64_t buffer_id, uint64_t page_offset, |
| uint64_t page_count) = 0; |
| virtual void SetNotificationCallback(msd_connection_notification_callback_t callback, |
| void* token) = 0; |
| virtual magma::Status ExecuteImmediateCommands(uint32_t context_id, uint64_t commands_size, |
| void* commands, uint64_t semaphore_count, |
| uint64_t* semaphore_ids) = 0; |
| }; |
| |
| PlatformConnection(std::shared_ptr<magma::PlatformEvent> shutdown_event) |
| : shutdown_event_(std::move(shutdown_event)) |
| { |
| } |
| |
| virtual ~PlatformConnection() {} |
| |
| static std::shared_ptr<PlatformConnection> Create(std::unique_ptr<Delegate> Delegate); |
| virtual uint32_t GetClientEndpoint() = 0; |
| // This handle is used to asynchronously return information to the client. |
| virtual uint32_t GetClientNotificationEndpoint() = 0; |
| |
| // handles a single request, returns false if anything has put it into an illegal state |
| // or if the remote has closed |
| virtual bool HandleRequest() = 0; |
| |
| std::shared_ptr<magma::PlatformEvent> ShutdownEvent() { return shutdown_event_; } |
| |
| static void RunLoop(std::shared_ptr<magma::PlatformConnection> connection) |
| { |
| magma::PlatformThreadHelper::SetCurrentThreadName("ConnectionThread"); |
| while (connection->HandleRequest()) |
| ; |
| // the runloop terminates when the remote closes, or an error is experienced |
| // so this is the apropriate time to let the connection go out of scope and be destroyed |
| } |
| |
| private: |
| std::shared_ptr<magma::PlatformEvent> shutdown_event_; |
| }; |
| |
| } // namespace magma |
| |
| #endif // GARNET_LIB_MAGMA_SRC_MAGMA_UTIL_PLATFORM_PLATFORM_CONNECTION_H_ |