void OpenGLRenderPrivate::initialize() { initializeOpenGLFunctions(); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); for (int i = 0; i < 5; ++i){ const char *fShaderCode = nullptr; switch (i){ case 0: case 1: fShaderCode = fShaderI420; break; case 2: fShaderCode = fShaderNV12; break; case 3: fShaderCode = fShaderNV21; break; case 4: fShaderCode = fShaderBGRP; break; } QOpenGLShaderProgram &p = program[i]; p.addShaderFromSourceCode(QOpenGLShader::Vertex, vShaderCode); p.addShaderFromSourceCode(QOpenGLShader::Fragment, fShaderCode); p.bindAttributeLocation("VtxCoord", 0); p.bindAttributeLocation("TexCoord", 1); p.bind(); switch (i){ case 0: p.setUniformValue("SamplerY", 0); p.setUniformValue("SamplerU", 1); p.setUniformValue("SamplerV", 2); break; case 1: p.setUniformValue("SamplerY", 0); p.setUniformValue("SamplerV", 1); p.setUniformValue("SamplerU", 2); break; case 2: case 3: p.setUniformValue("SamplerY", 0); p.setUniformValue("SamplerA", 1); break; case 4: p.setUniformValue("SamplerP", 0); break; } } tex[0] = 0; tex[1] = 0; tex[2] = 1; tex[3] = 0; tex[4] = 0; tex[5] = 1; tex[6] = 1; tex[7] = 1; QOpenGLContext *c = QOpenGLContext::currentContext(); timer.setInterval(c->format().swapInterval() / (double)c->screen()->refreshRate()); }
void QSGTextMaskMaterial::init(QFontEngine::GlyphFormat glyphFormat) { Q_ASSERT(m_font.isValid()); setFlag(Blending, true); QOpenGLContext *ctx = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext()); Q_ASSERT(ctx != 0); // The following piece of code will read/write to the font engine's caches, // potentially from different threads. However, this is safe because this // code is only called from QQuickItem::updatePaintNode() which is called // only when the GUI is blocked, and multiple threads will call it in // sequence. See also QSGRenderContext::invalidate QRawFontPrivate *fontD = QRawFontPrivate::get(m_font); if (QFontEngine *fontEngine = fontD->fontEngine) { if (glyphFormat == QFontEngine::Format_None) { glyphFormat = fontEngine->glyphFormat != QFontEngine::Format_None ? fontEngine->glyphFormat : QFontEngine::Format_A32; } qreal devicePixelRatio = ctx->surface()->surfaceClass() == QSurface::Window ? static_cast<QWindow *>(ctx->surface())->devicePixelRatio() : ctx->screen()->devicePixelRatio(); QTransform glyphCacheTransform = QTransform::fromScale(devicePixelRatio, devicePixelRatio); if (!fontEngine->supportsTransformation(glyphCacheTransform)) glyphCacheTransform = QTransform(); m_glyphCache = fontEngine->glyphCache(ctx, glyphFormat, glyphCacheTransform); if (!m_glyphCache || int(m_glyphCache->glyphFormat()) != glyphFormat) { m_glyphCache = new QOpenGLTextureGlyphCache(glyphFormat, glyphCacheTransform); fontEngine->setGlyphCache(ctx, m_glyphCache.data()); QSGRenderContext *sg = QSGRenderContext::from(ctx); Q_ASSERT(sg); sg->registerFontengineForCleanup(fontEngine); } } }