OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "modules/webgl/WebGLTimerQueryEXT.h" | 5 #include "modules/webgl/WebGLTimerQueryEXT.h" |
6 | 6 |
7 #include "core/dom/TaskRunnerHelper.h" | 7 #include "core/dom/TaskRunnerHelper.h" |
8 #include "gpu/command_buffer/client/gles2_interface.h" | 8 #include "gpu/command_buffer/client/gles2_interface.h" |
9 #include "modules/webgl/WebGLRenderingContextBase.h" | 9 #include "modules/webgl/WebGLRenderingContextBase.h" |
10 #include "public/platform/Platform.h" | 10 #include "public/platform/Platform.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 | 22 |
23 WebGLTimerQueryEXT::WebGLTimerQueryEXT(WebGLRenderingContextBase* ctx) | 23 WebGLTimerQueryEXT::WebGLTimerQueryEXT(WebGLRenderingContextBase* ctx) |
24 : WebGLContextObject(ctx), | 24 : WebGLContextObject(ctx), |
25 m_target(0), | 25 m_target(0), |
26 m_queryId(0), | 26 m_queryId(0), |
27 m_canUpdateAvailability(false), | 27 m_canUpdateAvailability(false), |
28 m_queryResultAvailable(false), | 28 m_queryResultAvailable(false), |
29 m_queryResult(0), | 29 m_queryResult(0), |
30 m_taskRunner(TaskRunnerHelper::get(TaskType::Unthrottled, | 30 m_taskRunner(TaskRunnerHelper::get(TaskType::Unthrottled, |
31 &ctx->canvas()->document()) | 31 &ctx->canvas()->document()) |
32 ->clone()), | 32 ->clone()) { |
33 m_cancellableTaskFactory(CancellableTaskFactory::create( | |
34 this, | |
35 &WebGLTimerQueryEXT::allowAvailabilityUpdate)) { | |
36 context()->contextGL()->GenQueriesEXT(1, &m_queryId); | 33 context()->contextGL()->GenQueriesEXT(1, &m_queryId); |
37 } | 34 } |
38 | 35 |
39 void WebGLTimerQueryEXT::resetCachedResult() { | 36 void WebGLTimerQueryEXT::resetCachedResult() { |
40 m_canUpdateAvailability = false; | 37 m_canUpdateAvailability = false; |
41 m_queryResultAvailable = false; | 38 m_queryResultAvailable = false; |
42 m_queryResult = 0; | 39 m_queryResult = 0; |
43 // When this is called, the implication is that we should start | 40 // When this is called, the implication is that we should start |
44 // keeping track of whether we can update the cached availability | 41 // keeping track of whether we can update the cached availability |
45 // and result. | 42 // and result. |
(...skipping 21 matching lines...) Expand all Loading... |
67 | 64 |
68 // We can only update the cached result when control returns to the browser. | 65 // We can only update the cached result when control returns to the browser. |
69 m_canUpdateAvailability = false; | 66 m_canUpdateAvailability = false; |
70 GLuint available = 0; | 67 GLuint available = 0; |
71 gl->GetQueryObjectuivEXT(object(), GL_QUERY_RESULT_AVAILABLE_EXT, &available); | 68 gl->GetQueryObjectuivEXT(object(), GL_QUERY_RESULT_AVAILABLE_EXT, &available); |
72 m_queryResultAvailable = !!available; | 69 m_queryResultAvailable = !!available; |
73 if (m_queryResultAvailable) { | 70 if (m_queryResultAvailable) { |
74 GLuint64 result = 0; | 71 GLuint64 result = 0; |
75 gl->GetQueryObjectui64vEXT(object(), GL_QUERY_RESULT_EXT, &result); | 72 gl->GetQueryObjectui64vEXT(object(), GL_QUERY_RESULT_EXT, &result); |
76 m_queryResult = result; | 73 m_queryResult = result; |
77 m_cancellableTaskFactory->cancel(); | 74 m_taskHandle.cancel(); |
78 } else { | 75 } else { |
79 scheduleAllowAvailabilityUpdate(); | 76 scheduleAllowAvailabilityUpdate(); |
80 } | 77 } |
81 } | 78 } |
82 | 79 |
83 bool WebGLTimerQueryEXT::isQueryResultAvailable() { | 80 bool WebGLTimerQueryEXT::isQueryResultAvailable() { |
84 return m_queryResultAvailable; | 81 return m_queryResultAvailable; |
85 } | 82 } |
86 | 83 |
87 GLuint64 WebGLTimerQueryEXT::getQueryResult() { | 84 GLuint64 WebGLTimerQueryEXT::getQueryResult() { |
88 return m_queryResult; | 85 return m_queryResult; |
89 } | 86 } |
90 | 87 |
91 void WebGLTimerQueryEXT::deleteObjectImpl(gpu::gles2::GLES2Interface* gl) { | 88 void WebGLTimerQueryEXT::deleteObjectImpl(gpu::gles2::GLES2Interface* gl) { |
92 gl->DeleteQueriesEXT(1, &m_queryId); | 89 gl->DeleteQueriesEXT(1, &m_queryId); |
93 m_queryId = 0; | 90 m_queryId = 0; |
94 } | 91 } |
95 | 92 |
96 void WebGLTimerQueryEXT::scheduleAllowAvailabilityUpdate() { | 93 void WebGLTimerQueryEXT::scheduleAllowAvailabilityUpdate() { |
97 if (!m_cancellableTaskFactory->isPending()) | 94 if (m_taskHandle.isActive()) |
98 m_taskRunner->postTask(BLINK_FROM_HERE, | 95 return; |
99 m_cancellableTaskFactory->cancelAndCreate()); | 96 m_taskHandle = m_taskRunner->postCancellableTask( |
| 97 BLINK_FROM_HERE, WTF::bind(&WebGLTimerQueryEXT::allowAvailabilityUpdate, |
| 98 wrapWeakPersistent(this))); |
100 } | 99 } |
101 | 100 |
102 void WebGLTimerQueryEXT::allowAvailabilityUpdate() { | 101 void WebGLTimerQueryEXT::allowAvailabilityUpdate() { |
103 m_canUpdateAvailability = true; | 102 m_canUpdateAvailability = true; |
104 } | 103 } |
105 | 104 |
106 } // namespace blink | 105 } // namespace blink |
OLD | NEW |