blob: 5a3ee73715ddfe94f221a6c46d7c3846df34ab82 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gtest/gtest.h"
#include "lib/escher/flib/fence.h"
#include "lib/escher/flib/release_fence_signaller.h"
#include "lib/escher/impl/command_buffer_sequencer.h"
#include "lib/escher/test/flib/util.h"
namespace escher {
namespace test {
class ReleaseFenceSignallerTest : public ::testing::Test {
public:
uint64_t GenerateNextCommandBufferSequenceNumber(
impl::CommandBufferSequencer* sequencer) {
return sequencer->GenerateNextCommandBufferSequenceNumber();
}
void CommandBufferFinished(impl::CommandBufferSequencer* sequencer,
uint64_t num) {
sequencer->CommandBufferFinished(num);
}
};
TEST_F(ReleaseFenceSignallerTest, FencesSignalledProperly) {
escher::impl::CommandBufferSequencer sequencer;
ReleaseFenceSignaller release_fence_signaler(&sequencer);
// Create two fences.
uint64_t seq_num1 = GenerateNextCommandBufferSequenceNumber(&sequencer);
zx::event fence1;
ASSERT_EQ(ZX_OK, zx::event::create(0, &fence1));
release_fence_signaler.AddCPUReleaseFence(CopyEvent(fence1));
uint64_t seq_num2 = GenerateNextCommandBufferSequenceNumber(&sequencer);
zx::event fence2;
ASSERT_EQ(ZX_OK, zx::event::create(0, &fence2));
release_fence_signaler.AddCPUReleaseFence(CopyEvent(fence2));
// Create a third fence that will not be signaled initially.
uint64_t seq_num3 = GenerateNextCommandBufferSequenceNumber(&sequencer);
zx::event fence3;
ASSERT_EQ(ZX_OK, zx::event::create(0, &fence3));
release_fence_signaler.AddCPUReleaseFence(CopyEvent(fence3));
// Assert that none of the fences are signalled.
ASSERT_FALSE(IsEventSignalled(fence1, kFenceSignalled));
ASSERT_FALSE(IsEventSignalled(fence2, kFenceSignalled));
// Mark the sequence numbers so far as finished. (Do it out of order for fun).
CommandBufferFinished(&sequencer, seq_num2);
CommandBufferFinished(&sequencer, seq_num1);
ASSERT_TRUE(IsEventSignalled(fence1, kFenceSignalled));
ASSERT_TRUE(IsEventSignalled(fence2, kFenceSignalled));
ASSERT_FALSE(IsEventSignalled(fence3, kFenceSignalled));
CommandBufferFinished(&sequencer, seq_num3);
ASSERT_TRUE(IsEventSignalled(fence1, kFenceSignalled));
ASSERT_TRUE(IsEventSignalled(fence2, kFenceSignalled));
ASSERT_TRUE(IsEventSignalled(fence3, kFenceSignalled));
}
} // namespace test
} // namespace escher