1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/modules/webgl/webgl_sync.h"
#include "gpu/command_buffer/client/gles2_interface.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/public/platform/task_type.h"
#include "third_party/blink/renderer/modules/webgl/webgl_context_object_support.h"
#include "third_party/blink/renderer/platform/wtf/functional.h"
namespace blink {
WebGLSync::WebGLSync(WebGLContextObjectSupport* ctx,
GLuint object,
GLenum object_type)
: WebGLObject(ctx),
sync_status_(GL_UNSIGNALED),
object_type_(object_type),
task_runner_(ctx->GetContextTaskRunner()) {
SetObject(object);
ScheduleAllowCacheUpdate();
}
WebGLSync::~WebGLSync() = default;
void WebGLSync::UpdateCache(gpu::gles2::GLES2Interface* gl) {
// Context loss is checked at higher levels.
if (sync_status_ == GL_SIGNALED) {
return;
}
if (!allow_cache_update_) {
return;
}
// We can only update the cached result when control returns to the browser.
allow_cache_update_ = false;
GLuint value = 0;
gl->GetQueryObjectuivEXT(Object(), GL_QUERY_RESULT_AVAILABLE, &value);
if (value == GL_TRUE) {
sync_status_ = GL_SIGNALED;
} else {
sync_status_ = GL_UNSIGNALED;
ScheduleAllowCacheUpdate();
}
}
GLint WebGLSync::GetCachedResult(GLenum pname) {
switch (pname) {
case GL_OBJECT_TYPE:
return object_type_;
case GL_SYNC_STATUS:
return sync_status_;
case GL_SYNC_CONDITION:
return GL_SYNC_GPU_COMMANDS_COMPLETE;
case GL_SYNC_FLAGS:
return 0;
}
NOTREACHED();
}
bool WebGLSync::IsSignaled() const {
return (sync_status_ == GL_SIGNALED);
}
void WebGLSync::ScheduleAllowCacheUpdate() {
if (task_handle_.IsActive())
return;
task_handle_ = PostCancellableTask(
*task_runner_, FROM_HERE,
WTF::BindOnce(&WebGLSync::AllowCacheUpdate, WrapWeakPersistent(this)));
}
void WebGLSync::AllowCacheUpdate() {
allow_cache_update_ = true;
}
void WebGLSync::DeleteObjectImpl(gpu::gles2::GLES2Interface* gl) {
gl->DeleteQueriesEXT(1, &Object());
}
} // namespace blink
|