Don't check adapter nullability in the constructor of DeviceBase
This patch removes the check on the nullability of adapter in the
constructor of DeviceBase by creating DeviceMock with the constructor
of DeviceBase.
Bug: chromium:42240655
Test: dawn_unittests
Change-Id: I10fbe4624c0153a250ff8c177f3d950d723ca66e
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/201334
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn/native/Device.cpp b/src/dawn/native/Device.cpp
index 3a604dc..fe4b757 100644
--- a/src/dawn/native/Device.cpp
+++ b/src/dawn/native/Device.cpp
@@ -504,11 +504,7 @@
mMutex = nullptr;
}
- // mAdapter is not set for mock test devices.
- // TODO(crbug.com/dawn/1702): using a mock adapter could avoid the null checking.
- if (mAdapter != nullptr) {
- mAdapter->GetInstance()->AddDevice(this);
- }
+ mAdapter->GetInstance()->AddDevice(this);
return {};
}
@@ -554,15 +550,11 @@
// freed any device-scope memory needed to run the callback.
mUncapturedErrorCallbackInfo = kEmptyUncapturedErrorCallbackInfo;
- // mAdapter is not set for mock test devices.
- // TODO(crbug.com/dawn/1702): using a mock adapter could avoid the null checking.
- if (mAdapter != nullptr) {
- mAdapter->GetInstance()->RemoveDevice(this);
+ mAdapter->GetInstance()->RemoveDevice(this);
- // Once last external ref dropped, all callbacks should be forwarded to Instance's callback
- // queue instead.
- mCallbackTaskManager = mAdapter->GetInstance()->GetCallbackTaskManager();
- }
+ // Once last external ref dropped, all callbacks should be forwarded to Instance's callback
+ // queue instead.
+ mCallbackTaskManager = mAdapter->GetInstance()->GetCallbackTaskManager();
}
void DeviceBase::DestroyObjects() {
diff --git a/src/dawn/tests/unittests/native/mocks/DawnMockTest.cpp b/src/dawn/tests/unittests/native/mocks/DawnMockTest.cpp
index fd50314..1df3aeb 100644
--- a/src/dawn/tests/unittests/native/mocks/DawnMockTest.cpp
+++ b/src/dawn/tests/unittests/native/mocks/DawnMockTest.cpp
@@ -30,13 +30,28 @@
#include <utility>
#include "dawn/dawn_proc.h"
+#include "dawn/native/ChainUtils.h"
namespace dawn::native {
DawnMockTest::DawnMockTest() {
dawnProcSetProcs(&dawn::native::GetProcs());
- auto deviceMock = AcquireRef(new ::testing::NiceMock<DeviceMock>());
+ Ref<InstanceBase> instance = APICreateInstance(nullptr);
+ const auto& adapters = instance->EnumerateAdapters();
+ DAWN_ASSERT(!adapters.empty());
+
+ DeviceDescriptor deviceDescriptor = {};
+ auto result = ValidateAndUnpack(&deviceDescriptor);
+ DAWN_ASSERT(result.IsSuccess());
+ UnpackedPtr<DeviceDescriptor> packedDeviceDescriptor = result.AcquireSuccess();
+
+ Ref<DeviceBase::DeviceLostEvent> lostEvent =
+ DeviceBase::DeviceLostEvent::Create(&deviceDescriptor);
+ TogglesState deviceToggles(ToggleStage::Device);
+
+ auto deviceMock = AcquireRef(new ::testing::NiceMock<DeviceMock>(
+ adapters[0].Get(), packedDeviceDescriptor, deviceToggles, std::move(lostEvent)));
mDeviceMock = deviceMock.Get();
device = wgpu::Device::Acquire(ToAPI(ReturnToAPI<DeviceBase>(std::move(deviceMock))));
}
diff --git a/src/dawn/tests/unittests/native/mocks/DeviceMock.cpp b/src/dawn/tests/unittests/native/mocks/DeviceMock.cpp
index f37a3ca..bf24b73 100644
--- a/src/dawn/tests/unittests/native/mocks/DeviceMock.cpp
+++ b/src/dawn/tests/unittests/native/mocks/DeviceMock.cpp
@@ -27,7 +27,8 @@
#include "dawn/tests/unittests/native/mocks/DeviceMock.h"
-#include "dawn/native/Instance.h"
+#include <utility>
+
#include "dawn/tests/unittests/native/mocks/BindGroupLayoutMock.h"
#include "dawn/tests/unittests/native/mocks/BindGroupMock.h"
#include "dawn/tests/unittests/native/mocks/BufferMock.h"
@@ -47,9 +48,11 @@
using ::testing::NiceMock;
using ::testing::WithArgs;
-DeviceMock::DeviceMock() {
- mInstance = APICreateInstance(nullptr);
-
+DeviceMock::DeviceMock(AdapterBase* adapter,
+ const UnpackedPtr<DeviceDescriptor>& descriptor,
+ const TogglesState& deviceToggles,
+ Ref<DeviceLostEvent>&& lostEvent)
+ : DeviceBase(adapter, descriptor, deviceToggles, std::move(lostEvent)) {
// Set all default creation functions to return nice mock objects.
ON_CALL(*this, CreateBindGroupImpl)
.WillByDefault(WithArgs<0>(
@@ -130,14 +133,6 @@
DeviceMock::~DeviceMock() = default;
-dawn::platform::Platform* DeviceMock::GetPlatform() const {
- return mInstance->GetPlatform();
-}
-
-dawn::native::InstanceBase* DeviceMock::GetInstance() const {
- return mInstance.Get();
-}
-
QueueMock* DeviceMock::GetQueueMock() {
return reinterpret_cast<QueueMock*>(GetQueue());
}
diff --git a/src/dawn/tests/unittests/native/mocks/DeviceMock.h b/src/dawn/tests/unittests/native/mocks/DeviceMock.h
index 0a3703c..e36429a 100644
--- a/src/dawn/tests/unittests/native/mocks/DeviceMock.h
+++ b/src/dawn/tests/unittests/native/mocks/DeviceMock.h
@@ -49,15 +49,14 @@
using DeviceBase::ForceEnableFeatureForTesting;
using DeviceBase::ForceSetToggleForTesting;
- // TODO(lokokung): Use real DeviceBase constructor instead of mock specific one.
- // - Requires AdapterMock.
- // - Can probably remove GetPlatform overload.
- // - Allows removing ForceSetToggleForTesting calls.
- DeviceMock();
+ // TODO(chromium:42240655):
+ // 1. Implement AdapterMock and use it in the constructor of DeviceMock
+ // 2. Remove ForceSetToggleForTesting calls
+ DeviceMock(AdapterBase* adapter,
+ const UnpackedPtr<DeviceDescriptor>& descriptor,
+ const TogglesState& deviceToggles,
+ Ref<DeviceLostEvent>&& lostEvent);
~DeviceMock() override;
- dawn::platform::Platform* GetPlatform() const override;
-
- dawn::native::InstanceBase* GetInstance() const override;
// Mock specific functionality.
QueueMock* GetQueueMock();
@@ -140,9 +139,6 @@
MOCK_METHOD(MaybeError, TickImpl, (), (override));
MOCK_METHOD(void, DestroyImpl, (), (override));
-
- private:
- Ref<InstanceBase> mInstance;
};
} // namespace dawn::native