Note that there are some explanatory texts on larger screens.

plurals
  1. POglDeleteTextures, leaking?
    text
    copied!<p>I found a rather disguting behaviour of glDeleteTexture, deleteing only parts of the aqcuired memory (GPU side and as Textures get saved back for the sake of speed in RAM), which in my case, is a showstopper bug, my program eating up all memory.</p> <p><strong>I don't want/require you to read all of the code, it's just a demo, I'd rather know how to actually use glDeleteTextures so it does <em>not</em> leak <em>any</em> memory.</strong></p> <p>The example code requires Qt 4.5 or later to compile:</p> <p><strong>glleak.pro</strong></p> <pre><code>QT += opengl SOURCES += main.cpp \ glleak.cpp HEADERS += glleak.h </code></pre> <p><strong>main.cpp</strong></p> <pre><code>#include &lt;QtOpenGL&gt; #include &lt;QtGui&gt; #include "glleak.h" int main(int argc, char** argv){ QApplication app(argc, argv); glleak gll(0); gll.show(); return app.exec(); } </code></pre> <p><strong>glleak.h</strong></p> <pre><code>#ifndef GLLEAK_H #define GLLEAK_H #include &lt;QGLWidget&gt; #include &lt;QMouseEvent&gt; #include &lt;QDebug&gt; #include &lt;QList&gt; class glleak : public QGLWidget { Q_OBJECT public: glleak(QWidget* parent = 0); virtual ~glleak(); protected: void initializeGL(); void paintGL(); void resizeGL(int w, int h); void drawScene(GLenum mode); void wheelEvent(QWheelEvent* event); void hardcoreTexturing(); private: QList&lt;GLuint&gt; texels; }; #endif // GLLEAK_H </code></pre> <p><strong>glleak.cpp</strong></p> <pre><code>glleak::glleak(QWidget* parent) : QGLWidget(parent) { } glleak::~glleak() { } void glleak::initializeGL(){ glClearColor(0.0f,0.0f,0.0f,0.0f); glEnable(GL_TEXTURE_2D); glEnable(GL_MULTISAMPLE); glLineWidth (1.5f); glPointSize(4.5f); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } void glleak::resizeGL(int w, int h){ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-w/2.0, w/2.0, h/2.0, -h/2.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glViewport(0, 0, w, h); glLoadIdentity(); } void glleak::paintGL(){ glPushMatrix(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glColor3f(1.0f,1.0f,1.0f); drawScene(GL_RENDER); glPopMatrix(); } void glleak::drawScene(GLenum mode){ qDebug() &lt;&lt; "drawed #" &lt;&lt; texels.count() &lt;&lt; " Textures"; hardcoreTexturing(); } void glleak::hardcoreTexturing(){ glEnable(GL_TEXTURE_2D); for ( int i(0); i&lt;texels.count(); ++i){ glPushMatrix(); glTranslatef(1.1f*i, 2.2f*i, 0.0f); glBindTexture(GL_TEXTURE_2D, texels.at(i)); glBegin(GL_QUADS); { glTexCoord2i(0,0); glVertex2i(-128,-128); glTexCoord2i(0,1); glVertex2i(-128,128); glTexCoord2i(1,1); glVertex2i(128,128); glTexCoord2i(1,0); glVertex2i(128,-128); } glEnd(); glPopMatrix(); } glDisable(GL_TEXTURE_2D); } void glleak::wheelEvent(QWheelEvent* event){ glEnable(GL_TEXTURE_2D); int n(50); if (event-&gt;delta()&gt;0){ qDebug() &lt;&lt; "gen textures"; for (int i(0); i&lt;n; ++i){ QImage t("./ballmer_peak.png","png"); GLuint tex(0); glGenTextures(1, &amp;tex); glBindTexture(GL_TEXTURE_2D, tex); glTexImage2D( GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); texels.append(tex); } } else{ qDebug() &lt;&lt; "del textures"; for (QList&lt;GLuint&gt;::iterator i(texels.begin()); i!=texels.end();){ glDeleteTextures(1, &amp;(*i)); i = texels.erase(i); if (--n &lt;= 0) break; } } glDisable(GL_TEXTURE_2D); updateGL(); } </code></pre> <p><strong>ballmer_peak.png</strong> A Image to load and render</p> <p>Note: Compile demo: Just put it all in a folder, rename your image to <strong>ballmer_peak.png</strong>, call qmake, make, ./glleak Note: <strong><em>Demo usage:</em> Use mousewheel to generate or delete 50 Textures at once</strong></p> <p>If I use glDeleteTextures completly wrong, please tell me how to use it. I am way out of ideas as my usage complies to the official OpenGL <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteTextures.xml" rel="nofollow noreferrer">glDeleteTextures</a> usage.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload