diff --git a/src/core/hle/service/nvnflinger/binder.h b/src/core/hle/service/nvnflinger/binder.h
index 124accb94..f9f326e3b 100644
--- a/src/core/hle/service/nvnflinger/binder.h
+++ b/src/core/hle/service/nvnflinger/binder.h
@@ -26,6 +26,24 @@ public:
     virtual void Transact(u32 code, std::span<const u8> parcel_data, std::span<u8> parcel_reply,
                           u32 flags) = 0;
     virtual Kernel::KReadableEvent* GetNativeHandle(u32 type_id) = 0;
+
+    virtual void AdjustWeakRefcount(s32 addval) = 0;
+    virtual void AdjustStrongRefcount(s32 addval) = 0;
+};
+
+class Binder {
+public:
+    void AdjustWeakRefcount(s32 addval) {
+        m_weak_ref_count += addval;
+    }
+
+    void AdjustStrongRefcount(s32 addval) {
+        m_strong_ref_count += addval;
+    }
+
+private:
+    std::atomic<s32> m_weak_ref_count{};
+    std::atomic<s32> m_strong_ref_count{};
 };
 
 } // namespace Service::android
diff --git a/src/core/hle/service/nvnflinger/buffer_queue_consumer.h b/src/core/hle/service/nvnflinger/buffer_queue_consumer.h
index a9226f1c3..7549ebe96 100644
--- a/src/core/hle/service/nvnflinger/buffer_queue_consumer.h
+++ b/src/core/hle/service/nvnflinger/buffer_queue_consumer.h
@@ -8,6 +8,7 @@
 
 #include <chrono>
 #include <memory>
+#include <atomic>
 
 #include "common/common_types.h"
 #include "core/hle/service/nvnflinger/binder.h"
@@ -36,9 +37,19 @@ public:
 
     Kernel::KReadableEvent* GetNativeHandle(u32 type_id) override;
 
+    void AdjustWeakRefcount(s32 addval) override {
+        m_weak_ref_count += addval;
+    }
+
+    void AdjustStrongRefcount(s32 addval) override {
+        m_strong_ref_count += addval;
+    }
+
 private:
     std::shared_ptr<BufferQueueCore> core;
     BufferQueueDefs::SlotsType& slots;
+    std::atomic<s32> m_weak_ref_count{};
+    std::atomic<s32> m_strong_ref_count{};
 };
 
 } // namespace Service::android
diff --git a/src/core/hle/service/nvnflinger/buffer_queue_producer.h b/src/core/hle/service/nvnflinger/buffer_queue_producer.h
index 048523514..6df0b9014 100644
--- a/src/core/hle/service/nvnflinger/buffer_queue_producer.h
+++ b/src/core/hle/service/nvnflinger/buffer_queue_producer.h
@@ -9,6 +9,7 @@
 #include <condition_variable>
 #include <memory>
 #include <mutex>
+#include <atomic>
 
 #include "common/common_funcs.h"
 #include "core/hle/service/nvdrv/nvdata.h"
@@ -52,6 +53,14 @@ public:
 
     Kernel::KReadableEvent* GetNativeHandle(u32 type_id) override;
 
+    void AdjustWeakRefcount(s32 addval) override {
+        m_weak_ref_count += addval;
+    }
+
+    void AdjustStrongRefcount(s32 addval) override {
+        m_strong_ref_count += addval;
+    }
+
 public:
     Status RequestBuffer(s32 slot, std::shared_ptr<GraphicBuffer>* buf);
     Status SetBufferCount(s32 buffer_count);
@@ -87,6 +96,8 @@ private:
     std::condition_variable_any callback_condition;
 
     Service::Nvidia::NvCore::NvMap& nvmap;
+    std::atomic<s32> m_weak_ref_count{};
+    std::atomic<s32> m_strong_ref_count{};
 };
 
 } // namespace Service::android
diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp
index 8629a2e89..8b1ac3ed8 100644
--- a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp
+++ b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp
@@ -5,6 +5,7 @@
 #include "core/hle/service/nvnflinger/binder.h"
 #include "core/hle/service/nvnflinger/hos_binder_driver.h"
 #include "core/hle/service/nvnflinger/hos_binder_driver_server.h"
+#include <atomic>
 
 namespace Service::Nvnflinger {
 
@@ -40,7 +41,21 @@ Result IHOSBinderDriver::TransactParcel(s32 binder_id, u32 transaction_id,
 }
 
 Result IHOSBinderDriver::AdjustRefcount(s32 binder_id, s32 addval, s32 type) {
-    LOG_WARNING(Service_VI, "(STUBBED) called id={}, addval={}, type={}", binder_id, addval, type);
+    LOG_DEBUG(Service_VI, "called id={}, addval={}, type={}", binder_id, addval, type);
+
+    const auto binder = m_server->TryGetBinder(binder_id);
+    R_SUCCEED_IF(binder == nullptr);
+
+    // type 0 = weak reference, type 1 = strong reference
+    if (type == 0) {
+        binder->AdjustWeakRefcount(addval);
+    } else if (type == 1) {
+        binder->AdjustStrongRefcount(addval);
+    } else {
+        LOG_ERROR(Service_VI, "Invalid refcount type {}", type);
+        R_THROW(Kernel::ResultInvalidArgument);
+    }
+
     R_SUCCEED();
 }