framebuffer mode removed as it crashes in the multithreaded situation +
didn't offer the expected workaround for the missing multisampling support on certain VMs
This commit is contained in:
parent
e39b0fd861
commit
716f5d5bcb
@ -101,7 +101,6 @@ class QskWindowPrivate : public QQuickWindowPrivate
|
|||||||
public:
|
public:
|
||||||
QskWindowPrivate():
|
QskWindowPrivate():
|
||||||
preferredSize( -1, -1 ),
|
preferredSize( -1, -1 ),
|
||||||
framebufferMode( QskWindow::DefaultFramebufferMode ),
|
|
||||||
explicitLocale( false ),
|
explicitLocale( false ),
|
||||||
deleteOnClose( false ),
|
deleteOnClose( false ),
|
||||||
autoLayoutChildren( true )
|
autoLayoutChildren( true )
|
||||||
@ -113,9 +112,7 @@ public:
|
|||||||
|
|
||||||
// minimum/maximum constraints are offered by QWindow
|
// minimum/maximum constraints are offered by QWindow
|
||||||
QSize preferredSize;
|
QSize preferredSize;
|
||||||
QMetaObject::Connection renderTargetConnection;
|
|
||||||
|
|
||||||
QskWindow::FramebufferMode framebufferMode : 1;
|
|
||||||
bool explicitLocale : 1;
|
bool explicitLocale : 1;
|
||||||
bool deleteOnClose : 1;
|
bool deleteOnClose : 1;
|
||||||
bool autoLayoutChildren : 1;
|
bool autoLayoutChildren : 1;
|
||||||
@ -314,10 +311,6 @@ void QskWindow::resizeEvent( QResizeEvent* event )
|
|||||||
|
|
||||||
if ( isExposed() )
|
if ( isExposed() )
|
||||||
layoutItems();
|
layoutItems();
|
||||||
|
|
||||||
Q_D( QskWindow );
|
|
||||||
if ( d->framebufferMode == OffscreenFramebufferMode )
|
|
||||||
d->renderTargetSize = size() * devicePixelRatio();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QLocale QskWindow::locale() const
|
QLocale QskWindow::locale() const
|
||||||
@ -520,86 +513,6 @@ const char* QskWindow::customRenderMode() const
|
|||||||
return d->customRenderMode;
|
return d->customRenderMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QskWindow::setFramebufferMode( FramebufferMode framebufferMode )
|
|
||||||
{
|
|
||||||
Q_D( QskWindow );
|
|
||||||
|
|
||||||
if ( d->framebufferMode == framebufferMode )
|
|
||||||
return;
|
|
||||||
|
|
||||||
d->framebufferMode = framebufferMode;
|
|
||||||
Q_EMIT framebufferModeChanged( d->framebufferMode );
|
|
||||||
|
|
||||||
connect( this, &QQuickWindow::beforeRendering,
|
|
||||||
this, &QskWindow::resizeFramebuffer );
|
|
||||||
}
|
|
||||||
|
|
||||||
QskWindow::FramebufferMode QskWindow::framebufferMode() const
|
|
||||||
{
|
|
||||||
Q_D( const QskWindow );
|
|
||||||
return d->framebufferMode;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QskWindow::resizeFramebuffer()
|
|
||||||
{
|
|
||||||
Q_D( QskWindow );
|
|
||||||
|
|
||||||
QObject::disconnect( this, &QQuickWindow::beforeRendering,
|
|
||||||
this, &QskWindow::resizeFramebuffer );
|
|
||||||
|
|
||||||
if ( d->framebufferMode == DefaultFramebufferMode )
|
|
||||||
{
|
|
||||||
delete renderTarget();
|
|
||||||
setRenderTarget( nullptr );
|
|
||||||
if ( d->renderTargetConnection )
|
|
||||||
QObject::disconnect( d->renderTargetConnection );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QOpenGLFramebufferObjectFormat renderTargetFormat;
|
|
||||||
renderTargetFormat.setAttachment( QOpenGLFramebufferObject::CombinedDepthStencil );
|
|
||||||
|
|
||||||
const auto samples = format().samples();
|
|
||||||
if ( samples && QOpenGLExtensions( openglContext() ).hasOpenGLExtension(
|
|
||||||
QOpenGLExtensions::FramebufferMultisample ) )
|
|
||||||
{
|
|
||||||
renderTargetFormat.setSamples( format().samples() );
|
|
||||||
}
|
|
||||||
|
|
||||||
delete renderTarget();
|
|
||||||
|
|
||||||
const auto framebufferSize = size() * devicePixelRatio();
|
|
||||||
|
|
||||||
setRenderTarget( new QOpenGLFramebufferObject(
|
|
||||||
framebufferSize, renderTargetFormat ) );
|
|
||||||
|
|
||||||
// Hack the size to render to a portion of the FBO
|
|
||||||
d->renderTargetSize = framebufferSize;
|
|
||||||
|
|
||||||
if ( !d->renderTargetConnection )
|
|
||||||
{
|
|
||||||
connect( this, &QQuickWindow::afterRendering,
|
|
||||||
this, &QskWindow::blitFramebuffer );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QskWindow::blitFramebuffer()
|
|
||||||
{
|
|
||||||
if ( clearBeforeRendering() )
|
|
||||||
{
|
|
||||||
QOpenGLFunctions gl( openglContext() );
|
|
||||||
QOpenGLFramebufferObject::bindDefault();
|
|
||||||
const auto c = color();
|
|
||||||
gl.glClearColor( c.redF(), c.greenF(), c.blueF(), c.alphaF() );
|
|
||||||
gl.glClear( GL_COLOR_BUFFER_BIT );
|
|
||||||
}
|
|
||||||
|
|
||||||
const QRect rect( QPoint(), renderTargetSize() );
|
|
||||||
QOpenGLFramebufferObject::blitFramebuffer(
|
|
||||||
nullptr, rect, renderTarget(), rect,
|
|
||||||
GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
|
|
||||||
}
|
|
||||||
|
|
||||||
void QskWindow::enforceSkin()
|
void QskWindow::enforceSkin()
|
||||||
{
|
{
|
||||||
if ( !qskEnforcedSkin )
|
if ( !qskEnforcedSkin )
|
||||||
|
@ -25,20 +25,9 @@ class QSK_EXPORT QskWindow : public QQuickWindow
|
|||||||
Q_PROPERTY( QLocale locale READ locale
|
Q_PROPERTY( QLocale locale READ locale
|
||||||
WRITE setLocale RESET resetLocale NOTIFY localeChanged FINAL )
|
WRITE setLocale RESET resetLocale NOTIFY localeChanged FINAL )
|
||||||
|
|
||||||
Q_PROPERTY( FramebufferMode framebufferMode READ framebufferMode
|
|
||||||
WRITE setFramebufferMode NOTIFY framebufferModeChanged FINAL )
|
|
||||||
|
|
||||||
using Inherited = QQuickWindow;
|
using Inherited = QQuickWindow;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum FramebufferMode
|
|
||||||
{
|
|
||||||
DefaultFramebufferMode = 0,
|
|
||||||
OffscreenFramebufferMode = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
Q_ENUM( FramebufferMode )
|
|
||||||
|
|
||||||
QskWindow( QWindow* parent = nullptr );
|
QskWindow( QWindow* parent = nullptr );
|
||||||
virtual ~QskWindow();
|
virtual ~QskWindow();
|
||||||
|
|
||||||
@ -60,9 +49,6 @@ public:
|
|||||||
|
|
||||||
Q_INVOKABLE void setFixedSize( const QSize& );
|
Q_INVOKABLE void setFixedSize( const QSize& );
|
||||||
|
|
||||||
void setFramebufferMode( FramebufferMode );
|
|
||||||
FramebufferMode framebufferMode() const;
|
|
||||||
|
|
||||||
void polishItems();
|
void polishItems();
|
||||||
|
|
||||||
void setCustomRenderMode( const char* mode );
|
void setCustomRenderMode( const char* mode );
|
||||||
@ -70,7 +56,6 @@ public:
|
|||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void localeChanged( const QLocale& );
|
void localeChanged( const QLocale& );
|
||||||
void framebufferModeChanged( FramebufferMode );
|
|
||||||
void autoLayoutChildrenChanged();
|
void autoLayoutChildrenChanged();
|
||||||
void deleteOnCloseChanged();
|
void deleteOnCloseChanged();
|
||||||
|
|
||||||
@ -89,8 +74,6 @@ protected:
|
|||||||
virtual void ensureFocus( Qt::FocusReason );
|
virtual void ensureFocus( Qt::FocusReason );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void resizeFramebuffer();
|
|
||||||
void blitFramebuffer();
|
|
||||||
void enforceSkin();
|
void enforceSkin();
|
||||||
|
|
||||||
Q_DECLARE_PRIVATE( QskWindow )
|
Q_DECLARE_PRIVATE( QskWindow )
|
||||||
|
Loading…
x
Reference in New Issue
Block a user