Enable shader cache for ES2 when GL_OES_get_program_binary is present
Change-Id: I4fb71471a7dd22441def1eb837857d245c3e3c5a Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
This commit is contained in:
parent
e4c1feae5c
commit
65cdd0f366
@ -168,12 +168,19 @@ bool QOpenGLProgramBinaryCache::verifyHeader(const QByteArray &buf) const
|
||||
|
||||
bool QOpenGLProgramBinaryCache::setProgramBinary(uint programId, uint blobFormat, const void *p, uint blobSize)
|
||||
{
|
||||
QOpenGLExtraFunctions *funcs = QOpenGLContext::currentContext()->extraFunctions();
|
||||
QOpenGLContext *context = QOpenGLContext::currentContext();
|
||||
QOpenGLExtraFunctions *funcs = context->extraFunctions();
|
||||
while (true) {
|
||||
GLenum error = funcs->glGetError();
|
||||
if (error == GL_NO_ERROR || error == GL_CONTEXT_LOST)
|
||||
break;
|
||||
}
|
||||
#if defined(QT_OPENGL_ES_2)
|
||||
if (context->isOpenGLES() && context->format().majorVersion() < 3) {
|
||||
initializeProgramBinaryOES(context);
|
||||
programBinaryOES(programId, blobFormat, p, blobSize);
|
||||
} else
|
||||
#endif
|
||||
funcs->glProgramBinary(programId, blobFormat, p, blobSize);
|
||||
|
||||
GLenum err = funcs->glGetError();
|
||||
@ -347,7 +354,8 @@ void QOpenGLProgramBinaryCache::save(const QByteArray &cacheKey, uint programId)
|
||||
|
||||
GLEnvInfo info;
|
||||
|
||||
QOpenGLExtraFunctions *funcs = QOpenGLContext::currentContext()->extraFunctions();
|
||||
QOpenGLContext *context = QOpenGLContext::currentContext();
|
||||
QOpenGLExtraFunctions *funcs = context->extraFunctions();
|
||||
GLint blobSize = 0;
|
||||
while (true) {
|
||||
GLenum error = funcs->glGetError();
|
||||
@ -390,6 +398,12 @@ void QOpenGLProgramBinaryCache::save(const QByteArray &cacheKey, uint programId)
|
||||
*p++ = 0;
|
||||
|
||||
GLint outSize = 0;
|
||||
#if defined(QT_OPENGL_ES_2)
|
||||
if (context->isOpenGLES() && context->format().majorVersion() < 3) {
|
||||
initializeProgramBinaryOES(context);
|
||||
getProgramBinaryOES(programId, blobSize, &outSize, &blobFormat, p);
|
||||
} else
|
||||
#endif
|
||||
funcs->glGetProgramBinary(programId, blobSize, &outSize, &blobFormat, p);
|
||||
if (blobSize != outSize) {
|
||||
qCDebug(DBG_SHADER_CACHE, "glGetProgramBinary returned size %d instead of %d", outSize, blobSize);
|
||||
@ -408,4 +422,17 @@ void QOpenGLProgramBinaryCache::save(const QByteArray &cacheKey, uint programId)
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(QT_OPENGL_ES_2)
|
||||
void QOpenGLProgramBinaryCache::initializeProgramBinaryOES(QOpenGLContext *context)
|
||||
{
|
||||
if (m_programBinaryOESInitialized)
|
||||
return;
|
||||
m_programBinaryOESInitialized = true;
|
||||
|
||||
Q_ASSERT(context);
|
||||
getProgramBinaryOES = (void (QOPENGLF_APIENTRYP)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary))context->getProcAddress("glGetProgramBinaryOES");
|
||||
programBinaryOES = (void (QOPENGLF_APIENTRYP)(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length))context->getProcAddress("glProgramBinaryOES");
|
||||
}
|
||||
#endif
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -93,6 +93,12 @@ private:
|
||||
uint format;
|
||||
};
|
||||
QCache<QByteArray, MemCacheEntry> m_memCache;
|
||||
#if defined(QT_OPENGL_ES_2)
|
||||
void (QOPENGLF_APIENTRYP programBinaryOES)(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
|
||||
void (QOPENGLF_APIENTRYP getProgramBinaryOES)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
|
||||
void initializeProgramBinaryOES(QOpenGLContext *context);
|
||||
bool m_programBinaryOESInitialized = false;
|
||||
#endif
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -3753,8 +3753,14 @@ QOpenGLProgramBinarySupportCheck::QOpenGLProgramBinarySupportCheck(QOpenGLContex
|
||||
if (ctx) {
|
||||
if (ctx->isOpenGLES()) {
|
||||
qCDebug(DBG_SHADER_CACHE, "OpenGL ES v%d context", ctx->format().majorVersion());
|
||||
if (ctx->format().majorVersion() >= 3)
|
||||
if (ctx->format().majorVersion() >= 3) {
|
||||
m_supported = true;
|
||||
} else {
|
||||
const bool hasExt = ctx->hasExtension("GL_OES_get_program_binary");
|
||||
qCDebug(DBG_SHADER_CACHE, "GL_OES_get_program_binary support = %d", hasExt);
|
||||
if (hasExt)
|
||||
m_supported = true;
|
||||
}
|
||||
} else {
|
||||
const bool hasExt = ctx->hasExtension("GL_ARB_get_program_binary");
|
||||
qCDebug(DBG_SHADER_CACHE, "GL_ARB_get_program_binary support = %d", hasExt);
|
||||
|
Loading…
x
Reference in New Issue
Block a user