diff --git a/include/dawn/wire/WireClient.h b/include/dawn/wire/WireClient.h
index c1adfb1..9b425b6 100644
--- a/include/dawn/wire/WireClient.h
+++ b/include/dawn/wire/WireClient.h
@@ -70,7 +70,10 @@
 
     const volatile char* HandleCommands(const volatile char* commands, size_t size) override;
 
-    ReservedTexture ReserveTexture(WGPUDevice device);
+    // TODO(dawn:1451): Remove the defaulting of descriptor once the callers are updated to provide
+    // one.
+    ReservedTexture ReserveTexture(WGPUDevice device,
+                                   const WGPUTextureDescriptor* descriptor = nullptr);
     ReservedSwapChain ReserveSwapChain(WGPUDevice device);
     ReservedDevice ReserveDevice();
     ReservedInstance ReserveInstance();
diff --git a/src/dawn/tests/unittests/wire/WireInjectTextureTests.cpp b/src/dawn/tests/unittests/wire/WireInjectTextureTests.cpp
index baabaa5..3438d9b 100644
--- a/src/dawn/tests/unittests/wire/WireInjectTextureTests.cpp
+++ b/src/dawn/tests/unittests/wire/WireInjectTextureTests.cpp
@@ -26,12 +26,16 @@
   public:
     WireInjectTextureTests() {}
     ~WireInjectTextureTests() override = default;
+
+    // A placeholder texture format for ReserveTexture. The data in it doesn't matter as long as
+    // we don't call texture reflection methods.
+    WGPUTextureDescriptor placeholderDesc = {};
 };
 
 // Test that reserving and injecting a texture makes calls on the client object forward to the
 // server object correctly.
 TEST_F(WireInjectTextureTests, CallAfterReserveInject) {
-    ReservedTexture reservation = GetWireClient()->ReserveTexture(device);
+    ReservedTexture reservation = GetWireClient()->ReserveTexture(device, &placeholderDesc);
 
     WGPUTexture apiTexture = api.GetNewTexture();
     EXPECT_CALL(api, TextureReference(apiTexture));
@@ -46,8 +50,8 @@
 
 // Test that reserve correctly returns different IDs each time.
 TEST_F(WireInjectTextureTests, ReserveDifferentIDs) {
-    ReservedTexture reservation1 = GetWireClient()->ReserveTexture(device);
-    ReservedTexture reservation2 = GetWireClient()->ReserveTexture(device);
+    ReservedTexture reservation1 = GetWireClient()->ReserveTexture(device, &placeholderDesc);
+    ReservedTexture reservation2 = GetWireClient()->ReserveTexture(device, &placeholderDesc);
 
     ASSERT_NE(reservation1.id, reservation2.id);
     ASSERT_NE(reservation1.texture, reservation2.texture);
@@ -55,7 +59,7 @@
 
 // Test that injecting the same id without a destroy first fails.
 TEST_F(WireInjectTextureTests, InjectExistingID) {
-    ReservedTexture reservation = GetWireClient()->ReserveTexture(device);
+    ReservedTexture reservation = GetWireClient()->ReserveTexture(device, &placeholderDesc);
 
     WGPUTexture apiTexture = api.GetNewTexture();
     EXPECT_CALL(api, TextureReference(apiTexture));
@@ -70,7 +74,7 @@
 
 // Test that the server only borrows the texture and does a single reference-release
 TEST_F(WireInjectTextureTests, InjectedTextureLifetime) {
-    ReservedTexture reservation = GetWireClient()->ReserveTexture(device);
+    ReservedTexture reservation = GetWireClient()->ReserveTexture(device, &placeholderDesc);
 
     // Injecting the texture adds a reference
     WGPUTexture apiTexture = api.GetNewTexture();
@@ -93,17 +97,17 @@
 TEST_F(WireInjectTextureTests, ReclaimTextureReservation) {
     // Test that doing a reservation and full release is an error.
     {
-        ReservedTexture reservation = GetWireClient()->ReserveTexture(device);
+        ReservedTexture reservation = GetWireClient()->ReserveTexture(device, &placeholderDesc);
         wgpuTextureRelease(reservation.texture);
         FlushClient(false);
     }
 
     // Test that doing a reservation and then reclaiming it recycles the ID.
     {
-        ReservedTexture reservation1 = GetWireClient()->ReserveTexture(device);
+        ReservedTexture reservation1 = GetWireClient()->ReserveTexture(device, &placeholderDesc);
         GetWireClient()->ReclaimTextureReservation(reservation1);
 
-        ReservedTexture reservation2 = GetWireClient()->ReserveTexture(device);
+        ReservedTexture reservation2 = GetWireClient()->ReserveTexture(device, &placeholderDesc);
 
         // The ID is the same, but the generation is still different.
         ASSERT_EQ(reservation1.id, reservation2.id);
@@ -114,4 +118,26 @@
     }
 }
 
+// Test the reflection of texture creation parameters for reserved textures.
+TEST_F(WireInjectTextureTests, ReservedTextureReflection) {
+    WGPUTextureDescriptor desc = {};
+    desc.size = {10, 11, 12};
+    desc.format = WGPUTextureFormat_R32Float;
+    desc.dimension = WGPUTextureDimension_3D;
+    desc.mipLevelCount = 1000;
+    desc.sampleCount = 3;
+    desc.usage = WGPUTextureUsage_RenderAttachment;
+
+    ReservedTexture reservation = GetWireClient()->ReserveTexture(device, &desc);
+    WGPUTexture texture = reservation.texture;
+
+    ASSERT_EQ(desc.size.width, wgpuTextureGetWidth(texture));
+    ASSERT_EQ(desc.size.height, wgpuTextureGetHeight(texture));
+    ASSERT_EQ(desc.size.depthOrArrayLayers, wgpuTextureGetDepthOrArrayLayers(texture));
+    ASSERT_EQ(desc.format, wgpuTextureGetFormat(texture));
+    ASSERT_EQ(desc.dimension, wgpuTextureGetDimension(texture));
+    ASSERT_EQ(desc.mipLevelCount, wgpuTextureGetMipLevelCount(texture));
+    ASSERT_EQ(desc.sampleCount, wgpuTextureGetSampleCount(texture));
+}
+
 }  // namespace dawn::wire
diff --git a/src/dawn/wire/WireClient.cpp b/src/dawn/wire/WireClient.cpp
index 624cc03..9845b38 100644
--- a/src/dawn/wire/WireClient.cpp
+++ b/src/dawn/wire/WireClient.cpp
@@ -28,8 +28,9 @@
     return mImpl->HandleCommands(commands, size);
 }
 
-ReservedTexture WireClient::ReserveTexture(WGPUDevice device) {
-    return mImpl->ReserveTexture(device);
+ReservedTexture WireClient::ReserveTexture(WGPUDevice device,
+                                           const WGPUTextureDescriptor* descriptor) {
+    return mImpl->ReserveTexture(device, descriptor);
 }
 
 ReservedSwapChain WireClient::ReserveSwapChain(WGPUDevice device) {
diff --git a/src/dawn/wire/client/Buffer.cpp b/src/dawn/wire/client/Buffer.cpp
index aaf6282..32da663 100644
--- a/src/dawn/wire/client/Buffer.cpp
+++ b/src/dawn/wire/client/Buffer.cpp
@@ -74,11 +74,7 @@
     // Create the buffer and send the creation command.
     // This must happen after any potential device->CreateErrorBuffer()
     // as server expects allocating ids to be monotonically increasing
-    Buffer* buffer = wireClient->Make<Buffer>();
-    buffer->mDevice = device;
-    buffer->mDeviceIsAlive = device->GetAliveWeakPtr();
-    buffer->mSize = descriptor->size;
-    buffer->mUsage = static_cast<WGPUBufferUsage>(descriptor->usage);
+    Buffer* buffer = wireClient->Make<Buffer>(device, descriptor);
     buffer->mDestructWriteHandleOnUnmap = false;
 
     if (descriptor->mappedAtCreation) {
@@ -126,12 +122,7 @@
 // static
 WGPUBuffer Buffer::CreateError(Device* device, const WGPUBufferDescriptor* descriptor) {
     Client* client = device->GetClient();
-
-    Buffer* buffer = client->Make<Buffer>();
-    buffer->mDevice = device;
-    buffer->mDeviceIsAlive = device->GetAliveWeakPtr();
-    buffer->mSize = descriptor->size;
-    buffer->mUsage = static_cast<WGPUBufferUsage>(descriptor->usage);
+    Buffer* buffer = client->Make<Buffer>(device, descriptor);
 
     DeviceCreateErrorBufferCmd cmd;
     cmd.self = ToAPI(device);
@@ -141,6 +132,14 @@
     return ToAPI(buffer);
 }
 
+Buffer::Buffer(const ObjectBaseParams& params,
+               Device* device,
+               const WGPUBufferDescriptor* descriptor)
+    : ObjectBase(params),
+      mSize(descriptor->size),
+      mUsage(static_cast<WGPUBufferUsage>(descriptor->usage)),
+      mDeviceIsAlive(device->GetAliveWeakPtr()) {}
+
 Buffer::~Buffer() {
     ClearAllCallbacks(WGPUBufferMapAsyncStatus_DestroyedBeforeCallback);
     FreeMappedData();
diff --git a/src/dawn/wire/client/Buffer.h b/src/dawn/wire/client/Buffer.h
index 8484164..8040016 100644
--- a/src/dawn/wire/client/Buffer.h
+++ b/src/dawn/wire/client/Buffer.h
@@ -31,7 +31,7 @@
     static WGPUBuffer Create(Device* device, const WGPUBufferDescriptor* descriptor);
     static WGPUBuffer CreateError(Device* device, const WGPUBufferDescriptor* descriptor);
 
-    using ObjectBase::ObjectBase;
+    Buffer(const ObjectBaseParams& params, Device* device, const WGPUBufferDescriptor* descriptor);
     ~Buffer() override;
 
     bool OnMapAsyncCallback(uint64_t requestSerial,
@@ -63,8 +63,6 @@
 
     void FreeMappedData();
 
-    Device* mDevice;
-
     enum class MapRequestType { None, Read, Write };
 
     enum class MapState {
diff --git a/src/dawn/wire/client/Client.cpp b/src/dawn/wire/client/Client.cpp
index 6c5e631..9b9fc1a 100644
--- a/src/dawn/wire/client/Client.cpp
+++ b/src/dawn/wire/client/Client.cpp
@@ -81,8 +81,22 @@
     }
 }
 
-ReservedTexture Client::ReserveTexture(WGPUDevice device) {
-    Texture* texture = Make<Texture>();
+ReservedTexture Client::ReserveTexture(WGPUDevice device, const WGPUTextureDescriptor* descriptor) {
+    // Make a fake descriptor so that data returned by wgpu::Texture getters isn't garbage.
+    // TODO(dawn:1451): Remove this defaulting once the descriptor is required for ReserveTexture.
+    WGPUTextureDescriptor defaultDescriptor = {};
+    if (descriptor == nullptr) {
+        defaultDescriptor.size = {1, 1, 1};
+        defaultDescriptor.mipLevelCount = 1;
+        defaultDescriptor.sampleCount = 1;
+        defaultDescriptor.dimension = WGPUTextureDimension_1D;
+        defaultDescriptor.format = WGPUTextureFormat_RGBA8Unorm;
+        defaultDescriptor.usage = 0;
+
+        descriptor = &defaultDescriptor;
+    }
+
+    Texture* texture = Make<Texture>(descriptor);
 
     ReservedTexture result;
     result.texture = ToAPI(texture);
diff --git a/src/dawn/wire/client/Client.h b/src/dawn/wire/client/Client.h
index d7e29d3..8648522 100644
--- a/src/dawn/wire/client/Client.h
+++ b/src/dawn/wire/client/Client.h
@@ -70,7 +70,7 @@
 
     MemoryTransferService* GetMemoryTransferService() const { return mMemoryTransferService; }
 
-    ReservedTexture ReserveTexture(WGPUDevice device);
+    ReservedTexture ReserveTexture(WGPUDevice device, const WGPUTextureDescriptor* descriptor);
     ReservedSwapChain ReserveSwapChain(WGPUDevice device);
     ReservedDevice ReserveDevice();
     ReservedInstance ReserveInstance();
diff --git a/src/dawn/wire/client/QuerySet.cpp b/src/dawn/wire/client/QuerySet.cpp
index 4a22a0c..6ecbaa4 100644
--- a/src/dawn/wire/client/QuerySet.cpp
+++ b/src/dawn/wire/client/QuerySet.cpp
@@ -22,11 +22,7 @@
 // static
 WGPUQuerySet QuerySet::Create(Device* device, const WGPUQuerySetDescriptor* descriptor) {
     Client* wireClient = device->GetClient();
-    QuerySet* querySet = wireClient->Make<QuerySet>();
-
-    // Copy over descriptor data for reflection.
-    querySet->mType = descriptor->type;
-    querySet->mCount = descriptor->count;
+    QuerySet* querySet = wireClient->Make<QuerySet>(descriptor);
 
     // Send the Device::CreateQuerySet command without modifications.
     DeviceCreateQuerySetCmd cmd;
@@ -39,6 +35,9 @@
     return ToAPI(querySet);
 }
 
+QuerySet::QuerySet(const ObjectBaseParams& params, const WGPUQuerySetDescriptor* descriptor)
+    : ObjectBase(params), mType(descriptor->type), mCount(descriptor->count) {}
+
 QuerySet::~QuerySet() = default;
 
 WGPUQueryType QuerySet::GetType() const {
diff --git a/src/dawn/wire/client/QuerySet.h b/src/dawn/wire/client/QuerySet.h
index fc5a73e..84c8099 100644
--- a/src/dawn/wire/client/QuerySet.h
+++ b/src/dawn/wire/client/QuerySet.h
@@ -27,7 +27,7 @@
   public:
     static WGPUQuerySet Create(Device* device, const WGPUQuerySetDescriptor* descriptor);
 
-    using ObjectBase::ObjectBase;
+    QuerySet(const ObjectBaseParams& params, const WGPUQuerySetDescriptor* descriptor);
     ~QuerySet() override;
 
     // Note that these values can be arbitrary since they aren't validated in the wire client.
diff --git a/src/dawn/wire/client/Texture.cpp b/src/dawn/wire/client/Texture.cpp
index 1fffde2..40a9873 100644
--- a/src/dawn/wire/client/Texture.cpp
+++ b/src/dawn/wire/client/Texture.cpp
@@ -22,15 +22,7 @@
 // static
 WGPUTexture Texture::Create(Device* device, const WGPUTextureDescriptor* descriptor) {
     Client* wireClient = device->GetClient();
-    Texture* texture = wireClient->Make<Texture>();
-
-    // Copy over descriptor data for reflection.
-    texture->mSize = descriptor->size;
-    texture->mMipLevelCount = descriptor->mipLevelCount;
-    texture->mSampleCount = descriptor->sampleCount;
-    texture->mDimension = descriptor->dimension;
-    texture->mFormat = descriptor->format;
-    texture->mUsage = static_cast<WGPUTextureUsage>(descriptor->usage);
+    Texture* texture = wireClient->Make<Texture>(descriptor);
 
     // Send the Device::CreateTexture command without modifications.
     DeviceCreateTextureCmd cmd;
@@ -43,6 +35,15 @@
     return ToAPI(texture);
 }
 
+Texture::Texture(const ObjectBaseParams& params, const WGPUTextureDescriptor* descriptor)
+    : ObjectBase(params),
+      mSize(descriptor->size),
+      mMipLevelCount(descriptor->mipLevelCount),
+      mSampleCount(descriptor->sampleCount),
+      mDimension(descriptor->dimension),
+      mFormat(descriptor->format),
+      mUsage(static_cast<WGPUTextureUsage>(descriptor->usage)) {}
+
 Texture::~Texture() = default;
 
 uint32_t Texture::GetWidth() const {
diff --git a/src/dawn/wire/client/Texture.h b/src/dawn/wire/client/Texture.h
index 10bc5fa..4cbd230 100644
--- a/src/dawn/wire/client/Texture.h
+++ b/src/dawn/wire/client/Texture.h
@@ -27,7 +27,7 @@
   public:
     static WGPUTexture Create(Device* device, const WGPUTextureDescriptor* descriptor);
 
-    using ObjectBase::ObjectBase;
+    Texture(const ObjectBaseParams& params, const WGPUTextureDescriptor* descriptor);
     ~Texture() override;
 
     // Note that these values can be arbitrary since they aren't validated in the wire client.
