query_tracker_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests for the QueryTracker.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/query_tracker.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2ext.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/client_test_helper.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_cmd_helper.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/mapped_memory.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/command_buffer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuerySyncManagerTest : public testing::Test {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kNumCommandEntries = 400;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kCommandBufferSizeBytes =
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kNumCommandEntries * sizeof(CommandBufferEntry);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_buffer_.reset(new MockClientCommandBuffer());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->Initialize(kCommandBufferSizeBytes);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mapped_memory_.reset(new MappedMemoryManager(helper_.get()));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_manager_.reset(new QuerySyncManager(mapped_memory_.get()));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_manager_.reset();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mapped_memory_.reset();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.reset();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_buffer_.reset();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CommandBuffer> command_buffer_;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<GLES2CmdHelper> helper_;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MappedMemoryManager> mapped_memory_;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<QuerySyncManager> sync_manager_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuerySyncManagerTest, Basic) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuerySyncManager::QueryInfo infos[4];
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&infos, 0xBD, sizeof(infos));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < arraysize(infos); ++ii) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(sync_manager_->Alloc(&infos[ii]));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, infos[ii].shm_id);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(infos[ii].sync != NULL);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0u, infos[ii].sync->process_count);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0u, infos[ii].sync->result);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < arraysize(infos); ++ii) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_manager_->Free(infos[ii]);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuerySyncManagerTest, DontFree) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuerySyncManager::QueryInfo infos[4];
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&infos, 0xBD, sizeof(infos));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < arraysize(infos); ++ii) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(sync_manager_->Alloc(&infos[ii]));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QueryTrackerTest : public testing::Test {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kNumCommandEntries = 400;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kCommandBufferSizeBytes =
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kNumCommandEntries * sizeof(CommandBufferEntry);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_buffer_.reset(new MockClientCommandBuffer());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->Initialize(kCommandBufferSizeBytes);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mapped_memory_.reset(new MappedMemoryManager(helper_.get()));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    query_tracker_.reset(new QueryTracker(mapped_memory_.get()));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    query_tracker_.reset();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mapped_memory_.reset();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.reset();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_buffer_.reset();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuerySync* GetSync(QueryTracker::Query* query) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return query->info_.sync;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CommandBuffer> command_buffer_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<GLES2CmdHelper> helper_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MappedMemoryManager> mapped_memory_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<QueryTracker> query_tracker_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryTrackerTest, Basic) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kId1 = 123;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kId2 = 124;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create a Query.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryTracker::Query* query = query_tracker_->CreateQuery(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kId1, GL_ANY_SAMPLES_PASSED_EXT);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query != NULL);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can get the same Query.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(query, query_tracker_->GetQuery(kId1));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we get nothing for a non-existent query.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query_tracker_->GetQuery(kId2) == NULL);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can delete the query.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  query_tracker_->RemoveQuery(kId1, false);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we get nothing for a non-existent query.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query_tracker_->GetQuery(kId1) == NULL);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryTrackerTest, Query) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kId1 = 123;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int32 kToken = 46;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kResult = 456;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a Query.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryTracker::Query* query = query_tracker_->CreateQuery(
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kId1, GL_ANY_SAMPLES_PASSED_EXT);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query != NULL);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query->NeverUsed());
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->Pending());
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, query->token());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, query->submit_count());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check MarkAsActive.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  query->MarkAsActive();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->NeverUsed());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->Pending());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, query->token());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, query->submit_count());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check MarkAsPending.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  query->MarkAsPending(kToken);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->NeverUsed());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query->Pending());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kToken, query->token());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, query->submit_count());
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check CheckResultsAvailable.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->CheckResultsAvailable(helper_.get()));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->NeverUsed());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query->Pending());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate GPU process marking it as available.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuerySync* sync = GetSync(query);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync->process_count = query->submit_count();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync->result = kResult;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check CheckResultsAvailable.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query->CheckResultsAvailable(helper_.get()));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kResult, query->GetResult());
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->NeverUsed());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->Pending());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172