1// Copyright 2013 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// These tests are run twice:
6// Once in a gpu test with an in-process WebGraphicsContext3D.
7// Once in a browsertest with a gpu-process WebGraphicsContext3D.
8
9#include "base/bind.h"
10#include "base/run_loop.h"
11#include "gpu/GLES2/gl2extchromium.h"
12#include "gpu/command_buffer/client/context_support.h"
13
14namespace {
15
16class SignalTest : public ContextTestBase {
17 public:
18  static void RunOnlyOnce(base::Closure cb, int* tmp) {
19    CHECK_EQ(*tmp, 0);
20    ++*tmp;
21    cb.Run();
22  }
23
24  // These tests should time out if the callback doesn't get called.
25  void TestSignalSyncPoint(unsigned sync_point) {
26    base::RunLoop run_loop;
27    context_support_->SignalSyncPoint(sync_point, run_loop.QuitClosure());
28    run_loop.Run();
29  }
30
31  // These tests should time out if the callback doesn't get called.
32  void TestSignalQuery(blink::WebGLId query) {
33    base::RunLoop run_loop;
34    context_support_->SignalQuery(
35        query,
36        base::Bind(
37            &RunOnlyOnce, run_loop.QuitClosure(), base::Owned(new int(0))));
38    run_loop.Run();
39  }
40};
41
42CONTEXT_TEST_F(SignalTest, BasicSignalSyncPointTest) {
43  if (!context_)
44    return;
45
46  TestSignalSyncPoint(context_->insertSyncPoint());
47};
48
49CONTEXT_TEST_F(SignalTest, InvalidSignalSyncPointTest) {
50  if (!context_)
51    return;
52
53  // Signalling something that doesn't exist should run the callback
54  // immediately.
55  TestSignalSyncPoint(1297824234);
56};
57
58CONTEXT_TEST_F(SignalTest, BasicSignalQueryTest) {
59  if (!context_)
60    return;
61
62  unsigned query = context_->createQueryEXT();
63  context_->beginQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM, query);
64  context_->finish();
65  context_->endQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM);
66  TestSignalQuery(query);
67  context_->deleteQueryEXT(query);
68};
69
70CONTEXT_TEST_F(SignalTest, SignalQueryUnboundTest) {
71  if (!context_)
72    return;
73
74  blink::WebGLId query = context_->createQueryEXT();
75  TestSignalQuery(query);
76  context_->deleteQueryEXT(query);
77};
78
79CONTEXT_TEST_F(SignalTest, InvalidSignalQueryUnboundTest) {
80  if (!context_)
81    return;
82
83  // Signalling something that doesn't exist should run the callback
84  // immediately.
85  TestSignalQuery(928729087);
86  TestSignalQuery(928729086);
87  TestSignalQuery(928729085);
88  TestSignalQuery(928729083);
89  TestSignalQuery(928729082);
90  TestSignalQuery(928729081);
91};
92
93};
94