summaryrefslogtreecommitdiffstats
path: root/src/core/chromium_gpu_helper.h
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-08-28 19:43:36 +0200
committerJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-09-01 15:48:54 +0200
commit5b8e3ecf388d9f8921412822049ef90565553067 (patch)
treea6d98800f9095dd79ab355e8831d92c565a48458 /src/core/chromium_gpu_helper.h
parent41efc54901905167d312e5a1974215efd592fee1 (diff)
Wait on sync point fences instead of creating a new fence
Posting a runnable on the GPU thread's message loop and creating a GL fence sync there assumes that there is a current GL context, and that synchronizing with this context will make sure that we wait for all GL context producing any of our consumed texture mailboxes. This is however not always the case like when: - The current GL context on the GPU thread is destroyed right before our runnable is handled, displaying errors on the console that glFlush needs a current context. - The GL driver will do extra scheduling and let the scene graph thread synchronize its GL command stream only with the GL context in which the fence sync was created. To remedy the situation, make sure that Chromium creates a fence sync for every sync points associated with a mailbox that we consume and do so directly in the GL context associated with the originating glInsertSyncPointCHROMIUM call. Wait for all those syncs on the Qt side afterward. This might also help with a few erratic behaviors noticed on some embedded GL drivers. Change-Id: I5fc60fcf51497477b2e1b3a535d0a141954fc6e5 Reviewed-by: Andras Becsi <andras.becsi@digia.com>
Diffstat (limited to 'src/core/chromium_gpu_helper.h')
-rw-r--r--src/core/chromium_gpu_helper.h30
1 files changed, 3 insertions, 27 deletions
diff --git a/src/core/chromium_gpu_helper.h b/src/core/chromium_gpu_helper.h
index 364f82bbc..8b11c9b5f 100644
--- a/src/core/chromium_gpu_helper.h
+++ b/src/core/chromium_gpu_helper.h
@@ -38,8 +38,10 @@
#define CHROMIUM_GPU_HELPER_H
#include <QtGlobal> // We need this for the Q_OS_QNX define.
+#include <QMap>
#include "base/callback.h"
+#include "ui/gl/gl_fence.h"
namespace base {
class MessageLoop;
@@ -57,38 +59,12 @@ class Texture;
}
}
-typedef void *EGLDisplay;
-typedef void *EGLSyncKHR;
-typedef struct __GLsync *GLsync;
-
-union FenceSync {
- enum SyncType {
- NoSync,
- EglSync,
- ArbSync
- };
- SyncType type;
- struct {
- SyncType type;
- EGLDisplay display;
- EGLSyncKHR sync;
- } egl;
- struct {
- SyncType type;
- GLsync sync;
- } arb;
-
- FenceSync() : type(NoSync) { }
- operator bool() { return type != NoSync; }
- void reset() { type = NoSync; }
-};
-
// These functions wrap code that needs to include headers that are
// incompatible with Qt GL headers.
// From the outside, types from incompatible headers referenced in these
// functions should only be forward-declared and considered as opaque types.
-FenceSync createFence();
+QMap<uint32, gfx::TransferableFence> transferFences();
base::MessageLoop *gpu_message_loop();
content::SyncPointManager *sync_point_manager();
gpu::gles2::MailboxManager *mailbox_manager();