diff --git a/dawn.json b/dawn.json index 341139d635..b3dba41b6f 100644 --- a/dawn.json +++ b/dawn.json @@ -909,7 +909,7 @@ "name": "create fence", "returns": "fence", "args": [ - {"name": "descriptor", "type": "fence descriptor", "annotation": "const*"} + {"name": "descriptor", "type": "fence descriptor", "annotation": "const*", "optional": true} ] } ] diff --git a/src/dawn_native/Queue.cpp b/src/dawn_native/Queue.cpp index 1876f9bce4..3af330af10 100644 --- a/src/dawn_native/Queue.cpp +++ b/src/dawn_native/Queue.cpp @@ -84,6 +84,10 @@ namespace dawn_native { return Fence::MakeError(GetDevice()); } + if (descriptor == nullptr) { + FenceDescriptor defaultDescriptor = {}; + return new Fence(this, &defaultDescriptor); + } return new Fence(this, descriptor); } @@ -135,7 +139,9 @@ namespace dawn_native { MaybeError QueueBase::ValidateCreateFence(const FenceDescriptor* descriptor) { DAWN_TRY(GetDevice()->ValidateIsAlive()); DAWN_TRY(GetDevice()->ValidateObject(this)); - DAWN_TRY(ValidateFenceDescriptor(descriptor)); + if (descriptor != nullptr) { + DAWN_TRY(ValidateFenceDescriptor(descriptor)); + } return {}; } diff --git a/src/dawn_wire/client/ApiProcs.cpp b/src/dawn_wire/client/ApiProcs.cpp index fddbbdec97..9819b225e4 100644 --- a/src/dawn_wire/client/ApiProcs.cpp +++ b/src/dawn_wire/client/ApiProcs.cpp @@ -331,8 +331,10 @@ namespace dawn_wire { namespace client { Fence* fence = reinterpret_cast(cFence); fence->queue = queue; - fence->signaledValue = descriptor->initialValue; - fence->completedValue = descriptor->initialValue; + + uint64_t initialValue = descriptor != nullptr ? descriptor->initialValue : 0u; + fence->signaledValue = initialValue; + fence->completedValue = initialValue; return cFence; } diff --git a/src/tests/end2end/FenceTests.cpp b/src/tests/end2end/FenceTests.cpp index 882261658f..cba7dd33d3 100644 --- a/src/tests/end2end/FenceTests.cpp +++ b/src/tests/end2end/FenceTests.cpp @@ -97,9 +97,7 @@ TEST_P(FenceTests, SimpleSignal) { // Test callbacks are called in increasing order of fence completion value TEST_P(FenceTests, OnCompletionOrdering) { - wgpu::FenceDescriptor descriptor; - descriptor.initialValue = 0u; - wgpu::Fence fence = queue.CreateFence(&descriptor); + wgpu::Fence fence = queue.CreateFence(); queue.Signal(fence, 4); @@ -133,9 +131,7 @@ TEST_P(FenceTests, OnCompletionOrdering) { // Test callbacks still occur if Queue::Signal happens multiple times TEST_P(FenceTests, MultipleSignalOnCompletion) { - wgpu::FenceDescriptor descriptor; - descriptor.initialValue = 0u; - wgpu::Fence fence = queue.CreateFence(&descriptor); + wgpu::Fence fence = queue.CreateFence(); queue.Signal(fence, 2); queue.Signal(fence, 4); @@ -149,9 +145,7 @@ TEST_P(FenceTests, MultipleSignalOnCompletion) { // Test all callbacks are called if they are added for the same fence value TEST_P(FenceTests, OnCompletionMultipleCallbacks) { - wgpu::FenceDescriptor descriptor; - descriptor.initialValue = 0u; - wgpu::Fence fence = queue.CreateFence(&descriptor); + wgpu::Fence fence = queue.CreateFence(); queue.Signal(fence, 4); @@ -178,15 +172,11 @@ TEST_P(FenceTests, OnCompletionMultipleCallbacks) { // TODO(enga): Enable when fence is removed from fence signal tracker // Currently it holds a reference and is not destructed TEST_P(FenceTests, DISABLED_DestroyBeforeOnCompletionEnd) { - wgpu::FenceDescriptor descriptor; - descriptor.initialValue = 0u; - wgpu::Fence fence = queue.CreateFence(&descriptor); + wgpu::Fence fence = queue.CreateFence(); // The fence in this block will be deleted when it goes out of scope { - wgpu::FenceDescriptor descriptor; - descriptor.initialValue = 0u; - wgpu::Fence testFence = queue.CreateFence(&descriptor); + wgpu::Fence testFence = queue.CreateFence(); queue.Signal(testFence, 4); @@ -220,9 +210,7 @@ TEST_P(FenceTests, DISABLED_DestroyBeforeOnCompletionEnd) { // Regression test that validation errors that are tracked client-side are captured // in error scopes. TEST_P(FenceTests, ClientValidationErrorInErrorScope) { - wgpu::FenceDescriptor descriptor; - descriptor.initialValue = 0u; - wgpu::Fence fence = queue.CreateFence(&descriptor); + wgpu::Fence fence = queue.CreateFence(); queue.Signal(fence, 4); diff --git a/src/tests/unittests/validation/FenceValidationTests.cpp b/src/tests/unittests/validation/FenceValidationTests.cpp index 31a1413fcf..127ea02fe8 100644 --- a/src/tests/unittests/validation/FenceValidationTests.cpp +++ b/src/tests/unittests/validation/FenceValidationTests.cpp @@ -78,6 +78,12 @@ TEST_F(FenceValidationTest, CreationSuccess) { } } +// Creation succeeds if no descriptor is provided +TEST_F(FenceValidationTest, DefaultDescriptor) { + wgpu::Fence fence = queue.CreateFence(); + EXPECT_EQ(fence.GetCompletedValue(), 0u); +} + TEST_F(FenceValidationTest, GetCompletedValue) { // Starts at initial value {