Derelict-GL3 Error
Kevin via Digitalmars-d
digitalmars-d at puremagic.com
Tue Jan 10 06:32:29 PST 2017
On Tuesday, 10 January 2017 at 04:34:24 UTC, Mike Parker wrote:
> On Tuesday, 10 January 2017 at 01:43:50 UTC, Kevin wrote:
>> Using Archlinux, Derelict-gl3 1.0.18
>> check format (GLuint, Glenum, Glint*)
>>
>> // this does not work
>> glGetShaderiv(program, GL_LINK_STATUS, &success);
>> writeln("GL_ERROR: ", glGetError());
>>
>> Give me error 1282
>>
>> // this one works fine.
>> glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
>
> This has nothing to do with Derelict. It's an error in your use
> of OpenGL, so you need to look up the OpenGL error code 1282
> and figure out what it means.
>
> Since I'm here, I'll save you some time. 1282 is
> GL_INVALID_OPERATION. However, just because you called it
> immediately after glGetShaderiv *does not mean* that function
> caused the error. The error code may have been set any time
> before that, by any of the functions you called. Then, when you
> call glGetError, the error code is reset to 0, so your next
> call to glGetError shows no error.
>
> Here's some psuedocode to illustrate:
>
> // OpenGL's internal error code
> errCode = 0;
>
> // In your code:
> glSomething(); // no error
> glSomethingElse(); // no error
> glAnotherThing(); // Oops! An error - errCode now is set to
> 1282
> glThisThing(); // No error, but the state is now messed up
> glThatThing(); // No error
> err = glGetError(); // This returns 1282, as set by
> glAnotherThing above
>
>
> What you need to do is debug your OpenGL code. The simplest way
> to do that is to insert glGetError at different points,
> recompile, and run it again. This will help you narrow things
> down to the function that actually caused the error.
>
> And for future reference, please go to opengl.org or the OpenGL
> forums at gamedev.net for help with OpenGL.
Thanks for info. I already did glGetError() above and below.
and it only from that code. At first I thought i put the wrong
type. I set success to 1 and let code go through and shader work
fine. The glGetShaderiv(program, GL_LINK_STATUS, &success) check
does not work. If you still think it opengl problem I will take
it there or maybe i made a simple mistake I can't see.
full code
import std.string : toStringz;
import std.stdio;
import std.file;
import derelict.opengl3.gl;
struct Shader {
private GLuint program;
@disable this(this);
~this() {
glDeleteProgram(program);
}
void use() {
glUseProgram(program);
}
bool create(string vertexName, string fragmentName, string
geometryName=null) {
char[512] infoLog;
program = 0;
GLuint vertexShader = shaderFile(vertexName,
GL_VERTEX_SHADER);
GLuint fragmentShader = shaderFile(fragmentName,
GL_FRAGMENT_SHADER);
GLuint geometryShader = 0;
GLint success = 1;
if(geometryName !is null)
geometryShader = shaderFile(geometryName,
GL_GEOMETRY_SHADER);
if(vertexShader == 0) {
writeln("Vertex is null");
return false;
}
if(fragmentShader == 0) {
writeln("Fragment is null");
glDeleteShader(vertexShader);
return false;
}
if(geometryName !is null) {
if(geometryShader == 0) {
writeln("Geometry is null");
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
return false;
}
}
// create program
program = glCreateProgram();
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
if(geometryName !is null)
glAttachShader(program, geometryShader);
glLinkProgram(program);
writeln("Before GL_ERROR: ", glGetError());
// this does not work
glGetShaderiv(program, GL_LINK_STATUS, &success);
writeln("After GL_ERROR: ", glGetError());
if(!success) {
writeln("GL_ERROR: ", glGetError());
glGetShaderInfoLog(program, 512, null, infoLog.ptr);
writeln("ERROR::Shader program linking failed");
writeln(infoLog);
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
if(geometryName !is null)
glDeleteShader(geometryShader);
return cast(bool) success;
}
private GLuint shaderFile(string sourceName, GLenum flag) {
string fileData;
GLchar* source;
GLint success;
GLchar[512] infoLog;
GLuint shader = 0;
if(exists(sourceName) != 0)
fileData = cast(string) read(sourceName);
else {
writeln("ERROR: File doesn't exist");
return 0;
}
source = cast(GLchar*) (toStringz(fileData));
shader = glCreateShader(flag);
glShaderSource(shader, 1, &source, null);
glCompileShader(shader);
// this one work fine
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
writeln("sh .. GL_ERROR: ", glGetError());
if(!success)
{
glGetShaderInfoLog(shader, 512, null, infoLog.ptr);
if(flag == GL_VERTEX_SHADER)
writeln("ERROR::Shader vertex compiltion failed ");
else if(flag == GL_FRAGMENT_SHADER)
writeln("ERROR::Shader fragment compiltion failed");
else if(flag == GL_GEOMETRY_SHADER)
writeln("ERROR::Shader geometry compiltion failed");
writeln(infoLog);
}
return shader;
}
}
More information about the Digitalmars-d
mailing list