Adds GetObjectType on wire objects to implement Release properly.
- Before [obj].Reference and procs.[obj]Reference were the same but
[obj].Release and procs.[obj]Release were different because the
former didn't send the command to the client. This change
standardizes the helpers to be the same as their respective procs so
that we can also use them when we need to keep objects alive, i.e. in
MapAsyncEvent.
Change-Id: I69ef6ed4b667bbfd24a1f0ab89248b400c2061ae
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/173564
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Loko Kung <lokokung@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/generator/templates/dawn/wire/client/ApiObjects.h b/generator/templates/dawn/wire/client/ApiObjects.h
index 61646cd..69aabde 100644
--- a/generator/templates/dawn/wire/client/ApiObjects.h
+++ b/generator/templates/dawn/wire/client/ApiObjects.h
@@ -43,6 +43,10 @@
{% else %}
struct {{type.name.CamelCase()}} final : ObjectBase {
using ObjectBase::ObjectBase;
+
+ ObjectType GetObjectType() const override {
+ return ObjectType::{{type.name.CamelCase()}};
+ }
};
{% endif %}
diff --git a/generator/templates/dawn/wire/client/ApiProcs.cpp b/generator/templates/dawn/wire/client/ApiProcs.cpp
index 6f27e18..e07f44b 100644
--- a/generator/templates/dawn/wire/client/ApiProcs.cpp
+++ b/generator/templates/dawn/wire/client/ApiProcs.cpp
@@ -117,18 +117,7 @@
//* When an object's refcount reaches 0, notify the server side of it and delete it.
void Client{{as_MethodSuffix(type.name, Name("release"))}}({{cType}} cObj) {
{{Type}}* obj = reinterpret_cast<{{Type}}*>(cObj);
-
- if (!obj->Release()) {
- return;
- }
-
- DestroyObjectCmd cmd;
- cmd.objectType = ObjectType::{{type.name.CamelCase()}};
- cmd.objectId = obj->GetWireId();
-
- Client* client = obj->GetClient();
- client->SerializeCommand(cmd);
- client->Free(obj);
+ obj->Release();
}
void Client{{as_MethodSuffix(type.name, Name("reference"))}}({{cType}} cObj) {
diff --git a/src/dawn/tests/unittests/wire/WireBasicTests.cpp b/src/dawn/tests/unittests/wire/WireBasicTests.cpp
index 3c4be7b..3dd5388 100644
--- a/src/dawn/tests/unittests/wire/WireBasicTests.cpp
+++ b/src/dawn/tests/unittests/wire/WireBasicTests.cpp
@@ -78,7 +78,7 @@
FlushClient();
}
-// Test that client reference/release do not call the backend API.
+// Test that client reference/release calls the backend API.
TEST_F(WireBasicTests, ReleaseCalledOnRefCount0) {
WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(device, nullptr);
diff --git a/src/dawn/wire/client/Adapter.cpp b/src/dawn/wire/client/Adapter.cpp
index c2ac501..fcb3965 100644
--- a/src/dawn/wire/client/Adapter.cpp
+++ b/src/dawn/wire/client/Adapter.cpp
@@ -117,6 +117,10 @@
});
}
+ObjectType Adapter::GetObjectType() const {
+ return ObjectType::Adapter;
+}
+
bool Adapter::GetLimits(WGPUSupportedLimits* limits) const {
return mLimitsAndFeatures.GetLimits(limits);
}
diff --git a/src/dawn/wire/client/Adapter.h b/src/dawn/wire/client/Adapter.h
index c200053..b6c0100 100644
--- a/src/dawn/wire/client/Adapter.h
+++ b/src/dawn/wire/client/Adapter.h
@@ -46,6 +46,7 @@
~Adapter() override;
void CancelCallbacksForDisconnect() override;
+ ObjectType GetObjectType() const override;
bool GetLimits(WGPUSupportedLimits* limits) const;
bool HasFeature(WGPUFeatureName feature) const;
diff --git a/src/dawn/wire/client/Buffer.cpp b/src/dawn/wire/client/Buffer.cpp
index b358574..d602009 100644
--- a/src/dawn/wire/client/Buffer.cpp
+++ b/src/dawn/wire/client/Buffer.cpp
@@ -63,10 +63,10 @@
mUserdata(callbackInfo.userdata),
mBuffer(buffer) {
DAWN_ASSERT(buffer != nullptr);
- GetProcs().bufferReference(ToAPI(mBuffer));
+ mBuffer->Reference();
}
- ~MapAsyncEvent() override { GetProcs().bufferRelease(ToAPI(mBuffer)); }
+ ~MapAsyncEvent() override { mBuffer->Release(); }
EventType GetType() override { return kType; }
@@ -318,6 +318,10 @@
FreeMappedData();
}
+ObjectType Buffer::GetObjectType() const {
+ return ObjectType::Buffer;
+}
+
void Buffer::SetFutureStatus(WGPUBufferMapAsyncStatus status) {
if (!mPendingMapRequest) {
return;
diff --git a/src/dawn/wire/client/Buffer.h b/src/dawn/wire/client/Buffer.h
index 7747790..5d09f03 100644
--- a/src/dawn/wire/client/Buffer.h
+++ b/src/dawn/wire/client/Buffer.h
@@ -52,6 +52,8 @@
const WGPUBufferDescriptor* descriptor);
~Buffer() override;
+ ObjectType GetObjectType() const override;
+
void MapAsync(WGPUMapModeFlags mode,
size_t offset,
size_t size,
diff --git a/src/dawn/wire/client/Device.cpp b/src/dawn/wire/client/Device.cpp
index 16826e7..1b90752 100644
--- a/src/dawn/wire/client/Device.cpp
+++ b/src/dawn/wire/client/Device.cpp
@@ -160,6 +160,10 @@
}
}
+ObjectType Device::GetObjectType() const {
+ return ObjectType::Device;
+}
+
bool Device::GetLimits(WGPUSupportedLimits* limits) const {
return mLimitsAndFeatures.GetLimits(limits);
}
diff --git a/src/dawn/wire/client/Device.h b/src/dawn/wire/client/Device.h
index 1633fe1..d9d9170 100644
--- a/src/dawn/wire/client/Device.h
+++ b/src/dawn/wire/client/Device.h
@@ -51,6 +51,8 @@
const WGPUDeviceDescriptor* descriptor);
~Device() override;
+ ObjectType GetObjectType() const override;
+
void SetUncapturedErrorCallback(WGPUErrorCallback errorCallback, void* errorUserdata);
void SetLoggingCallback(WGPULoggingCallback errorCallback, void* errorUserdata);
void SetDeviceLostCallback(WGPUDeviceLostCallback errorCallback, void* errorUserdata);
diff --git a/src/dawn/wire/client/Instance.cpp b/src/dawn/wire/client/Instance.cpp
index f1a1c9b..8f52947 100644
--- a/src/dawn/wire/client/Instance.cpp
+++ b/src/dawn/wire/client/Instance.cpp
@@ -145,6 +145,10 @@
GetEventManager().TransitionTo(EventManager::State::InstanceDropped);
}
+ObjectType Instance::GetObjectType() const {
+ return ObjectType::Instance;
+}
+
WireResult Instance::Initialize(const WGPUInstanceDescriptor* descriptor) {
if (descriptor == nullptr) {
return WireResult::Success;
diff --git a/src/dawn/wire/client/Instance.h b/src/dawn/wire/client/Instance.h
index 291c67c..def6f24 100644
--- a/src/dawn/wire/client/Instance.h
+++ b/src/dawn/wire/client/Instance.h
@@ -45,6 +45,8 @@
explicit Instance(const ObjectBaseParams& params);
~Instance() override;
+ ObjectType GetObjectType() const override;
+
WireResult Initialize(const WGPUInstanceDescriptor* descriptor);
void RequestAdapter(const WGPURequestAdapterOptions* options,
diff --git a/src/dawn/wire/client/ObjectBase.cpp b/src/dawn/wire/client/ObjectBase.cpp
index d66f521..cc992fc 100644
--- a/src/dawn/wire/client/ObjectBase.cpp
+++ b/src/dawn/wire/client/ObjectBase.cpp
@@ -59,10 +59,19 @@
mRefcount++;
}
-bool ObjectBase::Release() {
+void ObjectBase::Release() {
DAWN_ASSERT(mRefcount != 0);
mRefcount--;
- return mRefcount == 0;
+
+ if (mRefcount == 0) {
+ DestroyObjectCmd cmd;
+ cmd.objectType = GetObjectType();
+ cmd.objectId = GetWireId();
+
+ Client* client = GetClient();
+ client->SerializeCommand(cmd);
+ client->Free(this, GetObjectType());
+ }
}
ObjectWithEventsBase::ObjectWithEventsBase(const ObjectBaseParams& params,
diff --git a/src/dawn/wire/client/ObjectBase.h b/src/dawn/wire/client/ObjectBase.h
index 889c956..4bfaa66 100644
--- a/src/dawn/wire/client/ObjectBase.h
+++ b/src/dawn/wire/client/ObjectBase.h
@@ -33,6 +33,7 @@
#include "dawn/common/LinkedList.h"
#include "dawn/wire/ObjectHandle.h"
+#include "dawn/wire/ObjectType_autogen.h"
#include "dawn/wire/client/EventManager.h"
namespace dawn::wire::client {
@@ -55,6 +56,7 @@
virtual ~ObjectBase();
virtual void CancelCallbacksForDisconnect() {}
+ virtual ObjectType GetObjectType() const = 0;
const ObjectHandle& GetWireHandle() const;
ObjectId GetWireId() const;
@@ -62,9 +64,7 @@
Client* GetClient() const;
void Reference();
- // Returns true if it was the last reference, indicating that the caller must destroy the
- // object.
- [[nodiscard]] bool Release();
+ void Release();
protected:
uint32_t GetRefcount() const { return mRefcount; }
diff --git a/src/dawn/wire/client/QuerySet.cpp b/src/dawn/wire/client/QuerySet.cpp
index 1011d97..61108ff 100644
--- a/src/dawn/wire/client/QuerySet.cpp
+++ b/src/dawn/wire/client/QuerySet.cpp
@@ -37,6 +37,10 @@
QuerySet::~QuerySet() = default;
+ObjectType QuerySet::GetObjectType() const {
+ return ObjectType::QuerySet;
+}
+
WGPUQueryType QuerySet::GetType() const {
return mType;
}
diff --git a/src/dawn/wire/client/QuerySet.h b/src/dawn/wire/client/QuerySet.h
index 3353e20..1fe7dfa 100644
--- a/src/dawn/wire/client/QuerySet.h
+++ b/src/dawn/wire/client/QuerySet.h
@@ -41,6 +41,8 @@
QuerySet(const ObjectBaseParams& params, const WGPUQuerySetDescriptor* descriptor);
~QuerySet() override;
+ ObjectType GetObjectType() const override;
+
// Note that these values can be arbitrary since they aren't validated in the wire client.
WGPUQueryType GetType() const;
uint32_t GetCount() const;
diff --git a/src/dawn/wire/client/Queue.cpp b/src/dawn/wire/client/Queue.cpp
index 330a35d..f589f12 100644
--- a/src/dawn/wire/client/Queue.cpp
+++ b/src/dawn/wire/client/Queue.cpp
@@ -77,6 +77,10 @@
Queue::~Queue() = default;
+ObjectType Queue::GetObjectType() const {
+ return ObjectType::Queue;
+}
+
bool Client::DoQueueWorkDoneCallback(ObjectHandle eventManager,
WGPUFuture future,
WGPUQueueWorkDoneStatus status) {
diff --git a/src/dawn/wire/client/Queue.h b/src/dawn/wire/client/Queue.h
index 0d4cc55..405fd04 100644
--- a/src/dawn/wire/client/Queue.h
+++ b/src/dawn/wire/client/Queue.h
@@ -41,6 +41,8 @@
using ObjectWithEventsBase::ObjectWithEventsBase;
~Queue() override;
+ ObjectType GetObjectType() const override;
+
// Dawn API
void OnSubmittedWorkDone(WGPUQueueWorkDoneCallback callback, void* userdata);
WGPUFuture OnSubmittedWorkDoneF(const WGPUQueueWorkDoneCallbackInfo& callbackInfo);
diff --git a/src/dawn/wire/client/ShaderModule.cpp b/src/dawn/wire/client/ShaderModule.cpp
index 5d369b6..9cc2196 100644
--- a/src/dawn/wire/client/ShaderModule.cpp
+++ b/src/dawn/wire/client/ShaderModule.cpp
@@ -35,6 +35,10 @@
ClearAllCallbacks(WGPUCompilationInfoRequestStatus_Unknown);
}
+ObjectType ShaderModule::GetObjectType() const {
+ return ObjectType::ShaderModule;
+}
+
void ShaderModule::GetCompilationInfo(WGPUCompilationInfoCallback callback, void* userdata) {
Client* client = GetClient();
if (client->IsDisconnected()) {
diff --git a/src/dawn/wire/client/ShaderModule.h b/src/dawn/wire/client/ShaderModule.h
index ea7437e..8708ef9 100644
--- a/src/dawn/wire/client/ShaderModule.h
+++ b/src/dawn/wire/client/ShaderModule.h
@@ -41,6 +41,8 @@
using ObjectBase::ObjectBase;
~ShaderModule() override;
+ ObjectType GetObjectType() const override;
+
void GetCompilationInfo(WGPUCompilationInfoCallback callback, void* userdata);
bool GetCompilationInfoCallback(uint64_t requestSerial,
WGPUCompilationInfoRequestStatus status,
diff --git a/src/dawn/wire/client/Surface.cpp b/src/dawn/wire/client/Surface.cpp
index 43e22b9..f54aaca 100644
--- a/src/dawn/wire/client/Surface.cpp
+++ b/src/dawn/wire/client/Surface.cpp
@@ -35,6 +35,10 @@
Surface::~Surface() = default;
+ObjectType Surface::GetObjectType() const {
+ return ObjectType::Surface;
+}
+
WGPUTextureFormat Surface::GetPreferredFormat([[maybe_unused]] WGPUAdapter adapter) const {
// This is the only supported format in native mode (see crbug.com/dawn/160).
return WGPUTextureFormat_BGRA8Unorm;
diff --git a/src/dawn/wire/client/Surface.h b/src/dawn/wire/client/Surface.h
index 06ced11..08aae69 100644
--- a/src/dawn/wire/client/Surface.h
+++ b/src/dawn/wire/client/Surface.h
@@ -41,6 +41,8 @@
explicit Surface(const ObjectBaseParams& params);
~Surface() override;
+ ObjectType GetObjectType() const override;
+
WGPUTextureFormat GetPreferredFormat(WGPUAdapter adapter) const;
};
diff --git a/src/dawn/wire/client/SwapChain.cpp b/src/dawn/wire/client/SwapChain.cpp
index d6833ed..8b18407 100644
--- a/src/dawn/wire/client/SwapChain.cpp
+++ b/src/dawn/wire/client/SwapChain.cpp
@@ -48,6 +48,10 @@
SwapChain::~SwapChain() = default;
+ObjectType SwapChain::GetObjectType() const {
+ return ObjectType::SwapChain;
+}
+
WGPUTexture SwapChain::GetCurrentTexture() {
Client* wireClient = GetClient();
Texture* texture = wireClient->Make<Texture>(&mTextureDescriptor);
diff --git a/src/dawn/wire/client/SwapChain.h b/src/dawn/wire/client/SwapChain.h
index 17a8ada..770c223 100644
--- a/src/dawn/wire/client/SwapChain.h
+++ b/src/dawn/wire/client/SwapChain.h
@@ -43,6 +43,8 @@
const WGPUSwapChainDescriptor* descriptor);
~SwapChain() override;
+ ObjectType GetObjectType() const override;
+
WGPUTexture GetCurrentTexture();
private:
diff --git a/src/dawn/wire/client/Texture.cpp b/src/dawn/wire/client/Texture.cpp
index 51478c3..e4b4cc3 100644
--- a/src/dawn/wire/client/Texture.cpp
+++ b/src/dawn/wire/client/Texture.cpp
@@ -43,6 +43,10 @@
Texture::~Texture() = default;
+ObjectType Texture::GetObjectType() const {
+ return ObjectType::Texture;
+}
+
uint32_t Texture::GetWidth() const {
return mSize.width;
}
diff --git a/src/dawn/wire/client/Texture.h b/src/dawn/wire/client/Texture.h
index c5d57bd..2271b0b 100644
--- a/src/dawn/wire/client/Texture.h
+++ b/src/dawn/wire/client/Texture.h
@@ -41,6 +41,8 @@
Texture(const ObjectBaseParams& params, const WGPUTextureDescriptor* descriptor);
~Texture() override;
+ ObjectType GetObjectType() const override;
+
// Note that these values can be arbitrary since they aren't validated in the wire client.
uint32_t GetWidth() const;
uint32_t GetHeight() const;