diff --git a/src/dlangui/graphics/gldrawbuf.d b/src/dlangui/graphics/gldrawbuf.d index 9f69a788..81e8865d 100644 --- a/src/dlangui/graphics/gldrawbuf.d +++ b/src/dlangui/graphics/gldrawbuf.d @@ -445,8 +445,7 @@ private class GLImageCache { // unset rotation glSupport.setRotation(rx, ry, 0); // glMatrixMode(GL_PROJECTION); - // glPopMatrix(); - // checkError("pop matrix"); + // checkgl!glPopMatrix(); } } diff --git a/src/dlangui/graphics/glsupport.d b/src/dlangui/graphics/glsupport.d index a0be22fd..7c9d3b45 100644 --- a/src/dlangui/graphics/glsupport.d +++ b/src/dlangui/graphics/glsupport.d @@ -76,14 +76,24 @@ static this() { } /** * Convenient wrapper around glGetError() - * TODO use one of the DEBUG extensions instead + * TODO use one of the DEBUG extensions */ -bool checkError(string context="", string file=__FILE__, int line=__LINE__) +/// Using: checkgl!glFunction(funcParams); +template checkgl(alias func) +{ + debug auto checkgl(string functionName=__FUNCTION__, int line=__LINE__, Args...)(Args args) + { + scope(success) checkError(func.stringof, functionName, line); + return func(args); + } else + alias checkgl = func; +} +bool checkError(string context="", string functionName=__FUNCTION__, int line=__LINE__) { GLenum err = glGetError(); if (err != GL_NO_ERROR) { - Log.e("OpenGL error ", errors.get(err, to!string(err)), " at ", file, ":", line, " -- ", context); + Log.e("OpenGL error ", errors.get(err, to!string(err)), " at ", functionName, ":", line, " -- ", context); return true; } return false; @@ -194,8 +204,7 @@ class GLProgram { } initialized = true; Log.v("Program is initialized successfully"); - glUseProgram(0); - checkError("glUseProgram " ~ to!string(program)); + checkgl!glUseProgram(0); return !error; } bool initLocations() { @@ -211,8 +220,7 @@ class GLProgram { return true; } void release() { - glUseProgram(0); - checkError("glUseProgram(0)"); + checkgl!glUseProgram(0); } ~this() { clear(); @@ -272,16 +280,13 @@ class SolidFillProgram : GLProgram { void beforeExecute() { glEnable(GL_BLEND); - glDisable(GL_CULL_FACE); - checkError("glDisable(GL_CULL_FACE)"); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + checkgl!glDisable(GL_CULL_FACE); + checkgl!glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - checkError("glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)"); bind(); //glUniformMatrix4fv(matrixLocation, 1, false, m.value_ptr); //glUniformMatrix4fv(matrixLocation, 1, false, matrix.ptr); - glUniformMatrix4fv(matrixLocation, 1, false, glSupport.qtmatrix.ptr); - checkError("glUniformMatrix4fv"); + checkgl!glUniformMatrix4fv(matrixLocation, 1, false, glSupport.qtmatrix.ptr); } void afterExecute() { @@ -294,16 +299,13 @@ class SolidFillProgram : GLProgram { override bool initLocations() { bool res = super.initLocations(); - matrixLocation = glGetUniformLocation(program, "matrix"); - checkError("glGetUniformLocation matrix"); + matrixLocation = checkgl!glGetUniformLocation(program, toStringz("matrix")); if (matrixLocation == -1) Log.e("glGetUniformLocation failed for matrixLocation"); - vertexLocation = glGetAttribLocation(program, "vertex"); - checkError("glGetAttribLocation vertex"); + vertexLocation = checkgl!glGetAttribLocation(program, toStringz("vertex")); if (vertexLocation == -1) Log.e("glGetUniformLocation failed for vertexLocation"); - colAttrLocation = glGetAttribLocation(program, "colAttr"); - checkError("glGetAttribLocation colAttr"); + colAttrLocation = checkgl!glGetAttribLocation(program, toStringz("colAttr")); if (colAttrLocation == -1) Log.e("glGetUniformLocation failed for colAttrLocation"); return res && matrixLocation >= 0 && vertexLocation >= 0 && colAttrLocation >= 0; @@ -325,8 +327,7 @@ class SolidFillProgram : GLProgram { glEnableVertexAttribArray(vertexLocation); glEnableVertexAttribArray(colAttrLocation); - glDrawArrays(GL_TRIANGLES, 0, cast(int)vertices.length/3); - checkError("glDrawArrays"); + checkgl!glDrawArrays(GL_TRIANGLES, 0, cast(int)vertices.length/3); glDisableVertexAttribArray(vertexLocation); glDisableVertexAttribArray(colAttrLocation); @@ -356,8 +357,7 @@ class LineProgram : SolidFillProgram { glEnableVertexAttribArray(vertexLocation); glEnableVertexAttribArray(colAttrLocation); - glDrawArrays(GL_LINES, 0, cast(int)vertices.length/3); - checkError("glDrawArrays"); + checkgl!glDrawArrays(GL_LINES, 0, cast(int)vertices.length/3); glDisableVertexAttribArray(vertexLocation); glDisableVertexAttribArray(colAttrLocation); @@ -429,8 +429,7 @@ class TextureProgram : SolidFillProgram { glEnableVertexAttribArray(colAttrLocation); glEnableVertexAttribArray(texCoordLocation); - glDrawArrays(GL_TRIANGLES, 0, cast(int)vertices.length/3); - checkError("glDrawArrays"); + checkgl!glDrawArrays(GL_TRIANGLES, 0, cast(int)vertices.length/3); glDisableVertexAttribArray(vertexLocation); glDisableVertexAttribArray(colAttrLocation); @@ -486,17 +485,14 @@ class FontProgram : SolidFillProgram { override void beforeExecute() { glEnable(GL_BLEND); - glDisable(GL_CULL_FACE); - checkError("glDisable(GL_CULL_FACE)"); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + checkgl!glDisable(GL_CULL_FACE); + checkgl!glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //glBlendFunc(GL_ONE, GL_SRC_COLOR); //glBlendFunc(GL_ONE, GL_SRC_COLOR); //glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR); //glBlendFunc(GL_ONE_MINUS_SRC_COLOR, GL_SRC_COLOR); - checkError("glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR)"); bind(); - glUniformMatrix4fv(matrixLocation, 1, false, glSupport.qtmatrix.ptr); - checkError("glUniformMatrix4fv"); + checkgl!glUniformMatrix4fv(matrixLocation, 1, false, glSupport.qtmatrix.ptr); } override void afterExecute() { @@ -525,8 +521,7 @@ class FontProgram : SolidFillProgram { glEnableVertexAttribArray(colAttrLocation); glEnableVertexAttribArray(texCoordLocation); - glDrawArrays(GL_TRIANGLES, 0, cast(int)vertices.length/3); - checkError("glDrawArrays"); + checkgl!glDrawArrays(GL_TRIANGLES, 0, cast(int)vertices.length/3); glDisableVertexAttribArray(vertexLocation); glDisableVertexAttribArray(colAttrLocation); @@ -701,19 +696,13 @@ class GLSupport { glDisable(GL_CULL_FACE); glEnable(GL_BLEND); glDisable(GL_ALPHA_TEST); - glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - checkError("glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)"); - glEnableClientState(GL_VERTEX_ARRAY); - checkError("glEnableClientState(GL_VERTEX_ARRAY)"); - glEnableClientState(GL_COLOR_ARRAY); - checkError("glEnableClientState(GL_COLOR_ARRAY)"); - glVertexPointer(3, GL_FLOAT, 0, cast(void*)vertices.ptr); - checkError("glVertexPointer(3, GL_FLOAT, 0, vertices)"); - glColorPointer(4, GL_FLOAT, 0, cast(void*)colors); - checkError("glColorPointer(4, GL_FLOAT, 0, colors)"); + checkgl!glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + checkgl!glEnableClientState(GL_VERTEX_ARRAY); + checkgl!glEnableClientState(GL_COLOR_ARRAY); + checkgl!glVertexPointer(3, GL_FLOAT, 0, cast(void*)vertices.ptr); + checkgl!glColorPointer(4, GL_FLOAT, 0, cast(void*)colors); - glDrawArrays(GL_TRIANGLES, 0, 6); - checkError("glDrawArrays(GL_TRIANGLES, 0, 6)"); + checkgl!glDrawArrays(GL_TRIANGLES, 0, 6); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); @@ -771,24 +760,16 @@ class GLSupport { glDisable(GL_ALPHA_TEST); glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - checkError("glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)"); + checkgl!glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnableClientState(GL_COLOR_ARRAY); - checkError("glEnableClientState(GL_COLOR_ARRAY)"); - glEnableClientState(GL_VERTEX_ARRAY); - checkError("glEnableClientState(GL_VERTEX_ARRAY)"); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - checkError("glEnableClientState(GL_TEXTURE_COORD_ARRAY)"); - glVertexPointer(3, GL_FLOAT, 0, cast(void*)vertices.ptr); - checkError("glVertexPointer(3, GL_FLOAT, 0, vertices)"); - glTexCoordPointer(2, GL_FLOAT, 0, cast(void*)texcoords.ptr); - checkError("glTexCoordPointer(2, GL_FLOAT, 0, texcoords)"); - glColorPointer(4, GL_FLOAT, 0, cast(void*)colors.ptr); - checkError("glColorPointer(4, GL_FLOAT, 0, colors)"); + checkgl!glEnableClientState(GL_COLOR_ARRAY); + checkgl!glEnableClientState(GL_VERTEX_ARRAY); + checkgl!glEnableClientState(GL_TEXTURE_COORD_ARRAY); + checkgl!glVertexPointer(3, GL_FLOAT, 0, cast(void*)vertices.ptr); + checkgl!glTexCoordPointer(2, GL_FLOAT, 0, cast(void*)texcoords.ptr); + checkgl!glColorPointer(4, GL_FLOAT, 0, cast(void*)colors.ptr); - glDrawArrays(GL_TRIANGLES, 0, 6); - checkError("glDrawArrays"); + checkgl!glDrawArrays(GL_TRIANGLES, 0, 6); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); @@ -843,24 +824,16 @@ class GLSupport { glDisable(GL_ALPHA_TEST); glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - checkError("glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)"); + checkgl!glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnableClientState(GL_COLOR_ARRAY); - checkError("glEnableClientState(GL_COLOR_ARRAY)"); - glEnableClientState(GL_VERTEX_ARRAY); - checkError("glEnableClientState(GL_VERTEX_ARRAY)"); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - checkError("glEnableClientState(GL_TEXTURE_COORD_ARRAY)"); - glVertexPointer(3, GL_FLOAT, 0, cast(void*)vertices.ptr); - checkError("glVertexPointer(3, GL_FLOAT, 0, vertices)"); - glTexCoordPointer(2, GL_FLOAT, 0, cast(void*)texcoords.ptr); - checkError("glTexCoordPointer(2, GL_FLOAT, 0, texcoords)"); - glColorPointer(4, GL_FLOAT, 0, cast(void*)colors.ptr); - checkError("glColorPointer(4, GL_FLOAT, 0, colors)"); + checkgl!glEnableClientState(GL_COLOR_ARRAY); + checkgl!glEnableClientState(GL_VERTEX_ARRAY); + checkgl!glEnableClientState(GL_TEXTURE_COORD_ARRAY); + checkgl!glVertexPointer(3, GL_FLOAT, 0, cast(void*)vertices.ptr); + checkgl!glTexCoordPointer(2, GL_FLOAT, 0, cast(void*)texcoords.ptr); + checkgl!glColorPointer(4, GL_FLOAT, 0, cast(void*)colors.ptr); - glDrawArrays(GL_TRIANGLES, 0, 6); - checkError("glDrawArrays"); + checkgl!glDrawArrays(GL_TRIANGLES, 0, 6); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); @@ -876,15 +849,13 @@ class GLSupport { /// call glFlush void flushGL() { - glFlush(); - checkError("glFlush"); + checkgl!glFlush(); } bool setTextureImage(Tex2D texture, int dx, int dy, ubyte * pixels) { - //checkError("before setTextureImage"); + checkError("before setTextureImage"); texture.setup(); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - checkError("updateTexture - glPixelStorei"); + checkgl!glPixelStorei(GL_UNPACK_ALIGNMENT, 1); texture.setSamplerParams(true, true); // ORIGINAL: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dx, dy, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); @@ -893,15 +864,13 @@ class GLSupport { Log.e("Cannot set image for texture"); return false; } - checkError("after setTextureImage"); return true; } bool setTextureImageAlpha(Tex2D texture, int dx, int dy, ubyte * pixels) { checkError("before setTextureImageAlpha"); texture.setup(); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - checkError("setTextureImageAlpha - glPixelStorei"); + checkgl!glPixelStorei(GL_UNPACK_ALIGNMENT, 1); texture.setSamplerParams(true, true); glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, dx, dy, 0, GL_ALPHA, GL_UNSIGNED_BYTE, pixels); @@ -910,7 +879,6 @@ class GLSupport { return false; } texture.unbind(); - checkError("after setTextureImageAlpha"); return true; } @@ -929,25 +897,19 @@ class GLSupport { return false; fbo = f; - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, dx, dy, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, null); - checkError("glTexImage2D"); + checkgl!glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, dx, dy, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, null); texture.setSamplerParams(true, true); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture.ID, 0); - checkError("glFramebufferTexture2D"); + checkgl!glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture.ID, 0); // Always check that our framebuffer is ok - if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + if(checkgl!glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { Log.e("glFramebufferTexture2D failed"); res = false; } - checkError("glCheckFramebufferStatus"); //glClearColor(0.5f, 0, 0, 1); - glClearColor(0.5f, 0.5f, 0.5f, 1.0f); - checkError("glClearColor"); - glClear(GL_COLOR_BUFFER_BIT); - checkError("glClear"); - checkError("after createFramebuffer"); + checkgl!glClearColor(0.5f, 0.5f, 0.5f, 1.0f); + checkgl!glClear(GL_COLOR_BUFFER_BIT); //CRLog::trace("CRGLSupportImpl::createFramebuffer %d,%d texture=%d, buffer=%d", dx, dy, textureId, framebufferId); currentFBO = fbo; @@ -1058,18 +1020,15 @@ class GLSupport { if (_legacyMode) { glMatrixMode(GL_PROJECTION); - //glPushMatrix(); - //checkError("glPushMatrix"); + //checkgl!glPushMatrix(); //glLoadIdentity(); glLoadMatrixf(qtmatrix.ptr); //glOrthof(0, _dx, 0, _dy, -1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); - //glPushMatrix(); - //checkError("glPushMatrix"); + //checkgl!glPushMatrix(); glLoadIdentity(); } - glViewport(view.left, view.top, view.right, view.bottom); - checkError("glViewport"); + checkgl!glViewport(view.left, view.top, view.right, view.bottom); } void setPerspectiveProjection(float fieldOfView, float aspectRatio, float nearPlane, float farPlane) { @@ -1086,15 +1045,13 @@ class GLObject(GLObjectTypes type, GLuint target = 0) { private GLuint id; this() { - mixin("glGen" ~ to!string(type) ~ "s(1, &id);"); - checkError("glGen" ~ to!string(type)); + mixin("checkgl!glGen" ~ to!string(type) ~ "s(1, &id);"); bind(); - } + } ~this() { unbind(); - mixin("glDelete" ~ to!string(type) ~ "s(1, &id);"); - checkError("glDelete" ~ to!string(type)); + mixin("checkgl!glDelete" ~ to!string(type) ~ "s(1, &id);"); } void bind() { @@ -1106,11 +1063,10 @@ class GLObject(GLObjectTypes type, GLuint target = 0) { void unbind() { static if(target != 0) - mixin("glBind" ~ to!string(type) ~ "(" ~ to!string(target) ~ ", 0);"); + mixin("checkgl!glBind" ~ to!string(type) ~ "(" ~ to!string(target) ~ ", 0);"); else - mixin("glBind" ~ to!string(type) ~ "(0);"); - checkError("unbind " ~ to!string(type)); - } + mixin("checkgl!glBind" ~ to!string(type) ~ "(0);"); + } static if(type == GLObjectTypes.Buffer) { @@ -1119,9 +1075,9 @@ class GLObject(GLObjectTypes type, GLuint target = 0) { foreach(b; buffs) length += b.length; glBufferData(target, - length * float.sizeof, - null, - GL_STREAM_DRAW); + length * float.sizeof, + null, + GL_STREAM_DRAW); int offset; foreach(b; buffs) { glBufferSubData(target,