diff --git a/src/dawn_native/BUILD.gn b/src/dawn_native/BUILD.gn
index e4f03b5..25f02f9 100644
--- a/src/dawn_native/BUILD.gn
+++ b/src/dawn_native/BUILD.gn
@@ -312,6 +312,8 @@
       "d3d12/HeapD3D12.h",
       "d3d12/NativeSwapChainImplD3D12.cpp",
       "d3d12/NativeSwapChainImplD3D12.h",
+      "d3d12/PageableD3D12.cpp",
+      "d3d12/PageableD3D12.h",
       "d3d12/PipelineLayoutD3D12.cpp",
       "d3d12/PipelineLayoutD3D12.h",
       "d3d12/PlatformFunctions.cpp",
diff --git a/src/dawn_native/CMakeLists.txt b/src/dawn_native/CMakeLists.txt
index 6232477..c51ae82 100644
--- a/src/dawn_native/CMakeLists.txt
+++ b/src/dawn_native/CMakeLists.txt
@@ -193,6 +193,8 @@
         "d3d12/HeapD3D12.h"
         "d3d12/NativeSwapChainImplD3D12.cpp"
         "d3d12/NativeSwapChainImplD3D12.h"
+        "d3d12/PageableD3D12.cpp"
+        "d3d12/PageableD3D12.h"
         "d3d12/PipelineLayoutD3D12.cpp"
         "d3d12/PipelineLayoutD3D12.h"
         "d3d12/PlatformFunctions.cpp"
diff --git a/src/dawn_native/d3d12/HeapD3D12.cpp b/src/dawn_native/d3d12/HeapD3D12.cpp
index add21cf..ade5d4a 100644
--- a/src/dawn_native/d3d12/HeapD3D12.cpp
+++ b/src/dawn_native/d3d12/HeapD3D12.cpp
@@ -16,16 +16,8 @@
 
 namespace dawn_native { namespace d3d12 {
     Heap::Heap(ComPtr<ID3D12Pageable> d3d12Pageable, MemorySegment memorySegment, uint64_t size)
-        : mD3d12Pageable(std::move(d3d12Pageable)), mMemorySegment(memorySegment), mSize(size) {
-    }
-
-    Heap::~Heap() {
-        // When a heap is destroyed, it no longer resides in resident memory, so we must evict
-        // it from the LRU cache. If this heap is not manually removed from the LRU-cache, the
-        // ResidencyManager will attempt to use it after it has been deallocated.
-        if (IsInResidencyLRUCache()) {
-            RemoveFromList();
-        }
+        : Pageable(std::move(d3d12Pageable), memorySegment, size) {
+        mD3d12Pageable.As(&mD3d12Heap);
     }
 
     // This function should only be used when mD3D12Pageable was initialized from a
@@ -33,58 +25,7 @@
     // ID3D12Pageable was initially created as an ID3D12Resource (i.e. DirectAllocation), then
     // use GetD3D12Pageable().
     ID3D12Heap* Heap::GetD3D12Heap() const {
-        ComPtr<ID3D12Heap> heap;
-        HRESULT result = mD3d12Pageable.As(&heap);
-        ASSERT(SUCCEEDED(result));
-        return heap.Get();
-    }
-
-    ID3D12Pageable* Heap::GetD3D12Pageable() const {
-        return mD3d12Pageable.Get();
-    }
-
-    MemorySegment Heap::GetMemorySegment() const {
-        return mMemorySegment;
-    }
-
-    Serial Heap::GetLastUsage() const {
-        return mLastUsage;
-    }
-
-    void Heap::SetLastUsage(Serial serial) {
-        mLastUsage = serial;
-    }
-
-    uint64_t Heap::GetLastSubmission() const {
-        return mLastSubmission;
-    }
-
-    void Heap::SetLastSubmission(Serial serial) {
-        mLastSubmission = serial;
-    }
-
-    uint64_t Heap::GetSize() const {
-        return mSize;
-    }
-
-    bool Heap::IsInResidencyLRUCache() const {
-        return IsInList();
-    }
-
-    void Heap::IncrementResidencyLock() {
-        mResidencyLockRefCount++;
-    }
-
-    void Heap::DecrementResidencyLock() {
-        mResidencyLockRefCount--;
-    }
-
-    bool Heap::IsResidencyLocked() const {
-        if (mResidencyLockRefCount == 0) {
-            return false;
-        }
-
-        return true;
+        return mD3d12Heap.Get();
     }
 
 }}  // namespace dawn_native::d3d12
\ No newline at end of file
diff --git a/src/dawn_native/d3d12/HeapD3D12.h b/src/dawn_native/d3d12/HeapD3D12.h
index 71a4a0f..715ffcd 100644
--- a/src/dawn_native/d3d12/HeapD3D12.h
+++ b/src/dawn_native/d3d12/HeapD3D12.h
@@ -15,67 +15,25 @@
 #ifndef DAWNNATIVE_D3D12_HEAPD3D12_H_
 #define DAWNNATIVE_D3D12_HEAPD3D12_H_
 
-#include "common/LinkedList.h"
-#include "common/Serial.h"
-#include "dawn_native/D3D12Backend.h"
 #include "dawn_native/ResourceHeap.h"
+#include "dawn_native/d3d12/PageableD3D12.h"
 #include "dawn_native/d3d12/d3d12_platform.h"
 
 namespace dawn_native { namespace d3d12 {
 
     class Device;
 
-    // This class is used to represent heap allocations, but also serves as a node within the
-    // ResidencyManager's LRU cache. This node is inserted into the LRU-cache when it is first
-    // allocated, and any time it is scheduled to be used by the GPU. This node is removed from the
-    // LRU cache when it is evicted from resident memory due to budget constraints, or when the heap
-    // is destroyed.
-    class Heap : public ResourceHeapBase, public LinkNode<Heap> {
+    // This class is used to represent ID3D12Heap allocations, as well as an implicit heap
+    // representing a directly allocated resource. It inherits from Pageable because each Heap must
+    // be represented in the ResidencyManager.
+    class Heap : public ResourceHeapBase, public Pageable {
       public:
         Heap(ComPtr<ID3D12Pageable> d3d12Pageable, MemorySegment memorySegment, uint64_t size);
-        ~Heap();
 
         ID3D12Heap* GetD3D12Heap() const;
-        ID3D12Pageable* GetD3D12Pageable() const;
-        MemorySegment GetMemorySegment() const;
-
-        // We set mLastRecordingSerial to denote the serial this heap was last recorded to be used.
-        // We must check this serial against the current serial when recording heap usages to ensure
-        // we do not process residency for this heap multiple times.
-        Serial GetLastUsage() const;
-        void SetLastUsage(Serial serial);
-
-        // The residency manager must know the last serial that any portion of the heap was
-        // submitted to be used so that we can ensure this heap stays resident in memory at least
-        // until that serial has completed.
-        uint64_t GetLastSubmission() const;
-        void SetLastSubmission(Serial serial);
-
-        uint64_t GetSize() const;
-
-        bool IsInResidencyLRUCache() const;
-
-        // In some scenarios, such as async buffer mapping, we must lock residency to ensure the
-        // heap cannot be evicted. Because multiple buffers may be mapped in a single heap, we must
-        // track the number of resources currently locked.
-        void IncrementResidencyLock();
-        void DecrementResidencyLock();
-        bool IsResidencyLocked() const;
 
       private:
-        ComPtr<ID3D12Pageable> mD3d12Pageable;
-        MemorySegment mMemorySegment;
-        // mLastUsage denotes the last time this heap was recorded for use.
-        Serial mLastUsage = 0;
-        // mLastSubmission denotes the last time this heap was submitted to the GPU. Note that
-        // although this variable often contains the same value as mLastUsage, it can differ in some
-        // situations. When some asynchronous APIs (like SetSubData) are called, mLastUsage is
-        // updated upon the call, but the backend operation is deferred until the next submission
-        // to the GPU. This makes mLastSubmission unique from mLastUsage, and allows us to
-        // accurately identify when heaps are evictable.
-        Serial mLastSubmission = 0;
-        uint32_t mResidencyLockRefCount = 0;
-        uint64_t mSize = 0;
+        ComPtr<ID3D12Heap> mD3d12Heap;
     };
 }}  // namespace dawn_native::d3d12
 
diff --git a/src/dawn_native/d3d12/PageableD3D12.cpp b/src/dawn_native/d3d12/PageableD3D12.cpp
new file mode 100644
index 0000000..5884780
--- /dev/null
+++ b/src/dawn_native/d3d12/PageableD3D12.cpp
@@ -0,0 +1,76 @@
+// Copyright 2020 The Dawn Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "dawn_native/d3d12/PageableD3D12.h"
+
+namespace dawn_native { namespace d3d12 {
+    Pageable::Pageable(ComPtr<ID3D12Pageable> d3d12Pageable,
+                       MemorySegment memorySegment,
+                       uint64_t size)
+        : mD3d12Pageable(std::move(d3d12Pageable)), mMemorySegment(memorySegment), mSize(size) {
+    }
+
+    // When a pageable is destroyed, it no longer resides in resident memory, so we must evict
+    // it from the LRU cache. If this heap is not manually removed from the LRU-cache, the
+    // ResidencyManager will attempt to use it after it has been deallocated.
+    Pageable::~Pageable() {
+        if (IsInResidencyLRUCache()) {
+            RemoveFromList();
+        }
+    }
+
+    ID3D12Pageable* Pageable::GetD3D12Pageable() const {
+        return mD3d12Pageable.Get();
+    }
+
+    Serial Pageable::GetLastUsage() const {
+        return mLastUsage;
+    }
+
+    void Pageable::SetLastUsage(Serial serial) {
+        mLastUsage = serial;
+    }
+
+    uint64_t Pageable::GetLastSubmission() const {
+        return mLastSubmission;
+    }
+
+    void Pageable::SetLastSubmission(Serial serial) {
+        mLastSubmission = serial;
+    }
+
+    MemorySegment Pageable::GetMemorySegment() const {
+        return mMemorySegment;
+    }
+
+    uint64_t Pageable::GetSize() const {
+        return mSize;
+    }
+
+    bool Pageable::IsInResidencyLRUCache() const {
+        return IsInList();
+    }
+
+    void Pageable::IncrementResidencyLock() {
+        mResidencyLockRefCount++;
+    }
+
+    void Pageable::DecrementResidencyLock() {
+        mResidencyLockRefCount--;
+    }
+
+    bool Pageable::IsResidencyLocked() const {
+        return mResidencyLockRefCount != 0;
+    }
+}}  // namespace dawn_native::d3d12
\ No newline at end of file
diff --git a/src/dawn_native/d3d12/PageableD3D12.h b/src/dawn_native/d3d12/PageableD3D12.h
new file mode 100644
index 0000000..4729b4b
--- /dev/null
+++ b/src/dawn_native/d3d12/PageableD3D12.h
@@ -0,0 +1,80 @@
+// Copyright 2020 The Dawn Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef DAWNNATIVE_D3D12_PAGEABLED3D12_H_
+#define DAWNNATIVE_D3D12_PAGEABLED3D12_H_
+
+#include "common/LinkedList.h"
+#include "common/Serial.h"
+#include "dawn_native/D3D12Backend.h"
+#include "dawn_native/d3d12/d3d12_platform.h"
+
+namespace dawn_native { namespace d3d12 {
+    // This class is used to represent ID3D12Pageable allocations, and also serves as a node within
+    // the ResidencyManager's LRU cache. This node is inserted into the LRU-cache when it is first
+    // allocated, and any time it is scheduled to be used by the GPU. This node is removed from the
+    // LRU cache when it is evicted from resident memory due to budget constraints, or when the
+    // pageable allocation is released.
+    class Pageable : public LinkNode<Pageable> {
+      public:
+        Pageable(ComPtr<ID3D12Pageable> d3d12Pageable, MemorySegment memorySegment, uint64_t size);
+        ~Pageable();
+
+        ID3D12Pageable* GetD3D12Pageable() const;
+
+        // We set mLastRecordingSerial to denote the serial this pageable was last recorded to be
+        // used. We must check this serial against the current serial when recording usages to
+        // ensure we do not process residency for this pageable multiple times.
+        Serial GetLastUsage() const;
+        void SetLastUsage(Serial serial);
+
+        // The residency manager must know the last serial that any portion of the pageable was
+        // submitted to be used so that we can ensure this pageable stays resident in memory at
+        // least until that serial has completed.
+        uint64_t GetLastSubmission() const;
+        void SetLastSubmission(Serial serial);
+
+        MemorySegment GetMemorySegment() const;
+
+        uint64_t GetSize() const;
+
+        bool IsInResidencyLRUCache() const;
+
+        // In some scenarios, such as async buffer mapping or descriptor heaps, we must lock
+        // residency to ensure the pageable cannot be evicted. Because multiple buffers may be
+        // mapped in a single heap, we must track the number of resources currently locked.
+        void IncrementResidencyLock();
+        void DecrementResidencyLock();
+        bool IsResidencyLocked() const;
+
+      protected:
+        ComPtr<ID3D12Pageable> mD3d12Pageable;
+
+      private:
+        // mLastUsage denotes the last time this pageable was recorded for use.
+        Serial mLastUsage = 0;
+        // mLastSubmission denotes the last time this pageable was submitted to the GPU. Note that
+        // although this variable often contains the same value as mLastUsage, it can differ in some
+        // situations. When some asynchronous APIs (like SetSubData) are called, mLastUsage is
+        // updated upon the call, but the backend operation is deferred until the next submission
+        // to the GPU. This makes mLastSubmission unique from mLastUsage, and allows us to
+        // accurately identify when a pageable can be evicted.
+        Serial mLastSubmission = 0;
+        MemorySegment mMemorySegment;
+        uint32_t mResidencyLockRefCount = 0;
+        uint64_t mSize = 0;
+    };
+}}  // namespace dawn_native::d3d12
+
+#endif
\ No newline at end of file
diff --git a/src/dawn_native/d3d12/ResidencyManagerD3D12.cpp b/src/dawn_native/d3d12/ResidencyManagerD3D12.cpp
index c65d56a..9ba15df 100644
--- a/src/dawn_native/d3d12/ResidencyManagerD3D12.cpp
+++ b/src/dawn_native/d3d12/ResidencyManagerD3D12.cpp
@@ -144,12 +144,12 @@
 
     // Removes a heap from the LRU and returns the least recently used heap when possible. Returns
     // nullptr when nothing further can be evicted.
-    ResultOrError<Heap*> ResidencyManager::RemoveSingleEntryFromLRU(
+    ResultOrError<Pageable*> ResidencyManager::RemoveSingleEntryFromLRU(
         MemorySegmentInfo* memorySegment) {
         ASSERT(!memorySegment->lruCache.empty());
-        Heap* heap = memorySegment->lruCache.head()->value();
+        Pageable* pageable = memorySegment->lruCache.head()->value();
 
-        Serial lastSubmissionSerial = heap->GetLastSubmission();
+        Serial lastSubmissionSerial = pageable->GetLastSubmission();
 
         // If the next candidate for eviction was inserted into the LRU during the current serial,
         // it is because more memory is being used in a single command list than is available.
@@ -164,8 +164,8 @@
             DAWN_TRY(mDevice->WaitForSerial(lastSubmissionSerial));
         }
 
-        heap->RemoveFromList();
-        return heap;
+        pageable->RemoveFromList();
+        return pageable;
     }
 
     MaybeError ResidencyManager::EnsureCanAllocate(uint64_t allocationSize,
@@ -197,16 +197,16 @@
         uint64_t sizeNeededToBeUnderBudget = memoryUsageAfterMakeResident - memorySegment->budget;
         uint64_t sizeEvicted = 0;
         while (sizeEvicted < sizeNeededToBeUnderBudget) {
-            Heap* heap;
-            DAWN_TRY_ASSIGN(heap, RemoveSingleEntryFromLRU(memorySegment));
+            Pageable* pageable;
+            DAWN_TRY_ASSIGN(pageable, RemoveSingleEntryFromLRU(memorySegment));
 
             // If no heap was returned, then nothing more can be evicted.
-            if (heap == nullptr) {
+            if (pageable == nullptr) {
                 break;
             }
 
-            sizeEvicted += heap->GetSize();
-            resourcesToEvict.push_back(heap->GetD3D12Pageable());
+            sizeEvicted += pageable->GetSize();
+            resourcesToEvict.push_back(pageable->GetD3D12Pageable());
         }
 
         if (resourcesToEvict.size() > 0) {
@@ -287,13 +287,13 @@
 
     // Inserts a heap at the bottom of the LRU. The passed heap must be resident or scheduled to
     // become resident within the current serial.
-    void ResidencyManager::TrackResidentAllocation(Heap* heap) {
+    void ResidencyManager::TrackResidentAllocation(Pageable* pageable) {
         if (!mResidencyManagementEnabled) {
             return;
         }
 
-        ASSERT(heap->IsInList() == false);
-        GetMemorySegmentInfo(heap->GetMemorySegment())->lruCache.Append(heap);
+        ASSERT(pageable->IsInList() == false);
+        GetMemorySegmentInfo(pageable->GetMemorySegment())->lruCache.Append(pageable);
     }
 
     // Places an artifical cap on Dawn's budget so we can test in a predictable manner. If used,
diff --git a/src/dawn_native/d3d12/ResidencyManagerD3D12.h b/src/dawn_native/d3d12/ResidencyManagerD3D12.h
index abd6add..1d97d4d 100644
--- a/src/dawn_native/d3d12/ResidencyManagerD3D12.h
+++ b/src/dawn_native/d3d12/ResidencyManagerD3D12.h
@@ -27,6 +27,7 @@
 
     class Device;
     class Heap;
+    class Pageable;
 
     class ResidencyManager {
       public:
@@ -41,14 +42,14 @@
         uint64_t SetExternalMemoryReservation(MemorySegment segment,
                                               uint64_t requestedReservationSize);
 
-        void TrackResidentAllocation(Heap* heap);
+        void TrackResidentAllocation(Pageable* pageable);
 
         void RestrictBudgetForTesting(uint64_t artificialBudgetCap);
 
       private:
         struct MemorySegmentInfo {
             const DXGI_MEMORY_SEGMENT_GROUP dxgiSegment;
-            LinkedList<Heap> lruCache = {};
+            LinkedList<Pageable> lruCache = {};
             uint64_t budget = 0;
             uint64_t usage = 0;
             uint64_t externalReservation = 0;
@@ -62,7 +63,7 @@
 
         MemorySegmentInfo* GetMemorySegmentInfo(MemorySegment memorySegment);
         MaybeError EnsureCanMakeResident(uint64_t allocationSize, MemorySegmentInfo* memorySegment);
-        ResultOrError<Heap*> RemoveSingleEntryFromLRU(MemorySegmentInfo* memorySegment);
+        ResultOrError<Pageable*> RemoveSingleEntryFromLRU(MemorySegmentInfo* memorySegment);
         void UpdateVideoMemoryInfo();
         void UpdateMemorySegmentInfo(MemorySegmentInfo* segmentInfo);
 
diff --git a/src/dawn_native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.cpp b/src/dawn_native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.cpp
index 9c36ac5..5a3015b 100644
--- a/src/dawn_native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.cpp
+++ b/src/dawn_native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.cpp
@@ -77,7 +77,7 @@
             return false;
         }
 
-        ID3D12DescriptorHeap* descriptorHeap = mHeap.Get();
+        ID3D12DescriptorHeap* descriptorHeap = mHeap->GetD3D12DescriptorHeap();
 
         const uint64_t heapOffset = mSizeIncrement * startOffset;
 
@@ -99,7 +99,7 @@
     }
 
     ID3D12DescriptorHeap* ShaderVisibleDescriptorAllocator::GetShaderVisibleHeap() const {
-        return mHeap.Get();
+        return mHeap->GetD3D12DescriptorHeap();
     }
 
     void ShaderVisibleDescriptorAllocator::Tick(uint64_t completedSerial) {
@@ -108,7 +108,7 @@
 
     // Creates a GPU descriptor heap that manages descriptors in a FIFO queue.
     MaybeError ShaderVisibleDescriptorAllocator::AllocateAndSwitchShaderVisibleHeap() {
-        ComPtr<ID3D12DescriptorHeap> heap;
+        std::unique_ptr<ShaderVisibleDescriptorHeap> descriptorHeap;
         // Return the switched out heap to the pool and retrieve the oldest heap that is no longer
         // used by GPU. This maintains a heap buffer to avoid frequently re-creating heaps for heavy
         // users.
@@ -119,7 +119,7 @@
 
         // Recycle existing heap if possible.
         if (!mPool.empty() && mPool.front().heapSerial <= mDevice->GetCompletedCommandSerial()) {
-            heap = std::move(mPool.front().heap);
+            descriptorHeap = std::move(mPool.front().heap);
             mPool.pop_front();
         }
 
@@ -129,19 +129,23 @@
         const uint32_t descriptorCount = GetD3D12ShaderVisibleHeapSize(
             mHeapType, mDevice->IsToggleEnabled(Toggle::UseD3D12SmallShaderVisibleHeapForTesting));
 
-        if (heap == nullptr) {
+        if (descriptorHeap == nullptr) {
+            ComPtr<ID3D12DescriptorHeap> d3d12DescriptorHeap;
             D3D12_DESCRIPTOR_HEAP_DESC heapDescriptor;
             heapDescriptor.Type = mHeapType;
             heapDescriptor.NumDescriptors = descriptorCount;
             heapDescriptor.Flags = GetD3D12HeapFlags(mHeapType);
             heapDescriptor.NodeMask = 0;
-            DAWN_TRY(CheckOutOfMemoryHRESULT(mDevice->GetD3D12Device()->CreateDescriptorHeap(
-                                                 &heapDescriptor, IID_PPV_ARGS(&heap)),
-                                             "ID3D12Device::CreateDescriptorHeap"));
+            DAWN_TRY(
+                CheckOutOfMemoryHRESULT(mDevice->GetD3D12Device()->CreateDescriptorHeap(
+                                            &heapDescriptor, IID_PPV_ARGS(&d3d12DescriptorHeap)),
+                                        "ID3D12Device::CreateDescriptorHeap"));
+            descriptorHeap = std::make_unique<ShaderVisibleDescriptorHeap>(
+                std::move(d3d12DescriptorHeap), mSizeIncrement * descriptorCount);
         }
 
         // Create a FIFO buffer from the recently created heap.
-        mHeap = std::move(heap);
+        mHeap = std::move(descriptorHeap);
         mAllocator = RingBufferAllocator(descriptorCount);
 
         // Invalidate all bindgroup allocations on previously bound heaps by incrementing the heap
@@ -171,4 +175,15 @@
         return (allocation.GetLastUsageSerial() > mDevice->GetCompletedCommandSerial() &&
                 allocation.GetHeapSerial() == mHeapSerial);
     }
+
+    ShaderVisibleDescriptorHeap::ShaderVisibleDescriptorHeap(
+        ComPtr<ID3D12DescriptorHeap> d3d12DescriptorHeap,
+        uint64_t size)
+        : Pageable(d3d12DescriptorHeap, MemorySegment::Local, size),
+          mD3d12DescriptorHeap(std::move(d3d12DescriptorHeap)) {
+    }
+
+    ID3D12DescriptorHeap* ShaderVisibleDescriptorHeap::GetD3D12DescriptorHeap() const {
+        return mD3d12DescriptorHeap.Get();
+    }
 }}  // namespace dawn_native::d3d12
\ No newline at end of file
diff --git a/src/dawn_native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.h b/src/dawn_native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.h
index be4e839..da8a5e3 100644
--- a/src/dawn_native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.h
+++ b/src/dawn_native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.h
@@ -17,6 +17,7 @@
 
 #include "dawn_native/Error.h"
 #include "dawn_native/RingBufferAllocator.h"
+#include "dawn_native/d3d12/PageableD3D12.h"
 #include "dawn_native/d3d12/d3d12_platform.h"
 
 #include <list>
@@ -32,6 +33,16 @@
     class Device;
     class GPUDescriptorHeapAllocation;
 
+    class ShaderVisibleDescriptorHeap : public Pageable {
+      public:
+        ShaderVisibleDescriptorHeap(ComPtr<ID3D12DescriptorHeap> d3d12DescriptorHeap,
+                                    uint64_t size);
+        ID3D12DescriptorHeap* GetD3D12DescriptorHeap() const;
+
+      private:
+        ComPtr<ID3D12DescriptorHeap> mD3d12DescriptorHeap;
+    };
+
     class ShaderVisibleDescriptorAllocator {
       public:
         static ResultOrError<std::unique_ptr<ShaderVisibleDescriptorAllocator>> Create(
@@ -62,10 +73,10 @@
       private:
         struct SerialDescriptorHeap {
             Serial heapSerial;
-            ComPtr<ID3D12DescriptorHeap> heap;
+            std::unique_ptr<ShaderVisibleDescriptorHeap> heap;
         };
 
-        ComPtr<ID3D12DescriptorHeap> mHeap;
+        std::unique_ptr<ShaderVisibleDescriptorHeap> mHeap;
         RingBufferAllocator mAllocator;
         std::list<SerialDescriptorHeap> mPool;
         D3D12_DESCRIPTOR_HEAP_TYPE mHeapType;
