12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <GLES2/gl2.h> 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <GLES2/gl2ext.h> 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/tests/gl_manager.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/tests/gl_test_utils.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gpu { 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class OcclusionQueryTest : public testing::Test { 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected: 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLManager::Options options; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.size = gfx::Size(512, 512); 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gl_.Initialize(options); 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void TearDown() { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_.Destroy(); 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DrawRect(float x, float z, float scale, float* color); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLManager gl_; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint position_loc_; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint matrix_loc_; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint color_loc_; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void SetMatrix(float x, float z, float scale, float* matrix) { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[0] = scale; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[1] = 0.0f; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[2] = 0.0f; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[3] = 0.0f; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[4] = 0.0f; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[5] = scale; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[6] = 0.0f; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[7] = 0.0f; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[8] = 0.0f; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[9] = 0.0f; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[10] = scale; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[11] = 0.0f; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[12] = x; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[13] = 0.0f; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[14] = z; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix[15] = 1.0f; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OcclusionQueryTest::DrawRect(float x, float z, float scale, float* color) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLfloat matrix[16]; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetMatrix(x, z, scale, matrix); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set up the model matrix 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glUniformMatrix4fv(matrix_loc_, 1, GL_FALSE, matrix); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glUniform4fv(color_loc_, 1, color); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glDrawArrays(GL_TRIANGLES, 0, 6); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(OcclusionQueryTest, Occlusion) { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(GLTestHelper::HasExtension("GL_EXT_occlusion_query_boolean")) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << "GL_EXT_occlusion_query_boolean is required on OSX"; 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!GLTestHelper::HasExtension("GL_EXT_occlusion_query_boolean")) { 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static const char* v_shader_str = 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "uniform mat4 worldMatrix;\n" 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "attribute vec3 g_Position;\n" 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "void main()\n" 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "{\n" 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " gl_Position = worldMatrix *\n" 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " vec4(g_Position.x, g_Position.y, g_Position.z, 1.0);\n" 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "}\n"; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static const char* f_shader_str = 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "precision mediump float;" 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "uniform vec4 color;\n" 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "void main()\n" 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "{\n" 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " gl_FragColor = color;\n" 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "}\n"; 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str); 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position_loc_ = glGetAttribLocation(program, "g_Position"); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix_loc_ = glGetUniformLocation(program, "worldMatrix"); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color_loc_ = glGetUniformLocation(program, "color"); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GLTestHelper::SetupUnitQuad(position_loc_); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint query = 0; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glGenQueriesEXT(1, &query); 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glEnable(GL_DEPTH_TEST); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glClearColor(0.0f, 0.1f, 0.2f, 1.0f); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use the program object 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glUseProgram(program); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static float red[] = { 1.0f, 0.0f, 0.0f, 1.0f }; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DrawRect(0, 0.0f, 0.50f, red); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static float blue[] = { 0.0f, 0.0f, 1.0f, 1.0f }; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DrawRect(-0.125f, 0.1f, 0.25f, blue); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glFinish(); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint query_status = 0; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint result = 0; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT, &result); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &query_status); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(query_status); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DrawRect(1, 0.0f, 0.50f, red); 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query); 13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DrawRect(-0.125f, 0.1f, 0.25f, blue); 13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT); 13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) glFinish(); 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) query_status = 0; 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) result = 0; 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT, &result); 14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(result); 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &query_status); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(query_status); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::CheckGLError("no errors", __LINE__); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace gpu 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)