[calligra/krita-opengl2-rempt] krita: Also show the image properly.
Dmitry Kazakov
dimula73 at gmail.com
Sat May 18 07:31:42 UTC 2013
I have Linux Mint in VirtualBox.
On Sat, May 18, 2013 at 11:22 AM, Boudewijn Rempt <boud at valdyas.org> wrote:
> Yes, it doesn't work on Windows yet -- but it should work with all gpu's
> on Linux. It's weird, because Visual Studio's debugger stops in the
> infinity manager's event handler, while gdebugger just hands trying to
> debug the issue.
>
>
> On Sat, 18 May 2013, Dmitry Kazakov wrote:
>
> 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 33fbffea6c44747336e6aeb09fed68**612854f61e 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/**33fbffea6c44747336e6aeb09fed68*
>> *612854f61e<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<https://mail.kde.org/mailman/listinfo/kimageshop>
>>
>>
>>
>>
>> --
>> Dmitry Kazakov
>>
>
> _______________________________________________
> 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/1d0e0205/attachment-0001.html>
More information about the kimageshop
mailing list