| screencastutils.h | screencastutils.h | |||
|---|---|---|---|---|
| /* | /* | |||
| SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org> | SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org> | |||
| SPDX-License-Identifier: LGPL-2.0-or-later | SPDX-License-Identifier: LGPL-2.0-or-later | |||
| */ | */ | |||
| #pragma once | #pragma once | |||
| #include "kwinglplatform.h" | #include "kwinglplatform.h" | |||
| #include "kwingltexture.h" | #include "kwingltexture.h" | |||
| #include "kwinglutils.h" | ||||
| #include <spa/buffer/buffer.h> | #include <spa/buffer/buffer.h> | |||
| #include <spa/param/video/raw.h> | #include <spa/param/video/raw.h> | |||
| namespace KWin | namespace KWin | |||
| { | { | |||
| // in-place vertical mirroring | // in-place vertical mirroring | |||
| static void mirrorVertically(uchar *data, int height, int stride) | static void mirrorVertically(uchar *data, int height, int stride) | |||
| { | { | |||
| const int halfHeight = height / 2; | const int halfHeight = height / 2; | |||
| skipping to change at line 62 | skipping to change at line 63 | |||
| bool isGLES = GLPlatform::instance()->isGLES(); | bool isGLES = GLPlatform::instance()->isGLES(); | |||
| bool invertNeeded = isGLES ^ texture->isYInverted(); | bool invertNeeded = isGLES ^ texture->isYInverted(); | |||
| const bool invertNeededAndSupported = invertNeeded && GLPlatform::insta nce()->supports(PackInvert); | const bool invertNeededAndSupported = invertNeeded && GLPlatform::insta nce()->supports(PackInvert); | |||
| GLboolean prev; | GLboolean prev; | |||
| if (invertNeededAndSupported) { | if (invertNeededAndSupported) { | |||
| glGetBooleanv(GL_PACK_INVERT_MESA, &prev); | glGetBooleanv(GL_PACK_INVERT_MESA, &prev); | |||
| glPixelStorei(GL_PACK_INVERT_MESA, GL_TRUE); | glPixelStorei(GL_PACK_INVERT_MESA, GL_TRUE); | |||
| } | } | |||
| texture->bind(); | texture->bind(); | |||
| if (GLPlatform::instance()->isGLES()) { | // BUG: The nvidia driver fails to glGetTexImage | |||
| // Drop driver() == DriverNVidia some time after that's fixed | ||||
| if (GLPlatform::instance()->isGLES() || GLPlatform::instance()->driver( | ||||
| ) == Driver_NVidia) { | ||||
| GLFramebuffer fbo(texture); | ||||
| GLFramebuffer::pushFramebuffer(&fbo); | ||||
| glReadPixels(0, 0, size.width(), size.height(), closestGLType(forma t), GL_UNSIGNED_BYTE, spa->data); | glReadPixels(0, 0, size.width(), size.height(), closestGLType(forma t), GL_UNSIGNED_BYTE, spa->data); | |||
| GLFramebuffer::popFramebuffer(); | ||||
| } else if (GLPlatform::instance()->glVersion() >= kVersionNumber(4, 5)) { | } else if (GLPlatform::instance()->glVersion() >= kVersionNumber(4, 5)) { | |||
| glGetTextureImage(texture->texture(), 0, closestGLType(format), GL_ UNSIGNED_BYTE, spa->chunk->size, spa->data); | glGetTextureImage(texture->texture(), 0, closestGLType(format), GL_ UNSIGNED_BYTE, spa->chunk->size, spa->data); | |||
| } else { | } else { | |||
| glGetTexImage(texture->target(), 0, closestGLType(format), GL_UNSIG NED_BYTE, spa->data); | glGetTexImage(texture->target(), 0, closestGLType(format), GL_UNSIG NED_BYTE, spa->data); | |||
| } | } | |||
| if (invertNeededAndSupported) { | if (invertNeededAndSupported) { | |||
| if (!prev) { | if (!prev) { | |||
| glPixelStorei(GL_PACK_INVERT_MESA, prev); | glPixelStorei(GL_PACK_INVERT_MESA, prev); | |||
| } | } | |||
| End of changes. 3 change blocks. | ||||
| 1 lines changed or deleted | 8 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||