[magma] APIv3: add flags to semaphore import

This allows for one-shot semaphores, which are not reset after wait.

Change-Id: I53cbdaae4304a16e8c3b64fdd721f5640970bb67
diff --git a/sdk/fidl/fuchsia.gpu.magma/fuchsia.gpu.magma.api b/sdk/fidl/fuchsia.gpu.magma/fuchsia.gpu.magma.api
index 7e6646ea..7916a06 100644
--- a/sdk/fidl/fuchsia.gpu.magma/fuchsia.gpu.magma.api
+++ b/sdk/fidl/fuchsia.gpu.magma/fuchsia.gpu.magma.api
@@ -1,3 +1,3 @@
 {
-  "fidl/fuchsia.gpu.magma": "3daa900dc08dc5a9944e62ff1fc92b65"
+  "fidl/fuchsia.gpu.magma": "97295598ebe9890fba8d633abf389496"
 }
\ No newline at end of file
diff --git a/sdk/fidl/fuchsia.gpu.magma/magma.fidl b/sdk/fidl/fuchsia.gpu.magma/magma.fidl
index 6834245..25675e1 100644
--- a/sdk/fidl/fuchsia.gpu.magma/magma.fidl
+++ b/sdk/fidl/fuchsia.gpu.magma/magma.fidl
@@ -131,6 +131,11 @@
     BUFFER = 11;
 };
 
+@available(added=13)
+type ImportFlags = flexible bits : uint64 {
+    EVENT_ONE_SHOT = 0x1;
+};
+
 type BufferOp = flexible enum : uint32 {
     /// Populate the hardware page tables with the pages mapped in this range, committing pages
     /// as needed. This is not needed for allocations mapped GROWABLE, since the page tables will
@@ -202,13 +207,22 @@
 /// If a system driver error occurs, or if the client sends a message that the client should have
 /// known is invalid, the connection will be closed and a zx.Status sent via epitaph.
 protocol Primary {
-    /// Imports an object for use in the system driver.
+    /// DEPRECATED: use ImportObject.
     ImportObject2(resource struct {
         object zx.Handle;
         object_type ObjectType;
         object_id ObjectId;
     });
 
+    /// Imports an object for use in the system driver.
+    @available(added=13)
+    ImportObject(resource struct {
+        object zx.Handle;
+        flags ImportFlags;
+        object_type ObjectType;
+        object_id ObjectId;
+    });
+
     /// Destroys the object with `object_id` within this connection.
     ReleaseObject(struct {
         object_id ObjectId;
diff --git a/sdk/lib/magma_client/include/lib/magma/magma.h b/sdk/lib/magma_client/include/lib/magma/magma.h
index 5079852..af11daf 100644
--- a/sdk/lib/magma_client/include/lib/magma/magma.h
+++ b/sdk/lib/magma_client/include/lib/magma/magma.h
@@ -193,6 +193,22 @@
     magma_semaphore_id_t* id_out);
 
 ///
+/// \brief Imports and takes ownership of the semaphore referred to by the given handle. Takes
+///        ownership of |semaphore_handle| on both success and failure.
+/// \param connection An open connection.
+/// \param semaphore_handle A valid semaphore handle.
+/// \param flags Pass MAGMA_IMPORT_SEMAPHORE_ONESHOT to prevent auto-reset after wait.
+/// \param semaphore_out The returned semaphore.
+/// \param id_out The id of the semaphore.
+///
+MAGMA_EXPORT magma_status_t magma_connection_import_semaphore2(
+    magma_connection_t connection,
+    magma_handle_t semaphore_handle,
+    uint64_t flags,
+    magma_semaphore_t* semaphore_out,
+    magma_semaphore_id_t* id_out);
+
+///
 /// \brief Perform an operation on a range of a buffer
 /// \param connection An open connection.
 /// \param buffer A valid buffer.
diff --git a/sdk/lib/magma_client/include/lib/magma/magma_common_defs.h b/sdk/lib/magma_client/include/lib/magma/magma_common_defs.h
index 423502a..523af83 100644
--- a/sdk/lib/magma_client/include/lib/magma/magma_common_defs.h
+++ b/sdk/lib/magma_client/include/lib/magma/magma_common_defs.h
@@ -16,7 +16,7 @@
 
 // LINT.IfChange(version)
 // This version should be incremented whenever the Magma API changes.
-#define MAGMA_API_VERSION 2
+#define MAGMA_API_VERSION 3
 // LINT.ThenChange()
 
 // LINT.IfChange
@@ -88,6 +88,8 @@
 
 #define MAGMA_PERF_COUNTER_RESULT_DISCONTINUITY ((uint32_t)(1 << 0))
 
+#define MAGMA_IMPORT_SEMAPHORE_ONE_SHOT ((uint64_t)(1 << 0))
+
 typedef uint32_t magma_format_t;
 
 // Values must match fuchsia.sysmem.PixelFormatType
diff --git a/sdk/lib/magma_client/magma_client.api b/sdk/lib/magma_client/magma_client.api
index df4e599..6c08220 100644
--- a/sdk/lib/magma_client/magma_client.api
+++ b/sdk/lib/magma_client/magma_client.api
@@ -1,5 +1,5 @@
 {
-  "pkg/magma_client/include/lib/magma/magma.h": "aaf2e1b98394e4ae247d74d7b1aec67b",
-  "pkg/magma_client/include/lib/magma/magma_common_defs.h": "7153a36e07fcff5e632865fb0b5bb059",
+  "pkg/magma_client/include/lib/magma/magma.h": "6ea9bd882e4b6314213b85a01f85c8b1",
+  "pkg/magma_client/include/lib/magma/magma_common_defs.h": "dcaaaae4a2b8f5f6ba3a6bfb6aac2c71",
   "pkg/magma_client/include/lib/magma/magma_sysmem.h": "0e8f200a0a39629e98e5dab572570c68"
 }
\ No newline at end of file
diff --git a/src/graphics/drivers/msd-arm-mali/tests/unit_tests/non_hardware_test_device.cc b/src/graphics/drivers/msd-arm-mali/tests/unit_tests/non_hardware_test_device.cc
index 59b3202..7bbfbaa 100644
--- a/src/graphics/drivers/msd-arm-mali/tests/unit_tests/non_hardware_test_device.cc
+++ b/src/graphics/drivers/msd-arm-mali/tests/unit_tests/non_hardware_test_device.cc
@@ -292,6 +292,7 @@
 
       uint64_t id() const override { return real_semaphore_->id(); }
       uint64_t global_id() const override { return real_semaphore_->global_id(); }
+      void SetOneShot() override {}
 
       bool duplicate_handle(uint32_t* handle_out) const override {
         return real_semaphore_->duplicate_handle(handle_out);
diff --git a/src/graphics/drivers/msd-arm-mali/tests/unit_tests/test_command_buffer.cc b/src/graphics/drivers/msd-arm-mali/tests/unit_tests/test_command_buffer.cc
index 760c66d..944c1a5 100644
--- a/src/graphics/drivers/msd-arm-mali/tests/unit_tests/test_command_buffer.cc
+++ b/src/graphics/drivers/msd-arm-mali/tests/unit_tests/test_command_buffer.cc
@@ -201,7 +201,8 @@
     auto platform_semaphore = magma::PlatformSemaphore::Create();
     zx::handle handle;
     platform_semaphore->duplicate_handle(&handle);
-    connection_->ImportObject(std::move(handle), fuchsia_gpu_magma::wire::ObjectType::kEvent,
+    connection_->ImportObject(std::move(handle), /*flags=*/0,
+                              fuchsia_gpu_magma::wire::ObjectType::kEvent,
                               platform_semaphore->id());
 
     magma_arm_mali_atom atom;
diff --git a/src/graphics/drivers/msd-intel-gen/tests/unit_tests/test_hw_device.cc b/src/graphics/drivers/msd-intel-gen/tests/unit_tests/test_hw_device.cc
index bd74429..9eb9493 100644
--- a/src/graphics/drivers/msd-intel-gen/tests/unit_tests/test_hw_device.cc
+++ b/src/graphics/drivers/msd-intel-gen/tests/unit_tests/test_hw_device.cc
@@ -518,6 +518,8 @@
 
     bool WaitAsync(magma::PlatformPort* port, uint64_t key) override { return false; }
 
+    void SetOneShot() override {}
+
     std::unique_ptr<magma::PlatformSemaphore> sem_ = magma::PlatformSemaphore::Create();
     std::unique_ptr<magma::PlatformSemaphore> signal_sem_ = magma::PlatformSemaphore::Create();
     std::unique_ptr<magma::PlatformSemaphore> wait_sem_ = magma::PlatformSemaphore::Create();
diff --git a/src/graphics/lib/magma/include/magma/magma.json b/src/graphics/lib/magma/include/magma/magma.json
index 1ae88f5..f3348c0b 100644
--- a/src/graphics/lib/magma/include/magma/magma.json
+++ b/src/graphics/lib/magma/include/magma/magma.json
@@ -1,6 +1,6 @@
 {
     "magma-interface": {
-        "next-free-ordinal": 91,
+        "next-free-ordinal": 92,
         "exports": [
             {
                 "ordinal": 46,
@@ -295,6 +295,39 @@
                 ]
             },
             {
+                "ordinal": 91,
+                "name": "magma_connection_import_semaphore2",
+                "type": "magma_status_t",
+                "description": "Imports and takes ownership of the semaphore referred to by the given handle. Takes ownership of |semaphore_handle| on both success and failure.",
+                "arguments": [
+                    {
+                        "name": "connection",
+                        "type": "magma_connection_t",
+                        "description": "An open connection."
+                    },
+                    {
+                        "name": "semaphore_handle",
+                        "type": "magma_handle_t",
+                        "description": "A valid semaphore handle."
+                    },
+                    {
+                        "name": "flags",
+                        "type": "uint64_t",
+                        "description": "Pass MAGMA_IMPORT_SEMAPHORE_ONESHOT to prevent auto-reset after wait."
+                    },
+                    {
+                        "name": "semaphore_out",
+                        "type": "magma_semaphore_t*",
+                        "description": "The returned semaphore."
+                    },
+                    {
+                        "name": "id_out",
+                        "type": "magma_semaphore_id_t*",
+                        "description": "The id of the semaphore."
+                    }
+                ]
+            },
+            {
                 "ordinal": 65,
                 "name": "magma_connection_perform_buffer_op",
                 "type": "magma_status_t",
diff --git a/src/graphics/lib/magma/src/libmagma/magma.cc b/src/graphics/lib/magma/src/libmagma/magma.cc
index c8e87cb..7b62b1c 100644
--- a/src/graphics/lib/magma/src/libmagma/magma.cc
+++ b/src/graphics/lib/magma/src/libmagma/magma.cc
@@ -112,7 +112,7 @@
 
   magma_status_t result =
       magma::PlatformConnectionClient::cast(connection)
-          ->ImportObject(handle, magma::PlatformObject::BUFFER, platform_buffer->id());
+          ->ImportObject(handle, /*flags=*/0, magma::PlatformObject::BUFFER, platform_buffer->id());
   if (result != MAGMA_STATUS_OK)
     return DRET_MSG(result, "ImportObject failed");
 
@@ -181,7 +181,7 @@
 
   magma_status_t result =
       magma::PlatformConnectionClient::cast(connection)
-          ->ImportObject(handle, magma::PlatformObject::BUFFER, platform_buffer->id());
+          ->ImportObject(handle, /*flags=*/0, magma::PlatformObject::BUFFER, platform_buffer->id());
   if (result != MAGMA_STATUS_OK)
     return DRET_MSG(result, "ImportObject failed");
 
@@ -306,7 +306,7 @@
 
   magma_status_t result =
       magma::PlatformConnectionClient::cast(connection)
-          ->ImportObject(handle, magma::PlatformObject::SEMAPHORE, semaphore->id());
+          ->ImportObject(handle, /*flags=*/0, magma::PlatformObject::SEMAPHORE, semaphore->id());
   if (result != MAGMA_STATUS_OK)
     return DRET_MSG(result, "failed to ImportObject");
 
@@ -439,21 +439,33 @@
                                                  uint32_t semaphore_handle,
                                                  magma_semaphore_t* semaphore_out,
                                                  magma_semaphore_id_t* id_out) {
+  return magma_connection_import_semaphore2(connection, semaphore_handle, /*flags=*/0,
+                                            semaphore_out, id_out);
+}
+
+magma_status_t magma_connection_import_semaphore2(magma_connection_t connection,
+                                                  uint32_t semaphore_handle, uint64_t flags,
+                                                  magma_semaphore_t* semaphore_out,
+                                                  magma_semaphore_id_t* id_out) {
   auto platform_semaphore = magma::PlatformSemaphore::Import(semaphore_handle);
   if (!platform_semaphore)
     return DRET_MSG(MAGMA_STATUS_INVALID_ARGS, "PlatformSemaphore::Import failed");
 
   platform_semaphore->set_local_id(s_semaphore_id_generator.get());
 
+  if (flags & MAGMA_IMPORT_SEMAPHORE_ONE_SHOT) {
+    platform_semaphore->SetOneShot();
+  }
+
   uint32_t handle;
   if (!platform_semaphore->duplicate_handle(&handle))
     return DRET_MSG(MAGMA_STATUS_ACCESS_DENIED, "failed to duplicate handle");
 
   magma_status_t result =
       magma::PlatformConnectionClient::cast(connection)
-          ->ImportObject(handle, magma::PlatformObject::SEMAPHORE, platform_semaphore->id());
+          ->ImportObject(handle, flags, magma::PlatformObject::SEMAPHORE, platform_semaphore->id());
   if (result != MAGMA_STATUS_OK)
-    return DRET_MSG(result, "ImportObject failed: %d", result);
+    return DRET_MSG(result, "ImportObject2 failed: %d", result);
 
   *id_out = platform_semaphore->id();
   *semaphore_out = reinterpret_cast<magma_semaphore_t>(platform_semaphore.release());
diff --git a/src/graphics/lib/magma/src/libmagma/magma.ifs b/src/graphics/lib/magma/src/libmagma/magma.ifs
index 4fbc6b6..0eb9fe8 100644
--- a/src/graphics/lib/magma/src/libmagma/magma.ifs
+++ b/src/graphics/lib/magma/src/libmagma/magma.ifs
@@ -41,6 +41,7 @@
   - { Name: magma_connection_get_notification_channel_handle, Type: Func }
   - { Name: magma_connection_import_buffer, Type: Func }
   - { Name: magma_connection_import_semaphore, Type: Func }
+  - { Name: magma_connection_import_semaphore2, Type: Func }
   - { Name: magma_connection_map_buffer, Type: Func }
   - { Name: magma_connection_perform_buffer_op, Type: Func }
   - { Name: magma_connection_read_notification_channel, Type: Func }
diff --git a/src/graphics/lib/magma/src/magma_util/platform/platform_connection.h b/src/graphics/lib/magma/src/magma_util/platform/platform_connection.h
index 25c3539..1ebfa3a 100644
--- a/src/graphics/lib/magma/src/magma_util/platform/platform_connection.h
+++ b/src/graphics/lib/magma/src/magma_util/platform/platform_connection.h
@@ -44,8 +44,8 @@
   class Delegate {
    public:
     virtual ~Delegate() {}
-    virtual magma::Status ImportObject(uint32_t handle, PlatformObject::Type object_type,
-                                       uint64_t client_id) = 0;
+    virtual magma::Status ImportObject(uint32_t handle, uint64_t flags,
+                                       PlatformObject::Type object_type, uint64_t client_id) = 0;
     virtual magma::Status ReleaseObject(uint64_t object_id, PlatformObject::Type object_type) = 0;
 
     virtual magma::Status CreateContext(uint32_t context_id) = 0;
diff --git a/src/graphics/lib/magma/src/magma_util/platform/platform_connection_client.h b/src/graphics/lib/magma/src/magma_util/platform/platform_connection_client.h
index 29e24d3..340db56 100644
--- a/src/graphics/lib/magma/src/magma_util/platform/platform_connection_client.h
+++ b/src/graphics/lib/magma/src/magma_util/platform/platform_connection_client.h
@@ -39,8 +39,8 @@
                                                           uint64_t max_inflight_messages,
                                                           uint64_t max_inflight_bytes);
   // Imports an object for use in the system driver
-  virtual magma_status_t ImportObject(uint32_t handle, PlatformObject::Type object_type,
-                                      uint64_t object_id) = 0;
+  virtual magma_status_t ImportObject(uint32_t handle, uint64_t flags,
+                                      PlatformObject::Type object_type, uint64_t object_id) = 0;
 
   // Releases the connection's reference to the given object.
   virtual magma_status_t ReleaseObject(uint64_t object_id, PlatformObject::Type object_type) = 0;
diff --git a/src/graphics/lib/magma/src/magma_util/platform/platform_semaphore.h b/src/graphics/lib/magma/src/magma_util/platform/platform_semaphore.h
index af5ce80..24fe834 100644
--- a/src/graphics/lib/magma/src/magma_util/platform/platform_semaphore.h
+++ b/src/graphics/lib/magma/src/magma_util/platform/platform_semaphore.h
@@ -66,9 +66,9 @@
   // Returns MAGMA_STATUS_OK if the event is signaled before the timeout expires.
   virtual magma::Status WaitNoReset(uint64_t timeout_ms) = 0;
 
-  // If the event is signaled before the timeout expires resets the state to
-  // unsignalled and returns MAGMA_STATUS_OK.  Only one thread should ever wait on
-  // a given semaphore.
+  // If the event is signaled before the timeout expires, resets the state to
+  // unsignalled (if not one shot) and returns MAGMA_STATUS_OK.  Only one thread
+  // should ever wait on a given semaphore.
   virtual magma::Status Wait(uint64_t timeout_ms) = 0;
 
   magma::Status Wait() { return Wait(UINT64_MAX); }
@@ -77,6 +77,9 @@
   // Note that a port wait completion will not autoreset the semaphore.
   // On success returns true.
   virtual bool WaitAsync(PlatformPort* port, uint64_t key) = 0;
+
+  // Set one shot to prevent reset of the semaphore.
+  virtual void SetOneShot() = 0;
 };
 
 }  // namespace magma
diff --git a/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection.cc b/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection.cc
index 0a87289..8d249208 100644
--- a/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection.cc
+++ b/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection.cc
@@ -286,7 +286,36 @@
   }
   FlowControl(size);
 
-  if (!delegate_->ImportObject(request->object.release(), *object_type, request->object_id))
+  if (!delegate_->ImportObject(request->object.release(), /*flags=*/0, *object_type,
+                               request->object_id))
+    SetError(&completer, MAGMA_STATUS_INVALID_ARGS);
+}
+
+void ZirconPlatformConnection::ImportObject(ImportObjectRequestView request,
+                                            ImportObjectCompleter::Sync& completer) {
+  DLOG("ZirconPlatformConnection: ImportObject");
+
+  auto object_type = GetObjectType(request->object_type);
+  if (!object_type) {
+    SetError(&completer, MAGMA_STATUS_INVALID_ARGS);
+    return;
+  }
+
+  auto flags = static_cast<uint64_t>(request->flags);
+
+  uint64_t size = 0;
+
+  if (object_type == magma::PlatformObject::BUFFER) {
+    zx::unowned_vmo vmo(request->object.get());
+    zx_status_t status = vmo->get_size(&size);
+    if (status != ZX_OK) {
+      SetError(&completer, MAGMA_STATUS_INVALID_ARGS);
+      return;
+    }
+  }
+  FlowControl(size);
+
+  if (!delegate_->ImportObject(request->object.release(), flags, *object_type, request->object_id))
     SetError(&completer, MAGMA_STATUS_INVALID_ARGS);
 }
 
diff --git a/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection.h b/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection.h
index 0ec4e78..6bec440 100644
--- a/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection.h
+++ b/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection.h
@@ -142,6 +142,8 @@
 
   void ImportObject2(ImportObject2RequestView request,
                      ImportObject2Completer::Sync& _completer) override;
+  void ImportObject(ImportObjectRequestView request,
+                    ImportObjectCompleter::Sync& _completer) override;
   void ReleaseObject(ReleaseObjectRequestView request,
                      ReleaseObjectCompleter::Sync& _completer) override;
   void CreateContext(CreateContextRequestView request,
diff --git a/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection_client.cc b/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection_client.cc
index 3bbb32d..228e172 100644
--- a/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection_client.cc
+++ b/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection_client.cc
@@ -25,6 +25,8 @@
 static_assert(static_cast<uint64_t>(MapFlags::kExecute) == MAGMA_MAP_FLAG_EXECUTE, "mismatch");
 static_assert(static_cast<uint64_t>(MapFlags::kGrowable) == MAGMA_MAP_FLAG_GROWABLE, "mismatch");
 static_assert(static_cast<uint64_t>(MapFlags::kVendorFlag0) == MAGMA_MAP_FLAG_VENDOR_0, "mismatch");
+using fuchsia_gpu_magma::wire::ImportFlags;
+static_assert(static_cast<uint64_t>(ImportFlags::kEventOneShot) == MAGMA_IMPORT_SEMAPHORE_ONE_SHOT, "mismatch");
 
 // clang-format on
 
@@ -156,7 +158,7 @@
 static_assert(static_cast<uint32_t>(magma::PlatformObject::BUFFER) ==
               static_cast<uint32_t>(fuchsia_gpu_magma::wire::ObjectType::kBuffer));
 
-magma_status_t PrimaryWrapper::ImportObject(zx::handle handle,
+magma_status_t PrimaryWrapper::ImportObject(zx::handle handle, uint64_t flags,
                                             magma::PlatformObject::Type object_type,
                                             uint64_t object_id) {
   uint64_t size = 0;
@@ -173,8 +175,10 @@
 
   auto wire_object_type = static_cast<fuchsia_gpu_magma::wire::ObjectType>(object_type);
 
+  auto import_flags = static_cast<fuchsia_gpu_magma::wire::ImportFlags>(flags);
+
   zx_status_t status =
-      client_->ImportObject2(std::move(handle), wire_object_type, object_id).status();
+      client_->ImportObject(std::move(handle), import_flags, wire_object_type, object_id).status();
   if (status == ZX_OK) {
     UpdateFlowControl(size);
   }
@@ -498,10 +502,10 @@
       : client_(std::move(channel), max_inflight_messages, max_inflight_bytes),
         notification_channel_(std::move(notification_channel)) {}
 
-  magma_status_t ImportObject(uint32_t handle, PlatformObject::Type object_type,
+  magma_status_t ImportObject(uint32_t handle, uint64_t flags, PlatformObject::Type object_type,
                               uint64_t object_id) override {
     DLOG("ZirconPlatformConnectionClient: ImportObject");
-    magma_status_t result = client_.ImportObject(zx::handle(handle), object_type, object_id);
+    magma_status_t result = client_.ImportObject(zx::handle(handle), flags, object_type, object_id);
 
     if (result != MAGMA_STATUS_OK)
       return DRET_MSG(result, "failed to write to channel");
diff --git a/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection_client.h b/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection_client.h
index 67512d6..c002181 100644
--- a/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection_client.h
+++ b/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_connection_client.h
@@ -22,8 +22,8 @@
  public:
   PrimaryWrapper(zx::channel channel, uint64_t max_inflight_messages, uint64_t max_inflight_bytes);
 
-  magma_status_t ImportObject(zx::handle handle, magma::PlatformObject::Type object_type,
-                              uint64_t object_id);
+  magma_status_t ImportObject(zx::handle handle, uint64_t flags,
+                              magma::PlatformObject::Type object_type, uint64_t object_id);
   magma_status_t ReleaseObject(uint64_t object_id, magma::PlatformObject::Type object_type);
   magma_status_t CreateContext(uint32_t context_id);
   magma_status_t DestroyContext(uint32_t context_id);
diff --git a/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_semaphore.h b/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_semaphore.h
index 9421fc4..61072a1 100644
--- a/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_semaphore.h
+++ b/src/graphics/lib/magma/src/magma_util/platform/zircon/zircon_platform_semaphore.h
@@ -32,10 +32,12 @@
   bool duplicate_handle(zx::handle* handle_out) const override;
 
   void Reset() override {
-    event_.signal(zx_signal(), 0);
-    TRACE_DURATION("magma:sync", "semaphore reset", "id", koid_);
+    TRACE_DURATION("magma:sync", "semaphore reset", "id", koid_, "oneshot", is_one_shot_);
     TRACE_FLOW_END("magma:sync", "semaphore signal", koid_);
     TRACE_FLOW_END("magma:sync", "semaphore wait async", koid_);
+    if (!is_one_shot_) {
+      event_.signal(zx_signal(), 0);
+    }
   }
 
   void Signal() override {
@@ -51,6 +53,8 @@
 
   bool WaitAsync(PlatformPort* port, uint64_t key) override;
 
+  void SetOneShot() override { is_one_shot_ = true; }
+
   zx_handle_t zx_handle() const { return event_.get(); }
 
   zx_signals_t zx_signal() const { return ZX_EVENT_SIGNALED; }
@@ -59,6 +63,7 @@
   zx::event event_;
   uint64_t koid_;
   uint64_t local_id_ = 0;
+  bool is_one_shot_ = false;
 };
 
 }  // namespace magma
diff --git a/src/graphics/lib/magma/src/sys_driver/magma_system_connection.cc b/src/graphics/lib/magma/src/sys_driver/magma_system_connection.cc
index 88d7e45..0ba9d71 100644
--- a/src/graphics/lib/magma/src/sys_driver/magma_system_connection.cc
+++ b/src/graphics/lib/magma/src/sys_driver/magma_system_connection.cc
@@ -253,7 +253,7 @@
   }
 }
 
-magma::Status MagmaSystemConnection::ImportObject(uint32_t handle,
+magma::Status MagmaSystemConnection::ImportObject(uint32_t handle, uint64_t flags,
                                                   magma::PlatformObject::Type object_type,
                                                   uint64_t client_id) {
   if (!client_id)
@@ -274,6 +274,9 @@
         return MAGMA_DRET_MSG(MAGMA_STATUS_INVALID_ARGS, "failed to import platform semaphore");
 
       platform_sem->set_local_id(client_id);
+      if (flags & MAGMA_IMPORT_SEMAPHORE_ONE_SHOT) {
+        platform_sem->SetOneShot();
+      }
 
       auto iter = semaphore_map_.find(client_id);
       if (iter != semaphore_map_.end())
diff --git a/src/graphics/lib/magma/src/sys_driver/magma_system_connection.h b/src/graphics/lib/magma/src/sys_driver/magma_system_connection.h
index f943565d4..49c5050 100644
--- a/src/graphics/lib/magma/src/sys_driver/magma_system_connection.h
+++ b/src/graphics/lib/magma/src/sys_driver/magma_system_connection.h
@@ -33,8 +33,8 @@
 
   ~MagmaSystemConnection() override;
 
-  magma::Status ImportObject(uint32_t handle, magma::PlatformObject::Type object_type,
-                             uint64_t client_id) override;
+  magma::Status ImportObject(uint32_t handle, uint64_t flags,
+                             magma::PlatformObject::Type object_type, uint64_t client_id) override;
   magma::Status ReleaseObject(uint64_t object_id, magma::PlatformObject::Type object_type) override;
   magma::Status CreateContext(uint32_t context_id) override;
   magma::Status DestroyContext(uint32_t context_id) override;
diff --git a/src/graphics/lib/magma/src/sys_driver_cpp/magma_system_connection.cc b/src/graphics/lib/magma/src/sys_driver_cpp/magma_system_connection.cc
index 3c158bf..699242c 100644
--- a/src/graphics/lib/magma/src/sys_driver_cpp/magma_system_connection.cc
+++ b/src/graphics/lib/magma/src/sys_driver_cpp/magma_system_connection.cc
@@ -264,7 +264,7 @@
   return notification_handler_->GetAsyncDispatcher();
 }
 
-magma::Status MagmaSystemConnection::ImportObject(zx::handle handle,
+magma::Status MagmaSystemConnection::ImportObject(zx::handle handle, uint64_t flags,
                                                   fuchsia_gpu_magma::wire::ObjectType object_type,
                                                   uint64_t client_id) {
   if (!client_id)
@@ -284,6 +284,9 @@
         return MAGMA_DRET_MSG(MAGMA_STATUS_INVALID_ARGS, "failed to import platform semaphore");
 
       platform_sem->set_local_id(client_id);
+      if (flags & MAGMA_IMPORT_SEMAPHORE_ONE_SHOT) {
+        platform_sem->SetOneShot();
+      }
 
       auto iter = semaphore_map_.find(client_id);
       if (iter != semaphore_map_.end())
diff --git a/src/graphics/lib/magma/src/sys_driver_cpp/magma_system_connection.h b/src/graphics/lib/magma/src/sys_driver_cpp/magma_system_connection.h
index 78d0dbb..2bca144 100644
--- a/src/graphics/lib/magma/src/sys_driver_cpp/magma_system_connection.h
+++ b/src/graphics/lib/magma/src/sys_driver_cpp/magma_system_connection.h
@@ -28,7 +28,8 @@
 
   ~MagmaSystemConnection() override;
 
-  magma::Status ImportObject(zx::handle handle, fuchsia_gpu_magma::wire::ObjectType object_type,
+  magma::Status ImportObject(zx::handle handle, uint64_t flags,
+                             fuchsia_gpu_magma::wire::ObjectType object_type,
                              uint64_t client_id) override;
   magma::Status ReleaseObject(uint64_t object_id,
                               fuchsia_gpu_magma::wire::ObjectType object_type) override;
diff --git a/src/graphics/lib/magma/src/sys_driver_cpp/tests/test_magma_system_connection.cc b/src/graphics/lib/magma/src/sys_driver_cpp/tests/test_magma_system_connection.cc
index e067de5..c5180ca 100644
--- a/src/graphics/lib/magma/src/sys_driver_cpp/tests/test_magma_system_connection.cc
+++ b/src/graphics/lib/magma/src/sys_driver_cpp/tests/test_magma_system_connection.cc
@@ -148,8 +148,9 @@
   zx::handle duplicate_handle1;
   ASSERT_TRUE(semaphore->duplicate_handle(&duplicate_handle1));
 
-  EXPECT_TRUE(connection.ImportObject(
-      std::move(duplicate_handle1), fuchsia_gpu_magma::wire::ObjectType::kEvent, semaphore->id()));
+  EXPECT_TRUE(connection.ImportObject(std::move(duplicate_handle1), /*flags=*/0,
+                                      fuchsia_gpu_magma::wire::ObjectType::kEvent,
+                                      semaphore->id()));
 
   auto system_semaphore = connection.LookupSemaphore(semaphore->id());
   EXPECT_TRUE(system_semaphore);
@@ -160,8 +161,9 @@
   ASSERT_TRUE(semaphore->duplicate_handle(&duplicate_handle2));
 
   // Can't import the same id twice
-  EXPECT_FALSE(connection.ImportObject(
-      std::move(duplicate_handle2), fuchsia_gpu_magma::wire::ObjectType::kEvent, semaphore->id()));
+  EXPECT_FALSE(connection.ImportObject(std::move(duplicate_handle2), /*flags=*/0,
+                                       fuchsia_gpu_magma::wire::ObjectType::kEvent,
+                                       semaphore->id()));
 
   EXPECT_TRUE(
       connection.ReleaseObject(semaphore->id(), fuchsia_gpu_magma::wire::ObjectType::kEvent));
@@ -184,7 +186,7 @@
   MagmaSystemConnection connection(dev, std::move(msd_connection));
 
   constexpr uint32_t kBogusHandle = 0xabcd1234;
-  EXPECT_FALSE(connection.ImportObject(zx::handle(kBogusHandle),
+  EXPECT_FALSE(connection.ImportObject(zx::handle(kBogusHandle), /*flags=*/0,
                                        fuchsia_gpu_magma::wire::ObjectType::kEvent, 0));
 
   auto buffer = magma::PlatformBuffer::Create(4096, "test");
@@ -193,7 +195,7 @@
   zx::handle buffer_handle;
   ASSERT_TRUE(buffer->duplicate_handle(&buffer_handle));
 
-  EXPECT_FALSE(connection.ImportObject(std::move(buffer_handle),
+  EXPECT_FALSE(connection.ImportObject(std::move(buffer_handle), /*flags=*/0,
                                        fuchsia_gpu_magma::wire::ObjectType::kEvent, buffer->id()));
 }
 
diff --git a/src/graphics/lib/magma/src/sys_driver_cpp/tests/test_zircon_connection.cc b/src/graphics/lib/magma/src/sys_driver_cpp/tests/test_zircon_connection.cc
index c7f70ca..092b4d9 100644
--- a/src/graphics/lib/magma/src/sys_driver_cpp/tests/test_zircon_connection.cc
+++ b/src/graphics/lib/magma/src/sys_driver_cpp/tests/test_zircon_connection.cc
@@ -166,7 +166,8 @@
 
     uint32_t handle;
     EXPECT_TRUE(buf->duplicate_handle(&handle));
-    EXPECT_EQ(client_connection_->ImportObject(handle, magma::PlatformObject::BUFFER, buf->id()),
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0, magma::PlatformObject::BUFFER,
+                                               buf->id()),
               MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->Flush(), MAGMA_STATUS_OK);
     FlowControlCheck(1, buf->size());
@@ -179,7 +180,8 @@
 
     uint32_t handle;
     EXPECT_TRUE(buf->duplicate_handle(&handle));
-    EXPECT_EQ(client_connection_->ImportObject(handle, magma::PlatformObject::BUFFER, buf->id()),
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0, magma::PlatformObject::BUFFER,
+                                               buf->id()),
               MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->Flush(), MAGMA_STATUS_OK);
     FlowControlCheck(1, buf->size());
@@ -192,7 +194,8 @@
 
     uint32_t handle;
     EXPECT_TRUE(buf->duplicate_handle(&handle));
-    EXPECT_EQ(client_connection_->ImportObject(handle, magma::PlatformObject::BUFFER, buf->id()),
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0, magma::PlatformObject::BUFFER,
+                                               buf->id()),
               MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->ReleaseObject(shared_data_->test_buffer_id,
                                                 magma::PlatformObject::BUFFER),
@@ -209,9 +212,9 @@
 
     uint32_t handle;
     EXPECT_TRUE(semaphore->duplicate_handle(&handle));
-    EXPECT_EQ(
-        client_connection_->ImportObject(handle, magma::PlatformObject::SEMAPHORE, semaphore->id()),
-        MAGMA_STATUS_OK);
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0,
+                                               magma::PlatformObject::SEMAPHORE, semaphore->id()),
+              MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->Flush(), MAGMA_STATUS_OK);
     FlowControlCheckOneMessage();
   }
@@ -224,9 +227,9 @@
 
     uint32_t handle;
     EXPECT_TRUE(semaphore->duplicate_handle(&handle));
-    EXPECT_EQ(
-        client_connection_->ImportObject(handle, magma::PlatformObject::SEMAPHORE, semaphore->id()),
-        MAGMA_STATUS_OK);
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0,
+                                               magma::PlatformObject::SEMAPHORE, semaphore->id()),
+              MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->Flush(), MAGMA_STATUS_OK);
     FlowControlCheckOneMessage();
   }
@@ -239,9 +242,9 @@
 
     uint32_t handle;
     EXPECT_TRUE(semaphore->duplicate_handle(&handle));
-    EXPECT_EQ(
-        client_connection_->ImportObject(handle, magma::PlatformObject::SEMAPHORE, semaphore->id()),
-        MAGMA_STATUS_OK);
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0,
+                                               magma::PlatformObject::SEMAPHORE, semaphore->id()),
+              MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->ReleaseObject(shared_data_->test_semaphore_id,
                                                 magma::PlatformObject::SEMAPHORE),
               MAGMA_STATUS_OK);
@@ -289,7 +292,8 @@
 
     uint32_t handle;
     EXPECT_TRUE(buf->duplicate_handle(&handle));
-    EXPECT_EQ(client_connection_->ImportObject(handle, magma::PlatformObject::BUFFER, buf->id()),
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0, magma::PlatformObject::BUFFER,
+                                               buf->id()),
               MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->MapBuffer(buf->id(), /*address=*/page_size() * 1000,
                                             /*offset=*/1u * page_size(),
@@ -487,7 +491,8 @@
  public:
   TestDelegate(std::shared_ptr<SharedData> shared_data) : shared_data_(shared_data) {}
 
-  magma::Status ImportObject(zx::handle handle, fuchsia_gpu_magma::wire::ObjectType object_type,
+  magma::Status ImportObject(zx::handle handle, uint64_t flags,
+                             fuchsia_gpu_magma::wire::ObjectType object_type,
                              uint64_t object_id) override {
     std::unique_lock<std::mutex> lock(shared_data_->mutex);
     switch (object_type) {
diff --git a/src/graphics/lib/magma/src/sys_driver_cpp/zircon_connection.cc b/src/graphics/lib/magma/src/sys_driver_cpp/zircon_connection.cc
index 92f0405..1be5d01 100644
--- a/src/graphics/lib/magma/src/sys_driver_cpp/zircon_connection.cc
+++ b/src/graphics/lib/magma/src/sys_driver_cpp/zircon_connection.cc
@@ -200,7 +200,38 @@
   }
   FlowControl(size);
 
-  if (!delegate_->ImportObject(std::move(request->object), *object_type, request->object_id))
+  if (!delegate_->ImportObject(std::move(request->object), /*flags=*/0, *object_type,
+                               request->object_id))
+    SetError(&completer, MAGMA_STATUS_INVALID_ARGS);
+}
+
+void ZirconConnection::ImportObject(ImportObjectRequestView request,
+                                    ImportObjectCompleter::Sync& completer) {
+  TRACE_DURATION("magma", "ZirconConnection::ImportObject", "type",
+                 static_cast<uint32_t>(request->object_type));
+  MAGMA_DLOG("ZirconConnection: ImportObject");
+
+  auto object_type = ValidateObjectType(request->object_type);
+  if (!object_type) {
+    SetError(&completer, MAGMA_STATUS_INVALID_ARGS);
+    return;
+  }
+
+  auto flags = static_cast<uint64_t>(request->flags);
+
+  uint64_t size = 0;
+
+  if (object_type == fuchsia_gpu_magma::wire::ObjectType::kBuffer) {
+    zx::unowned_vmo vmo(request->object.get());
+    zx_status_t status = vmo->get_size(&size);
+    if (status != ZX_OK) {
+      SetError(&completer, MAGMA_STATUS_INVALID_ARGS);
+      return;
+    }
+  }
+  FlowControl(size);
+
+  if (!delegate_->ImportObject(std::move(request->object), flags, *object_type, request->object_id))
     SetError(&completer, MAGMA_STATUS_INVALID_ARGS);
 }
 
diff --git a/src/graphics/lib/magma/src/sys_driver_cpp/zircon_connection.h b/src/graphics/lib/magma/src/sys_driver_cpp/zircon_connection.h
index 0446ac3..dc43316 100644
--- a/src/graphics/lib/magma/src/sys_driver_cpp/zircon_connection.h
+++ b/src/graphics/lib/magma/src/sys_driver_cpp/zircon_connection.h
@@ -42,7 +42,7 @@
   class Delegate {
    public:
     virtual ~Delegate() {}
-    virtual magma::Status ImportObject(zx::handle handle,
+    virtual magma::Status ImportObject(zx::handle handle, uint64_t flags,
                                        fuchsia_gpu_magma::wire::ObjectType object_type,
                                        uint64_t client_id) = 0;
     virtual magma::Status ReleaseObject(uint64_t object_id,
@@ -136,6 +136,8 @@
  private:
   void ImportObject2(ImportObject2RequestView request,
                      ImportObject2Completer::Sync& _completer) override;
+  void ImportObject(ImportObjectRequestView request,
+                    ImportObjectCompleter::Sync& _completer) override;
   void ReleaseObject(ReleaseObjectRequestView request,
                      ReleaseObjectCompleter::Sync& _completer) override;
   void CreateContext(CreateContextRequestView request,
diff --git a/src/graphics/lib/magma/tests/helper/command_buffer_helper.h b/src/graphics/lib/magma/tests/helper/command_buffer_helper.h
index a4376df..0d0f457 100644
--- a/src/graphics/lib/magma/tests/helper/command_buffer_helper.h
+++ b/src/graphics/lib/magma/tests/helper/command_buffer_helper.h
@@ -228,10 +228,10 @@
       success = semaphore->duplicate_handle(&duplicate_handle);
       MAGMA_DASSERT(success);
       wait_semaphores_.push_back(semaphore);
-      success =
-          connection_
-              ->ImportObject(duplicate_handle, magma::PlatformObject::SEMAPHORE, semaphore->id())
-              .ok();
+      success = connection_
+                    ->ImportObject(duplicate_handle, /*flags=*/0, magma::PlatformObject::SEMAPHORE,
+                                   semaphore->id())
+                    .ok();
       MAGMA_DASSERT(success);
       abi_wait_semaphore_ids()[i] = semaphore->id();
       msd_wait_semaphores_.push_back(
@@ -247,10 +247,10 @@
       success = semaphore->duplicate_handle(&duplicate_handle);
       MAGMA_DASSERT(success);
       signal_semaphores_.push_back(semaphore);
-      success =
-          connection_
-              ->ImportObject(duplicate_handle, magma::PlatformObject::SEMAPHORE, semaphore->id())
-              .ok();
+      success = connection_
+                    ->ImportObject(duplicate_handle, /*flags=*/0, magma::PlatformObject::SEMAPHORE,
+                                   semaphore->id())
+                    .ok();
       MAGMA_DASSERT(success);
       abi_signal_semaphore_ids()[i] = semaphore->id();
       msd_signal_semaphores_.push_back(
diff --git a/src/graphics/lib/magma/tests/helper/command_buffer_helper_cpp.h b/src/graphics/lib/magma/tests/helper/command_buffer_helper_cpp.h
index b4caf9a..10fe5fa 100644
--- a/src/graphics/lib/magma/tests/helper/command_buffer_helper_cpp.h
+++ b/src/graphics/lib/magma/tests/helper/command_buffer_helper_cpp.h
@@ -202,7 +202,7 @@
       MAGMA_DASSERT(success);
       wait_semaphores_.push_back(semaphore);
       success = connection_
-                    ->ImportObject(zx::event(std::move(duplicate_handle)),
+                    ->ImportObject(zx::event(std::move(duplicate_handle)), /*flags=*/0,
                                    fuchsia_gpu_magma::wire::ObjectType::kEvent, semaphore->id())
                     .ok();
       MAGMA_DASSERT(success);
@@ -221,7 +221,7 @@
       MAGMA_DASSERT(success);
       signal_semaphores_.push_back(semaphore);
       success = connection_
-                    ->ImportObject(zx::event(std::move(duplicate_handle)),
+                    ->ImportObject(zx::event(std::move(duplicate_handle)), /*flags=*/0,
                                    fuchsia_gpu_magma::wire::ObjectType::kEvent, semaphore->id())
                     .ok();
       MAGMA_DASSERT(success);
diff --git a/src/graphics/lib/magma/tests/unit_tests/test_magma_system_connection.cc b/src/graphics/lib/magma/tests/unit_tests/test_magma_system_connection.cc
index 420fde8..4ccc4d5 100644
--- a/src/graphics/lib/magma/tests/unit_tests/test_magma_system_connection.cc
+++ b/src/graphics/lib/magma/tests/unit_tests/test_magma_system_connection.cc
@@ -144,8 +144,8 @@
   uint32_t duplicate_handle1;
   ASSERT_TRUE(semaphore->duplicate_handle(&duplicate_handle1));
 
-  EXPECT_TRUE(connection.ImportObject(duplicate_handle1, magma::PlatformObject::SEMAPHORE,
-                                      semaphore->id()));
+  EXPECT_TRUE(connection.ImportObject(duplicate_handle1, /*flags=*/0,
+                                      magma::PlatformObject::SEMAPHORE, semaphore->id()));
 
   auto system_semaphore = connection.LookupSemaphore(semaphore->id());
   EXPECT_TRUE(system_semaphore);
@@ -155,8 +155,8 @@
   ASSERT_TRUE(semaphore->duplicate_handle(&duplicate_handle2));
 
   // Can't import the same id twice
-  EXPECT_FALSE(connection.ImportObject(duplicate_handle2, magma::PlatformObject::SEMAPHORE,
-                                       semaphore->id()));
+  EXPECT_FALSE(connection.ImportObject(duplicate_handle2, /*flags=*/0,
+                                       magma::PlatformObject::SEMAPHORE, semaphore->id()));
 
   EXPECT_TRUE(connection.ReleaseObject(semaphore->id(), magma::PlatformObject::SEMAPHORE));
 
@@ -178,7 +178,8 @@
   MagmaSystemConnection connection(dev, MsdConnectionUniquePtr(msd_connection));
 
   constexpr uint32_t kBogusHandle = 0xabcd1234;
-  EXPECT_FALSE(connection.ImportObject(kBogusHandle, magma::PlatformObject::SEMAPHORE, 0));
+  EXPECT_FALSE(
+      connection.ImportObject(kBogusHandle, /*flags=*/0, magma::PlatformObject::SEMAPHORE, 0));
 
   auto buffer = magma::PlatformBuffer::Create(4096, "test");
   ASSERT_TRUE(buffer);
@@ -186,8 +187,8 @@
   uint32_t buffer_handle;
   ASSERT_TRUE(buffer->duplicate_handle(&buffer_handle));
 
-  EXPECT_FALSE(
-      connection.ImportObject(buffer_handle, magma::PlatformObject::SEMAPHORE, buffer->id()));
+  EXPECT_FALSE(connection.ImportObject(buffer_handle, /*flags=*/0, magma::PlatformObject::SEMAPHORE,
+                                       buffer->id()));
 }
 
 TEST(MagmaSystemConnection, BufferSharing) {
diff --git a/src/graphics/lib/magma/tests/unit_tests/test_platform_connection.cc b/src/graphics/lib/magma/tests/unit_tests/test_platform_connection.cc
index 602031b..c49e15e 100644
--- a/src/graphics/lib/magma/tests/unit_tests/test_platform_connection.cc
+++ b/src/graphics/lib/magma/tests/unit_tests/test_platform_connection.cc
@@ -165,7 +165,8 @@
 
     uint32_t handle;
     EXPECT_TRUE(buf->duplicate_handle(&handle));
-    EXPECT_EQ(client_connection_->ImportObject(handle, magma::PlatformObject::BUFFER, buf->id()),
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0, magma::PlatformObject::BUFFER,
+                                               buf->id()),
               MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->Flush(), MAGMA_STATUS_OK);
     FlowControlCheck(1, buf->size());
@@ -178,7 +179,8 @@
 
     uint32_t handle;
     EXPECT_TRUE(buf->duplicate_handle(&handle));
-    EXPECT_EQ(client_connection_->ImportObject(handle, magma::PlatformObject::BUFFER, buf->id()),
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0, magma::PlatformObject::BUFFER,
+                                               buf->id()),
               MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->Flush(), MAGMA_STATUS_OK);
     FlowControlCheck(1, buf->size());
@@ -191,7 +193,8 @@
 
     uint32_t handle;
     EXPECT_TRUE(buf->duplicate_handle(&handle));
-    EXPECT_EQ(client_connection_->ImportObject(handle, magma::PlatformObject::BUFFER, buf->id()),
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0, magma::PlatformObject::BUFFER,
+                                               buf->id()),
               MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->ReleaseObject(shared_data_->test_buffer_id,
                                                 magma::PlatformObject::BUFFER),
@@ -208,9 +211,9 @@
 
     uint32_t handle;
     EXPECT_TRUE(semaphore->duplicate_handle(&handle));
-    EXPECT_EQ(
-        client_connection_->ImportObject(handle, magma::PlatformObject::SEMAPHORE, semaphore->id()),
-        MAGMA_STATUS_OK);
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0,
+                                               magma::PlatformObject::SEMAPHORE, semaphore->id()),
+              MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->Flush(), MAGMA_STATUS_OK);
     FlowControlCheckOneMessage();
   }
@@ -223,9 +226,9 @@
 
     uint32_t handle;
     EXPECT_TRUE(semaphore->duplicate_handle(&handle));
-    EXPECT_EQ(
-        client_connection_->ImportObject(handle, magma::PlatformObject::SEMAPHORE, semaphore->id()),
-        MAGMA_STATUS_OK);
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0,
+                                               magma::PlatformObject::SEMAPHORE, semaphore->id()),
+              MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->Flush(), MAGMA_STATUS_OK);
     FlowControlCheckOneMessage();
   }
@@ -238,9 +241,9 @@
 
     uint32_t handle;
     EXPECT_TRUE(semaphore->duplicate_handle(&handle));
-    EXPECT_EQ(
-        client_connection_->ImportObject(handle, magma::PlatformObject::SEMAPHORE, semaphore->id()),
-        MAGMA_STATUS_OK);
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0,
+                                               magma::PlatformObject::SEMAPHORE, semaphore->id()),
+              MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->ReleaseObject(shared_data_->test_semaphore_id,
                                                 magma::PlatformObject::SEMAPHORE),
               MAGMA_STATUS_OK);
@@ -288,7 +291,8 @@
 
     uint32_t handle;
     EXPECT_TRUE(buf->duplicate_handle(&handle));
-    EXPECT_EQ(client_connection_->ImportObject(handle, magma::PlatformObject::BUFFER, buf->id()),
+    EXPECT_EQ(client_connection_->ImportObject(handle, /*flags=*/0, magma::PlatformObject::BUFFER,
+                                               buf->id()),
               MAGMA_STATUS_OK);
     EXPECT_EQ(client_connection_->MapBuffer(buf->id(), /*address=*/page_size() * 1000,
                                             /*offset=*/1u * page_size(),
@@ -483,8 +487,8 @@
  public:
   TestDelegate(std::shared_ptr<SharedData> shared_data) : shared_data_(shared_data) {}
 
-  magma::Status ImportObject(uint32_t handle, magma::PlatformObject::Type object_type,
-                             uint64_t object_id) override {
+  magma::Status ImportObject(uint32_t handle, uint64_t flags,
+                             magma::PlatformObject::Type object_type, uint64_t object_id) override {
     std::unique_lock<std::mutex> lock(shared_data_->mutex);
     switch (object_type) {
       case magma::PlatformObject::SEMAPHORE: {