display cross hangs machine

Olly Betts olly at survex.com
Wed May 2 18:41:56 BST 2007


On Wed, May 02, 2007 at 02:11:20PM -0300, Carlos Gu?no Grohmann wrote:
> gla-gl.cc:211: OpenGL error: no error (call glCallList in method
> GLAList::DrawList)

Progress, but sadly calling glGetError resets the error code so it is
just reported as "no error".  Try this updated patch against fresh
source code and we'll see what the problem actually was!

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 17:41:23 -0000
@@ -68,6 +68,8 @@
 #endif
 #endif
 
+#include <iostream>
+
 using namespace std;
 
 const double BLOB_DIAMETER = 5.0;
@@ -126,10 +128,20 @@ 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) do {\
+    GLenum error_code_ = glGetError(); \
+    if (error_code_ != GL_NO_ERROR) { \
+	cout << __FILE__":"STRING(__LINE__)": OpenGL error: " << gluErrorString(error_code_) << " (call "F" in method "M")" << endl; \
+	exit(1); \
+    } \
+} while (0)
+#endif
 
 //
 //  GLAPen
@@ -278,12 +290,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 +365,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 +379,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 +662,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 +865,7 @@ void GLACanvas::EndQuadrilaterals()
     // Finish drawing of quadrilaterals.
 
     glEnd();
+    CHECK_GL_ERROR("EndQuadrilaterals", "glEnd GL_QUADS");
 }
 
 void GLACanvas::BeginLines()
@@ -850,6 +880,7 @@ void GLACanvas::EndLines()
     // Finish drawing of a set of lines.
 
     glEnd();
+    CHECK_GL_ERROR("EndLines", "glEnd GL_LINES");
 }
 
 void GLACanvas::BeginTriangles()
@@ -864,6 +895,7 @@ void GLACanvas::EndTriangles()
     // Finish drawing of a set of triangles.
 
     glEnd();
+    CHECK_GL_ERROR("EndTriangles", "glEnd GL_TRIANGLES");
 }
 
 void GLACanvas::BeginTriangleStrip()
@@ -878,6 +910,7 @@ void GLACanvas::EndTriangleStrip()
     // Finish drawing of a triangle strip.
 
     glEnd();
+    CHECK_GL_ERROR("EndTriangleStrip", "glEnd GL_TRIANGLE_STRIP");
 }
 
 void GLACanvas::BeginPolyline()
@@ -892,6 +925,7 @@ void GLACanvas::EndPolyline()
     // Finish drawing of a polyline.
 
     glEnd();
+    CHECK_GL_ERROR("EndPolyline", "glEnd GL_LINE_STRIP");
 }
 
 void GLACanvas::BeginPolygon()
@@ -906,6 +940,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 +1009,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 +1029,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 +1045,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 +1065,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 +1076,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 +1166,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 +1176,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 +1243,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