OSDN Git Service

[Qt][OpenGL] Don't makeCurrent()/doneCurrent() inside of resizeGL().Fixed crash runni...
[csp-qt/common_source_project-fm7.git] / source / src / qt / gui / gl3 / qt_glutil_gl3_0.cpp
index f8c4d38..9d7a71a 100644 (file)
@@ -7,14 +7,19 @@
  * Jan 22, 2016 : Initial.
  */
 
+#include "osd_types.h"
 #include "qt_gldraw.h"
 #include "qt_glpack.h"
 #include "qt_glutil_gl3_0.h"
 #include "csp_logger.h"
-#include "menu_flags.h"
 #include <QOpenGLTexture>
 #include <QOpenGLFunctions_3_0>
 
+#include <QColor>
+#include <QImageReader>
+#include <QRect>
+#include <QOpenGLTexture>
+
 //extern USING_FLAGS *using_flags;
 #if 0
        // OLD_THREE_PHASE
@@ -303,12 +308,12 @@ void GLDraw_3_0::initGLObjects()
 void GLDraw_3_0::initPackedGLObject(GLScreenPack **p,
                                                                        int _width, int _height,
                                                                        const QString vertex_shader, const QString fragment_shader,
-                                                                       const QString _name)
+                                                                       const QString _name, bool req_float, bool req_highp)
 {
        QString s;
        GLScreenPack *pp;
        if(p != NULL) {
-               pp = new GLScreenPack(_width, _height, p_wid);
+               pp = new GLScreenPack(_width, _height, _name, p_wid, req_float, req_highp);
                *p = pp;
                if(pp != NULL) {
                        pp->initialize(_width, _height, vertex_shader, fragment_shader);
@@ -319,6 +324,11 @@ void GLDraw_3_0::initPackedGLObject(GLScreenPack **p,
                                csp_logger->debug_log(CSP_LOG_INFO, CSP_LOG_TYPE_GL_SHADER, "Fragment: %s ", fragment_shader.toLocal8Bit().constData());
                                csp_logger->debug_log(CSP_LOG_INFO, CSP_LOG_TYPE_GL_SHADER, "%s", s.toLocal8Bit().constData());
                        }
+                       s = pp->getGLLog();
+                       if(s.size() > 0) {
+                               csp_logger->debug_log(CSP_LOG_INFO, CSP_LOG_TYPE_GL_SHADER, "%s", s.toLocal8Bit().constData());
+                               pp->clearGLLog();
+                       }
                }
        }
 }
@@ -330,11 +340,7 @@ bool GLDraw_3_0::initGridShaders(const QString vertex_fixed, const QString verte
        bool f = false;
        grids_shader = new QOpenGLShaderProgram(p_wid);
        if(grids_shader != NULL) {
-               if(using_flags->is_use_screen_rotate()) {
-                       f = grids_shader->addShaderFromSourceFile(QOpenGLShader::Vertex, vertex_rotate);
-               } else {
-                       f = grids_shader->addShaderFromSourceFile(QOpenGLShader::Vertex, vertex_fixed);
-               }
+               f = grids_shader->addShaderFromSourceFile(QOpenGLShader::Vertex, vertex_rotate);
                f &= grids_shader->addShaderFromSourceFile(QOpenGLShader::Fragment, fragment);
                f &= grids_shader->link();
        }
@@ -421,12 +427,12 @@ void GLDraw_3_0::initLocalGLObjects(void)
                initPackedGLObject(&main_pass,
                                                   using_flags->get_screen_width() * 2, using_flags->get_screen_height() * 2,
                                                   ":/gl3/vertex_shader.glsl" , ":/gl3/chromakey_fragment_shader2.glsl",
-                                                  "Main Shader");
+                                                  "Main Shader", false, false);
        } else {
                initPackedGLObject(&main_pass,
                                                   using_flags->get_screen_width() * 2, using_flags->get_screen_height() * 2,
                                                   ":/gl3/vertex_shader.glsl" , ":/gl3/fragment_shader.glsl",
-                                                  "Main Shader");
+                                                  "Main Shader", false, false);
        }               
        if(main_pass != NULL) {
                setNormalVAO(main_pass->getShader(), main_pass->getVAO(),
@@ -436,11 +442,11 @@ void GLDraw_3_0::initLocalGLObjects(void)
        initPackedGLObject(&std_pass,
                                           using_flags->get_screen_width(), using_flags->get_screen_height(),
                                           ":/gl3/vertex_shader.glsl" , ":/gl3/chromakey_fragment_shader.glsl",
-                                          "Standard Shader");
+                                          "Standard Shader", false, false);
        initPackedGLObject(&led_pass,
                                           10, 10,
                                           ":/gl3/led_vertex_shader.glsl" , ":/gl3/led_fragment_shader.glsl",
-                                          "LED Shader");
+                                          "LED Shader", false, false);
        for(int i = 0; i < 32; i++) {
                led_pass_vao[i] = new QOpenGLVertexArrayObject;
                led_pass_vbuffer[i] = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
@@ -459,7 +465,7 @@ void GLDraw_3_0::initLocalGLObjects(void)
        initPackedGLObject(&osd_pass,
                                           48.0, 48.0,
                                           ":/gl3/vertex_shader.glsl" , ":/gl3/icon_fragment_shader.glsl",
-                                          "OSD Shader");
+                                          "OSD Shader", false, false);
        for(int i = 0; i < 32; i++) {
                osd_pass_vao[i] = new QOpenGLVertexArrayObject;
                osd_pass_vbuffer[i] = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
@@ -479,11 +485,11 @@ void GLDraw_3_0::initLocalGLObjects(void)
        initPackedGLObject(&ntsc_pass1,
                                           _width, _height,
                                           ":/gl3/vertex_shader.glsl" , ":/gl3/ntsc_pass1.glsl",
-                                          "NTSC Shader Pass1");
+                                          "NTSC Shader Pass1", true, true);
        initPackedGLObject(&ntsc_pass2,
                                           _width / 2, _height,
                                           ":/gl3/vertex_shader.glsl" , ":/gl3/ntsc_pass2.glsl",
-                                          "NTSC Shader Pass2");
+                                          "NTSC Shader Pass2", true, true);
        {
                int ii;
                QOpenGLShaderProgram *shader = ntsc_pass2->getShader();
@@ -504,7 +510,7 @@ void GLDraw_3_0::initLocalGLObjects(void)
                initPackedGLObject(&bitmap_block,
                                                   _width * 2, _height * 2,
                                                   ":/gl3/vertex_shader.glsl", ":/gl3/normal_fragment_shader.glsl",
-                                                  "Background Bitmap Shader");
+                                                  "Background Bitmap Shader", false, false);
                if(bitmap_block != NULL) {
                        setNormalVAO(bitmap_block->getShader(), bitmap_block->getVAO(),
                                                 bitmap_block->getVertexBuffer(),
@@ -571,19 +577,32 @@ void GLDraw_3_0::drawGridsMain_3(QOpenGLShaderProgram *prg,
                bp->bind();
                vp->bind();
                prg->bind();
-               //GLfloat ff[2];
-               //bp->read(8, &ff, sizeof(GLfloat) * 2);
-               //printf("%d %f %f\n", number, ff[0], ff[1]);
                
+               QMatrix2x2 rot;
+               switch(p_config->rotate_type) {
+                       case 0:
+                               rot = QMatrix2x2(rot0);
+                               break;
+                       case 1:
+                               rot = QMatrix2x2(rot90);
+                               break;
+                       case 2:
+                               rot = QMatrix2x2(rot180);
+                               break;
+                       case 3:
+                               rot = QMatrix2x2(rot270);
+                               break;
+                       default:
+                               rot = QMatrix2x2(rot0);
+                               break;
+               }
+               prg->setUniformValue("rotate_mat", rot);
                prg->setUniformValue("color", color);
                prg->enableAttributeArray("vertex");
                int vertex_loc = prg->attributeLocation("vertex");
                
                extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
                extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
-               //extfunc->glEnable(GL_BLEND);
-               //extfunc->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-               //extfunc->glBlendFunc(GL_SRC_ALPHA, GL_ONE);
                extfunc->glVertexAttribPointer(vertex_loc, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, 0); 
                extfunc->glEnableVertexAttribArray(vertex_loc);
                
@@ -593,7 +612,7 @@ void GLDraw_3_0::drawGridsMain_3(QOpenGLShaderProgram *prg,
                extfunc->glVertexPointer(3, GL_FLOAT, 0, 0);
                extfunc->glDrawArrays(GL_LINES, 0, (number + 1) * 2);
                extfunc->glDisableClientState(GL_VERTEX_ARRAY);
-               //extfunc->glDisable(GL_BLEND);
+
                prg->release();
                vp->release();
                bp->release();
@@ -602,7 +621,7 @@ void GLDraw_3_0::drawGridsMain_3(QOpenGLShaderProgram *prg,
 
 void GLDraw_3_0::doSetGridsVertical(int pixels, bool force)
 {
-       GLDraw_2_0::doSetGridsVertical(pixels, force);
+       GLDraw_Tmpl::doSetGridsVertical(pixels, force);
        updateGridsVAO(grids_vertical_buffer,
                                   grids_vertical_vertex,
                                   glVertGrids,
@@ -612,7 +631,7 @@ void GLDraw_3_0::doSetGridsVertical(int pixels, bool force)
 void GLDraw_3_0::doSetGridsHorizonal(int lines, bool force)
 {
        if((lines == vert_lines) && !force) return;
-       GLDraw_2_0::doSetGridsHorizonal(lines, force);
+       GLDraw_Tmpl::doSetGridsHorizonal(lines, force);
        updateGridsVAO(grids_horizonal_buffer,
                                   grids_horizonal_vertex,
                                   glHorizGrids,
@@ -688,14 +707,8 @@ void GLDraw_3_0::renderToTmpFrameBuffer_nPass(GLuint src_texture,
                                                if(ringing_phase > 1.0) ringing_phase = ringing_phase - 1.0;
                                                shader->setUniformValue(ii,  ringing_phase);
                                        }
-                                       //ii = shader->uniformLocation("luma_filter");
-                                       //if(ii >= 0) {
-                                       //      shader->setUniformValueArray(ii, luma_filter, 24 + 1, 1);
-                                       //}
-                                       //ii = shader->uniformLocation("chroma_filter");
-                                       //if(ii >= 0) {
-                                       //      shader->setUniformValueArray(ii, chroma_filter, 24 + 1, 1);
-                                       //}
+                                       shader->setUniformValue("rotate_mat", QMatrix2x2(rot0));
+
                                }
                                {
                                        QVector4D c(fBrightR, fBrightG, fBrightB, 1.0);
@@ -743,7 +756,7 @@ void GLDraw_3_0::renderToTmpFrameBuffer_nPass(GLuint src_texture,
 }
 
 
-void GLDraw_3_0::uploadMainTexture(QImage *p, bool use_chromakey)
+void GLDraw_3_0::uploadMainTexture(QImage *p, bool use_chromakey, bool was_mapped)
 {
        // set vertex
        redraw_required = true;
@@ -762,10 +775,10 @@ void GLDraw_3_0::uploadMainTexture(QImage *p, bool use_chromakey)
                                                                 //screen_texture_width * 2,
                                                                 //screen_texture_height * 2,
                                                                 p->width(), p->height(),
-                                                                GL_BGRA, GL_UNSIGNED_BYTE, p->constBits());
+                                                                GL_RGBA, GL_UNSIGNED_BYTE, p->constBits());
                extfunc->glBindTexture(GL_TEXTURE_2D, 0);
        }
-       if(using_flags->is_support_tv_render() && (using_flags->get_config_ptr()->rendering_type == CONFIG_RENDER_TYPE_TV)) {
+       if(using_flags->is_support_tv_render() && (p_config->rendering_type == CONFIG_RENDER_TYPE_TV)) {
                renderToTmpFrameBuffer_nPass(uVramTextureID->textureId(),
                                                                         screen_texture_width,
                                                                         screen_texture_height,
@@ -781,17 +794,17 @@ void GLDraw_3_0::uploadMainTexture(QImage *p, bool use_chromakey)
                                                                         ntsc_pass2->getViewportHeight());
                uTmpTextureID = ntsc_pass2->getTexture();
        } else {
-               renderToTmpFrameBuffer_nPass(uVramTextureID->textureId(),
-                                                                        screen_texture_width,
-                                                                        screen_texture_height,
-                                                                        std_pass,
-                                                                        std_pass->getViewportWidth(),
-                                                                        std_pass->getViewportHeight(),
-                                                                        use_chromakey);
+//             renderToTmpFrameBuffer_nPass(uVramTextureID->textureId(),
+//                                                                      screen_texture_width,
+//                                                                      screen_texture_height,
+//                                                                      std_pass,
+//                                                                      std_pass->getViewportWidth(),
+//                                                                      std_pass->getViewportHeight(),
+//                                                                      use_chromakey);
 
                //std_pass->bind();
-               uTmpTextureID = std_pass->getTexture();
-               //std_pass->release();
+               //uTmpTextureID = std_pass->getTexture();
+               uTmpTextureID = uVramTextureID->textureId();    //std_pass->release();
        }
        crt_flag = true;
 }
@@ -806,7 +819,7 @@ void GLDraw_3_0::drawScreenTexture(void)
        }
        
        QVector4D color;
-       smoosing = using_flags->get_config_ptr()->use_opengl_filters;
+       smoosing = p_config->use_opengl_filters;
        if(set_brightness) {
                color = QVector4D(fBrightR, fBrightG, fBrightB, 1.0);
        } else {
@@ -868,15 +881,26 @@ void GLDraw_3_0::drawMain(QOpenGLShaderProgram *prg,
                if(ii >= 0) {
                        prg->setUniformValue(ii,  (float)screen_texture_height);
                }
-               if(using_flags->is_use_screen_rotate()) {
-                       if(using_flags->get_config_ptr()->rotate_type) {
-                               prg->setUniformValue("rotate", GL_TRUE);
-                       } else {
-                               prg->setUniformValue("rotate", GL_FALSE);
-                       }
-               } else {
-                       prg->setUniformValue("rotate", GL_FALSE);
+               
+               QMatrix2x2 rot;
+               switch(p_config->rotate_type) {
+                       case 0:
+                               rot = QMatrix2x2(rot0);
+                               break;
+                       case 1:
+                               rot = QMatrix2x2(rot90);
+                               break;
+                       case 2:
+                               rot = QMatrix2x2(rot180);
+                               break;
+                       case 3:
+                               rot = QMatrix2x2(rot270);
+                               break;
+                       default:
+                               rot = QMatrix2x2(rot0);
+                               break;
                }
+               prg->setUniformValue("rotate_mat", rot);
 
                if(do_chromakey) {
                        ii = prg->uniformLocation("chromakey");
@@ -920,15 +944,25 @@ void GLDraw_3_0::drawMain(QOpenGLShaderProgram *prg,
                if(ii >= 0) {
                        prg->setUniformValue(ii,  color);
                }
-               if(using_flags->is_use_screen_rotate()) {
-                       if(using_flags->get_config_ptr()->rotate_type) {
-                               prg->setUniformValue("rotate", GL_TRUE);
-                       } else {
-                               prg->setUniformValue("rotate", GL_FALSE);
-                       }
-               } else {
-                       prg->setUniformValue("rotate", GL_FALSE);
+               QMatrix2x2 rot;
+               switch(p_config->rotate_type) {
+                       case 0:
+                               rot = QMatrix2x2(rot0);
+                               break;
+                       case 1:
+                               rot = QMatrix2x2(rot90);
+                               break;
+                       case 2:
+                               rot = QMatrix2x2(rot180);
+                               break;
+                       case 3:
+                               rot = QMatrix2x2(rot270);
+                               break;
+                       default:
+                               rot = QMatrix2x2(rot0);
+                               break;
                }
+               prg->setUniformValue("rotate_mat", rot);
 
                if(do_chromakey) {
                        ii = prg->uniformLocation("chromakey");
@@ -1012,15 +1046,25 @@ void GLDraw_3_0::drawButtonsMain(int num, bool f_smoosing)
                        if(ii >= 0) {
                                prg->setUniformValue(ii, GL_FALSE);
                        }
-                       if(using_flags->is_use_screen_rotate()) {
-                               if(using_flags->get_config_ptr()->rotate_type) {
-                                       prg->setUniformValue("rotate", GL_TRUE);
-                               } else {
-                                       prg->setUniformValue("rotate", GL_FALSE);
-                               }
-                       } else {
-                               prg->setUniformValue("rotate", GL_FALSE);
+                       QMatrix2x2 rot;
+                       switch(p_config->rotate_type) {
+                       case 0:
+                               rot = QMatrix2x2(rot0);
+                               break;
+                       case 1:
+                               rot = QMatrix2x2(rot90);
+                               break;
+                       case 2:
+                               rot = QMatrix2x2(rot180);
+                               break;
+                       case 3:
+                               rot = QMatrix2x2(rot270);
+                               break;
+                       default:
+                               rot = QMatrix2x2(rot0);
+                               break;
                        }
+                       prg->setUniformValue("rotate_mat", rot);
                        int vertex_loc = prg->attributeLocation("vertex");
                        int texcoord_loc = prg->attributeLocation("texcoord");
                        prg->setAttributeBuffer(vertex_loc, GL_FLOAT, 0, 3, sizeof(VertexTexCoord_t));
@@ -1052,7 +1096,7 @@ void GLDraw_3_0::drawButtons(void)
 void GLDraw_3_0::drawBitmapTexture(void)
 {
        QVector4D color = QVector4D(1.0f, 1.0f, 1.0f, 1.0f);
-       smoosing = using_flags->get_config_ptr()->use_opengl_filters;
+       smoosing = p_config->use_opengl_filters;
        if(uBitmapTextureID == NULL) return;
        if(using_flags->is_use_one_board_computer()) {
                extfunc->glDisable(GL_BLEND);
@@ -1168,6 +1212,7 @@ void GLDraw_3_0::drawOsdIcons()
                                        major = 0;
                                        minor = 0;
                                }
+                               // ToDo: CD(6),LD(7) and HDD(8).
                                if((major != 0) && (icon_texid[major][minor] != NULL)) {
                                        drawMain(osd_pass->getShader(), osd_pass_vao[i], osd_pass_vbuffer[i],
                                                         icon_texid[major][minor]->textureId(),
@@ -1194,7 +1239,8 @@ void GLDraw_3_0::paintGL(void)
                extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
                
                extfunc->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-               extfunc->glEnable(GL_DEPTH_TEST);
+               //extfunc->glEnable(GL_DEPTH_TEST);
+               extfunc->glDisable(GL_DEPTH_TEST);
                extfunc->glDisable(GL_BLEND);
                if(using_flags->is_use_one_board_computer() || using_flags->is_use_bitmap()) {
                        extfunc->glEnable(GL_BLEND);
@@ -1209,7 +1255,7 @@ void GLDraw_3_0::paintGL(void)
                extfunc->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
                extfunc->glDisable(GL_DEPTH_TEST);
                //drawOsdLeds();
-               if(using_flags->get_config_ptr()->use_osd_virtual_media) drawOsdIcons();
+               if(p_config->use_osd_virtual_media) drawOsdIcons();
                extfunc->glDisable(GL_BLEND);
                if(!using_flags->is_use_one_board_computer() && (using_flags->get_max_button() <= 0)) {
                        drawGrids();
@@ -1240,11 +1286,11 @@ void GLDraw_3_0::setBrightness(GLfloat r, GLfloat g, GLfloat b)
                if(uVramTextureID == NULL) {
                        uVramTextureID = new QOpenGLTexture(*imgptr);
                }
-               if(using_flags->is_use_one_board_computer() || (using_flags->get_max_button() > 0)) {
-                       uploadMainTexture(imgptr, true);
-               } else {
-                       uploadMainTexture(imgptr, false);
-               }
+               //if(using_flags->is_use_one_board_computer() || (using_flags->get_max_button() > 0)) {
+               //      uploadMainTexture(imgptr, true);
+               //} else {
+               //      uploadMainTexture(imgptr, false);
+               //}
                crt_flag = true;
                p_wid->doneCurrent();
        }
@@ -1460,6 +1506,12 @@ void GLDraw_3_0::do_set_texture_size(QImage *p, int w, int h)
                                         main_pass->getVertexBuffer(),
                                         vertexFormat, 4);
                
+               if(w > using_flags->get_real_screen_width()) {
+                       w = using_flags->get_real_screen_width();
+               }                       
+               if(h > using_flags->get_real_screen_height()) {
+                       h = using_flags->get_real_screen_height();
+               }
                this->doSetGridsHorizonal(h, false);
                this->doSetGridsVertical(w, false);
                p_wid->doneCurrent();
@@ -1467,6 +1519,9 @@ void GLDraw_3_0::do_set_texture_size(QImage *p, int w, int h)
 }
 void GLDraw_3_0::do_set_horiz_lines(int lines)
 {
+       if(lines > using_flags->get_real_screen_height()) {
+               lines = using_flags->get_real_screen_height();
+       }                       
        this->doSetGridsHorizonal(lines, false);
 }
 
@@ -1482,7 +1537,6 @@ void GLDraw_3_0::resizeGL_Screen(void)
 void GLDraw_3_0::resizeGL(int width, int height)
 {
        //int side = qMin(width, height);
-       p_wid->makeCurrent();
        extfunc->glViewport(0, 0, width, height);
        extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
        crt_flag = true;
@@ -1502,5 +1556,4 @@ void GLDraw_3_0::resizeGL(int width, int height)
        if(using_flags->get_max_button() > 0) {
                updateButtonTexture();
        }
-       p_wid->doneCurrent();
 }