Ticket #13230: gl4.patch

File gl4.patch, 10.5 KB (added by mspieth, 10 months ago)

Latest android gl attempted fixes with debugging code included

  • mythtv/libs/libmythtv/openglvideo.cpp

    commit 1f9857db69101f562f4009eb3705c208c8e8ea25
    Author: Mark Spieth <mspieth@digivation.com.au>
    Date:   Sun Feb 11 18:00:19 2018 +1100
    
        OpenGL Android Fixes
    
    diff --git a/mythtv/libs/libmythtv/openglvideo.cpp b/mythtv/libs/libmythtv/openglvideo.cpp
    index 858b59e320..455e0806ca 100644
    a b void OpenGLVideo::PrepareFrame(bool topfieldfirst, FrameScanType scan, 
    954954    QSize inputsize = inputTextureSize;
    955955    QSize realsize  = GetTextureSize(video_disp_dim);
    956956
     957//#define RECT_TEST 1
     958#define LOG_RECT(r, s) \
     959        if (currentFrameNum <= 0) {   \
     960            LOG(VB_GENERAL, LOG_INFO, LOC + \
     961                QString("PrepareFrame %1 %2 %3,%4,%5,%6")  \
     962                .arg(s) \
     963                .arg(currentFrameNum)   \
     964                .arg(r.left())  \
     965                .arg(r.top())   \
     966                .arg(r.right()) \
     967                .arg(r.bottom())); }
     968#define LOG_SIZE(r, s) \
     969        if (currentFrameNum <= 0) {   \
     970            LOG(VB_GENERAL, LOG_INFO, LOC + \
     971                QString("PrepareFrame %1 %2 %3,%4")  \
     972                .arg(s) \
     973                .arg(currentFrameNum)   \
     974                .arg(r.width())  \
     975                .arg(r.height())); }
     976#define LOG_TINFO(s) \
     977        if (currentFrameNum <= 0) {   \
     978            LOG(VB_GENERAL, LOG_INFO, LOC + s ); }
     979
     980    if (currentFrameNum <= 0)
     981    {
     982        LOG(VB_GENERAL, LOG_INFO, LOC +
     983            QString("PrepareFrame frame num %1").arg(frame));
     984    }
     985    LOG_SIZE(video_dim, "A video_dim");
     986    LOG_SIZE(video_disp_dim, "A video_disp_dim");
     987
    957988    glfilt_map_t::iterator it;
    958989    for (it = filters.begin(); it != filters.end(); ++it)
    959990    {
    void OpenGLVideo::PrepareFrame(bool topfieldfirst, FrameScanType scan, 
    962993
    963994        bool actual = softwarebob && (filter->outputBuffer == kDefaultBuffer);
    964995
     996        if (currentFrameNum <= 0)
     997        {
     998            LOG(VB_GENERAL, LOG_INFO, LOC +
     999                QString("PrepareFrame filter %1").arg(FilterToString(type)));
     1000        }
    9651001        // texture coordinates
    9661002        float trueheight = (float)(actual ? video_dim.height() :
    9671003                                            video_disp_dim.height());
    void OpenGLVideo::PrepareFrame(bool topfieldfirst, FrameScanType scan, 
    9691005
    9701006        QRectF trect(QPoint(0, 0), QSize(width, trueheight));
    9711007
     1008        LOG_RECT(trect, "A trect");
    9721009        // only apply overscan on last filter
    9731010        if (filter->outputBuffer == kDefaultBuffer)
    974             trect.setCoords(video_rect.left(),  video_rect.top(),
    975                             video_rect.left() + video_rect.width(),
    976                             video_rect.top()  + video_rect.height());
     1011        {
     1012            trect.setRect(video_rect.left(),  video_rect.top(),
     1013                          video_rect.width(), video_rect.height());
     1014            LOG_RECT(trect, "B trect default");
     1015        }
    9771016
    9781017        if (!textureRects && (inputsize.height() > 0))
    9791018            trueheight /= inputsize.height();
    void OpenGLVideo::PrepareFrame(bool topfieldfirst, FrameScanType scan, 
    9911030            {
    9921031                trect.setBottom(trect.bottom() / 2);
    9931032                trect.setTop(trect.top() / 2);
     1033                LOG_RECT(trect, "C trect int a");
    9941034                trect.adjust(0, bob, 0, bob);
    9951035            }
    9961036            if ((bot && !first) || (top && first))
    9971037            {
    9981038                trect.setTop(static_cast<qreal>(trueheight / 2) + (trect.top() / 2));
    9991039                trect.setBottom(static_cast<qreal>(trueheight / 2) + (trect.bottom() / 2));
     1040                LOG_RECT(trect, "D trect int b");
    10001041                trect.adjust(0, -bob, 0, -bob);
    10011042            }
    10021043        }
    void OpenGLVideo::PrepareFrame(bool topfieldfirst, FrameScanType scan, 
    10171058                         display_video_rect : frameBufferRect;
    10181059        QRect visible = (filter->outputBuffer == kDefaultBuffer) ?
    10191060                         display_visible_rect : frameBufferRect;
     1061#ifdef RECT_TEST
     1062        QRectF vrect(trect);
     1063        draw_border = true;
     1064#else
    10201065        QRectF vrect(display);
     1066#endif
    10211067
     1068#ifndef RECT_TEST
    10221069        // invert if first filter
    10231070        if (it == filters.begin())
    10241071        {
     1072            LOG_RECT(display, "E display");
     1073            LOG_RECT(visible, "F visible");
    10251074            if (filters.size() > 1)
    10261075            {
    1027                 vrect.setTop((visible.height()) - display.top());
    1028                 vrect.setBottom(vrect.top() - (display.height()));
     1076                vrect.setTop(visible.height() - display.top());
     1077                vrect.setBottom(vrect.top() - display.height());
     1078                LOG_RECT(vrect, "G vrect sf");
    10291079            }
    10301080            else
    10311081            {
    10321082                vrect.setBottom(display.top());
    1033                 vrect.setTop(display.top() + (display.height()));
     1083                vrect.setTop(display.top() + display.height());
     1084                LOG_RECT(vrect, "H vrect bf");
    10341085            }
    10351086        }
     1087#endif
    10361088
    10371089        // hardware bobdeint
    10381090        if (filter->outputBuffer == kDefaultBuffer &&
    void OpenGLVideo::PrepareFrame(bool topfieldfirst, FrameScanType scan, 
    10721124
    10731125        if (draw_border && filter->outputBuffer == kDefaultBuffer)
    10741126        {
     1127            LOG_RECT(vrect, "I vrect");
     1128#ifdef RECT_TEST
     1129            vrect = vrect.adjusted(+10, +10, +10, +10);
     1130            QRectF piprectf = vrect.adjusted(-1, -1, +1, +1);
     1131#else
    10751132            QRectF piprectf = vrect.adjusted(-10, -10, +10, +10);
     1133#endif
    10761134            QRect  piprect(piprectf.left(), piprectf.top(),
    10771135                           piprectf.width(), piprectf.height());
    10781136            static const QPen nopen(Qt::NoPen);
    void OpenGLVideo::PrepareFrame(bool topfieldfirst, FrameScanType scan, 
    11261184                COLOUR_UNIFORM);
    11271185        }
    11281186
     1187        LOG_RECT(trect, "Final trect");
     1188        LOG_RECT(vrect, "Final vrect");
    11291189        gl_context->DrawBitmap(textures, texture_count, target, &trect, &vrect,
    11301190                               program);
    11311191
    void OpenGLVideo::CustomiseProgramString(QString &string) 
    14281488    float yv12height = video_dim.height();
    14291489    QSize fb_size = GetTextureSize(video_disp_dim);
    14301490
     1491    LOG(VB_GENERAL, LOG_INFO, LOC +
     1492        QString("CustomiseProgramString fbsize %1,%2").arg(fb_size.width()).arg(fb_size.height()));
     1493    LOG(VB_GENERAL, LOG_INFO, LOC +
     1494        QString("CustomiseProgramString inputTextureSize %1,%2 tr %3")
     1495            .arg(inputTextureSize.width()).arg(inputTextureSize.height()).arg(textureRects));
     1496
    14311497    if (!textureRects &&
    14321498       (inputTextureSize.height() > 0))
    14331499    {
    void OpenGLVideo::CustomiseProgramString(QString &string) 
    14371503        maxwidth    = video_dim.width()  / (float)inputTextureSize.width();
    14381504        maxheight   = video_dim.height() / (float)inputTextureSize.height();
    14391505        yv12height  = maxheight;
     1506    LOG(VB_GENERAL, LOG_INFO, LOC +
     1507        QString("CustomiseProgramString lineHeight %1 colWidth %2 yselect %3")
     1508            .arg(QString::number(lineHeight, 'f', 16))
     1509                .arg(QString::number(colWidth, 'f', 16))
     1510                .arg(QString::number(yselect, 'f', 16)));
    14401511    }
    14411512
    14421513    float fieldSize = 1.0f / (lineHeight * 2.0f);
     1514    LOG(VB_GENERAL, LOG_INFO, LOC +
     1515        QString("CustomiseProgramString maxHeight %1 fieldSize %2 %3")
     1516            .arg(maxheight).arg(fieldSize, 0, 'f', 8).arg(fieldSize, 0, 'f', 16));
    14431517
    14441518    string.replace("%2", QString::number(fieldSize, 'f', 8));
    1445     string.replace("%3", QString::number(lineHeight, 'f', 8));
    1446     string.replace("%4", QString::number(lineHeight * 2.0f, 'f', 8));
    1447     string.replace("%5", QString::number(colWidth, 'f', 8));
     1519    string.replace("%3", QString::number(lineHeight, 'f', 16));
     1520    string.replace("%4", QString::number(lineHeight * 2.0f, 'f', 16));
     1521    string.replace("%5", QString::number(colWidth, 'f', 16));
    14481522    string.replace("%6", QString::number((float)fb_size.width(), 'f', 1));
    14491523    string.replace("%7", QString::number((float)fb_size.height(), 'f', 1));
    1450     string.replace("%8", QString::number(1.0f / yselect, 'f', 8));
    1451     string.replace("%9", QString::number(maxheight - lineHeight, 'f', 8));
    1452     string.replace("%WIDTH%", QString::number(maxwidth, 'f', 8));
    1453     string.replace("%HEIGHT%", QString::number(yv12height, 'f', 8));
     1524    string.replace("%8", QString::number(1.0f / yselect, 'f', 16));
     1525    string.replace("%9", QString::number(maxheight - lineHeight, 'f', 16));
     1526    string.replace("%WIDTH%", QString::number(maxwidth, 'f', 16));
     1527    string.replace("%HEIGHT%", QString::number(yv12height, 'f', 16));
     1528    LOG(VB_GENERAL, LOG_INFO, LOC +
     1529        QString("CustomiseProgramString width %1 height %2")
     1530            .arg(height, 0, 'f', 8).arg(width, 0, 'f', 8));
     1531
    14541532    string.replace("COLOUR_UNIFORM", COLOUR_UNIFORM);
    14551533}
    14561534
    static const QString YV12RGBVertexShader = 
    16481726"    v_texcoord0 = a_texcoord0;\n"
    16491727"}\n";
    16501728
     1729#ifdef ANDROID
     1730#define SAMPLEYVU "\
     1731vec3 sampleYVU(in GLSL_SAMPLER texture, vec2 texcoordY)\n\
     1732{\n\
     1733    vec2 texcoordV, texcoordU;\n\
     1734    texcoordV = vec2(texcoordY.s / 2.0, %HEIGHT% + texcoordY.t / 4.0);\n\
     1735    texcoordU = vec2(texcoordV.s, texcoordV.t + %HEIGHT% / 4.0);\n\
     1736    vec3 yvu;\n\
     1737    yvu.r = GLSL_TEXTURE(texture, texcoordY).r;\n\
     1738    yvu.g = GLSL_TEXTURE(texture, texcoordV).r;\n\
     1739    yvu.b = GLSL_TEXTURE(texture, texcoordU).r;\n\
     1740    return yvu;\n\
     1741}\n"
     1742#else
     1743
    16511744#define SAMPLEYVU "\
    16521745vec3 sampleYVU(in GLSL_SAMPLER texture, vec2 texcoordY)\n\
    16531746{\n\
    vec3 sampleYVU(in GLSL_SAMPLER texture, vec2 texcoordY)\n\ 
    16651758    yvu.b = GLSL_TEXTURE(texture, texcoordU).r;\n\
    16661759    return yvu;\n\
    16671760}\n"
     1761#endif
    16681762
    16691763static const QString YV12RGBFragmentShader =
    16701764"//YV12RGBFragmentShader\n"
  • mythtv/libs/libmythui/mythrender_opengl2.cpp

    diff --git a/mythtv/libs/libmythui/mythrender_opengl2.cpp b/mythtv/libs/libmythui/mythrender_opengl2.cpp
    index aa949ca07c..ac89cb5f85 100644
    a b void MythRenderOpenGL2::OptimiseShaderSource(QString &source) 
    905905    source.replace("GLSL_TEXTURE", texture);
    906906    source.replace("GLSL_DEFINES", m_GLSLVersion + extensions + m_qualifiers);
    907907
    908     LOG(VB_GENERAL, LOG_DEBUG, "\n" + source);
     908    //LOG(VB_GENERAL, LOG_DEBUG, "\n" + source);
     909    if (VERBOSE_LEVEL_CHECK(VB_GENERAL, LOG_DEBUG))
     910    {
     911        auto lines = source.split("\n");
     912        for(const auto &line : lines)
     913        {
     914            LOG(VB_GENERAL, LOG_DEBUG, line);
     915        }
     916    }
    909917}
    910918
    911919void MythRenderOpenGL2::DeleteOpenGLResources(void)