scopes: don't use shared context

OpenGL shared contexts (through Qt at least) seem to be buggy. Scopes have been
shifted to a non-shared approach as a result.
This commit is contained in:
itsmattkc
2020-04-28 17:08:52 +10:00
parent 690bdb6581
commit 4906bb7d53
17 changed files with 90 additions and 188 deletions
-3
View File
@@ -50,9 +50,6 @@ int main(int argc, char *argv[]) {
format.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(format);
// Try to share OpenGL contexts
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
// Create application instance
QApplication a(argc, argv);
+4
View File
@@ -177,6 +177,10 @@ T *PanelManager::CreatePanel(QWidget *parent)
panel->SetMovementLocked(locked_);
// Sane default for panel geometry
panel->resize(parent->size() / 3);
panel->move(panel->mapFromGlobal(parent->mapToGlobal(parent->pos())));
// Connect destroy signal so we can remove it from focus history
connect(panel, &PanelWidget::destroyed, this, &PanelManager::PanelDestroyed);
+1 -10
View File
@@ -84,19 +84,10 @@ QString ScopePanel::TypeToName(ScopePanel::Type t)
return QString();
}
void ScopePanel::SetDisplayReferredTexture(OpenGLTexture *texture)
{
Q_UNUSED(texture)
}
void ScopePanel::SetReferenceBuffer(Frame *frame)
{
histogram_->SetBuffer(frame);
}
void ScopePanel::SetReferenceTexture(OpenGLTexture *texture)
{
waveform_view_->SetTexture(texture);
waveform_view_->SetBuffer(frame);
}
void ScopePanel::SetColorManager(ColorManager *manager)
-4
View File
@@ -50,12 +50,8 @@ public:
static QString TypeToName(Type t);
public slots:
void SetDisplayReferredTexture(OpenGLTexture* texture);
void SetReferenceBuffer(Frame* frame);
void SetReferenceTexture(OpenGLTexture* texture);
void SetColorManager(ColorManager* manager);
protected:
+1 -22
View File
@@ -25,8 +25,7 @@
OLIVE_NAMESPACE_ENTER
ViewerPanelBase::ViewerPanelBase(const QString& object_name, QWidget *parent) :
TimeBasedPanel(object_name, parent),
scope_panel_count_(0)
TimeBasedPanel(object_name, parent)
{
}
@@ -98,33 +97,13 @@ void ViewerPanelBase::CreateScopePanel(ScopePanel::Type type)
p->SetType(type);
// If the scope closes, reduce the count (we do this because if no scopes are open, we can optimize the viewer slightly)
connect(p, &ScopePanel::CloseRequested, this, &ViewerPanelBase::ScopePanelClosed);
// Connect viewer widget texture drawing to scope panel
connect(vw, &ViewerWidget::DrewManagedTexture, p, &ScopePanel::SetDisplayReferredTexture);
connect(vw, &ViewerWidget::LoadedBuffer, p, &ScopePanel::SetReferenceBuffer);
connect(vw, &ViewerWidget::LoadedTexture, p, &ScopePanel::SetReferenceTexture);
connect(vw, &ViewerWidget::ColorManagerChanged, p, &ScopePanel::SetColorManager);
p->SetColorManager(vw->color_manager());
if (!scope_panel_count_) {
vw->SetEmitDrewManagedTextureEnabled(true);
}
scope_panel_count_++;
vw->ForceUpdate();
}
void ViewerPanelBase::ScopePanelClosed()
{
scope_panel_count_--;
if (!scope_panel_count_) {
static_cast<ViewerWidget*>(GetTimeBasedWidget())->SetEmitDrewManagedTextureEnabled(false);
}
}
OLIVE_NAMESPACE_EXIT
-6
View File
@@ -59,12 +59,6 @@ public:
protected:
void CreateScopePanel(ScopePanel::Type type);
private:
int scope_panel_count_;
private slots:
void ScopePanelClosed();
};
OLIVE_NAMESPACE_EXIT
+1 -1
View File
@@ -132,7 +132,7 @@ void OpenGLProxy::FrameToValue(FramePtr frame, StreamPtr stream, NodeValueTable*
VideoRenderingParams footage_params(frame->width(), frame->height(), frame->format());
footage_tex_ref = texture_cache_.Get(ctx_, footage_params, frame->data(), frame->linesize_pixels());
footage_tex_ref = texture_cache_.Get(ctx_, footage_params, frame);
if (ocio_method == ColorManager::kOCIOFast) {
if (!color_processor->IsEnabled()) {
@@ -74,6 +74,11 @@ void OpenGLTexture::Create(QOpenGLContext *ctx, int width, int height, const Pix
}
void OpenGLTexture::Create(QOpenGLContext *ctx, FramePtr frame)
{
Create(ctx, frame.get());
}
void OpenGLTexture::Create(QOpenGLContext *ctx, Frame *frame)
{
Create(ctx, frame->width(), frame->height(), frame->format(), frame->data(), frame->linesize_pixels());
}
@@ -120,6 +125,16 @@ const GLuint &OpenGLTexture::texture() const
return texture_;
}
void OpenGLTexture::Upload(FramePtr frame)
{
Upload(frame.get());
}
void OpenGLTexture::Upload(Frame *frame)
{
Upload(frame->data(), frame->linesize_pixels());
}
void OpenGLTexture::Upload(const void *data, int linesize)
{
if (!IsCreated()) {
@@ -44,6 +44,7 @@ public:
void Create(QOpenGLContext* ctx, int width, int height, const PixelFormat::Format &format, const void *data, int linesize);
void Create(QOpenGLContext* ctx, int width, int height, const PixelFormat::Format &format);
void Create(QOpenGLContext* ctx, FramePtr frame);
void Create(QOpenGLContext* ctx, Frame* frame);
bool IsCreated() const;
@@ -59,6 +60,8 @@ public:
const GLuint& texture() const;
void Upload(FramePtr frame);
void Upload(Frame* frame);
void Upload(const void *data, int linesize);
public slots:
@@ -29,6 +29,16 @@ OpenGLTextureCache::~OpenGLTextureCache()
}
}
OpenGLTextureCache::ReferencePtr OpenGLTextureCache::Get(QOpenGLContext *ctx, const VideoRenderingParams &params, FramePtr frame)
{
return Get(ctx, params, frame.get());
}
OpenGLTextureCache::ReferencePtr OpenGLTextureCache::Get(QOpenGLContext *ctx, const VideoRenderingParams &params, Frame *frame)
{
return Get(ctx, params, frame->data(), frame->linesize_pixels());
}
OpenGLTextureCache::ReferencePtr OpenGLTextureCache::Get(QOpenGLContext* ctx, const VideoRenderingParams &params, const void *data, int linesize)
{
OpenGLTexturePtr texture = nullptr;
@@ -57,6 +57,8 @@ public:
DISABLE_COPY_MOVE(OpenGLTextureCache)
ReferencePtr Get(QOpenGLContext *ctx, const VideoRenderingParams& params, FramePtr frame);
ReferencePtr Get(QOpenGLContext *ctx, const VideoRenderingParams& params, Frame* frame);
ReferencePtr Get(QOpenGLContext *ctx, const VideoRenderingParams& params, const void *data, int linesize);
ReferencePtr Get(QOpenGLContext *ctx, const VideoRenderingParams& params);
+42 -9
View File
@@ -28,27 +28,35 @@ OLIVE_NAMESPACE_ENTER
WaveformScope::WaveformScope(QWidget* parent) :
ManagedDisplayWidget(parent),
texture_(nullptr)
buffer_(nullptr)
{
EnableDefaultContextMenu();
}
void WaveformScope::SetTexture(OpenGLTexture *texture)
void WaveformScope::SetBuffer(Frame *frame)
{
texture_ = texture;
buffer_ = frame;
update();
UploadTextureFromBuffer();
}
void WaveformScope::initializeGL()
{
ManagedDisplayWidget::initializeGL();
makeCurrent();
pipeline_ = OpenGLShader::Create();
pipeline_->create();
pipeline_->addShaderFromSourceCode(QOpenGLShader::Vertex, OpenGLShader::CodeDefaultVertex());
pipeline_->addShaderFromSourceCode(QOpenGLShader::Fragment, Node::ReadFileAsString(":/shaders/rgbwaveform.frag"));
pipeline_->link();
doneCurrent();
connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &WaveformScope::CleanUp, Qt::DirectConnection);
if (buffer_) {
UploadTextureFromBuffer();
}
}
void WaveformScope::paintGL()
@@ -56,12 +64,12 @@ void WaveformScope::paintGL()
context()->functions()->glClearColor(0, 0, 0, 0);
context()->functions()->glClear(GL_COLOR_BUFFER_BIT);
if (!pipeline_ || !texture_) {
if (!pipeline_ || !texture_.IsCreated()) {
return;
}
pipeline_->bind();
pipeline_->setUniformValue("ove_resolution", texture_->width(), texture_->height());
pipeline_->setUniformValue("ove_resolution", texture_.width(), texture_.height());
pipeline_->setUniformValue("ove_viewport", width(), height());
// The general size of a pixel
@@ -69,17 +77,42 @@ void WaveformScope::paintGL()
pipeline_->release();
texture_->Bind();
texture_.Bind();
OpenGLRenderFunctions::Blit(pipeline_);
texture_->Release();
texture_.Release();
}
void WaveformScope::UploadTextureFromBuffer()
{
makeCurrent();
if (!texture_.IsCreated()
|| texture_.width() != buffer_->width()
|| texture_.height() != buffer_->height()
|| texture_.format() != buffer_->format()) {
texture_.Destroy();
texture_.Create(context(), buffer_);
} else {
texture_.Upload(buffer_);
}
doneCurrent();
update();
}
void WaveformScope::CleanUp()
{
qDebug() << "Cleaned up...";
makeCurrent();
pipeline_ = nullptr;
texture_ = nullptr;
texture_.Destroy();
doneCurrent();
}
OLIVE_NAMESPACE_EXIT
+6 -2
View File
@@ -36,7 +36,7 @@ public:
WaveformScope(QWidget* parent = nullptr);
public slots:
void SetTexture(OpenGLTexture* texture);
void SetBuffer(Frame* frame);
protected:
virtual void initializeGL() override;
@@ -44,9 +44,13 @@ protected:
virtual void paintGL() override;
private:
void UploadTextureFromBuffer();
OpenGLShaderPtr pipeline_;
OpenGLTexture* texture_;
OpenGLTexture texture_;
Frame* buffer_;
private slots:
void CleanUp();
-7
View File
@@ -66,8 +66,6 @@ ViewerWidget::ViewerWidget(QWidget *parent) :
connect(main_widget, &ViewerDisplayWidget::customContextMenuRequested, this, &ViewerWidget::ShowContextMenu);
connect(main_widget, &ViewerDisplayWidget::CursorColor, this, &ViewerWidget::CursorColor);
connect(main_widget, &ViewerDisplayWidget::LoadedBuffer, this, &ViewerWidget::LoadedBuffer);
connect(main_widget, &ViewerDisplayWidget::LoadedTexture, this, &ViewerWidget::LoadedTexture);
connect(main_widget, &ViewerDisplayWidget::DrewManagedTexture, this, &ViewerWidget::DrewManagedTexture);
connect(main_widget, &ViewerDisplayWidget::ColorProcessorChanged, this, &ViewerWidget::ColorProcessorChanged);
connect(main_widget, &ViewerDisplayWidget::ColorManagerChanged, this, &ViewerWidget::ColorManagerChanged);
connect(sizer_, &ViewerSizer::RequestMatrix, main_widget, &ViewerDisplayWidget::SetMatrix);
@@ -745,11 +743,6 @@ void ViewerWidget::SetSignalCursorColorEnabled(bool e)
}
}
void ViewerWidget::SetEmitDrewManagedTextureEnabled(bool e)
{
main_gl_widget()->SetEmitDrewManagedTextureEnabled(e);
}
void ViewerWidget::TimebaseChangedEvent(const rational &timebase)
{
TimeBasedWidget::TimebaseChangedEvent(timebase);
-15
View File
@@ -107,11 +107,6 @@ public slots:
*/
void SetSignalCursorColorEnabled(bool e);
/**
* @brief Wrapper for ViewerGLWidget::SetEmitDrewManagedTextureEnabled()
*/
void SetEmitDrewManagedTextureEnabled(bool e);
signals:
/**
* @brief Wrapper for ViewerGLWidget::CursorColor()
@@ -123,16 +118,6 @@ signals:
*/
void LoadedBuffer(Frame* load_buffer);
/**
* @brief Wrapper for ViewerGLWidget::LoadedTexture()
*/
void LoadedTexture(OpenGLTexture* texture);
/**
* @brief Wrapper for ViewerGLWidget::DrewManagedTexture()
*/
void DrewManagedTexture(OpenGLTexture* texture);
/**
* @brief Request a scope panel
*
+5 -69
View File
@@ -42,10 +42,8 @@ bool ViewerDisplayWidget::nouveau_check_done_ = false;
ViewerDisplayWidget::ViewerDisplayWidget(QWidget *parent) :
ManagedDisplayWidget(parent),
managed_copy_pipeline_(nullptr),
has_image_(false),
signal_cursor_color_(false),
enable_display_referred_signal_(false)
signal_cursor_color_(false)
{
}
@@ -91,14 +89,12 @@ void ViewerDisplayWidget::SetImage(const QString &fn)
input->read_image(input->spec().format, load_buffer_.data(), OIIO::AutoStride, load_buffer_.linesize_bytes());
input->close();
emit LoadedBuffer(&load_buffer_);
texture_.Upload(load_buffer_.data(), load_buffer_.linesize_pixels());
emit LoadedTexture(&texture_);
texture_.Upload(&load_buffer_);
doneCurrent();
emit LoadedBuffer(&load_buffer_);
has_image_ = true;
#if OIIO_VERSION < 10903
@@ -138,7 +134,7 @@ void ViewerDisplayWidget::SetImageFromLoadBuffer(Frame *in_buffer)
|| texture_.format() != in_buffer->format()) {
texture_.Create(context(), in_buffer->width(), in_buffer->height(), in_buffer->format(), in_buffer->data(), load_buffer_.linesize_pixels());
} else {
texture_.Upload(in_buffer->data(), load_buffer_.linesize_pixels());
texture_.Upload(in_buffer);
}
doneCurrent();
@@ -147,18 +143,6 @@ void ViewerDisplayWidget::SetImageFromLoadBuffer(Frame *in_buffer)
update();
}
void ViewerDisplayWidget::SetEmitDrewManagedTextureEnabled(bool e)
{
enable_display_referred_signal_ = e;
if (!enable_display_referred_signal_) {
// Destroy the texture now
managed_texture_.Destroy();
managed_copy_pipeline_ = nullptr;
framebuffer_.Destroy();
}
}
void ViewerDisplayWidget::ConnectSibling(ViewerDisplayWidget *sibling)
{
connect(this, &ViewerDisplayWidget::LoadedBuffer, sibling, &ViewerDisplayWidget::SetImageFromLoadBuffer, Qt::QueuedConnection);
@@ -243,33 +227,6 @@ void ViewerDisplayWidget::paintGL()
// We only draw if we have a pipeline
if (has_image_ && color_service() && texture_.IsCreated()) {
// If we're distributing our display-referred final buffer, we'll have to make a copy of it
if (enable_display_referred_signal_) {
if (!managed_texture_.IsCreated()
|| managed_texture_.width() != texture_.width()
|| managed_texture_.height() != texture_.height()
|| managed_texture_.format() != texture_.format()) {
managed_texture_.Destroy();
managed_texture_.Create(context(), texture_.width(), texture_.height(), texture_.format());
}
if (!managed_copy_pipeline_) {
managed_copy_pipeline_ = OpenGLShader::CreateDefault();
}
if (!framebuffer_.IsCreated()) {
framebuffer_.Create(context());
}
framebuffer_.Attach(&managed_texture_);
framebuffer_.Bind();
f->glViewport(0, 0, managed_texture_.width(), managed_texture_.height());
}
// Bind retrieved texture
f->glBindTexture(GL_TEXTURE_2D, texture_.texture());
@@ -279,24 +236,6 @@ void ViewerDisplayWidget::paintGL()
// Release retrieved texture
f->glBindTexture(GL_TEXTURE_2D, 0);
if (enable_display_referred_signal_) {
framebuffer_.Release();
framebuffer_.Detach();
emit DrewManagedTexture(&managed_texture_);
// Bind retrieved texture
managed_texture_.Bind();
f->glViewport(0, 0, width(), height());
OpenGLRenderFunctions::Blit(managed_copy_pipeline_);
// Bind retrieved texture
managed_texture_.Release();
}
}
// Draw action/title safe areas
@@ -348,10 +287,7 @@ void ViewerDisplayWidget::ContextCleanup()
{
makeCurrent();
managed_copy_pipeline_ = nullptr;
texture_.Destroy();
managed_texture_.Destroy();
framebuffer_.Destroy();
doneCurrent();
}
-40
View File
@@ -101,15 +101,6 @@ public slots:
*/
void SetImageFromLoadBuffer(Frame* in_buffer);
/**
* @brief Enables or disables DrewManagedTexture()
*
* To emit a display referred texture, it needs to be copied after the color transform is complete. This naturally
* adds extra GPU cycles that are wasted if there's nothing receiving the signal. Therefore, the signal is disabled
* by default.
*/
void SetEmitDrewManagedTextureEnabled(bool e);
signals:
/**
* @brief Signal emitted when the user starts dragging from the viewer
@@ -130,18 +121,6 @@ signals:
*/
void LoadedBuffer(Frame* load_buffer);
/**
* @brief Signal emitted when a buffer is loaded into a texture
*
* This texture will be the direct output of the renderer in reference space in GPU VRAM.
*/
void LoadedTexture(OpenGLTexture* texture);
/**
* @brief Emitted when the a texture has been transformed to display
*/
void DrewManagedTexture(OpenGLTexture* texture);
protected:
/**
* @brief Override the mouse press event simply to emit the DragStarted() signal
@@ -173,23 +152,6 @@ private:
*/
OpenGLTexture texture_;
/**
* @brief Internal framebuffer used to draw to managed_texture_
*/
OpenGLFramebuffer framebuffer_;
/**
* @brief Internal referenceto the OpenGL texture that's been managed
*
* Kept so that scopes can use the display-referred buffer without having to transform again.
*/
OpenGLTexture managed_texture_;
/**
* @brief Pipeline used to draw to managed_texture_
*/
OpenGLShaderPtr managed_copy_pipeline_;
/**
* @brief Drawing matrix (defaults to identity)
*/
@@ -210,8 +172,6 @@ private:
ViewerSafeMarginInfo safe_margin_;
bool enable_display_referred_signal_;
private slots:
/**
* @brief Slot to connect just before the OpenGL context is destroyed to clean up resources