blob: 1be8d783d61b7ba97cc908337058c4588d4d5ebb (
plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | // Copyright (C) 2016 The Qt Company Ltd.// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#include"qopenglcustomshaderstage_p.h"#include"qopenglengineshadermanager_p.h"#include"qopenglpaintengine_p.h"#include <private/qpainter_p.h>#include <QtCore/qpointer.h> QT_BEGIN_NAMESPACE class QOpenGLCustomShaderStagePrivate {public:QOpenGLCustomShaderStagePrivate() :m_manager(nullptr) {} QPointer<QOpenGLEngineShaderManager> m_manager; QByteArray m_source;};QOpenGLCustomShaderStage::QOpenGLCustomShaderStage():d_ptr(new QOpenGLCustomShaderStagePrivate){}QOpenGLCustomShaderStage::~QOpenGLCustomShaderStage(){Q_D(QOpenGLCustomShaderStage);if(d->m_manager) { d->m_manager->removeCustomStage(); d->m_manager->sharedShaders->cleanupCustomStage(this);}delete d_ptr;}voidQOpenGLCustomShaderStage::setUniformsDirty(){Q_D(QOpenGLCustomShaderStage);if(d->m_manager) d->m_manager->setDirty();// ### Probably a bit overkill!}boolQOpenGLCustomShaderStage::setOnPainter(QPainter* p){Q_D(QOpenGLCustomShaderStage);if(p->paintEngine()->type() !=QPaintEngine::OpenGL2) {qWarning("QOpenGLCustomShaderStage::setOnPainter() - paint engine not OpenGL2");return false;}if(d->m_manager)qWarning("Custom shader is already set on a painter"); QOpenGL2PaintEngineEx *engine =static_cast<QOpenGL2PaintEngineEx*>(p->paintEngine()); d->m_manager =QOpenGL2PaintEngineExPrivate::shaderManagerForEngine(engine);Q_ASSERT(d->m_manager); d->m_manager->setCustomStage(this);return true;}voidQOpenGLCustomShaderStage::removeFromPainter(QPainter* p){Q_D(QOpenGLCustomShaderStage);if(p->paintEngine()->type() !=QPaintEngine::OpenGL2)return; QOpenGL2PaintEngineEx *engine =static_cast<QOpenGL2PaintEngineEx*>(p->paintEngine()); d->m_manager =QOpenGL2PaintEngineExPrivate::shaderManagerForEngine(engine);Q_ASSERT(d->m_manager);// Just set the stage to null, don't call removeCustomStage().// This should leave the program in a compiled/linked state// if the next custom shader stage is this one again. d->m_manager->setCustomStage(nullptr); d->m_manager =nullptr;} QByteArray QOpenGLCustomShaderStage::source()const{Q_D(const QOpenGLCustomShaderStage);return d->m_source;}// Called by the shader manager if another custom shader is attached or// the manager is deletedvoidQOpenGLCustomShaderStage::setInactive(){Q_D(QOpenGLCustomShaderStage); d->m_manager =nullptr;}voidQOpenGLCustomShaderStage::setSource(const QByteArray& s){Q_D(QOpenGLCustomShaderStage); d->m_source = s;} QT_END_NAMESPACE
|