[calligra/krita-opengl2-rempt] krita: Also show the image properly.

Dmitry Kazakov dimula73 at gmail.com
Sat May 18 07:16:13 UTC 2013


Hi, Boud!

It still crashes on Virtual Box. I'm going to check it on old intel GMA
without Virtual Box, but a bit later.

On Thu, May 16, 2013 at 6:07 PM, Boudewijn Rempt <boud at valdyas.org> wrote:

> Git commit 33fbffea6c44747336e6aeb09fed68612854f61e by Boudewijn Rempt.
> Committed on 16/05/2013 at 15:59.
> Pushed by rempt into branch 'krita-opengl2-rempt'.
>
> Also show the image properly.
>
> CCMAIL:kimageshop at kde.org
>
> Please, everyone who has a different gpu from me, build this branch
> and test painting, zooming, panning, everything. Checkout the
> krita-opengl2-rempt branch
>
> We can now also start testing on windows and osx...
>
> TODO:
>
> * reintegrate OCIO (which was fragment-only)
> * move the texture updating to a separate thread
> * move the canvas rendering to a separate thread
> * integrate with krita sketch, somehow
> * reimplement the opengl cursor outline
> * reimplement the gradient shaders (perhaps? Not sure how useful they
> were.)
> * reimplement the 3d cursors (low prio -- they were fun, but I guess no
> pro artist used them)
> * figure out a way to move the layerstack composition to the GPU?
>
> M  +4    -1    krita/data/shaders/display.frag
> M  +47   -148  krita/ui/opengl/kis_opengl_canvas2.cpp
> M  +0    -19   krita/ui/opengl/kis_opengl_canvas2.h
> M  +4    -0    krita/ui/opengl/kis_texture_tile.h
>
> http://commits.kde.org/calligra/33fbffea6c44747336e6aeb09fed68612854f61e
>
> diff --git a/krita/data/shaders/display.frag
> b/krita/data/shaders/display.frag
> index 36c5aca..cd8462b 100644
> --- a/krita/data/shaders/display.frag
> +++ b/krita/data/shaders/display.frag
> @@ -1,6 +1,9 @@
> +/*
> + * shader for handling scaling
> + */
>  uniform sampler2D texture0;
>
> -varying vec4 v_textureCoordinate;
> +varying mediump vec4 v_textureCoordinate;
>
>  void main() {
>      gl_FragColor = texture2D(texture0, v_textureCoordinate.st);
> diff --git a/krita/ui/opengl/kis_opengl_canvas2.cpp
> b/krita/ui/opengl/kis_opengl_canvas2.cpp
> index 8369a4b..e4eea83 100644
> --- a/krita/ui/opengl/kis_opengl_canvas2.cpp
> +++ b/krita/ui/opengl/kis_opengl_canvas2.cpp
> @@ -78,24 +78,18 @@ public:
>      Private()
>          : displayShader(0)
>          , checkerShader(0)
> -        , vertexBuffer(0)
> -        , indexBuffer(0)
>      {
>      }
>
>      ~Private() {
>          delete displayShader;
>          delete checkerShader;
> -        delete vertexBuffer;
> -        delete indexBuffer;
>      }
>
>      KisOpenGLImageTexturesSP openGLImageTextures;
>
>      QGLShaderProgram *displayShader;
>      QGLShaderProgram *checkerShader;
> -    QGLBuffer *vertexBuffer;
> -    QGLBuffer *indexBuffer;
>  };
>
>  KisOpenGLCanvas2::KisOpenGLCanvas2(KisCanvas2 *canvas,
> KisCoordinatesConverter *coordinatesConverter, QWidget *parent,
> KisOpenGLImageTexturesSP imageTextures)
> @@ -180,7 +174,7 @@ void KisOpenGLCanvas2::paintEvent(QPaintEvent *)
>      glClear(GL_COLOR_BUFFER_BIT);
>
>      drawCheckers();
> -    //drawImage();
> +    drawImage();
>
>      QRect boundingRect =
> coordinatesConverter()->imageRectInWidgetPixels().toAlignedRect();
>
> @@ -263,65 +257,71 @@ void KisOpenGLCanvas2::drawImage()
>
>      KisCoordinatesConverter *converter = coordinatesConverter();
>
> -    QRectF widgetRect(0,0, width(), height());
> -    QRectF widgetRectInImagePixels =
> converter->documentToImage(converter->widgetToDocument(widgetRect));
> -
> -    qreal scaleX, scaleY;
> -    converter->imageScale(&scaleX, &scaleY);
> -
> -    QRect wr = widgetRectInImagePixels.toAlignedRect() &
> -            m_d->openGLImageTextures->storedImageBounds();
> -
>      m_d->displayShader->bind();
>
> -    QVector3D
> imageSize(m_d->openGLImageTextures->storedImageBounds().width(),
> -
>  m_d->openGLImageTextures->storedImageBounds().height(),
> -                        0.f);
> -
> -    QMatrix4x4 model;//(modelTransform);
> -    m_d->displayShader->setUniformValue("modelMatrix", model);
> -    model.scale(imageSize * scaleX);
> +    QMatrix4x4 projectionMatrix;
> +    projectionMatrix.setToIdentity();
> +    projectionMatrix.ortho(0, width(), height(), 0, NEAR_VAL, FAR_VAL);
>
> -    //Set view/projection matrices
> -    QMatrix4x4 view;//(textureTransform);
> -    m_d->displayShader->setUniformValue("viewMatrix", view);
> +    // Set view/projection matrices
> +    QMatrix4x4
> modelMatrix(coordinatesConverter()->imageToWidgetTransform());
> +    modelMatrix.optimize();
> +    modelMatrix = projectionMatrix * modelMatrix;
> +    m_d->displayShader->setUniformValue("modelViewProjection",
> modelMatrix);
>
> -//    QMatrix4x4 textureMatrix;//(textureTransform);
> -//    m_d->checkerShader->setUniformValue("textureMatrix", textureMatrix);
> +    QMatrix4x4 textureMatrix;
> +    textureMatrix.setToIdentity();
> +    m_d->displayShader->setUniformValue("textureMatrix", textureMatrix);
>
> -    //Setup the geometry for rendering
> -    m_d->vertexBuffer->bind();
> -    m_d->indexBuffer->bind();
> +    QRectF widgetRect(0,0, width(), height());
> +    QRectF widgetRectInImagePixels =
> converter->documentToImage(converter->widgetToDocument(widgetRect));
>
> -    m_d->displayShader->setAttributeBuffer("a_vertexPosition", GL_FLOAT,
> 0, 3);
> -    m_d->displayShader->enableAttributeArray("a_vertexPosition");
> -    m_d->displayShader->setAttributeBuffer("a_texturePosition", GL_FLOAT,
> 12 * sizeof(float), 2);
> -    m_d->displayShader->enableAttributeArray("a_vertexPosition");
> -    m_d->displayShader->setUniformValue("texture0", 0);
> +    qreal scaleX, scaleY;
> +    converter->imageScale(&scaleX, &scaleY);
>
> -    //    m_d->openGLImageTextures->activateHDRExposureProgram();
> +    QRect wr = widgetRectInImagePixels.toAlignedRect() &
> m_d->openGLImageTextures->storedImageBounds();
>
>      int firstColumn = m_d->openGLImageTextures->xToCol(wr.left());
>      int lastColumn = m_d->openGLImageTextures->xToCol(wr.right());
>      int firstRow = m_d->openGLImageTextures->yToRow(wr.top());
>      int lastRow = m_d->openGLImageTextures->yToRow(wr.bottom());
>
> -    QMatrix4x4 proj;
> -    proj.ortho(0, 0, width(), height(), NEAR_VAL, FAR_VAL);
> -    m_d->displayShader->setUniformValue("projectionMatrix", proj);
> -
>      for (int col = firstColumn; col <= lastColumn; col++) {
>          for (int row = firstRow; row <= lastRow; row++) {
>
>              KisTextureTile *tile =
>                      m_d->openGLImageTextures->getTextureTileCR(col, row);
>
> -            //QRectF textureRect(tile->tileRectInTexturePixels());
> +            /*
> +             * We create a float rect here to workaround Qt's
> +             * "history reasons" in calculation of right()
> +             * and bottom() coordinates of integer rects.
> +             */
> +            QRectF textureRect(tile->tileRectInTexturePixels());
>              QRectF modelRect(tile->tileRectInImagePixels());
>
> -            model.translate(modelRect.x(), -modelRect.y());
> -            model.scale(modelRect.width(), modelRect.height());
> -            m_d->displayShader->setUniformValue("modelMatrix", model);
> +            //Setup the geometry for rendering
> +            QVector<QVector3D> vertices;
> +            vertices << QVector3D(modelRect.left(),  modelRect.bottom(),
> 0.f)
> +                     << QVector3D(modelRect.left(),  modelRect.top(),
>  0.f)
> +                     << QVector3D(modelRect.right(), modelRect.bottom(),
> 0.f)
> +                     << QVector3D(modelRect.left(),  modelRect.top(), 0.f)
> +                     << QVector3D(modelRect.right(), modelRect.top(), 0.f)
> +                     << QVector3D(modelRect.right(), modelRect.bottom(),
>    0.f);
> +
> +
>  m_d->displayShader->enableAttributeArray(PROGRAM_VERTEX_ATTRIBUTE);
> +
>  m_d->displayShader->setAttributeArray(PROGRAM_VERTEX_ATTRIBUTE,
> vertices.constData());
> +
> +            QVector<QVector2D> texCoords;
> +            texCoords << QVector2D(textureRect.left(),
> textureRect.bottom())
> +                      << QVector2D(textureRect.left(), textureRect.top())
> +                      << QVector2D(textureRect.right(),
> textureRect.bottom())
> +                      << QVector2D(textureRect.left(), textureRect.top())
> +                      << QVector2D(textureRect.right(), textureRect.top())
> +                      << QVector2D(textureRect.right(),
> textureRect.bottom());
> +
> +
>  m_d->displayShader->enableAttributeArray(PROGRAM_TEXCOORD_ATTRIBUTE);
> +
>  m_d->displayShader->setAttributeArray(PROGRAM_TEXCOORD_ATTRIBUTE,
> texCoords.constData());
>
>              glBindTexture(GL_TEXTURE_2D, tile->textureId());
>
> @@ -331,57 +331,16 @@ void KisOpenGLCanvas2::drawImage()
>                  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
> GL_LINEAR);
>              }
>
> -            glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
> +            glDrawArrays(GL_TRIANGLES, 0, 6);
>
>          }
>      }
>
>      //    m_d->openGLImageTextures->deactivateHDRExposureProgram();
> -
> -    m_d->vertexBuffer->release();
> -    m_d->indexBuffer->release();
> +    glBindTexture(GL_TEXTURE_2D, 0);
>      m_d->displayShader->release();
>  }
>
> -void KisOpenGLCanvas2::saveGLState()
> -{
> -    //    Q_ASSERT(!m_d->GLStateSaved);
> -
> -    //    if (!m_d->GLStateSaved) {
> -    //        m_d->GLStateSaved = true;
> -
> -    //        glPushAttrib(GL_ALL_ATTRIB_BITS);
> -    //        glMatrixMode(GL_PROJECTION);
> -    //        glPushMatrix();
> -    //        glMatrixMode(GL_TEXTURE);
> -    //        glPushMatrix();
> -    //        glMatrixMode(GL_MODELVIEW);
> -    //        glPushMatrix();
> -
> -    //        glGetIntegerv(GL_CURRENT_PROGRAM,
> &m_d->savedCurrentProgram);
> -    //        glUseProgram(NO_PROGRAM);
> -    //    }
> -}
> -
> -void KisOpenGLCanvas2::restoreGLState()
> -{
> -    //    Q_ASSERT(m_d->GLStateSaved);
> -
> -    //    if (m_d->GLStateSaved) {
> -    //        m_d->GLStateSaved = false;
> -
> -    //        glMatrixMode(GL_PROJECTION);
> -    //        glPopMatrix();
> -    //        glMatrixMode(GL_TEXTURE);
> -    //        glPopMatrix();
> -    //        glMatrixMode(GL_MODELVIEW);
> -    //        glPopMatrix();
> -    //        glPopAttrib();
> -
> -    //        glUseProgram(m_d->savedCurrentProgram);
> -    //    }
> -}
> -
>  void KisOpenGLCanvas2::initializeShaders()
>  {
>
> @@ -406,68 +365,8 @@ void KisOpenGLCanvas2::initializeShaders()
>          qDebug() << "OpenGL error" << glGetError();
>          qFatal("Failed linking display shader");
>      }
> -
> -    m_d->vertexBuffer = new QGLBuffer(QGLBuffer::VertexBuffer);
> -    m_d->vertexBuffer->create();
> -    m_d->vertexBuffer->bind();
> -
> -    QVector<float> vertices;
> -    /*
> -     *  0.0, 1.0  ---- 1.0, 1.0
> -     *     |              |
> -     *     |              |
> -     *  0.0, 0.0  ---- 1.0, 0.0
> -     */
> -    vertices << 0.0f << 0.0f << 0.0f;
> -    vertices << 0.0f << 1.0f << 0.0f;
> -    vertices << 1.0f << 0.0f << 0.0f;
> -    vertices << 1.0f << 1.0f << 0.0f;
> -    int vertSize = sizeof(float) * vertices.count();
> -
> -    // coordinates to convert vertex points to a position in the texture.
> Follows order of corner
> -    // points in vertices
> -    QVector<float> uvs;
> -    uvs << 0.f << 0.f;
> -    uvs << 0.f << 1.f;
> -    uvs << 1.f << 0.f;
> -    uvs << 1.f << 1.f;
> -    int uvSize = sizeof(float) * uvs.count();
> -
> -    m_d->vertexBuffer->allocate(vertSize + uvSize);
> -    m_d->vertexBuffer->write(0, reinterpret_cast<void*>(vertices.data()),
> vertSize);
> -    m_d->vertexBuffer->write(vertSize,
> reinterpret_cast<void*>(uvs.data()), uvSize);
> -    m_d->vertexBuffer->release();
> -
> -    m_d->indexBuffer = new QGLBuffer(QGLBuffer::IndexBuffer);
> -    m_d->indexBuffer->create();
> -    m_d->indexBuffer->bind();
> -
> -    QVector<uint> indices;
> -    // determines where opengl looks for vertex data. create two
> clockwise triangles from
> -    // the points.
> -    /*
> -     *  1->-3
> -     *  |\  |
> -     *  ^ \ v
> -     *  |  \|
> -     *  0...2
> -     */
> -    indices << 0 << 1 << 2 << 1 << 3 << 2;
> -    m_d->indexBuffer->allocate(reinterpret_cast<void*>(indices.data()),
> indices.size() * sizeof(uint));
> -    m_d->indexBuffer->release();
> -}
> -
> -void KisOpenGLCanvas2::beginOpenGL(void)
> -{
> -    //    saveGLState();
>  }
>
> -void KisOpenGLCanvas2::endOpenGL(void)
> -{
> -    //    restoreGLState();
> -}
> -
> -
>  void KisOpenGLCanvas2::slotConfigChanged()
>  {
>      notifyConfigChanged();
> diff --git a/krita/ui/opengl/kis_opengl_canvas2.h
> b/krita/ui/opengl/kis_opengl_canvas2.h
> index 4f76dde..40f5438 100644
> --- a/krita/ui/opengl/kis_opengl_canvas2.h
> +++ b/krita/ui/opengl/kis_opengl_canvas2.h
> @@ -56,22 +56,6 @@ public:
>
>      virtual ~KisOpenGLCanvas2();
>
> -    /**
> -     * Prepare the canvas for rendering using native OpenGL
> -     * commands. This sets the projection and model view matrices so
> -     * that primitives can be rendered using coordinates returned
> -     * from pixelToView().
> -     */
> -    void beginOpenGL();
> -
> -    /**
> -     * Notify the canvas that rendering using native OpenGL commands
> -     * has finished. This restores the state so that the canvas can
> -     * be painted on using a QPainter.
> -     */
> -    void endOpenGL();
> -
> -
>  public: // QWidget
>
>      /// reimplemented method from superclass
> @@ -108,9 +92,6 @@ private:
>      void drawCheckers();
>
>      void initializeShaders();
> -
> -    void saveGLState();
> -    void restoreGLState();
>  };
>
>  #endif // HAVE_OPENGL
> diff --git a/krita/ui/opengl/kis_texture_tile.h
> b/krita/ui/opengl/kis_texture_tile.h
> index 9a3517e..60fd6f6 100644
> --- a/krita/ui/opengl/kis_texture_tile.h
> +++ b/krita/ui/opengl/kis_texture_tile.h
> @@ -74,6 +74,10 @@ public:
>          return m_textureRectInImagePixels;
>      }
>
> +    inline QRectF tileRectInTexturePixels() {
> +        return m_tileRectInTexturePixels;
> +    }
> +
>  private:
>      void repeatStripes(const KisTextureTileUpdateInfo &updateInfo);
>
> _______________________________________________
> Krita mailing list
> kimageshop at kde.org
> https://mail.kde.org/mailman/listinfo/kimageshop
>



-- 
Dmitry Kazakov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kimageshop/attachments/20130518/97322659/attachment-0001.html>


More information about the kimageshop mailing list