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