dawn_wire: Add an API to reclaim reserved devices and textures
Dawn Wire has a way to reserve an ID and generation on the client side, but if these reservations are never injected on the server, then it will be impossible to reclaim the in-use ObjectIDs. Bug: dawn:565 Change-Id: I751fce237c881e8cbdeaba18ad0ec1e124bd7ac2 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/38281 Commit-Queue: Austin Eng <enga@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Stephen White <senorblanco@chromium.org>
This commit is contained in:
parent
cef68bc8b7
commit
45ce1fda88
|
@ -41,6 +41,14 @@ namespace dawn_wire {
|
|||
return mImpl->ReserveDevice();
|
||||
}
|
||||
|
||||
void WireClient::ReclaimTextureReservation(const ReservedTexture& reservation) {
|
||||
mImpl->ReclaimTextureReservation(reservation);
|
||||
}
|
||||
|
||||
void WireClient::ReclaimDeviceReservation(const ReservedDevice& reservation) {
|
||||
mImpl->ReclaimDeviceReservation(reservation);
|
||||
}
|
||||
|
||||
void WireClient::Disconnect() {
|
||||
mImpl->Disconnect();
|
||||
}
|
||||
|
|
|
@ -118,6 +118,14 @@ namespace dawn_wire { namespace client {
|
|||
return result;
|
||||
}
|
||||
|
||||
void Client::ReclaimTextureReservation(const ReservedTexture& reservation) {
|
||||
TextureAllocator().Free(FromAPI(reservation.texture));
|
||||
}
|
||||
|
||||
void Client::ReclaimDeviceReservation(const ReservedDevice& reservation) {
|
||||
DeviceAllocator().Free(FromAPI(reservation.device));
|
||||
}
|
||||
|
||||
void Client::Disconnect() {
|
||||
mDisconnected = true;
|
||||
mSerializer = ChunkedCommandSerializer(NoopCommandSerializer::GetInstance());
|
||||
|
|
|
@ -48,6 +48,9 @@ namespace dawn_wire { namespace client {
|
|||
ReservedTexture ReserveTexture(WGPUDevice device);
|
||||
ReservedDevice ReserveDevice();
|
||||
|
||||
void ReclaimTextureReservation(const ReservedTexture& reservation);
|
||||
void ReclaimDeviceReservation(const ReservedDevice& reservation);
|
||||
|
||||
template <typename Cmd>
|
||||
void SerializeCommand(const Cmd& cmd) {
|
||||
mSerializer.SerializeCommand(cmd, *this);
|
||||
|
|
|
@ -61,6 +61,9 @@ namespace dawn_wire {
|
|||
ReservedTexture ReserveTexture(WGPUDevice device);
|
||||
ReservedDevice ReserveDevice();
|
||||
|
||||
void ReclaimTextureReservation(const ReservedTexture& reservation);
|
||||
void ReclaimDeviceReservation(const ReservedDevice& reservation);
|
||||
|
||||
// Disconnects the client.
|
||||
// Commands allocated after this point will not be sent.
|
||||
void Disconnect();
|
||||
|
|
|
@ -228,3 +228,29 @@ TEST_F(WireInjectDeviceTests, TrackChildObjectsWithTwoReservedDevices) {
|
|||
EXPECT_CALL(api, OnDeviceSetUncapturedErrorCallback(serverDevice2, nullptr, nullptr)).Times(1);
|
||||
EXPECT_CALL(api, OnDeviceSetDeviceLostCallback(serverDevice2, nullptr, nullptr)).Times(1);
|
||||
}
|
||||
|
||||
// Test that a device reservation can be reclaimed. This is necessary to
|
||||
// avoid leaking ObjectIDs for reservations that are never injected.
|
||||
TEST_F(WireInjectDeviceTests, ReclaimDeviceReservation) {
|
||||
// Test that doing a reservation and full release is an error.
|
||||
{
|
||||
ReservedDevice reservation = GetWireClient()->ReserveDevice();
|
||||
wgpuDeviceRelease(reservation.device);
|
||||
FlushClient(false);
|
||||
}
|
||||
|
||||
// Test that doing a reservation and then reclaiming it recycles the ID.
|
||||
{
|
||||
ReservedDevice reservation1 = GetWireClient()->ReserveDevice();
|
||||
GetWireClient()->ReclaimDeviceReservation(reservation1);
|
||||
|
||||
ReservedDevice reservation2 = GetWireClient()->ReserveDevice();
|
||||
|
||||
// The ID is the same, but the generation is still different.
|
||||
ASSERT_EQ(reservation1.id, reservation2.id);
|
||||
ASSERT_NE(reservation1.generation, reservation2.generation);
|
||||
|
||||
// No errors should occur.
|
||||
FlushClient();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -86,3 +86,29 @@ TEST_F(WireInjectTextureTests, InjectedTextureLifetime) {
|
|||
DeleteServer();
|
||||
Mock::VerifyAndClearExpectations(&api);
|
||||
}
|
||||
|
||||
// Test that a texture reservation can be reclaimed. This is necessary to
|
||||
// avoid leaking ObjectIDs for reservations that are never injected.
|
||||
TEST_F(WireInjectTextureTests, ReclaimTextureReservation) {
|
||||
// Test that doing a reservation and full release is an error.
|
||||
{
|
||||
ReservedTexture reservation = GetWireClient()->ReserveTexture(device);
|
||||
wgpuTextureRelease(reservation.texture);
|
||||
FlushClient(false);
|
||||
}
|
||||
|
||||
// Test that doing a reservation and then reclaiming it recycles the ID.
|
||||
{
|
||||
ReservedTexture reservation1 = GetWireClient()->ReserveTexture(device);
|
||||
GetWireClient()->ReclaimTextureReservation(reservation1);
|
||||
|
||||
ReservedTexture reservation2 = GetWireClient()->ReserveTexture(device);
|
||||
|
||||
// The ID is the same, but the generation is still different.
|
||||
ASSERT_EQ(reservation1.id, reservation2.id);
|
||||
ASSERT_NE(reservation1.generation, reservation2.generation);
|
||||
|
||||
// No errors should occur.
|
||||
FlushClient();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue