File indexing completed on 2024-11-10 04:56:53

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include "eglimagetexture.h"
0011 #include "egldisplay.h"
0012 #include "opengl/gltexture_p.h"
0013 
0014 #include <QDebug>
0015 #include <epoxy/egl.h>
0016 
0017 namespace KWin
0018 {
0019 
0020 EGLImageTexture::EGLImageTexture(EglDisplay *display, EGLImage image, uint textureId, int internalFormat, const QSize &size, uint32_t target)
0021     : GLTexture(target, textureId, internalFormat, size, 1, true, OutputTransform::FlipY)
0022     , m_image(image)
0023     , m_display(display)
0024 {
0025 }
0026 
0027 EGLImageTexture::~EGLImageTexture()
0028 {
0029     eglDestroyImageKHR(m_display->handle(), m_image);
0030 }
0031 
0032 std::shared_ptr<EGLImageTexture> EGLImageTexture::create(EglDisplay *display, EGLImageKHR image, int internalFormat, const QSize &size, bool externalOnly)
0033 {
0034     if (image == EGL_NO_IMAGE) {
0035         return nullptr;
0036     }
0037     GLuint texture = 0;
0038     glGenTextures(1, &texture);
0039     if (!texture) {
0040         return nullptr;
0041     }
0042     const uint32_t target = externalOnly ? GL_TEXTURE_EXTERNAL_OES : GL_TEXTURE_2D;
0043     glBindTexture(target, texture);
0044     glEGLImageTargetTexture2DOES(target, image);
0045     glBindTexture(target, 0);
0046     return std::make_shared<EGLImageTexture>(display, image, texture, internalFormat, size, target);
0047 }
0048 
0049 } // namespace KWin