1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// These tests are run twice: 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Once in a gpu test with an in-process WebGraphicsContext3D. 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Once in a browsertest with a gpu-process WebGraphicsContext3D. 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/run_loop.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "gpu/GLES2/gl2extchromium.h" 128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "gpu/command_buffer/client/context_support.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SignalTest : public ContextTestBase { 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static void RunOnlyOnce(base::Closure cb, int* tmp) { 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK_EQ(*tmp, 0); 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ++*tmp; 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cb.Run(); 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // These tests should time out if the callback doesn't get called. 258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void TestSignalSyncPoint(unsigned sync_point) { 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::RunLoop run_loop; 278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) context_support_->SignalSyncPoint(sync_point, run_loop.QuitClosure()); 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch run_loop.Run(); 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // These tests should time out if the callback doesn't get called. 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void TestSignalQuery(blink::WebGLId query) { 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::RunLoop run_loop; 348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) context_support_->SignalQuery( 358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) query, 368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Bind( 378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &RunOnlyOnce, run_loop.QuitClosure(), base::Owned(new int(0)))); 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch run_loop.Run(); 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochCONTEXT_TEST_F(SignalTest, BasicSignalSyncPointTest) { 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!context_) 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestSignalSyncPoint(context_->insertSyncPoint()); 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochCONTEXT_TEST_F(SignalTest, InvalidSignalSyncPointTest) { 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!context_) 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Signalling something that doesn't exist should run the callback 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // immediately. 558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestSignalSyncPoint(1297824234); 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochCONTEXT_TEST_F(SignalTest, BasicSignalQueryTest) { 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!context_) 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unsigned query = context_->createQueryEXT(); 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context_->beginQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM, query); 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context_->finish(); 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context_->endQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM); 668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestSignalQuery(query); 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context_->deleteQueryEXT(query); 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochCONTEXT_TEST_F(SignalTest, SignalQueryUnboundTest) { 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!context_) 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebGLId query = context_->createQueryEXT(); 758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestSignalQuery(query); 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context_->deleteQueryEXT(query); 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochCONTEXT_TEST_F(SignalTest, InvalidSignalQueryUnboundTest) { 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!context_) 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Signalling something that doesn't exist should run the callback 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // immediately. 858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestSignalQuery(928729087); 868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestSignalQuery(928729086); 878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestSignalQuery(928729085); 888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestSignalQuery(928729083); 898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestSignalQuery(928729082); 908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestSignalQuery(928729081); 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 94