Fix OpenGL on macOS

This commit is contained in:
Florian Märkl 2019-08-17 14:04:17 +02:00 committed by Florian Märkl
commit 2b8bf99dd5
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
3 changed files with 49 additions and 15 deletions

View file

@ -60,6 +60,8 @@ class AVOpenGLWidget: public QOpenGLWidget
QThread *frame_uploader_thread; QThread *frame_uploader_thread;
public: public:
static QSurfaceFormat CreateSurfaceFormat();
explicit AVOpenGLWidget(VideoDecoder *decoder, QWidget *parent = nullptr); explicit AVOpenGLWidget(VideoDecoder *decoder, QWidget *parent = nullptr);
~AVOpenGLWidget() override; ~AVOpenGLWidget() override;

View file

@ -54,9 +54,9 @@ out vec4 out_color;
void main() void main()
{ {
vec3 yuv = vec3( vec3 yuv = vec3(
texture2D(tex_y, uv_var).r, texture(tex_y, uv_var).r,
texture2D(tex_u, uv_var).r - 0.5, texture(tex_u, uv_var).r - 0.5,
texture2D(tex_v, uv_var).r - 0.5); texture(tex_v, uv_var).r - 0.5);
vec3 rgb = mat3( vec3 rgb = mat3(
1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
0.0, -0.39393, 2.02839, 0.0, -0.39393, 2.02839,
@ -72,9 +72,8 @@ static const float vert_pos[] = {
1.0f, 1.0f 1.0f, 1.0f
}; };
AVOpenGLWidget::AVOpenGLWidget(VideoDecoder *decoder, QWidget *parent)
: QOpenGLWidget(parent), QSurfaceFormat AVOpenGLWidget::CreateSurfaceFormat()
decoder(decoder)
{ {
QSurfaceFormat format; QSurfaceFormat format;
format.setDepthBufferSize(0); format.setDepthBufferSize(0);
@ -84,7 +83,14 @@ AVOpenGLWidget::AVOpenGLWidget(VideoDecoder *decoder, QWidget *parent)
#ifdef DEBUG_OPENGL #ifdef DEBUG_OPENGL
format.setOption(QSurfaceFormat::DebugContext, true); format.setOption(QSurfaceFormat::DebugContext, true);
#endif #endif
setFormat(format); return format;
}
AVOpenGLWidget::AVOpenGLWidget(VideoDecoder *decoder, QWidget *parent)
: QOpenGLWidget(parent),
decoder(decoder)
{
setFormat(CreateSurfaceFormat());
frame_uploader_context = nullptr; frame_uploader_context = nullptr;
frame_uploader = nullptr; frame_uploader = nullptr;
@ -165,6 +171,9 @@ void AVOpenGLWidget::initializeGL()
{ {
auto f = QOpenGLContext::currentContext()->extraFunctions(); auto f = QOpenGLContext::currentContext()->extraFunctions();
const char *gl_version = (const char *)f->glGetString(GL_VERSION);
CHIAKI_LOGI(decoder->GetChiakiLog(), "OpenGL initialized with version \"%s\"", gl_version ? gl_version : "(null)");
#ifdef DEBUG_OPENGL #ifdef DEBUG_OPENGL
auto logger = new QOpenGLDebugLogger(this); auto logger = new QOpenGLDebugLogger(this);
logger->initialize(); logger->initialize();
@ -174,13 +183,28 @@ void AVOpenGLWidget::initializeGL()
logger->startLogging(); logger->startLogging();
#endif #endif
auto CheckShaderCompiled = [&](GLuint shader) {
GLint compiled = 0;
f->glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
if(compiled == GL_TRUE)
return;
GLint info_log_size = 0;
f->glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_log_size);
QVector<GLchar> info_log(info_log_size);
f->glGetShaderInfoLog(shader, info_log_size, &info_log_size, info_log.data());
f->glDeleteShader(shader);
CHIAKI_LOGE(decoder->GetChiakiLog(), "Failed to Compile Shader:\n%s", info_log.data());
};
GLuint shader_vert = f->glCreateShader(GL_VERTEX_SHADER); GLuint shader_vert = f->glCreateShader(GL_VERTEX_SHADER);
f->glShaderSource(shader_vert, 1, &shader_vert_glsl, nullptr); f->glShaderSource(shader_vert, 1, &shader_vert_glsl, nullptr);
f->glCompileShader(shader_vert); f->glCompileShader(shader_vert);
CheckShaderCompiled(shader_vert);
GLuint shader_frag = f->glCreateShader(GL_FRAGMENT_SHADER); GLuint shader_frag = f->glCreateShader(GL_FRAGMENT_SHADER);
f->glShaderSource(shader_frag, 1, &shader_frag_glsl, nullptr); f->glShaderSource(shader_frag, 1, &shader_frag_glsl, nullptr);
f->glCompileShader(shader_frag); f->glCompileShader(shader_frag);
CheckShaderCompiled(shader_frag);
program = f->glCreateProgram(); program = f->glCreateProgram();
f->glAttachShader(program, shader_vert); f->glAttachShader(program, shader_vert);
@ -194,7 +218,7 @@ void AVOpenGLWidget::initializeGL()
{ {
GLint info_log_size = 0; GLint info_log_size = 0;
f->glGetProgramiv(program, GL_INFO_LOG_LENGTH, &info_log_size); f->glGetProgramiv(program, GL_INFO_LOG_LENGTH, &info_log_size);
std::vector<GLchar> info_log(info_log_size); QVector<GLchar> info_log(info_log_size);
f->glGetProgramInfoLog(program, info_log_size, &info_log_size, info_log.data()); f->glGetProgramInfoLog(program, info_log_size, &info_log_size, info_log.data());
f->glDeleteProgram(program); f->glDeleteProgram(program);
CHIAKI_LOGE(decoder->GetChiakiLog(), "Failed to Link Shader Program:\n%s", info_log.data()); CHIAKI_LOGE(decoder->GetChiakiLog(), "Failed to Link Shader Program:\n%s", info_log.data());
@ -264,31 +288,34 @@ void AVOpenGLWidget::paintGL()
f->glClear(GL_COLOR_BUFFER_BIT); f->glClear(GL_COLOR_BUFFER_BIT);
int widget_width = (int)(width() * devicePixelRatioF());
int widget_height = (int)(height() * devicePixelRatioF());
QMutexLocker lock(&frames_mutex); QMutexLocker lock(&frames_mutex);
AVOpenGLFrame *frame = &frames[frame_fg]; AVOpenGLFrame *frame = &frames[frame_fg];
GLsizei vp_width, vp_height; GLsizei vp_width, vp_height;
if(!frame->width || !frame->height) if(!frame->width || !frame->height)
{ {
vp_width = width(); vp_width = widget_width;
vp_height = height(); vp_height = widget_height;
} }
else else
{ {
float aspect = (float)frame->width / (float)frame->height; float aspect = (float)frame->width / (float)frame->height;
if(aspect < (float)width() / (float)height()) if(aspect < (float)widget_width / (float)widget_height)
{ {
vp_height = height(); vp_height = widget_height;
vp_width = (GLsizei)(vp_height * aspect); vp_width = (GLsizei)(vp_height * aspect);
} }
else else
{ {
vp_width = width(); vp_width = widget_width;
vp_height = (GLsizei)(vp_width / aspect); vp_height = (GLsizei)(vp_width / aspect);
} }
} }
f->glViewport((width() - vp_width) / 2, (height() - vp_height) / 2, vp_width, vp_height); f->glViewport((widget_width - vp_width) / 2, (widget_height - vp_height) / 2, vp_width, vp_height);
for(int i=0; i<3; i++) for(int i=0; i<3; i++)
{ {

View file

@ -6,6 +6,7 @@
#include <settings.h> #include <settings.h>
#include <registdialog.h> #include <registdialog.h>
#include <host.h> #include <host.h>
#include <avopenglwidget.h>
#include <chiaki-cli.h> #include <chiaki-cli.h>
@ -21,6 +22,7 @@
#include <QAudioFormat> #include <QAudioFormat>
#include <QCommandLineParser> #include <QCommandLineParser>
#include <QMap> #include <QMap>
#include <QSurfaceFormat>
Q_DECLARE_METATYPE(ChiakiLogLevel) Q_DECLARE_METATYPE(ChiakiLogLevel)
@ -55,9 +57,12 @@ int main(int argc, char *argv[])
return 1; return 1;
} }
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
QSurfaceFormat::setDefaultFormat(AVOpenGLWidget::CreateSurfaceFormat());
QApplication app(argc, argv); QApplication app(argc, argv);
QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
Settings settings; Settings settings;