blob: 88a3d6aff79dc2b913c732f9e0962949ed1ce807 [file] [log] [blame]
#!/usr/bin/python
# Copyright 2017 The ANGLE Project Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# gen_uniform_type_table.py:
# Code generation for OpenGL uniform type info tables.
# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
from datetime import date
import sys
all_uniform_types = [
"GL_NONE", "GL_BOOL", "GL_BOOL_VEC2", "GL_BOOL_VEC3", "GL_BOOL_VEC4", "GL_FLOAT",
"GL_FLOAT_MAT2", "GL_FLOAT_MAT2x3", "GL_FLOAT_MAT2x4", "GL_FLOAT_MAT3", "GL_FLOAT_MAT3x2",
"GL_FLOAT_MAT3x4", "GL_FLOAT_MAT4", "GL_FLOAT_MAT4x2", "GL_FLOAT_MAT4x3", "GL_FLOAT_VEC2",
"GL_FLOAT_VEC3", "GL_FLOAT_VEC4", "GL_IMAGE_2D", "GL_IMAGE_2D_ARRAY", "GL_IMAGE_3D",
"GL_IMAGE_CUBE", "GL_INT", "GL_INT_IMAGE_2D", "GL_INT_IMAGE_2D_ARRAY", "GL_INT_IMAGE_3D",
"GL_INT_IMAGE_CUBE", "GL_INT_SAMPLER_2D", "GL_INT_SAMPLER_2D_ARRAY",
"GL_INT_SAMPLER_2D_MULTISAMPLE", "GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY", "GL_INT_SAMPLER_3D",
"GL_INT_SAMPLER_CUBE", "GL_INT_VEC2", "GL_INT_VEC3", "GL_INT_VEC4", "GL_SAMPLER_2D",
"GL_SAMPLER_2D_ARRAY", "GL_SAMPLER_2D_ARRAY_SHADOW", "GL_SAMPLER_2D_MULTISAMPLE",
"GL_SAMPLER_2D_MULTISAMPLE_ARRAY", "GL_SAMPLER_2D_RECT_ANGLE", "GL_SAMPLER_2D_SHADOW",
"GL_SAMPLER_3D", "GL_SAMPLER_CUBE", "GL_SAMPLER_CUBE_SHADOW", "GL_SAMPLER_EXTERNAL_OES",
"GL_UNSIGNED_INT", "GL_UNSIGNED_INT_ATOMIC_COUNTER", "GL_UNSIGNED_INT_IMAGE_2D",
"GL_UNSIGNED_INT_IMAGE_2D_ARRAY", "GL_UNSIGNED_INT_IMAGE_3D", "GL_UNSIGNED_INT_IMAGE_CUBE",
"GL_UNSIGNED_INT_SAMPLER_2D", "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY",
"GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE", "GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY",
"GL_UNSIGNED_INT_SAMPLER_3D", "GL_UNSIGNED_INT_SAMPLER_CUBE", "GL_UNSIGNED_INT_VEC2",
"GL_UNSIGNED_INT_VEC3", "GL_UNSIGNED_INT_VEC4"
]
# Uniform texture types. Be wary of substrings finding the wrong types.
# e.g. with 2D_MULTISAMPLE/2D_ARRAY and 2D.
texture_types = {
"2D": "2D",
"2D_ARRAY": "2D_ARRAY",
"2D_ARRAY_SHADOW": "2D_ARRAY",
"2D_MULTISAMPLE": "2D_MULTISAMPLE",
"2D_MULTISAMPLE_ARRAY": "2D_MULTISAMPLE_ARRAY",
"2D_RECT_ANGLE": "2D",
"2D_SHADOW": "2D",
"3D": "3D",
"CUBE": "CUBE_MAP",
"CUBE_SHADOW": "CUBE_MAP",
"EXTERNAL_OES": "EXTERNAL_OES",
"RECT": "RECTANGLE",
}
template_cpp = """// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name}.
//
// Copyright {copyright_year} The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Uniform type info table:
// Metadata about a particular uniform format, indexed by GL type.
#include <array>
#include "common/utilities.h"
using namespace angle;
namespace gl
{{
namespace
{{
constexpr std::array<UniformTypeInfo, {total_count}> kInfoTable =
{{{{
{uniform_type_info_data}
}}}};
size_t GetTypeInfoIndex(GLenum uniformType)
{{
switch (uniformType)
{{
{uniform_type_index_cases}
default:
UNREACHABLE();
return 0;
}}
}}
}} // anonymous namespace
const UniformTypeInfo &GetUniformTypeInfo(GLenum uniformType)
{{
ASSERT(kInfoTable[GetTypeInfoIndex(uniformType)].type == uniformType);
return kInfoTable[GetTypeInfoIndex(uniformType)];
}}
}} // namespace gl
"""
type_info_data_template = """{{{type}, {component_type}, {texture_type}, {transposed_type}, {bool_type}, {sampler_format}, {rows}, {columns}, {components}, {component_size}, {internal_size}, {external_size}, {is_sampler}, {is_matrix}, {is_image}, {glsl_asfloat} }}"""
type_index_case_template = """case {enum_value}: return {index_value};"""
def cpp_bool(value):
return "true" if value else "false"
def get_component_type(uniform_type):
if uniform_type.find("GL_BOOL") == 0:
return "GL_BOOL"
elif uniform_type.find("GL_FLOAT") == 0:
return "GL_FLOAT"
elif uniform_type.find("GL_INT") == 0:
return "GL_INT"
elif uniform_type.find("GL_UNSIGNED_INT") == 0:
return "GL_UNSIGNED_INT"
elif uniform_type == "GL_NONE":
return "GL_NONE"
else:
return "GL_INT"
def get_texture_type(uniform_type):
for sampler_type, tex_type in texture_types.items():
if uniform_type.endswith(sampler_type):
return "GL_TEXTURE_" + tex_type
return "GL_NONE"
def get_transposed_type(uniform_type):
if "_MAT" in uniform_type:
if "x" in uniform_type:
return "GL_FLOAT_MAT" + uniform_type[-1] + "x" + uniform_type[uniform_type.find("_MAT")
+ 4]
else:
return uniform_type
else:
return "GL_NONE"
def get_bool_type(uniform_type):
if uniform_type == "GL_INT" or uniform_type == "GL_UNSIGNED_INT" or uniform_type == "GL_FLOAT":
return "GL_BOOL"
elif "_VEC" in uniform_type:
return "GL_BOOL_VEC" + uniform_type[-1]
else:
return "GL_NONE"
def get_sampler_format(uniform_type):
if not "_SAMPLER_" in uniform_type:
return "SamplerFormat::InvalidEnum"
elif "_SHADOW" in uniform_type:
return "SamplerFormat::Shadow"
elif "GL_UNSIGNED_INT_SAMPLER_" in uniform_type:
return "SamplerFormat::Unsigned"
elif "GL_INT_SAMPLER_" in uniform_type:
return "SamplerFormat::Signed"
else:
return "SamplerFormat::Float"
def get_rows(uniform_type):
if uniform_type == "GL_NONE":
return "0"
elif "_MAT" in uniform_type:
return uniform_type[-1]
else:
return "1"
def get_columns(uniform_type):
if uniform_type == "GL_NONE":
return "0"
elif "_VEC" in uniform_type:
return uniform_type[-1]
elif "_MAT" in uniform_type:
return uniform_type[uniform_type.find("_MAT") + 4]
else:
return "1"
def get_components(uniform_type):
return str(int(get_rows(uniform_type)) * int(get_columns(uniform_type)))
def get_component_size(uniform_type):
component_type = get_component_type(uniform_type)
if component_type == "GL_BOOL":
return "sizeof(GLint)"
elif component_type == "GL_FLOAT":
return "sizeof(GLfloat)"
elif component_type == "GL_INT":
return "sizeof(GLint)"
elif component_type == "GL_UNSIGNED_INT":
return "sizeof(GLuint)"
elif component_type == "GL_NONE":
return "0"
else:
raise "Invalid component type: " + component_type
def get_internal_size(uniform_type):
return get_component_size(uniform_type) + " * " + str(int(get_rows(uniform_type)) * 4)
def get_external_size(uniform_type):
return get_component_size(uniform_type) + " * " + get_components(uniform_type)
def get_is_sampler(uniform_type):
return cpp_bool("_SAMPLER_" in uniform_type)
def get_is_matrix(uniform_type):
return cpp_bool("_MAT" in uniform_type)
def get_is_image(uniform_type):
return cpp_bool("_IMAGE_" in uniform_type)
def get_glsl_asfloat(uniform_type):
component_type = get_component_type(uniform_type)
if component_type == "GL_BOOL":
return '""'
elif component_type == "GL_FLOAT":
return '""'
elif component_type == "GL_INT":
return '"intBitsToFloat"'
elif component_type == "GL_UNSIGNED_INT":
return '"uintBitsToFloat"'
elif component_type == "GL_NONE":
return '""'
else:
raise "Invalid component type: " + component_type
def gen_type_info(uniform_type):
return type_info_data_template.format(
type=uniform_type,
component_type=get_component_type(uniform_type),
texture_type=get_texture_type(uniform_type),
transposed_type=get_transposed_type(uniform_type),
bool_type=get_bool_type(uniform_type),
sampler_format=get_sampler_format(uniform_type),
rows=get_rows(uniform_type),
columns=get_columns(uniform_type),
components=get_components(uniform_type),
component_size=get_component_size(uniform_type),
internal_size=get_internal_size(uniform_type),
external_size=get_external_size(uniform_type),
is_sampler=get_is_sampler(uniform_type),
is_matrix=get_is_matrix(uniform_type),
is_image=get_is_image(uniform_type),
glsl_asfloat=get_glsl_asfloat(uniform_type))
def gen_type_index_case(index, uniform_type):
return "case " + uniform_type + ": return " + str(index) + ";"
def main():
# auto_script parameters.
if len(sys.argv) > 1:
inputs = []
outputs = ['uniform_type_info_autogen.cpp']
if sys.argv[1] == 'inputs':
print ','.join(inputs)
elif sys.argv[1] == 'outputs':
print ','.join(outputs)
else:
print('Invalid script parameters')
return 1
return 0
uniform_type_info_data = ",\n".join(
[gen_type_info(uniform_type) for uniform_type in all_uniform_types])
uniform_type_index_cases = "\n".join([
gen_type_index_case(index, uniform_type)
for index, uniform_type in enumerate(all_uniform_types)
])
with open('uniform_type_info_autogen.cpp', 'wt') as out_file:
output_cpp = template_cpp.format(
script_name=sys.argv[0],
copyright_year=date.today().year,
total_count=len(all_uniform_types),
uniform_type_info_data=uniform_type_info_data,
uniform_type_index_cases=uniform_type_index_cases)
out_file.write(output_cpp)
out_file.close()
return 0
if __name__ == '__main__':
sys.exit(main())