summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chromium/ui/gl/gl_fence.h28
-rw-r--r--chromium/ui/gl/gl_fence_apple.cc4
-rw-r--r--chromium/ui/gl/gl_fence_apple.h1
-rw-r--r--chromium/ui/gl/gl_fence_arb.cc15
-rw-r--r--chromium/ui/gl/gl_fence_arb.h1
-rw-r--r--chromium/ui/gl/gl_fence_egl.cc12
-rw-r--r--chromium/ui/gl/gl_fence_egl.h1
-rw-r--r--chromium/ui/gl/gl_fence_nv.cc4
-rw-r--r--chromium/ui/gl/gl_fence_nv.h1
9 files changed, 64 insertions, 3 deletions
diff --git a/chromium/ui/gl/gl_fence.h b/chromium/ui/gl/gl_fence.h
index 2f7a8772f9d..730e67929b2 100644
--- a/chromium/ui/gl/gl_fence.h
+++ b/chromium/ui/gl/gl_fence.h
@@ -8,8 +8,34 @@
#include "base/macros.h"
#include "ui/gl/gl_export.h"
+typedef void *EGLDisplay;
+typedef void *EGLSyncKHR;
+typedef struct __GLsync *GLsync;
+
namespace gfx {
+union TransferableFence {
+ enum SyncType {
+ NoSync,
+ EglSync,
+ ArbSync
+ };
+ SyncType type;
+ struct {
+ SyncType type;
+ EGLDisplay display;
+ EGLSyncKHR sync;
+ } egl;
+ struct {
+ SyncType type;
+ GLsync sync;
+ } arb;
+
+ TransferableFence() : type(NoSync) { }
+ operator bool() { return type != NoSync; }
+ void reset() { type = NoSync; }
+};
+
class GL_EXPORT GLFence {
public:
GLFence();
@@ -18,6 +44,8 @@ class GL_EXPORT GLFence {
static bool IsSupported();
static GLFence* Create();
+ virtual TransferableFence Transfer() = 0;
+
virtual bool HasCompleted() = 0;
virtual void ClientWait() = 0;
diff --git a/chromium/ui/gl/gl_fence_apple.cc b/chromium/ui/gl/gl_fence_apple.cc
index 3b5f697da50..086fd8a6145 100644
--- a/chromium/ui/gl/gl_fence_apple.cc
+++ b/chromium/ui/gl/gl_fence_apple.cc
@@ -15,6 +15,10 @@ GLFenceAPPLE::GLFenceAPPLE() {
glFlush();
}
+TransferableFence GLFenceAPPLE::Transfer() {
+ return gfx::TransferableFence();
+}
+
bool GLFenceAPPLE::HasCompleted() {
DCHECK(glIsFenceAPPLE(fence_));
return !!glTestFenceAPPLE(fence_);
diff --git a/chromium/ui/gl/gl_fence_apple.h b/chromium/ui/gl/gl_fence_apple.h
index 5458e0d1c12..0beb90e7e45 100644
--- a/chromium/ui/gl/gl_fence_apple.h
+++ b/chromium/ui/gl/gl_fence_apple.h
@@ -17,6 +17,7 @@ class GL_EXPORT GLFenceAPPLE : public GLFence {
~GLFenceAPPLE() override;
// GLFence implementation:
+ TransferableFence Transfer() override;
bool HasCompleted() override;
void ClientWait() override;
void ServerWait() override;
diff --git a/chromium/ui/gl/gl_fence_arb.cc b/chromium/ui/gl/gl_fence_arb.cc
index 5c6b3371108..41d54cea212 100644
--- a/chromium/ui/gl/gl_fence_arb.cc
+++ b/chromium/ui/gl/gl_fence_arb.cc
@@ -29,6 +29,16 @@ GLFenceARB::GLFenceARB() {
glFlush();
}
+TransferableFence GLFenceARB::Transfer() {
+ gfx::TransferableFence ret;
+ if (sync_) {
+ ret.type = gfx::TransferableFence::ArbSync;
+ ret.arb.sync = sync_;
+ sync_ = 0;
+ }
+ return ret;
+}
+
bool GLFenceARB::HasCompleted() {
// Handle the case where FenceSync failed.
if (!sync_)
@@ -61,8 +71,9 @@ void GLFenceARB::ServerWait() {
}
GLFenceARB::~GLFenceARB() {
- DCHECK_EQ(GL_TRUE, glIsSync(sync_));
- glDeleteSync(sync_);
+ DCHECK_EQ(GL_TRUE, !sync_ || glIsSync(sync_));
+ if (sync_)
+ glDeleteSync(sync_);
}
} // namespace gfx
diff --git a/chromium/ui/gl/gl_fence_arb.h b/chromium/ui/gl/gl_fence_arb.h
index 3975efec7e1..3c97f0271c1 100644
--- a/chromium/ui/gl/gl_fence_arb.h
+++ b/chromium/ui/gl/gl_fence_arb.h
@@ -17,6 +17,7 @@ class GL_EXPORT GLFenceARB : public GLFence {
~GLFenceARB() override;
// GLFence implementation:
+ TransferableFence Transfer() override;
bool HasCompleted() override;
void ClientWait() override;
void ServerWait() override;
diff --git a/chromium/ui/gl/gl_fence_egl.cc b/chromium/ui/gl/gl_fence_egl.cc
index ce6583d6325..201f36261d9 100644
--- a/chromium/ui/gl/gl_fence_egl.cc
+++ b/chromium/ui/gl/gl_fence_egl.cc
@@ -27,6 +27,15 @@ GLFenceEGL::GLFenceEGL() {
glFlush();
}
+TransferableFence GLFenceEGL::Transfer() {
+ gfx::TransferableFence ret;
+ ret.type = gfx::TransferableFence::EglSync;
+ ret.egl.display = display_;
+ ret.egl.sync = sync_;
+ sync_ = EGL_NO_SYNC_KHR;
+ return ret;
+}
+
bool GLFenceEGL::HasCompleted() {
EGLint value = 0;
if (eglGetSyncAttribKHR(display_, sync_, EGL_SYNC_STATUS_KHR, &value) !=
@@ -66,7 +75,8 @@ void GLFenceEGL::ServerWait() {
}
GLFenceEGL::~GLFenceEGL() {
- eglDestroySyncKHR(display_, sync_);
+ if (sync_ != EGL_NO_SYNC_KHR)
+ eglDestroySyncKHR(display_, sync_);
}
} // namespace gfx
diff --git a/chromium/ui/gl/gl_fence_egl.h b/chromium/ui/gl/gl_fence_egl.h
index 5b6006c1972..5e022f09ebd 100644
--- a/chromium/ui/gl/gl_fence_egl.h
+++ b/chromium/ui/gl/gl_fence_egl.h
@@ -19,6 +19,7 @@ class GL_EXPORT GLFenceEGL : public GLFence {
~GLFenceEGL() override;
// GLFence implementation:
+ TransferableFence Transfer() override;
bool HasCompleted() override;
void ClientWait() override;
void ServerWait() override;
diff --git a/chromium/ui/gl/gl_fence_nv.cc b/chromium/ui/gl/gl_fence_nv.cc
index df972bd4b5e..25156df1f58 100644
--- a/chromium/ui/gl/gl_fence_nv.cc
+++ b/chromium/ui/gl/gl_fence_nv.cc
@@ -33,6 +33,10 @@ void GLFenceNV::ResetState() {
glFlush();
}
+TransferableFence GLFenceNV::Transfer() {
+ return gfx::TransferableFence();
+}
+
bool GLFenceNV::HasCompleted() {
DCHECK(glIsFenceNV(fence_));
return !!glTestFenceNV(fence_);
diff --git a/chromium/ui/gl/gl_fence_nv.h b/chromium/ui/gl/gl_fence_nv.h
index 488251b777a..b6fed9a3e47 100644
--- a/chromium/ui/gl/gl_fence_nv.h
+++ b/chromium/ui/gl/gl_fence_nv.h
@@ -17,6 +17,7 @@ class GL_EXPORT GLFenceNV : public GLFence {
~GLFenceNV() override;
// GLFence implementation:
+ TransferableFence Transfer() override;
bool ResetSupported() override;
void ResetState() override;
bool HasCompleted() override;