blob: 8dd22e74171ed2974e689ddf2d669e528c825c02 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "modules/webgl/WebGLSync.h"
#include "gpu/command_buffer/client/gles2_interface.h"
#include "modules/webgl/WebGL2RenderingContextBase.h"
#include "public/platform/Platform.h"
#include "public/platform/TaskType.h"
namespace blink {
WebGLSync::WebGLSync(WebGL2RenderingContextBase* ctx,
GLsync object,
GLenum object_type)
: WebGLSharedObject(ctx),
sync_status_(GL_UNSIGNALED),
object_(object),
object_type_(object_type) {
if (ctx->canvas()) {
task_runner_ =
ctx->canvas()->GetDocument().GetTaskRunner(TaskType::kUnthrottled);
} else {
// Fallback for OffscreenCanvas (no frame scheduler)
task_runner_ = Platform::Current()->CurrentThread()->GetWebTaskRunner();
}
ScheduleAllowCacheUpdate();
}
WebGLSync::~WebGLSync() {
RunDestructor();
}
void WebGLSync::UpdateCache(gpu::gles2::GLES2Interface* gl) {
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;
GLsizei length = -1;
GLint value = 0;
gl->GetSynciv(object_, GL_SYNC_STATUS, 1, &length, &value);
if (value) {
sync_status_ = value;
}
if (sync_status_ != GL_SIGNALED) {
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();
return 0;
}
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::Bind(&WebGLSync::AllowCacheUpdate, WrapWeakPersistent(this)));
}
void WebGLSync::AllowCacheUpdate() {
allow_cache_update_ = true;
}
void WebGLSync::DeleteObjectImpl(gpu::gles2::GLES2Interface* gl) {
gl->DeleteSync(object_);
object_ = nullptr;
}
} // namespace blink