diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp
index bdbbf25a6..0868ab9ed 100644
--- a/src/d3d11/d3d11_context.cpp
+++ b/src/d3d11/d3d11_context.cpp
@@ -1009,10 +1009,22 @@ namespace dxvk {
     if (!ctrBuf.defined())
       return;
 
-    EmitCs([=] (DxvkContext* ctx) {
-      ctx->drawIndirectXfb(ctrBuf,
+    // We bind the SO counter as an indirect count buffer,
+    // so reset any tracking we may have been doing here.
+    m_state.id.reset();
+
+    EmitCs([=] (DxvkContext* ctx) mutable {
+      ctx->bindDrawBuffers(DxvkBufferSlice(),
+        Forwarder::move(ctrBuf));
+
+      ctx->drawIndirectXfb(0u,
         vtxBuf.buffer()->getXfbVertexStride(),
         vtxBuf.offset());
+
+      // Reset draw buffer right away so we don't
+      // keep the SO counter alive indefinitely
+      ctx->bindDrawBuffers(DxvkBufferSlice(),
+        DxvkBufferSlice());
     });
   }
 
diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp
index f2d1d6e3c..95aa05d4e 100644
--- a/src/dxvk/dxvk_context.cpp
+++ b/src/dxvk/dxvk_context.cpp
@@ -1052,17 +1052,19 @@ namespace dxvk {
   
   
   void DxvkContext::drawIndirectXfb(
-    const DxvkBufferSlice&  counterBuffer,
+          VkDeviceSize      counterOffset,
           uint32_t          counterDivisor,
           uint32_t          counterBias) {
-    if (this->commitGraphicsState<false, false>()) {
-      auto physSlice = counterBuffer.getSliceHandle();
+    if (this->commitGraphicsState<false, true>()) {
+      auto physSlice = m_state.id.cntBuffer.getSliceHandle();
 
       m_cmd->cmdDrawIndirectVertexCount(1, 0,
-        physSlice.handle,
-        physSlice.offset,
-        counterBias,
-        counterDivisor);
+        physSlice.handle, physSlice.offset + counterOffset,
+        counterBias, counterDivisor);
+
+      // The count will generally be written from streamout
+      if (likely(m_state.id.cntBuffer.buffer()->hasGfxStores()))
+        accessDrawCountBuffer(counterOffset);
     }
   }
 
diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h
index ace683ebf..a3aba78d2 100644
--- a/src/dxvk/dxvk_context.h
+++ b/src/dxvk/dxvk_context.h
@@ -832,14 +832,14 @@ namespace dxvk {
             uint32_t          stride);
     
     /**
-     * \brief Transform feddback draw call
-
-     * \param [in] counterBuffer Xfb counter buffer
+     * \brief Transform feedback draw call
+     *
+     * \param [in] counterOffset Draw count offset
      * \param [in] counterDivisor Vertex stride
      * \param [in] counterBias Counter bias
      */
     void drawIndirectXfb(
-      const DxvkBufferSlice&  counterBuffer,
+            VkDeviceSize      counterOffset,
             uint32_t          counterDivisor,
             uint32_t          counterBias);