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)
|
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) {
|
while (true) {
|
||||||
GLenum error = funcs->glGetError();
|
GLenum error = funcs->glGetError();
|
||||||
if (error == GL_NO_ERROR || error == GL_CONTEXT_LOST)
|
if (error == GL_NO_ERROR || error == GL_CONTEXT_LOST)
|
||||||
break;
|
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);
|
funcs->glProgramBinary(programId, blobFormat, p, blobSize);
|
||||||
|
|
||||||
GLenum err = funcs->glGetError();
|
GLenum err = funcs->glGetError();
|
||||||
@ -347,7 +354,8 @@ void QOpenGLProgramBinaryCache::save(const QByteArray &cacheKey, uint programId)
|
|||||||
|
|
||||||
GLEnvInfo info;
|
GLEnvInfo info;
|
||||||
|
|
||||||
QOpenGLExtraFunctions *funcs = QOpenGLContext::currentContext()->extraFunctions();
|
QOpenGLContext *context = QOpenGLContext::currentContext();
|
||||||
|
QOpenGLExtraFunctions *funcs = context->extraFunctions();
|
||||||
GLint blobSize = 0;
|
GLint blobSize = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
GLenum error = funcs->glGetError();
|
GLenum error = funcs->glGetError();
|
||||||
@ -390,6 +398,12 @@ void QOpenGLProgramBinaryCache::save(const QByteArray &cacheKey, uint programId)
|
|||||||
*p++ = 0;
|
*p++ = 0;
|
||||||
|
|
||||||
GLint outSize = 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);
|
funcs->glGetProgramBinary(programId, blobSize, &outSize, &blobFormat, p);
|
||||||
if (blobSize != outSize) {
|
if (blobSize != outSize) {
|
||||||
qCDebug(DBG_SHADER_CACHE, "glGetProgramBinary returned size %d instead of %d", outSize, blobSize);
|
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
|
QT_END_NAMESPACE
|
||||||
|
@ -93,6 +93,12 @@ private:
|
|||||||
uint format;
|
uint format;
|
||||||
};
|
};
|
||||||
QCache<QByteArray, MemCacheEntry> m_memCache;
|
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
|
QT_END_NAMESPACE
|
||||||
|
@ -3753,8 +3753,14 @@ QOpenGLProgramBinarySupportCheck::QOpenGLProgramBinarySupportCheck(QOpenGLContex
|
|||||||
if (ctx) {
|
if (ctx) {
|
||||||
if (ctx->isOpenGLES()) {
|
if (ctx->isOpenGLES()) {
|
||||||
qCDebug(DBG_SHADER_CACHE, "OpenGL ES v%d context", ctx->format().majorVersion());
|
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;
|
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 {
|
} else {
|
||||||
const bool hasExt = ctx->hasExtension("GL_ARB_get_program_binary");
|
const bool hasExt = ctx->hasExtension("GL_ARB_get_program_binary");
|
||||||
qCDebug(DBG_SHADER_CACHE, "GL_ARB_get_program_binary support = %d", hasExt);
|
qCDebug(DBG_SHADER_CACHE, "GL_ARB_get_program_binary support = %d", hasExt);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user