109 : m_size(colorAttachment->size())
110 , m_colorAttachment(colorAttachment)
113 qCCritical(KWIN_OPENGL) <<
"Framebuffer objects aren't supported!";
119 prevFbo = current->handle();
122 glGenFramebuffers(1, &m_handle);
123 glBindFramebuffer(GL_FRAMEBUFFER, m_handle);
130 const GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
131 glBindFramebuffer(GL_FRAMEBUFFER, prevFbo);
133 if (status != GL_FRAMEBUFFER_COMPLETE) {
135 qCCritical(KWIN_OPENGL) <<
"Invalid framebuffer status: " << formatFramebufferStatus(status);
136 glDeleteFramebuffers(1, &m_handle);
154 if (!m_foreign && m_valid) {
155 glDeleteFramebuffers(1, &m_handle);
158 glDeleteRenderbuffers(1, &m_depthBuffer);
160 if (m_stencilBuffer && m_stencilBuffer != m_depthBuffer) {
161 glDeleteRenderbuffers(1, &m_stencilBuffer);
173 glViewport(0, 0, m_size.width(), m_size.height());
189 if (s_supportsPackedDepthStencil) {
190 glGenRenderbuffers(1, &buffer);
191 glBindRenderbuffer(GL_RENDERBUFFER, buffer);
192 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, m_size.width(), m_size.height());
193 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, buffer);
194 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, buffer);
196 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
197 glDeleteRenderbuffers(1, &buffer);
199 m_depthBuffer = buffer;
200 m_stencilBuffer = buffer;
208 if (s_supportsDepth24) {
209 depthFormat = GL_DEPTH_COMPONENT24;
211 depthFormat = GL_DEPTH_COMPONENT16;
214 depthFormat = GL_DEPTH_COMPONENT;
217 glGenRenderbuffers(1, &buffer);
218 glBindRenderbuffer(GL_RENDERBUFFER, buffer);
219 glRenderbufferStorage(GL_RENDERBUFFER, depthFormat, m_size.width(), m_size.height());
220 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, buffer);
221 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
222 glDeleteRenderbuffers(1, &buffer);
224 m_depthBuffer = buffer;
228 GLenum stencilFormat;
230 stencilFormat = GL_STENCIL_INDEX8;
232 stencilFormat = GL_STENCIL_INDEX;
235 glGenRenderbuffers(1, &buffer);
236 glBindRenderbuffer(GL_RENDERBUFFER, buffer);
237 glRenderbufferStorage(GL_RENDERBUFFER, stencilFormat, m_size.width(), m_size.height());
238 glFramebufferRenderbuffer(GL_RENDERBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, buffer);
239 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
240 glDeleteRenderbuffers(1, &buffer);
242 m_stencilBuffer = buffer;
255 glBindFramebuffer(GL_DRAW_FRAMEBUFFER,
handle());
256 glBindFramebuffer(GL_READ_FRAMEBUFFER, top->
handle());
258 const QRect s = source.isNull() ? QRect(QPoint(0, 0), top->
size()) : source;
259 const QRect d = destination.isNull() ? QRect(QPoint(0, 0),
size()) : destination;
261 GLuint srcX0 = s.x();
262 GLuint srcY0 = top->
size().height() - (s.y() + s.height());
263 GLuint srcX1 = s.x() + s.width();
264 GLuint srcY1 = top->
size().height() - s.y();
266 std::swap(srcX0, srcX1);
269 std::swap(srcY0, srcY1);
272 const GLuint dstX0 = d.x();
273 const GLuint dstY0 = m_size.height() - (d.y() + d.height());
274 const GLuint dstX1 = d.x() + d.width();
275 const GLuint dstY1 = m_size.height() - d.y();
277 glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, GL_COLOR_BUFFER_BIT, filter);
295 const auto texture = sourceRenderTarget.
texture();
304 mat.ortho(QRectF(QPointF(),
size()));
306 mat.translate(destination.x(), destination.y());
OutputTransform contentTransform() const