1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <GLES2/gl2.h> 6#include <GLES2/gl2ext.h> 7#include <GLES2/gl2extchromium.h> 8 9#include "base/threading/platform_thread.h" 10#include "gpu/command_buffer/tests/gl_manager.h" 11#include "gpu/command_buffer/tests/gl_test_utils.h" 12#include "testing/gmock/include/gmock/gmock.h" 13#include "testing/gtest/include/gtest/gtest.h" 14 15namespace gpu { 16 17class QueryTest : public testing::Test { 18 protected: 19 virtual void SetUp() { 20 gl_.Initialize(GLManager::Options()); 21 } 22 23 virtual void TearDown() { 24 gl_.Destroy(); 25 } 26 27 GLManager gl_; 28}; 29 30TEST_F(QueryTest, GetErrorBasic) { 31 EXPECT_TRUE(GLTestHelper::HasExtension("GL_CHROMIUM_get_error_query")); 32 33 GLuint query = 0; 34 glGenQueriesEXT(1, &query); 35 36 GLuint query_status = 0; 37 GLuint result = 0; 38 39 glBeginQueryEXT(GL_GET_ERROR_QUERY_CHROMIUM, query); 40 glEnable(GL_TEXTURE_2D); // Generates an INVALID_ENUM error 41 glEndQueryEXT(GL_GET_ERROR_QUERY_CHROMIUM); 42 43 glFinish(); 44 45 query_status = 0; 46 result = 0; 47 glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT, &result); 48 EXPECT_TRUE(result); 49 glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &query_status); 50 EXPECT_EQ(static_cast<uint32>(GL_INVALID_ENUM), query_status); 51} 52 53TEST_F(QueryTest, DISABLED_LatencyQueryBasic) { 54 EXPECT_TRUE(GLTestHelper::HasExtension( 55 "GL_CHROMIUM_command_buffer_latency_query")); 56 57 GLuint query = 0; 58 glGenQueriesEXT(1, &query); 59 60 GLuint query_result = 0; 61 GLuint available = 0; 62 63 // First test a query with a ~1ms "latency". 64 const unsigned int kExpectedLatencyMicroseconds = 2000; 65 const unsigned int kTimePrecisionMicroseconds = 1000; 66 67 glBeginQueryEXT(GL_LATENCY_QUERY_CHROMIUM, query); 68 // Usually, we want to measure gpu-side latency, but we fake it by 69 // adding client side latency for our test because it's easier. 70 base::PlatformThread::Sleep( 71 base::TimeDelta::FromMicroseconds(kExpectedLatencyMicroseconds)); 72 glEndQueryEXT(GL_LATENCY_QUERY_CHROMIUM); 73 74 glFinish(); 75 76 query_result = 0; 77 available = 0; 78 glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT, &available); 79 EXPECT_TRUE(available); 80 glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &query_result); 81 EXPECT_GE(query_result, kExpectedLatencyMicroseconds 82 - kTimePrecisionMicroseconds); 83 EXPECT_LE(query_result, kExpectedLatencyMicroseconds 84 + kTimePrecisionMicroseconds); 85 86 // Then test a query with the lowest latency possible. 87 glBeginQueryEXT(GL_LATENCY_QUERY_CHROMIUM, query); 88 glEndQueryEXT(GL_LATENCY_QUERY_CHROMIUM); 89 90 glFinish(); 91 92 query_result = 0; 93 available = 0; 94 glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT, &available); 95 EXPECT_TRUE(available); 96 glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &query_result); 97 98 EXPECT_LE(query_result, kTimePrecisionMicroseconds); 99} 100 101} // namespace gpu 102 103 104