Created
January 15, 2013 18:40
-
-
Save Kos/4540890 to your computer and use it in GitHub Desktop.
This module shows...
a) how GLSL error locations are presented depending on how the shader source is passed (one string vs array of strings),
b) whether a single token can spread across several source strings.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
This module shows... | |
a) how GLSL error locations are presented depending on how the shader source is passed | |
(one string vs array of strings), | |
b) whether a single token can spread across several source strings. | |
''' | |
import ctypes | |
from OpenGL import GL | |
# This is a deep dependency from my framework, | |
# please replace it with your own decorator that makes a function run through a valid GL context | |
from debugwindow import gltest | |
# An example shader with an error in line 5 | |
source = '''\ | |
#version 330 // 1 | |
// 2 | |
void main() { // 3 | |
// 4 | |
gl_Position = vec4(1,2,three,4); // 5 error here | |
// 6 | |
} // 7 | |
''' | |
# This shader is correct, but is split into two strings inside a token | |
alt_source_list = [ | |
'#version 330\nvo', | |
'id main() { gl_Position = vec4(0); }' | |
] | |
@gltest | |
def run(splits): | |
shader = GL.glCreateShader(GL.GL_VERTEX_SHADER) | |
if splits: | |
keep_eols = True | |
source_lines = source.splitlines(keep_eols) # It is important to keep newlines. | |
c_sources = map(ctypes.c_char_p, source_lines) | |
else: | |
c_sources = [ctypes.c_char_p(source)] | |
ctype_char_p_arr = ctypes.c_char_p * len(c_sources) | |
c_sources_array = ctype_char_p_arr(*c_sources) | |
if splits: | |
assert len(c_sources) > 1 | |
else: | |
assert len(c_sources) == 1 | |
GL.glShaderSource.wrappedOperation(shader, len(c_sources), c_sources_array, None) | |
GL.glCompileShader(shader) | |
print 'Compile status:', bool(GL.glGetShaderiv(shader, GL.GL_COMPILE_STATUS)) | |
print 'Info log:' | |
print GL.glGetShaderInfoLog(shader) | |
@gltest | |
def run2(): | |
shader = GL.glCreateShader(GL.GL_VERTEX_SHADER) | |
c_sources = map(ctypes.c_char_p, alt_source_list) | |
ctype_char_p_arr = ctypes.c_char_p * len(c_sources) | |
c_sources_array = ctype_char_p_arr(*c_sources) | |
assert len(c_sources) == 2 | |
GL.glShaderSource.wrappedOperation(shader, len(c_sources), c_sources_array, None) | |
GL.glCompileShader(shader) | |
print 'Compile status:', bool(GL.glGetShaderiv(shader, GL.GL_COMPILE_STATUS)) | |
print 'Info log:' | |
print GL.glGetShaderInfoLog(shader) | |
def main(): | |
print '# Shader as lines:' | |
print '(Expected an error in line 5)' | |
run(True) | |
print '# Shader as one block:' | |
print '(Expected an error in line 5)' | |
run(False) | |
print '# Tokens across block' | |
print '(Expected success if the token can span through strings)' | |
run2() | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment