110 initializeOpenGLFunctions();
111 m_blitProgram =
new QOpenGLShaderProgram();
112 m_blitProgram->addShaderFromSourceCode(QOpenGLShader::Vertex,
"attribute vec4 position;\n\
113 attribute vec4 texCoords;\n\
114 varying vec2 outTexCoords;\n\
115 void main()\n\
116 {\n\
117 gl_Position = position;\n\
118 outTexCoords = texCoords.xy;\n\
119 }");
120 m_blitProgram->addShaderFromSourceCode(QOpenGLShader::Fragment,
"varying highp vec2 outTexCoords;\n\
121 uniform sampler2D texture;\n\
122 uniform lowp float forceOpaque;\n\
123 void main()\n\
124 {\n\
125 lowp vec4 c = texture2D(texture, outTexCoords);\n\
126 c.a = mix(c.a, 1.0, forceOpaque);\n\
127 gl_FragColor = c;\n\
128 }");
134 qDebug() <<
"Shader Program link failed.";
145 glDisable(GL_DEPTH_TEST);
147 glDisable(GL_CULL_FACE);
148 glDisable(GL_SCISSOR_TEST);
149 glDepthMask(GL_FALSE);
150 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
155 static const GLfloat squareVertices[] = {
161 static const GLfloat inverseSquareVertices[] = {
167 static const GLfloat textureVertices[] = {
178 m_buffer.allocate(
sizeof(squareVertices) +
sizeof(inverseSquareVertices) +
sizeof(textureVertices));
179 m_buffer.write(m_squareVerticesOffset, squareVertices,
sizeof(squareVertices));
180 m_buffer.write(m_inverseSquareVerticesOffset, inverseSquareVertices,
sizeof(inverseSquareVertices));
181 m_buffer.write(m_textureVerticesOffset, textureVertices,
sizeof(textureVertices));
185 m_textureWrap = m_context->context()->functions()->hasOpenGLFeature(QOpenGLFunctions::NPOTTextureRepeat) ? GL_REPEAT : GL_CLAMP_TO_EDGE;
191 void blit(QWaylandEglWindow *window)
193 QOpenGLTextureCache *cache = QOpenGLTextureCache::cacheForContext(m_context->context());
195 QSize surfaceSize = window->surfaceSize();
196 qreal scale = window->scale() ;
197 glViewport(0, 0, surfaceSize.width() * scale, surfaceSize.height() * scale);
200 if (
auto *decoration = window->decoration()) {
203 QImage decorationImage = decoration->contentImage();
204 cache->bindTexture(
m_context->context(), decorationImage);
205 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
206 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
207 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
m_textureWrap);
208 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
m_textureWrap);
209 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
214 glBindTexture(GL_TEXTURE_2D, window->contentTexture());
215 QRect r = window->contentsRect();
216 glViewport(r.x() * scale, r.y() * scale, r.width() * scale, r.height() * scale);
218 const bool opaqueWindow = window->window() && !window->window()->requestedFormat().hasAlpha();
219 m_blitProgram->setUniformValue(
"forceOpaque", opaqueWindow ? 1.0f : 0.0f);
220 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);