Updates and fixes for cg2glsl.

This commit is contained in:
Themaister 2013-08-10 18:57:51 +02:00
parent 954727aa79
commit 1a071c4992

View File

@ -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 ...')