display cross hangs machine

Olly Betts olly at survex.com
Wed May 2 17:32:05 BST 2007


On Wed, May 02, 2007 at 12:59:46PM -0300, Carlos Gu?no Grohmann wrote:
> On 5/1/07, Olly Betts <olly at survex.com> wrote:
> >First thing to check is that it is the use of point sprites that is
> >causing the problem.  Can you add:
> >
> >    glpoint_sprite = false;
> >
> >At line 350 of src/gla-gl.cc and recompile aven.

> Works perfectly!
> 
> thanks!!

OK, we should try to work out why it fails using point sprites.  Just
disabling their use is a reasonable workaround, but they provide a much
faster way of drawing crosses so I don't want to disable them for
everyone, and I'd like aven to work out of the box.

This could be a bug in the aven code, or it could be a bug in the opengl
drivers for your card.  Or something else perhaps, but those are the
most obvious possibilities.

Can you revert to the original sources (so undo the above change) and
apply the attached patch, like so:

cd survex-1.1.2
patch -p0 < opengldebug.patch
make
src/aven

With this patch, you'll get a log of OpenGL calls made on the terminal,
so we can see what happens just before the program hangs.  Also, I've
added error checks to a number of OpenGL calls which didn't have them
and aven will exit if any fail.

Cheers,
    Olly
-------------- next part --------------
Index: src/gla-gl.cc
===================================================================
RCS file: /usr/data/cvs/survex/src/Attic/gla-gl.cc,v
retrieving revision 1.1.2.94
diff -p -u -r1.1.2.94 gla-gl.cc
--- src/gla-gl.cc	18 Oct 2006 02:36:56 -0000	1.1.2.94
+++ src/gla-gl.cc	2 May 2007 16:30:42 -0000
@@ -68,6 +68,8 @@
 #endif
 #endif
 
+#include <iostream>
+
 using namespace std;
 
 const double BLOB_DIAMETER = 5.0;
@@ -126,10 +128,19 @@ wxString GetGLSystemDescription()
 // Important: CHECK_GL_ERROR must not be called within a glBegin()/glEnd() pair
 //            (thus it must not be called from BeginLines(), etc., or within a
 //             BeginLines()/EndLines() block etc.)
+#if 0
 #define CHECK_GL_ERROR(M, F) \
     if (glGetError() == GL_NO_ERROR) { } else \
 	wxLogError(__FILE__":"STRING(__LINE__)": OpenGL error: %s " \
 		   "(call "F" in method "M")", gluErrorString(glGetError()))
+#else
+#define CHECK_GL_ERROR(M, F) \
+    if (glGetError() != GL_NO_ERROR) { \
+	cout << __FILE__":"STRING(__LINE__)": OpenGL error: " << gluErrorString(glGetError()) << " (call "F" in method "M")" << endl; \
+	exit(1); \
+    } else \
+	cout << __FILE__":"STRING(__LINE__)": OK (call "F" in method "M")" << endl
+#endif
 
 //
 //  GLAPen
@@ -278,12 +289,15 @@ void GLACanvas::FirstShow()
     // Grey fog effect.
     GLfloat fogcolour[4] = { 0.5, 0.5, 0.5, 1.0 };
     glFogfv(GL_FOG_COLOR, fogcolour);
+    CHECK_GL_ERROR("FirstShow", "glFogfv");
 
     // Linear fogging.
     glFogi(GL_FOG_MODE, GL_LINEAR);
+    CHECK_GL_ERROR("FirstShow", "glFogi");
 
     // Optimise for speed (compute fog per vertex).
     glHint(GL_FOG_HINT, GL_FASTEST);
+    CHECK_GL_ERROR("FirstShow", "glHint");
 
     // No padding on pixel packing and unpacking (default is to pad each
     // line to a multiple of 4 bytes).
@@ -350,7 +364,9 @@ void GLACanvas::FirstShow()
 
     if (glpoint_sprite) {
 	glGenTextures(1, &m_CrossTexture);
+	CHECK_GL_ERROR("FirstShow", "glGenTextures");
 	glBindTexture(GL_TEXTURE_2D, m_CrossTexture);
+	CHECK_GL_ERROR("FirstShow", "glBindTexture");
 	const unsigned char crossteximage[128] = {
 	    255,255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,255,
 	      0,  0,255,255,  0,  0,  0,  0,  0,  0,  0,  0,255,255,  0,  0,
@@ -362,12 +378,19 @@ void GLACanvas::FirstShow()
 	    255,255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,255
 	};
 	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+	CHECK_GL_ERROR("FirstShow", "glPixelStorei");
 	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+	CHECK_GL_ERROR("FirstShow", "glTexEnvi");
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+	CHECK_GL_ERROR("FirstShow", "glTexParameteri GL_TEXTURE_WRAP_S");
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+	CHECK_GL_ERROR("FirstShow", "glTexParameteri GL_TEXTURE_WRAP_T");
 	glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 8, 8, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, (GLvoid *)crossteximage);
+	CHECK_GL_ERROR("FirstShow", "glTexImage2D");
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	CHECK_GL_ERROR("FirstShow", "glTexParameteri GL_TEXTURE_MAG_FILTER");
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	CHECK_GL_ERROR("FirstShow", "glTexParameteri GL_TEXTURE_MIN_FILTER");
     }
     //if (glpoint_ok) printf("Using GL_POINTS for blobs\n");
     //if (glpoint_sprite) printf("Using GL_POINT_SPRITE* for crosses");
@@ -638,12 +661,17 @@ void GLACanvas::SetIndicatorTransform()
     glDisable(GL_BLEND);
     CHECK_GL_ERROR("SetIndicatorTransform", "glDisable GL_BLEND");
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+    CHECK_GL_ERROR("SetIndicatorTransform", "glTexParameteri GL_TEXTURE_WRAP_S");
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+    CHECK_GL_ERROR("SetIndicatorTransform", "glTexParameteri GL_TEXTURE_WRAP_T");
     glAlphaFunc(GL_GREATER, 0.5f);
+    CHECK_GL_ERROR("SetIndicatorTransform", "glAlphaFunc");
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+    CHECK_GL_ERROR("SetIndicatorTransform", "glTexParameteri GL_TEXTURE_MAG_FILTER");
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    CHECK_GL_ERROR("SetIndicatorTransform", "glTexParameteri GL_TEXTURE_MIN_FILTER");
     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
-    CHECK_GL_ERROR("SetIndicatorTransform", "various");
+    CHECK_GL_ERROR("SetIndicatorTransform", "glHint");
 }
 
 void GLACanvas::FinishDrawing()
@@ -836,6 +864,7 @@ void GLACanvas::EndQuadrilaterals()
     // Finish drawing of quadrilaterals.
 
     glEnd();
+    CHECK_GL_ERROR("EndQuadrilaterals", "glEnd GL_QUADS");
 }
 
 void GLACanvas::BeginLines()
@@ -850,6 +879,7 @@ void GLACanvas::EndLines()
     // Finish drawing of a set of lines.
 
     glEnd();
+    CHECK_GL_ERROR("EndLines", "glEnd GL_LINES");
 }
 
 void GLACanvas::BeginTriangles()
@@ -864,6 +894,7 @@ void GLACanvas::EndTriangles()
     // Finish drawing of a set of triangles.
 
     glEnd();
+    CHECK_GL_ERROR("EndTriangles", "glEnd GL_TRIANGLES");
 }
 
 void GLACanvas::BeginTriangleStrip()
@@ -878,6 +909,7 @@ void GLACanvas::EndTriangleStrip()
     // Finish drawing of a triangle strip.
 
     glEnd();
+    CHECK_GL_ERROR("EndTriangleStrip", "glEnd GL_TRIANGLE_STRIP");
 }
 
 void GLACanvas::BeginPolyline()
@@ -892,6 +924,7 @@ void GLACanvas::EndPolyline()
     // Finish drawing of a polyline.
 
     glEnd();
+    CHECK_GL_ERROR("EndPolyline", "glEnd GL_LINE_STRIP");
 }
 
 void GLACanvas::BeginPolygon()
@@ -906,6 +939,7 @@ void GLACanvas::EndPolygon()
     // Finish drawing of a polygon.
 
     glEnd();
+    CHECK_GL_ERROR("EndPolygon", "glEnd GL_POLYGON");
 }
 
 void GLACanvas::PlaceVertex(glaCoord x, glaCoord y, glaCoord z)
@@ -974,11 +1008,11 @@ void GLACanvas::DrawBlob(glaCoord x, gla
 	// Draw an filled circle.
 	assert(m_Quadric);
 	glTranslated(X, Y, Z);
-	CHECK_GL_ERROR("glTranslated 1", "DrawBlob");
+	CHECK_GL_ERROR("DrawBlob", "glTranslated 1");
 	gluDisk(m_Quadric, 0, BLOB_DIAMETER * 0.5, 8, 1);
-	CHECK_GL_ERROR("gluDisk", "DrawBlob");
+	CHECK_GL_ERROR("DrawBlob", "gluDisk");
 	glTranslated(-X, -Y, -Z);
-	CHECK_GL_ERROR("glTranslated 2", "DrawBlob");
+	CHECK_GL_ERROR("DrawBlob", "glTranslated 2");
     }
 #ifdef GLA_DEBUG
     m_Vertices++;
@@ -994,11 +1028,11 @@ void GLACanvas::DrawBlob(glaCoord x, gla
 	// Draw an filled circle.
 	assert(m_Quadric);
 	glTranslated(x, y, 0);
-	CHECK_GL_ERROR("glTranslated 1", "DrawBlob 2");
+	CHECK_GL_ERROR("DrawBlob 2", "glTranslated 1");
 	gluDisk(m_Quadric, 0, BLOB_DIAMETER * 0.5, 8, 1);
-	CHECK_GL_ERROR("gluDisk", "DrawBlob");
+	CHECK_GL_ERROR("DrawBlob 2", "gluDisk");
 	glTranslated(-x, -y, 0);
-	CHECK_GL_ERROR("glTranslated 2", "DrawBlob 2");
+	CHECK_GL_ERROR("DrawBlob 2", "glTranslated 2");
     }
 #ifdef GLA_DEBUG
     m_Vertices++;
@@ -1010,12 +1044,19 @@ void GLACanvas::BeginCrosses()
     // Plot crosses.
     if (glpoint_sprite) {
 	glPushAttrib(GL_ENABLE_BIT|GL_POINT_BIT);
+	CHECK_GL_ERROR("BeginCrosses", "glPushAttrib");
 	glBindTexture(GL_TEXTURE_2D, m_CrossTexture);
+	CHECK_GL_ERROR("BeginCrosses", "glBindTexture");
 	glEnable(GL_ALPHA_TEST);
+	CHECK_GL_ERROR("BeginCrosses", "glEnable GL_ALPHA_TEST");
 	glPointSize(8);
+	CHECK_GL_ERROR("BeginCrosses", "glPointSize");
 	glTexEnvf(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
+	CHECK_GL_ERROR("BeginCrosses", "glTexEnvf");
 	glEnable(GL_TEXTURE_2D);
+	CHECK_GL_ERROR("BeginCrosses", "glEnable GL_TEXTURE_2D");
 	glEnable(GL_POINT_SPRITE_ARB);
+	CHECK_GL_ERROR("BeginCrosses", "glEnable GL_POINT_SPRITE_ARB");
 	glBegin(GL_POINTS);
     } else {
 	// To get the crosses to appear at a constant size and orientation on
@@ -1023,10 +1064,10 @@ void GLACanvas::BeginCrosses()
 	// unfortunately means they can't be usefully put in an opengl display
 	// list).
 	glPushAttrib(GL_TRANSFORM_BIT|GL_VIEWPORT_BIT|GL_ENABLE_BIT);
-	CHECK_GL_ERROR("BeginCrosses", "glPushAttrib");
+	CHECK_GL_ERROR("BeginCrosses", "glPushAttrib 2");
 	SetIndicatorTransform();
 	glEnable(GL_DEPTH_TEST);
-	CHECK_GL_ERROR("BeginBlobs", "glEnable GL_DEPTH_TEST");
+	CHECK_GL_ERROR("BeginCrosses", "glEnable GL_DEPTH_TEST");
 	glBegin(GL_LINES);
     }
 }
@@ -1034,6 +1075,11 @@ void GLACanvas::BeginCrosses()
 void GLACanvas::EndCrosses()
 {
     glEnd();
+    if (glpoint_sprite) {
+	CHECK_GL_ERROR("EndCrosses", "glEnd GL_POINTS");
+    } else {
+	CHECK_GL_ERROR("EndCrosses", "glEnd GL_LINES");
+    }
     glPopAttrib();
     CHECK_GL_ERROR("EndCrosses", "glPopAttrib");
 }
@@ -1119,6 +1165,7 @@ GLACanvas::DrawShadedRectangle(const GLA
     // size.
 
     glShadeModel(GL_SMOOTH);
+    CHECK_GL_ERROR("DrawShadedRectangle", "glShadeModel GL_SMOOTH");
     BeginQuadrilaterals();
     SetColour(fill_bot);
     PlaceIndicatorVertex(x0, y0);
@@ -1128,6 +1175,7 @@ GLACanvas::DrawShadedRectangle(const GLA
     PlaceIndicatorVertex(x0, y0 + h);
     EndQuadrilaterals();
     glShadeModel(GL_FLAT);
+    CHECK_GL_ERROR("DrawShadedRectangle", "glShadeModel GL_FLAT");
 }
 
 void GLACanvas::DrawCircle(gla_colour edge, gla_colour fill,
@@ -1194,6 +1242,7 @@ GLACanvas::DrawTriangle(gla_colour edge,
     PlaceIndicatorVertex(p1.GetX(), p1.GetY());
     PlaceIndicatorVertex(p2.GetX(), p2.GetY());
     glEnd();
+    CHECK_GL_ERROR("DrawTriangle", "glEnd GL_LINE_STRIP");
 }
 
 void GLACanvas::EnableDashedLines()


More information about the Survex mailing list