From 1a071c49924a31bca8fa8a5172b858f1cd79f15b Mon Sep 17 00:00:00 2001 From: Themaister Date: Sat, 10 Aug 2013 18:57:51 +0200 Subject: [PATCH] Updates and fixes for cg2glsl. --- tools/cg2glsl.py | 119 +++++++++++++++++++++++++++++++---------------- 1 file changed, 79 insertions(+), 40 deletions(-) diff --git a/tools/cg2glsl.py b/tools/cg2glsl.py index 9027c81a8c..f63fae647e 100755 --- a/tools/cg2glsl.py +++ b/tools/cg2glsl.py @@ -60,6 +60,8 @@ def replace_global_vertex(source): source = replace_global_in(source) replace_table = [ + ('attribute', 'COMPAT_attribute'), + ('varying', 'COMPAT_varying'), ('POSITION', 'VertexCoord'), ('TEXCOORD1', 'LUTTexCoord'), ('TEXCOORD0', 'TexCoord'), @@ -143,7 +145,7 @@ def destructify_varyings(source, direction): while (j < len(source)) and ('};' not in source[j]): j += 1 - lines = ['varying ' + string for string in source[i + 1 : j]] + lines = ['COMPAT_varying ' + string for string in source[i + 1 : j]] varyings.extend(lines) names = [string.strip().split(' ')[1].split(';')[0].strip() for string in source[i + 1 : j]] varyings_name.extend(names) @@ -173,12 +175,15 @@ def destructify_varyings(source, direction): for struct in struct_types: if struct in line: - variable = line.split(' ')[1].split(';')[0] + decomment_line = line.split('//')[0].strip() + if len(decomment_line) == 0: + continue + variable = decomment_line.split(' ')[1].split(';')[0] # Only redirect if the struct is actually used as vertex output. for vout_line in vout_lines: if variable in vout_line: - log('Found struct variable for', struct + ':', variable) + log('Found struct variable for', struct + ':', variable, 'in line:', line) variables.append(variable) break @@ -335,15 +340,11 @@ def replace_varyings(source): if 'void main()' in line: for attrib in attribs: if attrib == 'VertexCoord': - source.insert(index, 'attribute vec4 ' + attrib + ';') + source.insert(index, 'COMPAT_attribute vec4 ' + attrib + ';') else: - source.insert(index, 'attribute vec2 ' + attrib + ';') + source.insert(index, 'COMPAT_attribute vec2 ' + attrib + ';') for uniform in uniforms: - source.insert(index, '#endif') - source.insert(index, 'uniform vec2 ' + uniform + ';') - source.insert(index, '#else') - source.insert(index, 'uniform mediump vec2 ' + uniform + ';') - source.insert(index, '#ifdef GL_ES') + source.insert(index, 'uniform COMPAT_PRECISION vec2 ' + uniform + ';') break for line in source: @@ -357,15 +358,9 @@ def hack_source_vertex(source): ref_index = 0 for index, line in enumerate(source): if 'void main()' in line: - source.insert(index, '#endif') - source.insert(index, 'uniform vec2 InputSize;') - source.insert(index, 'uniform vec2 TextureSize;') - source.insert(index, 'uniform vec2 OutputSize;') - source.insert(index, '#else') - source.insert(index, 'uniform mediump vec2 InputSize;') - source.insert(index, 'uniform mediump vec2 TextureSize;') - source.insert(index, 'uniform mediump vec2 OutputSize;') - source.insert(index, '#ifdef GL_ES') + source.insert(index, 'uniform COMPAT_PRECISION vec2 InputSize;') + source.insert(index, 'uniform COMPAT_PRECISION vec2 TextureSize;') + source.insert(index, 'uniform COMPAT_PRECISION vec2 OutputSize;') source.insert(index, 'uniform int FrameCount;') source.insert(index, 'uniform int FrameDirection;') source.insert(index, 'uniform mat4 MVPMatrix;') @@ -412,10 +407,12 @@ def hack_source_vertex(source): def replace_global_fragment(source): source = replace_global_in(source) replace_table = [ + ('varying', 'COMPAT_varying'), ('FrameCount', 'float(FrameCount)'), ('FrameDirection', 'float(FrameDirection)'), ('input', 'input_dummy'), ('output', 'output_dummy'), # 'output' is reserved in GLSL. + ('gl_FragColor', 'FragColor'), ] for replacement in replace_table: @@ -461,15 +458,9 @@ def hack_source_fragment(source): ref_index = 0 for index, line in enumerate(source): if 'void main()' in line: - source.insert(index, '#endif') - source.insert(index, 'uniform vec2 InputSize;') - source.insert(index, 'uniform vec2 TextureSize;') - source.insert(index, 'uniform vec2 OutputSize;') - source.insert(index, '#else') - source.insert(index, 'uniform mediump vec2 InputSize;') - source.insert(index, 'uniform mediump vec2 TextureSize;') - source.insert(index, 'uniform mediump vec2 OutputSize;') - source.insert(index, '#ifdef GL_ES') + source.insert(index, 'uniform COMPAT_PRECISION vec2 InputSize;') + source.insert(index, 'uniform COMPAT_PRECISION vec2 TextureSize;') + source.insert(index, 'uniform COMPAT_PRECISION vec2 OutputSize;') source.insert(index, 'uniform int FrameCount;') source.insert(index, 'uniform int FrameDirection;') ref_index = index @@ -510,11 +501,7 @@ def hack_source_fragment(source): for sampler in added_samplers: source.insert(ref_index, sampler) for uniform in uniforms: - source.insert(ref_index, '#endif') - source.insert(ref_index, 'uniform vec2 ' + uniform + ';') - source.insert(ref_index, '#else') - source.insert(ref_index, 'uniform mediump vec2 ' + uniform + ';') - source.insert(ref_index, '#ifdef GL_ES') + source.insert(ref_index, 'uniform COMPAT_PRECISION vec2 ' + uniform + ';') if struct_texunit0: source.insert(ref_index, 'uniform sampler2D Texture;') @@ -528,24 +515,38 @@ def hack_source_fragment(source): return ret def validate_shader(source, target): - command = ['cgc', '-noentry', '-ogles'] - p = subprocess.Popen(command, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE) - stdout_ret, stderr_ret = p.communicate(source.encode()) - log('Shader:') log('===') log(source) log('===') + + command = ['cgc', '-noentry', '-ogles'] + p = subprocess.Popen(command, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE) + stdout_ret, stderr_ret = p.communicate(source.encode()) + log('CGC:', stderr_ret.decode()) return p.returncode == 0 +def preprocess_vertex(source_data): + input_data = source_data.split('\n') + ret = [] + for line in input_data: + if 'uniform float4x4' in line: + ret.append('#pragma pack_matrix(column_major)\n') + ret.append(line) + ret.append('#pragma pack_matrix(row_major)\n') + else: + ret.append(line) + return '\n'.join(ret) + def convert(source, dest): vert_cmd = ['cgc', '-profile', 'glesv', '-entry', 'main_vertex'] with open(source, 'r') as f: source_data = f.read() p = subprocess.Popen(vert_cmd, stdin = subprocess.PIPE, stderr = subprocess.PIPE, stdout = subprocess.PIPE) - vertex_source, stderr_ret = p.communicate(input = ('#pragma pack_matrix(column_major)\n' + source_data).encode()) + source_data = preprocess_vertex(source_data) + vertex_source, stderr_ret = p.communicate(input = source_data.encode()) log(stderr_ret.decode()) vertex_source = vertex_source.decode() @@ -586,8 +587,46 @@ def convert(source, dest): vertex_source = remove_comments(vertex_source[1:]) fragment_source = remove_comments(fragment_source[1:]) - out_vertex = '\n'.join(vertex_source) - out_fragment = '\n'.join(['#ifdef GL_ES', 'precision mediump float;', '#endif'] + fragment_source) + vert_hacks = [] + vert_hacks.append(''' +#if __VERSION__ >= 130 +#define COMPAT_varying out +#define COMPAT_attribute in +#else +#define COMPAT_varying varying +#define COMPAT_attribute attribute +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif''') + + out_vertex = '\n'.join(vert_hacks + vertex_source) + + frag_hacks = [] + frag_hacks.append(''' +#if __VERSION__ >= 130 +#define COMPAT_varying in +out vec4 FragColor; +#else +#define COMPAT_varying varying +#define FragColor gl_FragColor +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif''') + + out_fragment = '\n'.join(frag_hacks + fragment_source) if not validate_shader(out_vertex, 'glesv'): log('Vertex shader does not compile ...')