Commit b391ec40 by Olli Etuaho Committed by Commit Bot

Generate code for looking up built-ins

Instead of storing built-ins in a std::unordered_map, we now generate a series of switch statements using the hash value of the look-up string. This works similarly to earlier implementation of looking up unmangled built-ins. Those built-ins that need to be initialized at run-time are stored as member variables of TSymbolTable. This increases compiler init performance significantly, as well as increasing compiler perf test scores around 1-2%. Binary size is larger than before though. BUG=angleproject:2267 TEST=angle_unittests Change-Id: If1dcd36f0d2b30c2ed315cdcf6e831ae9fe70c94 Reviewed-on: https://chromium-review.googlesource.com/960031Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
parent aa5d883e
......@@ -165,6 +165,7 @@ generators = {
'src/compiler/translator/BuiltIn_autogen.h',
'src/compiler/translator/ParseContext_autogen.h',
'src/compiler/translator/SymbolTable_autogen.cpp',
'src/compiler/translator/SymbolTable_autogen.h',
'src/tests/compiler_tests/ImmutableString_test_autogen.cpp',
],
'script': 'src/compiler/translator/gen_builtin_symbols.py',
......
......@@ -59,22 +59,6 @@ class TSymbolTable::TSymbolTableLevel
bool mGlobalInvariant;
};
class TSymbolTable::TSymbolTableBuiltInLevel
{
public:
TSymbolTableBuiltInLevel() = default;
void insert(const TSymbol *symbol);
const TSymbol *find(const ImmutableString &name) const;
private:
using tLevel = TUnorderedMap<ImmutableString,
const TSymbol *,
ImmutableString::FowlerNollVoHash<sizeof(size_t)>>;
using tLevelPair = const tLevel::value_type;
tLevel mLevel;
};
bool TSymbolTable::TSymbolTableLevel::insert(TSymbol *symbol)
{
// returning true means symbol was added to the table
......@@ -96,20 +80,6 @@ TSymbol *TSymbolTable::TSymbolTableLevel::find(const ImmutableString &name) cons
return (*it).second;
}
void TSymbolTable::TSymbolTableBuiltInLevel::insert(const TSymbol *symbol)
{
mLevel.insert(tLevelPair(symbol->getMangledName(), symbol));
}
const TSymbol *TSymbolTable::TSymbolTableBuiltInLevel::find(const ImmutableString &name) const
{
tLevel::const_iterator it = mLevel.find(name);
if (it == mLevel.end())
return nullptr;
else
return (*it).second;
}
TSymbolTable::TSymbolTable() : mUniqueIdCounter(0), mShaderType(GL_FRAGMENT_SHADER)
{
}
......@@ -126,12 +96,6 @@ bool TSymbolTable::atGlobalLevel() const
return mTable.size() == 1u;
}
void TSymbolTable::pushBuiltInLevel()
{
mBuiltInTable.push_back(
std::unique_ptr<TSymbolTableBuiltInLevel>(new TSymbolTableBuiltInLevel));
}
void TSymbolTable::push()
{
mTable.push_back(std::unique_ptr<TSymbolTableLevel>(new TSymbolTableLevel));
......@@ -208,31 +172,6 @@ const TSymbol *TSymbolTable::findBuiltIn(const ImmutableString &name, int shader
return findBuiltIn(name, shaderVersion, false);
}
const TSymbol *TSymbolTable::findBuiltIn(const ImmutableString &name,
int shaderVersion,
bool includeGLSLBuiltins) const
{
for (int level = LAST_BUILTIN_LEVEL; level >= 0; level--)
{
if (level == GLSL_BUILTINS && !includeGLSLBuiltins)
level--;
if (level == ESSL3_1_BUILTINS && shaderVersion != 310)
level--;
if (level == ESSL3_BUILTINS && shaderVersion < 300)
level--;
if (level == ESSL1_BUILTINS && shaderVersion != 100)
level--;
const TSymbol *symbol = mBuiltInTable[level]->find(name);
if (symbol)
return symbol;
}
return nullptr;
}
bool TSymbolTable::declare(TSymbol *symbol)
{
ASSERT(!mTable.empty());
......@@ -252,14 +191,6 @@ void TSymbolTable::declareUserDefinedFunction(TFunction *function, bool insertUn
mTable[0]->insert(function);
}
void TSymbolTable::insertBuiltIn(ESymbolLevel level, const TSymbol *symbol)
{
ASSERT(symbol);
ASSERT(level <= LAST_BUILTIN_LEVEL);
mBuiltInTable[level]->insert(symbol);
}
void TSymbolTable::setDefaultPrecision(TBasicType type, TPrecision prec)
{
int indexOfLastElement = static_cast<int>(mPrecisionStack.size()) - 1;
......@@ -329,13 +260,7 @@ void TSymbolTable::initializeBuiltIns(sh::GLenum type,
const ShBuiltInResources &resources)
{
mShaderType = type;
ASSERT(isEmpty());
pushBuiltInLevel(); // COMMON_BUILTINS
pushBuiltInLevel(); // ESSL1_BUILTINS
pushBuiltInLevel(); // ESSL3_BUILTINS
pushBuiltInLevel(); // ESSL3_1_BUILTINS
pushBuiltInLevel(); // GLSL_BUILTINS
mResources = resources;
// We need just one precision stack level for predefined precisions.
mPrecisionStack.push_back(std::unique_ptr<PrecisionStackLevel>(new PrecisionStackLevel));
......@@ -368,8 +293,7 @@ void TSymbolTable::initializeBuiltIns(sh::GLenum type,
setDefaultPrecision(EbtAtomicCounter, EbpHigh);
insertBuiltInFunctions(type);
insertBuiltInVariables(type, spec, resources);
initializeBuiltInVariables(type, spec, resources);
mUniqueIdCounter = kLastBuiltInId + 1;
}
......
......@@ -38,6 +38,7 @@
#include "compiler/translator/InfoSink.h"
#include "compiler/translator/IntermNode.h"
#include "compiler/translator/Symbol.h"
#include "compiler/translator/SymbolTable_autogen.h"
namespace sh
{
......@@ -60,7 +61,7 @@ struct UnmangledBuiltIn
TExtension extension;
};
class TSymbolTable : angle::NonCopyable
class TSymbolTable : angle::NonCopyable, TSymbolTableBase
{
public:
TSymbolTable();
......@@ -134,23 +135,16 @@ class TSymbolTable : angle::NonCopyable
friend class TSymbolUniqueId;
int nextUniqueIdValue();
class TSymbolTableBuiltInLevel;
class TSymbolTableLevel;
void pushBuiltInLevel();
void insertBuiltIn(ESymbolLevel level, const TSymbol *symbol);
TFunction *findUserDefinedFunction(const ImmutableString &name) const;
void initSamplerDefaultPrecision(TBasicType samplerType);
void insertBuiltInFunctions(sh::GLenum shaderType);
void insertBuiltInVariables(sh::GLenum shaderType,
ShShaderSpec spec,
const ShBuiltInResources &resources);
void initializeBuiltInVariables(sh::GLenum shaderType,
ShShaderSpec spec,
const ShBuiltInResources &resources);
std::vector<std::unique_ptr<TSymbolTableBuiltInLevel>> mBuiltInTable;
std::vector<std::unique_ptr<TSymbolTableLevel>> mTable;
// There's one precision stack level for predefined precisions and then one level for each scope
......@@ -163,6 +157,7 @@ class TSymbolTable : angle::NonCopyable
static const int kLastBuiltInId;
sh::GLenum mShaderType;
ShBuiltInResources mResources;
};
} // namespace sh
......
This source diff could not be displayed because it is too large. You can view the blob instead.
// GENERATED FILE - DO NOT EDIT.
// Generated by gen_builtin_symbols.py using data from builtin_variables.json and
// builtin_function_declarations.txt.
//
// Copyright 2018 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.
//
// SymbolTable_autogen.h:
// Autogenerated member variables of TSymbolTable.
#ifndef COMPILER_TRANSLATOR_SYMBOLTABLE_AUTOGEN_H_
#define COMPILER_TRANSLATOR_SYMBOLTABLE_AUTOGEN_H_
namespace sh
{
class TSymbolTableBase
{
protected:
TSymbolTableBase() = default;
TStructure *mVar_gl_DepthRangeParameters = nullptr;
TVariable *mVar_gl_DepthRange = nullptr;
TVariable *mVar_gl_MaxVertexAttribs = nullptr;
TVariable *mVar_gl_MaxVertexUniformVectors = nullptr;
TVariable *mVar_gl_MaxVertexTextureImageUnits = nullptr;
TVariable *mVar_gl_MaxCombinedTextureImageUnits = nullptr;
TVariable *mVar_gl_MaxTextureImageUnits = nullptr;
TVariable *mVar_gl_MaxFragmentUniformVectors = nullptr;
TVariable *mVar_gl_MaxVaryingVectors = nullptr;
TVariable *mVar_gl_MaxDrawBuffers = nullptr;
TVariable *mVar_gl_MaxDualSourceDrawBuffersEXT = nullptr;
TVariable *mVar_gl_MaxVertexOutputVectors = nullptr;
TVariable *mVar_gl_MaxFragmentInputVectors = nullptr;
TVariable *mVar_gl_MinProgramTexelOffset = nullptr;
TVariable *mVar_gl_MaxProgramTexelOffset = nullptr;
TVariable *mVar_gl_MaxImageUnits = nullptr;
TVariable *mVar_gl_MaxVertexImageUniforms = nullptr;
TVariable *mVar_gl_MaxFragmentImageUniforms = nullptr;
TVariable *mVar_gl_MaxComputeImageUniforms = nullptr;
TVariable *mVar_gl_MaxCombinedImageUniforms = nullptr;
TVariable *mVar_gl_MaxCombinedShaderOutputResources = nullptr;
TVariable *mVar_gl_MaxComputeWorkGroupCount = nullptr;
TVariable *mVar_gl_MaxComputeWorkGroupSize = nullptr;
TVariable *mVar_gl_MaxComputeUniformComponents = nullptr;
TVariable *mVar_gl_MaxComputeTextureImageUnits = nullptr;
TVariable *mVar_gl_MaxComputeAtomicCounters = nullptr;
TVariable *mVar_gl_MaxComputeAtomicCounterBuffers = nullptr;
TVariable *mVar_gl_MaxVertexAtomicCounters = nullptr;
TVariable *mVar_gl_MaxFragmentAtomicCounters = nullptr;
TVariable *mVar_gl_MaxCombinedAtomicCounters = nullptr;
TVariable *mVar_gl_MaxAtomicCounterBindings = nullptr;
TVariable *mVar_gl_MaxVertexAtomicCounterBuffers = nullptr;
TVariable *mVar_gl_MaxFragmentAtomicCounterBuffers = nullptr;
TVariable *mVar_gl_MaxCombinedAtomicCounterBuffers = nullptr;
TVariable *mVar_gl_MaxAtomicCounterBufferSize = nullptr;
TVariable *mVar_gl_MaxGeometryInputComponents = nullptr;
TVariable *mVar_gl_MaxGeometryOutputComponents = nullptr;
TVariable *mVar_gl_MaxGeometryImageUniforms = nullptr;
TVariable *mVar_gl_MaxGeometryTextureImageUnits = nullptr;
TVariable *mVar_gl_MaxGeometryOutputVertices = nullptr;
TVariable *mVar_gl_MaxGeometryTotalOutputComponents = nullptr;
TVariable *mVar_gl_MaxGeometryUniformComponents = nullptr;
TVariable *mVar_gl_MaxGeometryAtomicCounters = nullptr;
TVariable *mVar_gl_MaxGeometryAtomicCounterBuffers = nullptr;
TVariable *mVar_gl_FragData = nullptr;
TVariable *mVar_gl_SecondaryFragDataEXT = nullptr;
TVariable *mVar_gl_FragDepthEXT = nullptr;
TVariable *mVar_gl_LastFragData = nullptr;
TVariable *mVar_gl_LastFragDataNV = nullptr;
TInterfaceBlock *mVar_gl_PerVertex = nullptr;
TVariable *mVar_gl_in = nullptr;
TVariable *mVar_gl_PositionGS = nullptr;
};
} // namespace sh
#endif // COMPILER_TRANSLATOR_SYMBOLTABLE_AUTOGEN_H_
......@@ -516,7 +516,7 @@
},
"subgroups":{
"EXTBlendFuncExtended":{
"condition":"resources.EXT_blend_func_extended",
"condition":"mResources.EXT_blend_func_extended",
"variables":{
"gl_SecondaryFragColorEXT":{
"level":"ESSL1_BUILTINS",
......@@ -536,7 +536,7 @@
}
},
"EXTFragDepth":{
"condition":"resources.EXT_frag_depth",
"condition":"mResources.EXT_frag_depth",
"variables":{
"gl_FragDepthEXT":{
"level":"ESSL1_BUILTINS",
......@@ -546,7 +546,7 @@
}
},
"EXTShaderFramebufferFetch":{
"condition":"resources.EXT_shader_framebuffer_fetch",
"condition":"mResources.EXT_shader_framebuffer_fetch",
"variables":{
"gl_LastFragData":{
"level":"ESSL1_BUILTINS",
......@@ -556,7 +556,7 @@
}
},
"NVShaderFramebufferFetch":{
"condition":"resources.NV_shader_framebuffer_fetch",
"condition":"mResources.NV_shader_framebuffer_fetch",
"variables":{
"gl_LastFragColor":{
"level":"ESSL1_BUILTINS",
......@@ -577,7 +577,7 @@
}
},
"ARMShaderFramebufferFetch":{
"condition":"!resources.EXT_shader_framebuffer_fetch && !resources.NV_shader_framebuffer_fetch && resources.ARM_shader_framebuffer_fetch",
"condition":"!mResources.EXT_shader_framebuffer_fetch && !mResources.NV_shader_framebuffer_fetch && mResources.ARM_shader_framebuffer_fetch",
"variables":{
"gl_LastFragColorARM":{
"level":"ESSL1_BUILTINS",
......@@ -592,7 +592,7 @@
}
},
"GeometryShaderSupported":{
"condition":"resources.EXT_geometry_shader",
"condition":"mResources.EXT_geometry_shader",
"variables":{
"gl_PrimitiveID":{
"level":"ESSL3_1_BUILTINS",
......@@ -821,7 +821,7 @@
}
},
"Multiview":{
"condition":"resources.OVR_multiview && shaderType != GL_COMPUTE_SHADER",
"condition":"mResources.OVR_multiview && shaderType != GL_COMPUTE_SHADER",
"subgroups":{
"ESSL3":{
"variables":{
......
......@@ -80,6 +80,35 @@ namespace BuiltInVariable
#endif // COMPILER_TRANSLATOR_BUILTIN_AUTOGEN_H_
"""
template_symboltable_h = """// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {variable_data_source_name} and
// {function_data_source_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.
//
// SymbolTable_autogen.h:
// Autogenerated member variables of TSymbolTable.
#ifndef COMPILER_TRANSLATOR_SYMBOLTABLE_AUTOGEN_H_
#define COMPILER_TRANSLATOR_SYMBOLTABLE_AUTOGEN_H_
namespace sh
{{
class TSymbolTableBase
{{
protected:
TSymbolTableBase() = default;
{declare_member_variables}
}};
}} // namespace sh
#endif // COMPILER_TRANSLATOR_SYMBOLTABLE_AUTOGEN_H_
"""
# By having the variables defined in a cpp file we ensure that there's just one instance of each of the declared variables.
template_symboltable_cpp = """// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {variable_data_source_name} and
......@@ -162,17 +191,20 @@ namespace BuiltInFunction
}} // namespace BuiltInFunction
void TSymbolTable::insertBuiltInVariables(sh::GLenum shaderType,
ShShaderSpec spec,
const ShBuiltInResources &resources)
void TSymbolTable::initializeBuiltInVariables(sh::GLenum shaderType,
ShShaderSpec spec,
const ShBuiltInResources &resources)
{{
const TSourceLoc zeroSourceLoc = {{0, 0, 0, 0}};
{insert_variables}
{init_member_variables}
}}
void TSymbolTable::insertBuiltInFunctions(sh::GLenum shaderType)
const TSymbol *TSymbolTable::findBuiltIn(const ImmutableString &name,
int shaderVersion,
bool includeGLSLBuiltins) const
{{
{insert_functions}
uint32_t nameHash = name.hash32();
{get_builtin}
}}
const UnmangledBuiltIn *TSymbolTable::getUnmangledBuiltInForShaderVersion(const ImmutableString &name, int shaderVersion)
......@@ -268,7 +300,21 @@ def get_basic_mangled_name(basic):
return chr(ord('A') + index)
return chr(ord('a') + index - 26)
levels = ['ESSL3_1_BUILTINS', 'ESSL3_BUILTINS', 'ESSL1_BUILTINS', 'COMMON_BUILTINS']
levels = ['GLSL_BUILTINS', 'ESSL3_1_BUILTINS', 'ESSL3_BUILTINS', 'ESSL1_BUILTINS', 'COMMON_BUILTINS']
def get_shader_version_condition_for_level(level):
if level == 'GLSL_BUILTINS':
return 'includeGLSLBuiltins'
elif level == 'ESSL3_1_BUILTINS':
return 'shaderVersion >= 310'
elif level == 'ESSL3_BUILTINS':
return 'shaderVersion >= 300'
elif level == 'ESSL1_BUILTINS':
return 'shaderVersion == 100'
elif level == 'COMMON_BUILTINS':
return ''
else:
raise Exception('Unsupported symbol table level')
class GroupedList:
""""Class for storing a list of objects grouped by symbol table level and condition."""
......@@ -297,9 +343,42 @@ class GroupedList:
return self.objs[level][condition][name]
return None
def iter_conditions(self, level):
return self.objs[level].iteritems()
def get_switch_code(self):
code = []
for level in levels:
if len(self.objs[level]) == 0:
continue
level_condition = get_shader_version_condition_for_level(level)
if level_condition != '':
code.append('if ({condition})\n {{'.format(condition = level_condition))
for condition, objs in self.objs[level].iteritems():
if len(objs) > 0:
if condition != 'NO_CONDITION':
condition_header = ' if ({condition})\n {{'.format(condition = condition)
code.append(condition_header.replace('shaderType', 'mShaderType'))
switch = {}
for name, obj in objs.iteritems():
name_hash = hash32(name)
if name_hash not in switch:
switch[name_hash] = []
switch[name_hash].append(obj['hash_matched_code'])
code.append('switch(nameHash) {')
for name_hash, obj in sorted(switch.iteritems()):
code.append('case 0x' + ('%08x' % name_hash) + 'u:\n{')
code += obj
code.append('break;\n}')
code.append('}')
if condition != 'NO_CONDITION':
code.append('}')
if level_condition != '':
code.append('}')
code.append('return nullptr;')
return '\n'.join(code)
class TType:
def __init__(self, glsl_header_type):
......@@ -555,11 +634,12 @@ function_declarations = []
get_variable_declarations = []
get_variable_definitions = []
# Code for inserting builtin TVariables to the symbol table.
insert_variables = []
# Code for defining TVariables stored as members of TSymbolTable.
declare_member_variables = []
init_member_variables = []
# Code for inserting builtin TFunctions to the symbol table. Grouped by condition.
insert_functions_by_condition = OrderedDict()
# Code for querying builtins.
get_builtin_if_statements = GroupedList()
# Declarations of UnmangledBuiltIn objects
unmangled_builtin_declarations = set()
......@@ -573,6 +653,9 @@ script_generated_hash_tests = OrderedDict()
# Functions for testing whether a builtin belongs in group.
is_in_group_definitions = []
# Counts of variables with a certain name string:
variable_name_count = {}
id_counter = 0
def hash32(str):
......@@ -582,7 +665,7 @@ def hash32(str):
for c in str:
hash = hash ^ ord(c)
hash = hash * fnvPrime & 0xffffffff
sanity_check = ' ASSERT_EQ(0x{hash}u, ImmutableString("{str}").hash32());'.format(hash = ('%x' % hash), str = str)
sanity_check = ' ASSERT_EQ(0x{hash}u, ImmutableString("{str}").hash32());'.format(hash = ('%08x' % hash), str = str)
script_generated_hash_tests.update({sanity_check: None})
return hash
......@@ -741,7 +824,7 @@ def process_single_function_group(condition, group_name, group):
pass
elif (not unmangled_function_if_statements.has_key(level, condition, function_name)) or extension == 'UNDEFINED':
# We don't have this unmangled builtin recorded yet or we might replace an unmangled builtin from an extension with one from core.
unmangled_function_if_statements.add_obj(level, condition, function_name, {'code': unmangled_if, 'extension': extension})
unmangled_function_if_statements.add_obj(level, condition, function_name, {'hash_matched_code': unmangled_if, 'extension': extension})
unmangled_builtin_declarations.add('constexpr const UnmangledBuiltIn {extension}(TExtension::{extension});'.format(**template_args))
for function_props in function_variants:
......@@ -795,8 +878,12 @@ def process_single_function_group(condition, group_name, group):
template_function_declaration = 'constexpr const TFunction kFunction_{unique_name}(BuiltInId::{unique_name}, BuiltInName::{name_with_suffix}, TExtension::{extension}, BuiltInParameters::{parameters_var_name}, {param_count}, {return_type}, BuiltInName::{unique_name}, EOp{op}, {known_to_not_have_side_effects});'
function_declarations.append(template_function_declaration.format(**template_args))
template_insert_function = ' insertBuiltIn({level}, &BuiltInFunction::kFunction_{unique_name});'
insert_functions_by_condition[condition].append(template_insert_function.format(**template_args))
template_mangled_if = """if (name == BuiltInName::{unique_name})
{{
return &BuiltInFunction::kFunction_{unique_name};
}}"""
mangled_if = template_mangled_if.format(**template_args)
get_builtin_if_statements.add_obj(level, condition, template_args['mangled_name'], {'hash_matched_code': mangled_if})
id_counter += 1
......@@ -807,8 +894,6 @@ def process_function_group(group_name, group):
condition = 'NO_CONDITION'
if 'condition' in group:
condition = group['condition']
if condition not in insert_functions_by_condition:
insert_functions_by_condition[condition] = []
process_single_function_group(condition, group_name, group)
......@@ -832,17 +917,19 @@ def process_function_group(group_name, group):
for group_name, group in parsed_functions.iteritems():
process_function_group(group_name, group)
def process_single_variable_group(group_name, group):
def process_single_variable_group(condition, group_name, group):
global id_counter
if 'variables' not in group:
return
for variable_name, props in group['variables'].iteritems():
level = props['level']
template_args = {
'id': id_counter,
'name': variable_name,
'name_with_suffix': variable_name + get_suffix(props),
'level': props['level'],
'extension': get_extension(props)
'extension': get_extension(props),
'class': 'TVariable'
}
template_builtin_id_declaration = ' static constexpr const TSymbolUniqueId {name_with_suffix} = TSymbolUniqueId({id});'
......@@ -853,6 +940,9 @@ def process_single_variable_group(group_name, group):
template_name_declaration = 'constexpr const ImmutableString {name}("{name}");'
name_declarations.add(template_name_declaration.format(**template_args))
is_member = True
template_init_variable = ''
if 'type' in props:
if props['type']['basic'] != 'Bool' and 'precision' not in props['type']:
raise Exception('Missing precision for variable ' + variable_name)
......@@ -862,19 +952,20 @@ def process_single_variable_group(group_name, group):
# Handle struct and interface block definitions.
template_args['class'] = props['class']
template_args['fields'] = 'fields_{name_with_suffix}'.format(**template_args)
insert_variables.append('TFieldList *{fields} = new TFieldList();'.format(**template_args))
init_member_variables.append(' TFieldList *{fields} = new TFieldList();'.format(**template_args))
for field_name, field_type in props['fields'].iteritems():
template_args['field_name'] = field_name
template_args['field_type'] = TType(field_type).get_dynamic_type_string()
template_name_declaration = 'constexpr const ImmutableString {field_name}("{field_name}");'
name_declarations.add(template_name_declaration.format(**template_args))
template_add_field = '{fields}->push_back(new TField({field_type}, BuiltInName::{field_name}, zeroSourceLoc));'
insert_variables.append(template_add_field.format(**template_args))
template_init_variable = ' {class} *{name_with_suffix} = new {class}(BuiltInId::{name_with_suffix}, BuiltInName::{name}, TExtension::{extension}, {fields});'
insert_variables.append(template_init_variable.format(**template_args))
template_insert_variable = ' insertBuiltIn({level}, {name_with_suffix});'
if 'private' not in props or not props['private']:
insert_variables.append(template_insert_variable.format(**template_args))
template_add_field = ' {fields}->push_back(new TField({field_type}, BuiltInName::{field_name}, zeroSourceLoc));'
init_member_variables.append(template_add_field.format(**template_args))
template_init_temp_variable = ' {class} *{name_with_suffix} = new {class}(BuiltInId::{name_with_suffix}, BuiltInName::{name}, TExtension::{extension}, {fields});'
init_member_variables.append(template_init_temp_variable.format(**template_args))
if 'private' in props and props['private']:
is_member = False
else:
template_init_variable = ' mVar_{name_with_suffix} = {name_with_suffix};'
elif 'initDynamicType' in props:
# Handle variables whose type can't be expressed as TStaticType
......@@ -882,11 +973,9 @@ def process_single_variable_group(group_name, group):
template_args['type_name'] = 'type_{name_with_suffix}'.format(**template_args)
template_args['type'] = template_args['type_name']
template_args['initDynamicType'] = props['initDynamicType'].format(**template_args)
template_insert_variable = """ {initDynamicType}
template_init_variable = """ {initDynamicType}
{type_name}->realize();
TVariable *{name_with_suffix} = new TVariable(BuiltInId::{name_with_suffix}, BuiltInName::{name}, SymbolType::BuiltIn, TExtension::{extension}, {type});
insertBuiltIn({level}, {name_with_suffix});"""
insert_variables.append(template_insert_variable.format(**template_args))
mVar_{name_with_suffix} = new TVariable(BuiltInId::{name_with_suffix}, BuiltInName::{name}, SymbolType::BuiltIn, TExtension::{extension}, {type});"""
elif 'value' in props:
# Handle variables with constant value, such as gl_MaxDrawBuffers.
......@@ -897,31 +986,28 @@ def process_single_variable_group(group_name, group):
resources_key = props['valueKey']
template_args['value'] = 'resources.' + resources_key
template_args['object_size'] = TType(props['type']).get_object_size()
template_insert_variable = """ TVariable *{name_with_suffix} = new TVariable(BuiltInId::{name_with_suffix}, BuiltInName::{name}, SymbolType::BuiltIn, TExtension::{extension}, {type});
template_init_variable = """ mVar_{name_with_suffix} = new TVariable(BuiltInId::{name_with_suffix}, BuiltInName::{name}, SymbolType::BuiltIn, TExtension::{extension}, {type});
{{
TConstantUnion *unionArray = new TConstantUnion[{object_size}];
unionArray[0].setIConst({value});
{name_with_suffix}->shareConstPointer(unionArray);
}}
insertBuiltIn({level}, {name_with_suffix});"""
mVar_{name_with_suffix}->shareConstPointer(unionArray);
}}"""
if template_args['object_size'] > 1:
template_insert_variable = """ TVariable *{name_with_suffix} = new TVariable(BuiltInId::{name_with_suffix}, BuiltInName::{name}, SymbolType::BuiltIn, TExtension::{extension}, {type});
template_init_variable = """ mVar_{name_with_suffix} = new TVariable(BuiltInId::{name_with_suffix}, BuiltInName::{name}, SymbolType::BuiltIn, TExtension::{extension}, {type});
{{
TConstantUnion *unionArray = new TConstantUnion[{object_size}];
for (size_t index = 0u; index < {object_size}; ++index)
{{
unionArray[index].setIConst({value}[index]);
}}
{name_with_suffix}->shareConstPointer(unionArray);
}}
insertBuiltIn({level}, {name_with_suffix});"""
insert_variables.append(template_insert_variable.format(**template_args))
mVar_{name_with_suffix}->shareConstPointer(unionArray);
}}"""
else:
# Handle variables that can be stored as constexpr TVariable like
# gl_Position, gl_FragColor etc.
define_constexpr_variable(template_args)
is_member = False
template_get_variable_declaration = 'const TVariable *{name_with_suffix}();'
get_variable_declarations.append(template_get_variable_declaration.format(**template_args))
......@@ -933,28 +1019,72 @@ def process_single_variable_group(group_name, group):
"""
get_variable_definitions.append(template_get_variable_definition.format(**template_args))
template_insert_variable = ' insertBuiltIn({level}, &BuiltInVariable::kVar_{name_with_suffix});'
insert_variables.append(template_insert_variable.format(**template_args))
template_name_if = """if (name == BuiltInName::{name})
{{
return &BuiltInVariable::kVar_{name_with_suffix};
}}"""
name_if = template_name_if.format(**template_args)
get_builtin_if_statements.add_obj(level, condition, template_args['name'], {'hash_matched_code': name_if})
if is_member:
get_condition = condition
init_conditionally = (condition != 'NO_CONDITION' and variable_name_count[variable_name] == 1)
if init_conditionally:
# Instead of having the condition if statement at lookup, it's cheaper to have it at initialization time.
init_member_variables.append(' if ({condition})\n {{'.format(condition = condition))
template_args['condition_comment'] = '\n // Only initialized if {condition}'.format(condition = condition)
get_condition = 'NO_CONDITION'
else:
template_args['condition_comment'] = ''
init_member_variables.append(template_init_variable.format(**template_args))
if init_conditionally:
init_member_variables.append(' }')
template_declare_member_variable = '{class} *mVar_{name_with_suffix} = nullptr;'
declare_member_variables.append(template_declare_member_variable.format(**template_args))
template_name_if = """if (name == BuiltInName::{name})
{{{condition_comment}
return mVar_{name_with_suffix};
}}"""
name_if = template_name_if.format(**template_args)
get_builtin_if_statements.add_obj(level, get_condition, variable_name, {'hash_matched_code': name_if})
id_counter += 1
def process_variable_group(group_name, group):
def count_variable_names(group):
if 'variables' in group:
for name in group['variables'].iterkeys():
if name not in variable_name_count:
variable_name_count[name] = 1
else:
variable_name_count[name] += 1
if 'subgroups' in group:
for subgroup_name, subgroup in group['subgroups'].iteritems():
count_variable_names(subgroup)
def process_variable_group(parent_condition, group_name, group):
condition = 'NO_CONDITION'
if 'condition' in group:
insert_variables.append(' if ({condition})'.format(condition = group['condition']))
insert_variables.append(' {')
condition = group['condition']
if parent_condition != 'NO_CONDITION':
if condition == 'NO_CONDITION':
condition = parent_condition
else:
condition = '({cond1}) && ({cond2})'.format(cond1 = parent_condition, cond2 = condition)
process_single_variable_group(group_name, group)
process_single_variable_group(condition, group_name, group)
if 'subgroups' in group:
for subgroup_name, subgroup in group['subgroups'].iteritems():
process_variable_group(subgroup_name, subgroup)
if 'condition' in group:
insert_variables.append(' }')
process_variable_group(condition, subgroup_name, subgroup)
for group_name, group in parsed_variables.iteritems():
process_variable_group(group_name, group)
count_variable_names(group)
for group_name, group in parsed_variables.iteritems():
process_variable_group('NO_CONDITION', group_name, group)
output_strings = {
'script_name': os.path.basename(__file__),
......@@ -975,70 +1105,16 @@ output_strings = {
'variable_declarations': '\n'.join(sorted(variable_declarations)),
'get_variable_declarations': '\n'.join(sorted(get_variable_declarations)),
'get_variable_definitions': '\n'.join(sorted(get_variable_definitions)),
'insert_variables': '\n'.join(insert_variables)
}
'unmangled_builtin_declarations': '\n'.join(sorted(unmangled_builtin_declarations)),
insert_functions = []
get_unmangled_builtin = []
'declare_member_variables': '\n'.join(declare_member_variables),
'init_member_variables': '\n'.join(init_member_variables),
def get_shader_version_condition_for_level(level):
if level == 'ESSL3_1_BUILTINS':
return 'shaderVersion >= 310'
elif level == 'ESSL3_BUILTINS':
return 'shaderVersion >= 300'
elif level == 'ESSL1_BUILTINS':
return 'shaderVersion == 100'
elif level == 'COMMON_BUILTINS':
return ''
else:
raise Exception('Unsupported symbol table level')
'get_unmangled_builtin': unmangled_function_if_statements.get_switch_code(),
'get_builtin': get_builtin_if_statements.get_switch_code(),
for condition in insert_functions_by_condition:
if condition != 'NO_CONDITION':
condition_header = ' if ({condition})\n {{'.format(condition = condition)
insert_functions.append(condition_header)
for insert_function in insert_functions_by_condition[condition]:
insert_functions.append(insert_function)
if condition != 'NO_CONDITION':
insert_functions.append('}')
for level in levels:
level_condition = get_shader_version_condition_for_level(level)
if level_condition != '':
get_unmangled_builtin.append('if ({condition})\n {{'.format(condition = level_condition))
for condition, functions in unmangled_function_if_statements.iter_conditions(level):
if len(functions) > 0:
if condition != 'NO_CONDITION':
condition_header = ' if ({condition})\n {{'.format(condition = condition)
get_unmangled_builtin.append(condition_header.replace('shaderType', 'mShaderType'))
get_unmangled_builtin_switch = {}
for function_name, get_unmangled_case in functions.iteritems():
name_hash = hash32(function_name)
if name_hash not in get_unmangled_builtin_switch:
get_unmangled_builtin_switch[name_hash] = []
get_unmangled_builtin_switch[name_hash].append(get_unmangled_case['code'])
get_unmangled_builtin.append('switch(nameHash) {')
for name_hash, get_unmangled_cases in sorted(get_unmangled_builtin_switch.iteritems()):
get_unmangled_builtin.append('case 0x' + ('%x' % name_hash) + 'u:\n{')
get_unmangled_builtin += get_unmangled_cases
get_unmangled_builtin.append('break;\n}')
get_unmangled_builtin.append('}')
if condition != 'NO_CONDITION':
get_unmangled_builtin.append('}')
if level_condition != '':
get_unmangled_builtin.append('}')
get_unmangled_builtin.append('return nullptr;')
output_strings['insert_functions'] = '\n'.join(insert_functions)
output_strings['unmangled_builtin_declarations'] = '\n'.join(sorted(unmangled_builtin_declarations))
output_strings['get_unmangled_builtin'] = '\n'.join(get_unmangled_builtin)
output_strings['script_generated_hash_tests'] = '\n'.join(script_generated_hash_tests.iterkeys())
'script_generated_hash_tests': '\n'.join(script_generated_hash_tests.iterkeys())
}
with open('../../tests/compiler_tests/ImmutableString_test_autogen.cpp', 'wt') as outfile_cpp:
output_cpp = template_immutablestringtest_cpp.format(**output_strings)
......@@ -1055,3 +1131,7 @@ with open('SymbolTable_autogen.cpp', 'wt') as outfile_cpp:
with open('ParseContext_autogen.h', 'wt') as outfile_header:
output_header = template_parsecontext_header.format(**output_strings)
outfile_header.write(output_header)
with open('SymbolTable_autogen.h', 'wt') as outfile_h:
output_h = template_symboltable_h.format(**output_strings)
outfile_h.write(output_h)
......@@ -38,7 +38,7 @@ TEST(ImmutableStringTest, ScriptGeneratedHashesMatch)
ASSERT_EQ(0xc1e02fa4u, ImmutableString("atomicCounter").hash32());
ASSERT_EQ(0x666490f9u, ImmutableString("atomicCounterIncrement").hash32());
ASSERT_EQ(0xd651bc5du, ImmutableString("atomicCounterDecrement").hash32());
ASSERT_EQ(0x26813a3u, ImmutableString("atomicAdd").hash32());
ASSERT_EQ(0x026813a3u, ImmutableString("atomicAdd").hash32());
ASSERT_EQ(0x23647d3cu, ImmutableString("atomicMin").hash32());
ASSERT_EQ(0x1150d92eu, ImmutableString("atomicMax").hash32());
ASSERT_EQ(0xe676f219u, ImmutableString("atomicAnd").hash32());
......@@ -60,12 +60,12 @@ TEST(ImmutableStringTest, ScriptGeneratedHashesMatch)
ASSERT_EQ(0xb413b257u, ImmutableString("EndPrimitive").hash32());
ASSERT_EQ(0x10d2583fu, ImmutableString("sinh").hash32());
ASSERT_EQ(0xf45c461cu, ImmutableString("cosh").hash32());
ASSERT_EQ(0x92855d0u, ImmutableString("tanh").hash32());
ASSERT_EQ(0x092855d0u, ImmutableString("tanh").hash32());
ASSERT_EQ(0xbab19e4au, ImmutableString("asinh").hash32());
ASSERT_EQ(0xedf2c855u, ImmutableString("acosh").hash32());
ASSERT_EQ(0x7275075u, ImmutableString("atanh").hash32());
ASSERT_EQ(0x07275075u, ImmutableString("atanh").hash32());
ASSERT_EQ(0x2a48023bu, ImmutableString("abs").hash32());
ASSERT_EQ(0xcbc8ba4u, ImmutableString("sign").hash32());
ASSERT_EQ(0x0cbc8ba4u, ImmutableString("sign").hash32());
ASSERT_EQ(0xd55e61e5u, ImmutableString("trunc").hash32());
ASSERT_EQ(0x4f0be23bu, ImmutableString("round").hash32());
ASSERT_EQ(0xa4639127u, ImmutableString("roundEven").hash32());
......@@ -91,15 +91,15 @@ TEST(ImmutableStringTest, ScriptGeneratedHashesMatch)
ASSERT_EQ(0xc03183c0u, ImmutableString("transpose").hash32());
ASSERT_EQ(0x767e36c0u, ImmutableString("determinant").hash32());
ASSERT_EQ(0xb201f283u, ImmutableString("inverse").hash32());
ASSERT_EQ(0x5fc75c3u, ImmutableString("lessThan").hash32());
ASSERT_EQ(0x491f109u, ImmutableString("lessThanEqual").hash32());
ASSERT_EQ(0x4644cdeu, ImmutableString("greaterThan").hash32());
ASSERT_EQ(0x05fc75c3u, ImmutableString("lessThan").hash32());
ASSERT_EQ(0x0491f109u, ImmutableString("lessThanEqual").hash32());
ASSERT_EQ(0x04644cdeu, ImmutableString("greaterThan").hash32());
ASSERT_EQ(0xed7dc722u, ImmutableString("greaterThanEqual").hash32());
ASSERT_EQ(0x2f7508efu, ImmutableString("equal").hash32());
ASSERT_EQ(0x2485bbbeu, ImmutableString("notEqual").hash32());
ASSERT_EQ(0x3c6468f4u, ImmutableString("texture").hash32());
ASSERT_EQ(0x94b08f7fu, ImmutableString("textureProj").hash32());
ASSERT_EQ(0x23feff3u, ImmutableString("textureLod").hash32());
ASSERT_EQ(0x023feff3u, ImmutableString("textureLod").hash32());
ASSERT_EQ(0xc73e788du, ImmutableString("textureSize").hash32());
ASSERT_EQ(0xb755b482u, ImmutableString("textureProjLod").hash32());
ASSERT_EQ(0x33a56e6cu, ImmutableString("textureGrad").hash32());
......@@ -137,7 +137,7 @@ TEST(ImmutableStringTest, ScriptGeneratedHashesMatch)
ASSERT_EQ(0x9cf73498u, ImmutableString("tan").hash32());
ASSERT_EQ(0xfeae7ea6u, ImmutableString("asin").hash32());
ASSERT_EQ(0x3c01df1fu, ImmutableString("acos").hash32());
ASSERT_EQ(0x678cabfu, ImmutableString("atan").hash32());
ASSERT_EQ(0x0678cabfu, ImmutableString("atan").hash32());
ASSERT_EQ(0x58336ad5u, ImmutableString("pow").hash32());
ASSERT_EQ(0x72a68728u, ImmutableString("exp").hash32());
ASSERT_EQ(0x3f515151u, ImmutableString("log").hash32());
......@@ -158,10 +158,926 @@ TEST(ImmutableStringTest, ScriptGeneratedHashesMatch)
ASSERT_EQ(0xce79296cu, ImmutableString("normalize").hash32());
ASSERT_EQ(0x5fd55fe1u, ImmutableString("faceforward").hash32());
ASSERT_EQ(0x92c778aau, ImmutableString("reflect").hash32());
ASSERT_EQ(0x66c705cu, ImmutableString("refract").hash32());
ASSERT_EQ(0x066c705cu, ImmutableString("refract").hash32());
ASSERT_EQ(0x2c29f04du, ImmutableString("any").hash32());
ASSERT_EQ(0x13254bc4u, ImmutableString("all").hash32());
ASSERT_EQ(0x29b19c8au, ImmutableString("not").hash32());
ASSERT_EQ(0x30c87b17u, ImmutableString("gl_ViewportIndex").hash32());
ASSERT_EQ(0x02731c1cu, ImmutableString("gl_Layer").hash32());
ASSERT_EQ(0xf3de0717u, ImmutableString("frexp(0B0C").hash32());
ASSERT_EQ(0xa30b98d3u, ImmutableString("frexp(1B1C").hash32());
ASSERT_EQ(0x17aa3bbfu, ImmutableString("frexp(2B2C").hash32());
ASSERT_EQ(0x7dbee433u, ImmutableString("frexp(3B3C").hash32());
ASSERT_EQ(0x57b9431bu, ImmutableString("ldexp(0B0C").hash32());
ASSERT_EQ(0x124f3157u, ImmutableString("ldexp(1B1C").hash32());
ASSERT_EQ(0x94d22cc3u, ImmutableString("ldexp(2B2C").hash32());
ASSERT_EQ(0xfae6d537u, ImmutableString("ldexp(3B3C").hash32());
ASSERT_EQ(0x82b86afcu, ImmutableString("packUnorm4x8(3B").hash32());
ASSERT_EQ(0x6d7cd09au, ImmutableString("packSnorm4x8(3B").hash32());
ASSERT_EQ(0x7e0ed3ccu, ImmutableString("unpackUnorm4x8(0D").hash32());
ASSERT_EQ(0x2bceb1c6u, ImmutableString("unpackSnorm4x8(0D").hash32());
ASSERT_EQ(0x2c65fc52u, ImmutableString("bitfieldExtract(0C0C0C").hash32());
ASSERT_EQ(0x301e7aa3u, ImmutableString("bitfieldExtract(1C0C0C").hash32());
ASSERT_EQ(0x1bc77874u, ImmutableString("bitfieldExtract(2C0C0C").hash32());
ASSERT_EQ(0x2e198dddu, ImmutableString("bitfieldExtract(3C0C0C").hash32());
ASSERT_EQ(0x1ef52e53u, ImmutableString("bitfieldExtract(0D0C0C").hash32());
ASSERT_EQ(0xbecd46a2u, ImmutableString("bitfieldExtract(1D0C0C").hash32());
ASSERT_EQ(0x50828f41u, ImmutableString("bitfieldExtract(2D0C0C").hash32());
ASSERT_EQ(0x26e63818u, ImmutableString("bitfieldExtract(3D0C0C").hash32());
ASSERT_EQ(0xbcfd7f73u, ImmutableString("bitfieldInsert(0C0C0C0C").hash32());
ASSERT_EQ(0x221a7f03u, ImmutableString("bitfieldInsert(1C1C0C0C").hash32());
ASSERT_EQ(0xf4fc8897u, ImmutableString("bitfieldInsert(2C2C0C0C").hash32());
ASSERT_EQ(0x100c00dfu, ImmutableString("bitfieldInsert(3C3C0C0C").hash32());
ASSERT_EQ(0x6bd9dd3bu, ImmutableString("bitfieldInsert(0D0D0C0C").hash32());
ASSERT_EQ(0x3d7510bbu, ImmutableString("bitfieldInsert(1D1D0C0C").hash32());
ASSERT_EQ(0x70f71a0bu, ImmutableString("bitfieldInsert(2D2D0C0C").hash32());
ASSERT_EQ(0x0a15fba3u, ImmutableString("bitfieldInsert(3D3D0C0C").hash32());
ASSERT_EQ(0x380ee623u, ImmutableString("bitfieldReverse(0C").hash32());
ASSERT_EQ(0xe0122d32u, ImmutableString("bitfieldReverse(1C").hash32());
ASSERT_EQ(0xf009f79du, ImmutableString("bitfieldReverse(2C").hash32());
ASSERT_EQ(0x100c6894u, ImmutableString("bitfieldReverse(3C").hash32());
ASSERT_EQ(0x3d0eee02u, ImmutableString("bitfieldReverse(0D").hash32());
ASSERT_EQ(0xdb122553u, ImmutableString("bitfieldReverse(1D").hash32());
ASSERT_EQ(0xe909ec98u, ImmutableString("bitfieldReverse(2D").hash32());
ASSERT_EQ(0x0f0c6701u, ImmutableString("bitfieldReverse(3D").hash32());
ASSERT_EQ(0x3827bbd4u, ImmutableString("bitCount(0C").hash32());
ASSERT_EQ(0x18254addu, ImmutableString("bitCount(1C").hash32());
ASSERT_EQ(0x082bed72u, ImmutableString("bitCount(2C").hash32());
ASSERT_EQ(0x602a3963u, ImmutableString("bitCount(3C").hash32());
ASSERT_EQ(0x3727ba41u, ImmutableString("bitCount(0D").hash32());
ASSERT_EQ(0x11253fd8u, ImmutableString("bitCount(1D").hash32());
ASSERT_EQ(0x032be593u, ImmutableString("bitCount(2D").hash32());
ASSERT_EQ(0x652a4142u, ImmutableString("bitCount(3D").hash32());
ASSERT_EQ(0xc1b44a60u, ImmutableString("findLSB(0C").hash32());
ASSERT_EQ(0xa1b1d969u, ImmutableString("findLSB(1C").hash32());
ASSERT_EQ(0x91ba0efeu, ImmutableString("findLSB(2C").hash32());
ASSERT_EQ(0xe9b6c7efu, ImmutableString("findLSB(3C").hash32());
ASSERT_EQ(0xc8b45565u, ImmutableString("findLSB(0D").hash32());
ASSERT_EQ(0xa2b1dafcu, ImmutableString("findLSB(1D").hash32());
ASSERT_EQ(0x94ba13b7u, ImmutableString("findLSB(2D").hash32());
ASSERT_EQ(0xe6b6c336u, ImmutableString("findLSB(3D").hash32());
ASSERT_EQ(0x129034f1u, ImmutableString("findMSB(0C").hash32());
ASSERT_EQ(0x3292a5e8u, ImmutableString("findMSB(1C").hash32());
ASSERT_EQ(0xda9459f7u, ImmutableString("findMSB(2C").hash32());
ASSERT_EQ(0x0296d786u, ImmutableString("findMSB(3C").hash32());
ASSERT_EQ(0x13903684u, ImmutableString("findMSB(0D").hash32());
ASSERT_EQ(0x3992b0edu, ImmutableString("findMSB(1D").hash32());
ASSERT_EQ(0xd794553eu, ImmutableString("findMSB(2D").hash32());
ASSERT_EQ(0x0596dc3fu, ImmutableString("findMSB(3D").hash32());
ASSERT_EQ(0x76d26c06u, ImmutableString("uaddCarry(0D0D0D").hash32());
ASSERT_EQ(0x8638ea07u, ImmutableString("uaddCarry(1D1D1D").hash32());
ASSERT_EQ(0x830df594u, ImmutableString("uaddCarry(2D2D2D").hash32());
ASSERT_EQ(0x859069e5u, ImmutableString("uaddCarry(3D3D3D").hash32());
ASSERT_EQ(0xee0c9f85u, ImmutableString("usubBorrow(0D0D0D").hash32());
ASSERT_EQ(0x56a8a0b4u, ImmutableString("usubBorrow(1D1D1D").hash32());
ASSERT_EQ(0x2d76ad27u, ImmutableString("usubBorrow(2D2D2D").hash32());
ASSERT_EQ(0x1e102f26u, ImmutableString("usubBorrow(3D3D3D").hash32());
ASSERT_EQ(0x2691af51u, ImmutableString("umulExtended(0D0D0D0D").hash32());
ASSERT_EQ(0x6b51f121u, ImmutableString("umulExtended(1D1D1D1D").hash32());
ASSERT_EQ(0x4d3ff831u, ImmutableString("umulExtended(2D2D2D2D").hash32());
ASSERT_EQ(0x282a4a31u, ImmutableString("umulExtended(3D3D3D3D").hash32());
ASSERT_EQ(0x84d951b5u, ImmutableString("imulExtended(0C0C0C0C").hash32());
ASSERT_EQ(0xcc193b45u, ImmutableString("imulExtended(1C1C1C1C").hash32());
ASSERT_EQ(0x0a58432du, ImmutableString("imulExtended(2C2C2C2C").hash32());
ASSERT_EQ(0x8277ae4du, ImmutableString("imulExtended(3C3C3C3C").hash32());
ASSERT_EQ(0x2e205f43u, ImmutableString("texelFetch(0O1C0C").hash32());
ASSERT_EQ(0x83a9e786u, ImmutableString("texelFetch(0T1C0C").hash32());
ASSERT_EQ(0xbbdb8c61u, ImmutableString("texelFetch(0Y1C0C").hash32());
ASSERT_EQ(0x573d1826u, ImmutableString("textureGather(0H1B").hash32());
ASSERT_EQ(0x0f61635eu, ImmutableString("textureGather(0P1B").hash32());
ASSERT_EQ(0x181a7211u, ImmutableString("textureGather(0U1B").hash32());
ASSERT_EQ(0x98b5c033u, ImmutableString("textureGather(0H1B0C").hash32());
ASSERT_EQ(0x1230974bu, ImmutableString("textureGather(0P1B0C").hash32());
ASSERT_EQ(0x047e2010u, ImmutableString("textureGather(0U1B0C").hash32());
ASSERT_EQ(0x889130b4u, ImmutableString("textureGather(0K2B").hash32());
ASSERT_EQ(0x80649bccu, ImmutableString("textureGather(0S2B").hash32());
ASSERT_EQ(0x77ff0931u, ImmutableString("textureGather(0X2B").hash32());
ASSERT_EQ(0xf0b36e1du, ImmutableString("textureGather(0K2B0C").hash32());
ASSERT_EQ(0x7e927bd5u, ImmutableString("textureGather(0S2B0C").hash32());
ASSERT_EQ(0x36e78b70u, ImmutableString("textureGather(0X2B0C").hash32());
ASSERT_EQ(0xf05b183bu, ImmutableString("textureGather(0J2B").hash32());
ASSERT_EQ(0xe6f2e1d3u, ImmutableString("textureGather(0R2B").hash32());
ASSERT_EQ(0x7bff68f8u, ImmutableString("textureGather(0W2B").hash32());
ASSERT_EQ(0x91e7b756u, ImmutableString("textureGather(0J2B0C").hash32());
ASSERT_EQ(0xb00a70eeu, ImmutableString("textureGather(0R2B0C").hash32());
ASSERT_EQ(0xd840ea01u, ImmutableString("textureGather(0W2B0C").hash32());
ASSERT_EQ(0xc3dadff4u, ImmutableString("textureGather(0Z1B").hash32());
ASSERT_EQ(0xbcf1974au, ImmutableString("textureGather(0Z1B0B").hash32());
ASSERT_EQ(0xdc0090e3u, ImmutableString("textureGather(0b2B").hash32());
ASSERT_EQ(0x36e65c71u, ImmutableString("textureGather(0b2B0B").hash32());
ASSERT_EQ(0x5e97fd5au, ImmutableString("textureGather(0a2B").hash32());
ASSERT_EQ(0xafef0c94u, ImmutableString("textureGather(0a2B0B").hash32());
ASSERT_EQ(0xe3b7a4efu, ImmutableString("textureGatherOffset(0H1B1C").hash32());
ASSERT_EQ(0x38ee90d7u, ImmutableString("textureGatherOffset(0P1B1C").hash32());
ASSERT_EQ(0xf91ef410u, ImmutableString("textureGatherOffset(0U1B1C").hash32());
ASSERT_EQ(0x8fa34bcau, ImmutableString("textureGatherOffset(0H1B1C0C").hash32());
ASSERT_EQ(0xb7b5eb12u, ImmutableString("textureGatherOffset(0P1B1C0C").hash32());
ASSERT_EQ(0x59490119u, ImmutableString("textureGatherOffset(0U1B1C0C").hash32());
ASSERT_EQ(0x3f682f01u, ImmutableString("textureGatherOffset(0K2B1C").hash32());
ASSERT_EQ(0x50a3ba69u, ImmutableString("textureGatherOffset(0S2B1C").hash32());
ASSERT_EQ(0xe3bd7c3cu, ImmutableString("textureGatherOffset(0X2B1C").hash32());
ASSERT_EQ(0x899b1520u, ImmutableString("textureGatherOffset(0K2B1C0C").hash32());
ASSERT_EQ(0x01a83888u, ImmutableString("textureGatherOffset(0S2B1C0C").hash32());
ASSERT_EQ(0x38ed38e5u, ImmutableString("textureGatherOffset(0X2B1C0C").hash32());
ASSERT_EQ(0xb006f693u, ImmutableString("textureGatherOffset(0Z1B0B1C").hash32());
ASSERT_EQ(0xd26cea7cu, ImmutableString("textureGatherOffset(0b2B0B1C").hash32());
ASSERT_EQ(0x0b8d8d0eu, ImmutableString("atomicCounter(0F").hash32());
ASSERT_EQ(0xf0f5289du, ImmutableString("atomicCounterIncrement(0F").hash32());
ASSERT_EQ(0xf5adf6d1u, ImmutableString("atomicCounterDecrement(0F").hash32());
ASSERT_EQ(0x48923c61u, ImmutableString("atomicAdd(0D0D").hash32());
ASSERT_EQ(0x174429d9u, ImmutableString("atomicAdd(0C0C").hash32());
ASSERT_EQ(0x7de6c91cu, ImmutableString("atomicMin(0D0D").hash32());
ASSERT_EQ(0x2f35a524u, ImmutableString("atomicMin(0C0C").hash32());
ASSERT_EQ(0x7a93e532u, ImmutableString("atomicMax(0D0D").hash32());
ASSERT_EQ(0xf35a12fau, ImmutableString("atomicMax(0C0C").hash32());
ASSERT_EQ(0xc90f20b3u, ImmutableString("atomicAnd(0D0D").hash32());
ASSERT_EQ(0x8f5a420bu, ImmutableString("atomicAnd(0C0C").hash32());
ASSERT_EQ(0x449a297fu, ImmutableString("atomicOr(0D0D").hash32());
ASSERT_EQ(0x797c3e57u, ImmutableString("atomicOr(0C0C").hash32());
ASSERT_EQ(0xe0d1d797u, ImmutableString("atomicXor(0D0D").hash32());
ASSERT_EQ(0x16f120efu, ImmutableString("atomicXor(0C0C").hash32());
ASSERT_EQ(0x32d4301fu, ImmutableString("atomicExchange(0D0D").hash32());
ASSERT_EQ(0x68f37977u, ImmutableString("atomicExchange(0C0C").hash32());
ASSERT_EQ(0x529504a4u, ImmutableString("atomicCompSwap(0D0D0D").hash32());
ASSERT_EQ(0x0fab9dd9u, ImmutableString("atomicCompSwap(0C0C0C").hash32());
ASSERT_EQ(0xb32c4610u, ImmutableString("imageSize(0c").hash32());
ASSERT_EQ(0xba2c5115u, ImmutableString("imageSize(0d").hash32());
ASSERT_EQ(0xb92c4f82u, ImmutableString("imageSize(0e").hash32());
ASSERT_EQ(0xb82c4defu, ImmutableString("imageSize(0f").hash32());
ASSERT_EQ(0xb72c4c5cu, ImmutableString("imageSize(0g").hash32());
ASSERT_EQ(0xbe2c5761u, ImmutableString("imageSize(0h").hash32());
ASSERT_EQ(0xbd2c55ceu, ImmutableString("imageSize(0i").hash32());
ASSERT_EQ(0xbc2c543bu, ImmutableString("imageSize(0j").hash32());
ASSERT_EQ(0xbb2c52a8u, ImmutableString("imageSize(0k").hash32());
ASSERT_EQ(0xc22c5dadu, ImmutableString("imageSize(0l").hash32());
ASSERT_EQ(0xc12c5c1au, ImmutableString("imageSize(0m").hash32());
ASSERT_EQ(0xc02c5a87u, ImmutableString("imageSize(0n").hash32());
ASSERT_EQ(0x6c195e87u, ImmutableString("imageLoad(0c1C").hash32());
ASSERT_EQ(0x753e7136u, ImmutableString("imageLoad(0d1C").hash32());
ASSERT_EQ(0xa9d0e5b5u, ImmutableString("imageLoad(0e1C").hash32());
ASSERT_EQ(0x9ad4e7a3u, ImmutableString("imageLoad(0f2C").hash32());
ASSERT_EQ(0x00a05f04u, ImmutableString("imageLoad(0g2C").hash32());
ASSERT_EQ(0x11c8ccddu, ImmutableString("imageLoad(0h2C").hash32());
ASSERT_EQ(0xa7a68486u, ImmutableString("imageLoad(0i2C").hash32());
ASSERT_EQ(0x28a31a5fu, ImmutableString("imageLoad(0j2C").hash32());
ASSERT_EQ(0x8d315d40u, ImmutableString("imageLoad(0k2C").hash32());
ASSERT_EQ(0xce50b7e9u, ImmutableString("imageLoad(0l2C").hash32());
ASSERT_EQ(0x62f2ce12u, ImmutableString("imageLoad(0m2C").hash32());
ASSERT_EQ(0x243de78bu, ImmutableString("imageLoad(0n2C").hash32());
ASSERT_EQ(0xaf6251f9u, ImmutableString("imageStore(0c1C3B").hash32());
ASSERT_EQ(0x5ba8f703u, ImmutableString("imageStore(0d1C3C").hash32());
ASSERT_EQ(0xe495b7e1u, ImmutableString("imageStore(0e1C3D").hash32());
ASSERT_EQ(0x886bdcd5u, ImmutableString("imageStore(0f2C3B").hash32());
ASSERT_EQ(0xb0002869u, ImmutableString("imageStore(0g2C3C").hash32());
ASSERT_EQ(0xf0cb4011u, ImmutableString("imageStore(0h2C3D").hash32());
ASSERT_EQ(0xfa7d2618u, ImmutableString("imageStore(0i2C3B").hash32());
ASSERT_EQ(0xcf4a9cdeu, ImmutableString("imageStore(0j2C3C").hash32());
ASSERT_EQ(0x008583a0u, ImmutableString("imageStore(0k2C3D").hash32());
ASSERT_EQ(0xbaead883u, ImmutableString("imageStore(0l2C3B").hash32());
ASSERT_EQ(0xc4d9f177u, ImmutableString("imageStore(0m2C3C").hash32());
ASSERT_EQ(0xd8dff3cbu, ImmutableString("imageStore(0n2C3D").hash32());
ASSERT_EQ(0xa7570267u, ImmutableString("memoryBarrier(").hash32());
ASSERT_EQ(0xd8373034u, ImmutableString("memoryBarrierAtomicCounter(").hash32());
ASSERT_EQ(0xff425859u, ImmutableString("memoryBarrierBuffer(").hash32());
ASSERT_EQ(0xcd7ff8a6u, ImmutableString("memoryBarrierImage(").hash32());
ASSERT_EQ(0x2c4d0487u, ImmutableString("gl_MaxImageUnits").hash32());
ASSERT_EQ(0xeacd9c77u, ImmutableString("gl_MaxVertexImageUniforms").hash32());
ASSERT_EQ(0xe9637851u, ImmutableString("gl_MaxFragmentImageUniforms").hash32());
ASSERT_EQ(0x551515f4u, ImmutableString("gl_MaxComputeImageUniforms").hash32());
ASSERT_EQ(0x37f0f1d0u, ImmutableString("gl_MaxCombinedImageUniforms").hash32());
ASSERT_EQ(0x8dd1ae75u, ImmutableString("gl_MaxCombinedShaderOutputResources").hash32());
ASSERT_EQ(0xd54f2797u, ImmutableString("gl_MaxComputeWorkGroupCount").hash32());
ASSERT_EQ(0xec875d49u, ImmutableString("gl_MaxComputeWorkGroupSize").hash32());
ASSERT_EQ(0x6c3a75d8u, ImmutableString("gl_MaxComputeUniformComponents").hash32());
ASSERT_EQ(0x029d3b2bu, ImmutableString("gl_MaxComputeTextureImageUnits").hash32());
ASSERT_EQ(0xc3a870f0u, ImmutableString("gl_MaxComputeAtomicCounters").hash32());
ASSERT_EQ(0xacde249eu, ImmutableString("gl_MaxComputeAtomicCounterBuffers").hash32());
ASSERT_EQ(0x4cbd309du, ImmutableString("gl_MaxVertexAtomicCounters").hash32());
ASSERT_EQ(0x4591b147u, ImmutableString("gl_MaxFragmentAtomicCounters").hash32());
ASSERT_EQ(0x82903444u, ImmutableString("gl_MaxCombinedAtomicCounters").hash32());
ASSERT_EQ(0x5aeafb40u, ImmutableString("gl_MaxAtomicCounterBindings").hash32());
ASSERT_EQ(0x107540dfu, ImmutableString("gl_MaxVertexAtomicCounterBuffers").hash32());
ASSERT_EQ(0xf6212c11u, ImmutableString("gl_MaxFragmentAtomicCounterBuffers").hash32());
ASSERT_EQ(0x3d856f72u, ImmutableString("gl_MaxCombinedAtomicCounterBuffers").hash32());
ASSERT_EQ(0x98a09aa9u, ImmutableString("gl_MaxAtomicCounterBufferSize").hash32());
ASSERT_EQ(0x8539932du, ImmutableString("gl_MaxGeometryInputComponents").hash32());
ASSERT_EQ(0xd26bc9eau, ImmutableString("gl_MaxGeometryOutputComponents").hash32());
ASSERT_EQ(0x3dc1da39u, ImmutableString("gl_MaxGeometryImageUniforms").hash32());
ASSERT_EQ(0x361fe182u, ImmutableString("gl_MaxGeometryTextureImageUnits").hash32());
ASSERT_EQ(0x3620853du, ImmutableString("gl_MaxGeometryOutputVertices").hash32());
ASSERT_EQ(0x9923396au, ImmutableString("gl_MaxGeometryTotalOutputComponents").hash32());
ASSERT_EQ(0xc0ec9f01u, ImmutableString("gl_MaxGeometryUniformComponents").hash32());
ASSERT_EQ(0xd96c18afu, ImmutableString("gl_MaxGeometryAtomicCounters").hash32());
ASSERT_EQ(0xe353b519u, ImmutableString("gl_MaxGeometryAtomicCounterBuffers").hash32());
ASSERT_EQ(0x7dab4220u, ImmutableString("gl_in").hash32());
ASSERT_EQ(0x34af0318u, ImmutableString("barrier(").hash32());
ASSERT_EQ(0x9a984c24u, ImmutableString("memoryBarrierShared(").hash32());
ASSERT_EQ(0xdf09d132u, ImmutableString("groupMemoryBarrier(").hash32());
ASSERT_EQ(0x56624254u, ImmutableString("gl_NumWorkGroups").hash32());
ASSERT_EQ(0x121ffe70u, ImmutableString("gl_WorkGroupSize").hash32());
ASSERT_EQ(0x6fced514u, ImmutableString("gl_WorkGroupID").hash32());
ASSERT_EQ(0x4bbe0c1du, ImmutableString("gl_LocalInvocationID").hash32());
ASSERT_EQ(0xa34369b3u, ImmutableString("gl_GlobalInvocationID").hash32());
ASSERT_EQ(0x99f53c3cu, ImmutableString("gl_LocalInvocationIndex").hash32());
ASSERT_EQ(0xab932950u, ImmutableString("EmitVertex(").hash32());
ASSERT_EQ(0xfa01fdedu, ImmutableString("EndPrimitive(").hash32());
ASSERT_EQ(0xc91ada96u, ImmutableString("gl_PrimitiveIDIn").hash32());
ASSERT_EQ(0xfc2907ccu, ImmutableString("gl_InvocationID").hash32());
ASSERT_EQ(0x863d719du, ImmutableString("gl_PrimitiveID").hash32());
ASSERT_EQ(0xe29142f0u, ImmutableString("gl_PerVertex").hash32());
ASSERT_EQ(0x02c4bde0u, ImmutableString("gl_Position").hash32());
ASSERT_EQ(0x556a8827u, ImmutableString("sinh(0B").hash32());
ASSERT_EQ(0x3368140au, ImmutableString("sinh(1B").hash32());
ASSERT_EQ(0x25704cc5u, ImmutableString("sinh(2B").hash32());
ASSERT_EQ(0x7b6d0290u, ImmutableString("sinh(3B").hash32());
ASSERT_EQ(0x68fefbb2u, ImmutableString("cosh(0B").hash32());
ASSERT_EQ(0x8b016fcfu, ImmutableString("cosh(1B").hash32());
ASSERT_EQ(0xb103ea38u, ImmutableString("cosh(2B").hash32());
ASSERT_EQ(0xdb066aedu, ImmutableString("cosh(3B").hash32());
ASSERT_EQ(0x119658feu, ImmutableString("tanh(0B").hash32());
ASSERT_EQ(0x3398cd1bu, ImmutableString("tanh(1B").hash32());
ASSERT_EQ(0x599b4784u, ImmutableString("tanh(2B").hash32());
ASSERT_EQ(0x039cfeb9u, ImmutableString("tanh(3B").hash32());
ASSERT_EQ(0xca4a7880u, ImmutableString("asinh(0B").hash32());
ASSERT_EQ(0xf44cf935u, ImmutableString("asinh(1B").hash32());
ASSERT_EQ(0x0246537au, ImmutableString("asinh(2B").hash32());
ASSERT_EQ(0x2448c797u, ImmutableString("asinh(3B").hash32());
ASSERT_EQ(0xc114b5b5u, ImmutableString("acosh(0B").hash32());
ASSERT_EQ(0x97123500u, ImmutableString("acosh(1B").hash32());
ASSERT_EQ(0xf1108417u, ImmutableString("acosh(2B").hash32());
ASSERT_EQ(0xcf0e0ffau, ImmutableString("acosh(3B").hash32());
ASSERT_EQ(0xb11b8a15u, ImmutableString("atanh(0B").hash32());
ASSERT_EQ(0x87190960u, ImmutableString("atanh(1B").hash32());
ASSERT_EQ(0x61168ef7u, ImmutableString("atanh(2B").hash32());
ASSERT_EQ(0xbf14e45au, ImmutableString("atanh(3B").hash32());
ASSERT_EQ(0x10769e08u, ImmutableString("abs(0C").hash32());
ASSERT_EQ(0xf0742d11u, ImmutableString("abs(1C").hash32());
ASSERT_EQ(0xe07acfa6u, ImmutableString("abs(2C").hash32());
ASSERT_EQ(0x38791b97u, ImmutableString("abs(3C").hash32());
ASSERT_EQ(0xbb7088edu, ImmutableString("sign(0C").hash32());
ASSERT_EQ(0x5b723064u, ImmutableString("sign(1C").hash32());
ASSERT_EQ(0x8374adf3u, ImmutableString("sign(2C").hash32());
ASSERT_EQ(0xab772b82u, ImmutableString("sign(3C").hash32());
ASSERT_EQ(0x26c07245u, ImmutableString("trunc(0B").hash32());
ASSERT_EQ(0x7cbd2810u, ImmutableString("trunc(1B").hash32());
ASSERT_EQ(0x56baada7u, ImmutableString("trunc(2B").hash32());
ASSERT_EQ(0x34b8398au, ImmutableString("trunc(3B").hash32());
ASSERT_EQ(0x0c793f9bu, ImmutableString("round(0B").hash32());
ASSERT_EQ(0xea76cb7eu, ImmutableString("round(1B").hash32());
ASSERT_EQ(0xdc7d7139u, ImmutableString("round(2B").hash32());
ASSERT_EQ(0x327bba04u, ImmutableString("round(3B").hash32());
ASSERT_EQ(0xdb3a3b0fu, ImmutableString("roundEven(0B").hash32());
ASSERT_EQ(0xb937c6f2u, ImmutableString("roundEven(1B").hash32());
ASSERT_EQ(0x2b3f362du, ImmutableString("roundEven(2B").hash32());
ASSERT_EQ(0x013cb578u, ImmutableString("roundEven(3B").hash32());
ASSERT_EQ(0xbdf50df5u, ImmutableString("min(0C0C").hash32());
ASSERT_EQ(0x80de719du, ImmutableString("min(1C1C").hash32());
ASSERT_EQ(0x81dadab1u, ImmutableString("min(2C2C").hash32());
ASSERT_EQ(0x5997f741u, ImmutableString("min(3C3C").hash32());
ASSERT_EQ(0xa0e0e294u, ImmutableString("min(1C0C").hash32());
ASSERT_EQ(0x49e092b7u, ImmutableString("min(2C0C").hash32());
ASSERT_EQ(0x499e99d6u, ImmutableString("min(3C0C").hash32());
ASSERT_EQ(0x405da95du, ImmutableString("min(0D0D").hash32());
ASSERT_EQ(0x95954a75u, ImmutableString("min(1D1D").hash32());
ASSERT_EQ(0x47bb8b0du, ImmutableString("min(2D2D").hash32());
ASSERT_EQ(0x61bd085du, ImmutableString("min(3D3D").hash32());
ASSERT_EQ(0x6f92d00cu, ImmutableString("min(1D0D").hash32());
ASSERT_EQ(0x13bfb65fu, ImmutableString("min(2D0D").hash32());
ASSERT_EQ(0x7fbf762eu, ImmutableString("min(3D0D").hash32());
ASSERT_EQ(0xaaa9d50bu, ImmutableString("max(0C0C").hash32());
ASSERT_EQ(0xf6fdcb9bu, ImmutableString("max(1C1C").hash32());
ASSERT_EQ(0x9b0b952fu, ImmutableString("max(2C2C").hash32());
ASSERT_EQ(0x919deb77u, ImmutableString("max(3C3C").hash32());
ASSERT_EQ(0x1f00492au, ImmutableString("max(1C0C").hash32());
ASSERT_EQ(0x5306a6a9u, ImmutableString("max(2C0C").hash32());
ASSERT_EQ(0xe99c3768u, ImmutableString("max(3C0C").hash32());
ASSERT_EQ(0xe45eb3b3u, ImmutableString("max(0D0D").hash32());
ASSERT_EQ(0xc2ff54b3u, ImmutableString("max(1D1D").hash32());
ASSERT_EQ(0x505a7783u, ImmutableString("max(2D2D").hash32());
ASSERT_EQ(0x593a41bbu, ImmutableString("max(3D3D").hash32());
ASSERT_EQ(0xa4fce6e2u, ImmutableString("max(1D0D").hash32());
ASSERT_EQ(0x8454b931u, ImmutableString("max(2D0D").hash32());
ASSERT_EQ(0xe732d280u, ImmutableString("max(3D0D").hash32());
ASSERT_EQ(0x40b0dfadu, ImmutableString("clamp(0C0C0C").hash32());
ASSERT_EQ(0x1b502a44u, ImmutableString("clamp(1C0C0C").hash32());
ASSERT_EQ(0xc2b695f3u, ImmutableString("clamp(2C0C0C").hash32());
ASSERT_EQ(0x4ba47222u, ImmutableString("clamp(3C0C0C").hash32());
ASSERT_EQ(0x5729921cu, ImmutableString("clamp(1C1C1C").hash32());
ASSERT_EQ(0x000dfdb7u, ImmutableString("clamp(2C2C2C").hash32());
ASSERT_EQ(0xaec45456u, ImmutableString("clamp(3C3C3C").hash32());
ASSERT_EQ(0xc3bc1280u, ImmutableString("clamp(0D0D0D").hash32());
ASSERT_EQ(0x0ad28199u, ImmutableString("clamp(1D0D0D").hash32());
ASSERT_EQ(0x45e11f4au, ImmutableString("clamp(2D0D0D").hash32());
ASSERT_EQ(0xb6f9d1ebu, ImmutableString("clamp(3D0D0D").hash32());
ASSERT_EQ(0x61475731u, ImmutableString("clamp(1D1D1D").hash32());
ASSERT_EQ(0x9d0abd32u, ImmutableString("clamp(2D2D2D").hash32());
ASSERT_EQ(0xeb86dc53u, ImmutableString("clamp(3D3D3D").hash32());
ASSERT_EQ(0xb6c1d1ecu, ImmutableString("mix(0B0B0E").hash32());
ASSERT_EQ(0xfc8b17f5u, ImmutableString("mix(1B1B1E").hash32());
ASSERT_EQ(0x95305b7au, ImmutableString("mix(2B2B2E").hash32());
ASSERT_EQ(0xcc917983u, ImmutableString("mix(3B3B3E").hash32());
ASSERT_EQ(0x7f4a0e15u, ImmutableString("modf(0B0B").hash32());
ASSERT_EQ(0x515a7a59u, ImmutableString("modf(1B1B").hash32());
ASSERT_EQ(0xf4880c75u, ImmutableString("modf(2B2B").hash32());
ASSERT_EQ(0x01cd0981u, ImmutableString("modf(3B3B").hash32());
ASSERT_EQ(0xd43b6ae0u, ImmutableString("isnan(0B").hash32());
ASSERT_EQ(0xfe3deb95u, ImmutableString("isnan(1B").hash32());
ASSERT_EQ(0x0c3745dau, ImmutableString("isnan(2B").hash32());
ASSERT_EQ(0xae38f077u, ImmutableString("isnan(3B").hash32());
ASSERT_EQ(0x84bc1fc6u, ImmutableString("isinf(0B").hash32());
ASSERT_EQ(0xa6be93e3u, ImmutableString("isinf(1B").hash32());
ASSERT_EQ(0x4cc044ccu, ImmutableString("isinf(2B").hash32());
ASSERT_EQ(0x76c2c581u, ImmutableString("isinf(3B").hash32());
ASSERT_EQ(0x5fb09d21u, ImmutableString("floatBitsToInt(0B").hash32());
ASSERT_EQ(0x35ae1c6cu, ImmutableString("floatBitsToInt(1B").hash32());
ASSERT_EQ(0x0faba203u, ImmutableString("floatBitsToInt(2B").hash32());
ASSERT_EQ(0xeda92de6u, ImmutableString("floatBitsToInt(3B").hash32());
ASSERT_EQ(0x04a657b6u, ImmutableString("floatBitsToUint(0B").hash32());
ASSERT_EQ(0xa6a99553u, ImmutableString("floatBitsToUint(1B").hash32());
ASSERT_EQ(0xccac0fbcu, ImmutableString("floatBitsToUint(2B").hash32());
ASSERT_EQ(0xf6ae9071u, ImmutableString("floatBitsToUint(3B").hash32());
ASSERT_EQ(0x3c11a2ecu, ImmutableString("intBitsToFloat(0C").hash32());
ASSERT_EQ(0x1c0f31f5u, ImmutableString("intBitsToFloat(1C").hash32());
ASSERT_EQ(0x0c15d48au, ImmutableString("intBitsToFloat(2C").hash32());
ASSERT_EQ(0x6414207bu, ImmutableString("intBitsToFloat(3C").hash32());
ASSERT_EQ(0x7a053116u, ImmutableString("uintBitsToFloat(0D").hash32());
ASSERT_EQ(0xa807b817u, ImmutableString("uintBitsToFloat(1D").hash32());
ASSERT_EQ(0xb5ff7f5cu, ImmutableString("uintBitsToFloat(2D").hash32());
ASSERT_EQ(0x5c02c345u, ImmutableString("uintBitsToFloat(3D").hash32());
ASSERT_EQ(0x9ef04df5u, ImmutableString("packSnorm2x16(1B").hash32());
ASSERT_EQ(0xe73def97u, ImmutableString("packUnorm2x16(1B").hash32());
ASSERT_EQ(0xbfd16903u, ImmutableString("packHalf2x16(1B").hash32());
ASSERT_EQ(0xab46cb2du, ImmutableString("unpackSnorm2x16(0D").hash32());
ASSERT_EQ(0xe12111f7u, ImmutableString("unpackUnorm2x16(0D").hash32());
ASSERT_EQ(0xbb0a6cb5u, ImmutableString("unpackHalf2x16(0D").hash32());
ASSERT_EQ(0x0f88eaa3u, ImmutableString("matrixCompMult(9B9B").hash32());
ASSERT_EQ(0x93b01b17u, ImmutableString("matrixCompMult(6B6B").hash32());
ASSERT_EQ(0xd7cedc37u, ImmutableString("matrixCompMult(DBDB").hash32());
ASSERT_EQ(0x346dec93u, ImmutableString("matrixCompMult(7B7B").hash32());
ASSERT_EQ(0xf68d511bu, ImmutableString("matrixCompMult(EBEB").hash32());
ASSERT_EQ(0x987daeb7u, ImmutableString("matrixCompMult(BBBB").hash32());
ASSERT_EQ(0x12fad71du, ImmutableString("outerProduct(1B1B").hash32());
ASSERT_EQ(0xb6286939u, ImmutableString("outerProduct(2B2B").hash32());
ASSERT_EQ(0xc36ef945u, ImmutableString("outerProduct(3B3B").hash32());
ASSERT_EQ(0xc421c37eu, ImmutableString("outerProduct(2B1B").hash32());
ASSERT_EQ(0x20f43162u, ImmutableString("outerProduct(1B2B").hash32());
ASSERT_EQ(0xf36934a7u, ImmutableString("outerProduct(3B1B").hash32());
ASSERT_EQ(0x42f6a57fu, ImmutableString("outerProduct(1B3B").hash32());
ASSERT_EQ(0x196baf10u, ImmutableString("outerProduct(3B2B").hash32());
ASSERT_EQ(0x0c26b204u, ImmutableString("outerProduct(2B3B").hash32());
ASSERT_EQ(0xfbc1e56fu, ImmutableString("transpose(5B").hash32());
ASSERT_EQ(0x04cd89bbu, ImmutableString("transpose(AB").hash32());
ASSERT_EQ(0xc2d9edc8u, ImmutableString("transpose(FB").hash32());
ASSERT_EQ(0xa1c52958u, ImmutableString("transpose(6B").hash32());
ASSERT_EQ(0xb3a4f203u, ImmutableString("transpose(9B").hash32());
ASSERT_EQ(0xcbc7aa0du, ImmutableString("transpose(7B").hash32());
ASSERT_EQ(0xfad5c8c2u, ImmutableString("transpose(DB").hash32());
ASSERT_EQ(0xaad0cda4u, ImmutableString("transpose(BB").hash32());
ASSERT_EQ(0x9cd7735fu, ImmutableString("transpose(EB").hash32());
ASSERT_EQ(0xd763566fu, ImmutableString("determinant(5B").hash32());
ASSERT_EQ(0xe06efabbu, ImmutableString("determinant(AB").hash32());
ASSERT_EQ(0x9e7b5ec8u, ImmutableString("determinant(FB").hash32());
ASSERT_EQ(0x0671c30au, ImmutableString("inverse(5B").hash32());
ASSERT_EQ(0x0f7d6756u, ImmutableString("inverse(AB").hash32());
ASSERT_EQ(0x198ec035u, ImmutableString("inverse(FB").hash32());
ASSERT_EQ(0xae3dea39u, ImmutableString("lessThan(1D1D").hash32());
ASSERT_EQ(0x2cbb3831u, ImmutableString("lessThan(2D2D").hash32());
ASSERT_EQ(0x0b5bd931u, ImmutableString("lessThan(3D3D").hash32());
ASSERT_EQ(0xbc4bed83u, ImmutableString("lessThanEqual(1D1D").hash32());
ASSERT_EQ(0x4869dbd3u, ImmutableString("lessThanEqual(2D2D").hash32());
ASSERT_EQ(0xdf2d350bu, ImmutableString("lessThanEqual(3D3D").hash32());
ASSERT_EQ(0x2d7ebf02u, ImmutableString("greaterThan(1D1D").hash32());
ASSERT_EQ(0x3ba7cb8au, ImmutableString("greaterThan(2D2D").hash32());
ASSERT_EQ(0x2620dd52u, ImmutableString("greaterThan(3D3D").hash32());
ASSERT_EQ(0xd8a05eaeu, ImmutableString("greaterThanEqual(1D1D").hash32());
ASSERT_EQ(0x267a1e16u, ImmutableString("greaterThanEqual(2D2D").hash32());
ASSERT_EQ(0xd1427cfeu, ImmutableString("greaterThanEqual(3D3D").hash32());
ASSERT_EQ(0xc011536du, ImmutableString("equal(1D1D").hash32());
ASSERT_EQ(0x4b343265u, ImmutableString("equal(2D2D").hash32());
ASSERT_EQ(0xd75220b5u, ImmutableString("equal(3D3D").hash32());
ASSERT_EQ(0x593a5ce2u, ImmutableString("notEqual(1D1D").hash32());
ASSERT_EQ(0xce15eaeau, ImmutableString("notEqual(2D2D").hash32());
ASSERT_EQ(0xc53620b2u, ImmutableString("notEqual(3D3D").hash32());
ASSERT_EQ(0xc5a2d6f5u, ImmutableString("texture(0N1B").hash32());
ASSERT_EQ(0xd934e233u, ImmutableString("textureProj(0N2B").hash32());
ASSERT_EQ(0xb7326e16u, ImmutableString("textureProj(0N3B").hash32());
ASSERT_EQ(0xbed19cffu, ImmutableString("texture(0H1B").hash32());
ASSERT_EQ(0xe4231ee7u, ImmutableString("texture(0P1B").hash32());
ASSERT_EQ(0xdb6a1034u, ImmutableString("texture(0U1B").hash32());
ASSERT_EQ(0x4b60ca6fu, ImmutableString("texture(0I2B").hash32());
ASSERT_EQ(0x71ef80d7u, ImmutableString("texture(0Q2B").hash32());
ASSERT_EQ(0x393c36c2u, ImmutableString("texture(0V2B").hash32());
ASSERT_EQ(0x8ee6e7c6u, ImmutableString("texture(0J2B").hash32());
ASSERT_EQ(0xf486ed4eu, ImmutableString("texture(0R2B").hash32());
ASSERT_EQ(0x8f8e3971u, ImmutableString("texture(0W2B").hash32());
ASSERT_EQ(0x25876e15u, ImmutableString("texture(0K2B").hash32());
ASSERT_EQ(0x0b283d1du, ImmutableString("texture(0S2B").hash32());
ASSERT_EQ(0x938e9938u, ImmutableString("texture(0X2B").hash32());
ASSERT_EQ(0x2db85505u, ImmutableString("textureProj(0H2B").hash32());
ASSERT_EQ(0x37221e6du, ImmutableString("textureProj(0P2B").hash32());
ASSERT_EQ(0xe3f81a12u, ImmutableString("textureProj(0U2B").hash32());
ASSERT_EQ(0x83b69dd0u, ImmutableString("textureProj(0H3B").hash32());
ASSERT_EQ(0x0d1f9db8u, ImmutableString("textureProj(0P3B").hash32());
ASSERT_EQ(0x05fa8e2fu, ImmutableString("textureProj(0U3B").hash32());
ASSERT_EQ(0xb91a42d3u, ImmutableString("textureProj(0I3B").hash32());
ASSERT_EQ(0xc282793bu, ImmutableString("textureProj(0Q3B").hash32());
ASSERT_EQ(0x3f5e397eu, ImmutableString("textureProj(0V3B").hash32());
ASSERT_EQ(0x66fac460u, ImmutableString("textureLod(0H1B0B").hash32());
ASSERT_EQ(0xf9c25078u, ImmutableString("textureLod(0P1B0B").hash32());
ASSERT_EQ(0xee116f63u, ImmutableString("textureLod(0U1B0B").hash32());
ASSERT_EQ(0xa78e0f2cu, ImmutableString("textureLod(0I2B0B").hash32());
ASSERT_EQ(0x12a67064u, ImmutableString("textureLod(0Q2B0B").hash32());
ASSERT_EQ(0x339c450du, ImmutableString("textureLod(0V2B0B").hash32());
ASSERT_EQ(0x622e51a9u, ImmutableString("textureLod(0J2B0B").hash32());
ASSERT_EQ(0x999dc041u, ImmutableString("textureLod(0R2B0B").hash32());
ASSERT_EQ(0xa687812eu, ImmutableString("textureLod(0W2B0B").hash32());
ASSERT_EQ(0xd846ba4au, ImmutableString("textureLod(0K2B0B").hash32());
ASSERT_EQ(0x4cd78002u, ImmutableString("textureLod(0S2B0B").hash32());
ASSERT_EQ(0x072c92c3u, ImmutableString("textureLod(0X2B0B").hash32());
ASSERT_EQ(0x3da16996u, ImmutableString("texture(0Z2B").hash32());
ASSERT_EQ(0xc3be50cau, ImmutableString("texture(0a3B").hash32());
ASSERT_EQ(0x8b97d9fbu, ImmutableString("texture(0b3B").hash32());
ASSERT_EQ(0x8411eff2u, ImmutableString("textureProj(0Z3B").hash32());
ASSERT_EQ(0xfcf90ed9u, ImmutableString("textureLod(0Z2B0B").hash32());
ASSERT_EQ(0x85509e6au, ImmutableString("textureSize(0H0C").hash32());
ASSERT_EQ(0xcd2de632u, ImmutableString("textureSize(0P0C").hash32());
ASSERT_EQ(0x154b0321u, ImmutableString("textureSize(0U0C").hash32());
ASSERT_EQ(0x077c06e5u, ImmutableString("textureSize(0I0C").hash32());
ASSERT_EQ(0xd095b9adu, ImmutableString("textureSize(0Q0C").hash32());
ASSERT_EQ(0x4bfe4a10u, ImmutableString("textureSize(0V0C").hash32());
ASSERT_EQ(0x3e30e0d4u, ImmutableString("textureSize(0J0C").hash32());
ASSERT_EQ(0xc799e0bcu, ImmutableString("textureSize(0R0C").hash32());
ASSERT_EQ(0x8e78ffabu, ImmutableString("textureSize(0W0C").hash32());
ASSERT_EQ(0xc1997dcfu, ImmutableString("textureSize(0K0C").hash32());
ASSERT_EQ(0x4b027db7u, ImmutableString("textureSize(0S0C").hash32());
ASSERT_EQ(0xd6961c9au, ImmutableString("textureSize(0X0C").hash32());
ASSERT_EQ(0x90b39384u, ImmutableString("textureSize(0Z0C").hash32());
ASSERT_EQ(0xdb880a9du, ImmutableString("textureSize(0a0C").hash32());
ASSERT_EQ(0x528b682cu, ImmutableString("textureSize(0b0C").hash32());
ASSERT_EQ(0x7c701716u, ImmutableString("textureSize(0O").hash32());
ASSERT_EQ(0x737008ebu, ImmutableString("textureSize(0T").hash32());
ASSERT_EQ(0x6e70010cu, ImmutableString("textureSize(0Y").hash32());
ASSERT_EQ(0x4257e234u, ImmutableString("textureProjLod(0H2B0B").hash32());
ASSERT_EQ(0x164d5fdcu, ImmutableString("textureProjLod(0P2B0B").hash32());
ASSERT_EQ(0x798a0c0fu, ImmutableString("textureProjLod(0U2B0B").hash32());
ASSERT_EQ(0x1b87f4a5u, ImmutableString("textureProjLod(0H3B0B").hash32());
ASSERT_EQ(0xbb36aeedu, ImmutableString("textureProjLod(0P3B0B").hash32());
ASSERT_EQ(0x64ce27feu, ImmutableString("textureProjLod(0U3B0B").hash32());
ASSERT_EQ(0xf058b46au, ImmutableString("textureProjLod(0I3B0B").hash32());
ASSERT_EQ(0x09e0f252u, ImmutableString("textureProjLod(0Q3B0B").hash32());
ASSERT_EQ(0xb087ded7u, ImmutableString("textureProjLod(0V3B0B").hash32());
ASSERT_EQ(0xdf19eb73u, ImmutableString("textureProjLod(0Z3B0B").hash32());
ASSERT_EQ(0xfb768e02u, ImmutableString("texelFetch(0H1C0C").hash32());
ASSERT_EQ(0x28be44dau, ImmutableString("texelFetch(0P1C0C").hash32());
ASSERT_EQ(0xda6f4215u, ImmutableString("texelFetch(0U1C0C").hash32());
ASSERT_EQ(0x7732f2f2u, ImmutableString("texelFetch(0I2C0C").hash32());
ASSERT_EQ(0x17d44f4au, ImmutableString("texelFetch(0Q2C0C").hash32());
ASSERT_EQ(0x0233df8fu, ImmutableString("texelFetch(0V2C0C").hash32());
ASSERT_EQ(0xa3b5f7d4u, ImmutableString("texelFetch(0K2C0C").hash32());
ASSERT_EQ(0x4455c12cu, ImmutableString("texelFetch(0S2C0C").hash32());
ASSERT_EQ(0xc01ff0f1u, ImmutableString("texelFetch(0X2C0C").hash32());
ASSERT_EQ(0x319bd053u, ImmutableString("textureGrad(0H1B1B1B").hash32());
ASSERT_EQ(0x8f2182ebu, ImmutableString("textureGrad(0P1B1B1B").hash32());
ASSERT_EQ(0xe7a84898u, ImmutableString("textureGrad(0U1B1B1B").hash32());
ASSERT_EQ(0x017a65d7u, ImmutableString("textureGrad(0I2B2B2B").hash32());
ASSERT_EQ(0x32c6e76fu, ImmutableString("textureGrad(0Q2B2B2B").hash32());
ASSERT_EQ(0xfe5d9a62u, ImmutableString("textureGrad(0V2B2B2B").hash32());
ASSERT_EQ(0x3e2a3dd6u, ImmutableString("textureGrad(0J2B2B2B").hash32());
ASSERT_EQ(0x68df806eu, ImmutableString("textureGrad(0R2B2B2B").hash32());
ASSERT_EQ(0x2337ed89u, ImmutableString("textureGrad(0W2B2B2B").hash32());
ASSERT_EQ(0xd45005c2u, ImmutableString("textureGrad(0Z2B1B1B").hash32());
ASSERT_EQ(0x2a98dd2au, ImmutableString("textureGrad(0a3B2B2B").hash32());
ASSERT_EQ(0xe17cbae1u, ImmutableString("textureGrad(0K2B1B1B").hash32());
ASSERT_EQ(0xad25bf79u, ImmutableString("textureGrad(0S2B1B1B").hash32());
ASSERT_EQ(0x47a2ba6cu, ImmutableString("textureGrad(0X2B1B1B").hash32());
ASSERT_EQ(0xa4df529fu, ImmutableString("textureGrad(0b3B1B1B").hash32());
ASSERT_EQ(0xb6a81eddu, ImmutableString("textureProjGrad(0H2B1B1B").hash32());
ASSERT_EQ(0x6fa329a5u, ImmutableString("textureProjGrad(0P2B1B1B").hash32());
ASSERT_EQ(0xe0e2d862u, ImmutableString("textureProjGrad(0U2B1B1B").hash32());
ASSERT_EQ(0x6509abb0u, ImmutableString("textureProjGrad(0H3B1B1B").hash32());
ASSERT_EQ(0xa0c1a478u, ImmutableString("textureProjGrad(0P3B1B1B").hash32());
ASSERT_EQ(0x96a71f27u, ImmutableString("textureProjGrad(0U3B1B1B").hash32());
ASSERT_EQ(0x7fe4d147u, ImmutableString("textureProjGrad(0I3B2B2B").hash32());
ASSERT_EQ(0x3c0d8cafu, ImmutableString("textureProjGrad(0Q3B2B2B").hash32());
ASSERT_EQ(0x32a42332u, ImmutableString("textureProjGrad(0V3B2B2B").hash32());
ASSERT_EQ(0xca53d58au, ImmutableString("textureProjGrad(0Z3B1B1B").hash32());
ASSERT_EQ(0x22d26116u, ImmutableString("textureOffset(0H1B1C").hash32());
ASSERT_EQ(0x101493beu, ImmutableString("textureOffset(0P1B1C").hash32());
ASSERT_EQ(0x39c4a805u, ImmutableString("textureOffset(0U1B1C").hash32());
ASSERT_EQ(0xcbaf14edu, ImmutableString("textureOffset(0I2B2C").hash32());
ASSERT_EQ(0x78036035u, ImmutableString("textureOffset(0Q2B2C").hash32());
ASSERT_EQ(0x138e5608u, ImmutableString("textureOffset(0V2B2C").hash32());
ASSERT_EQ(0x73713e4bu, ImmutableString("textureOffset(0Z2B1C").hash32());
ASSERT_EQ(0x80b45ae8u, ImmutableString("textureOffset(0K2B1C").hash32());
ASSERT_EQ(0x59ec8230u, ImmutableString("textureOffset(0S2B1C").hash32());
ASSERT_EQ(0x70c27acdu, ImmutableString("textureOffset(0X2B1C").hash32());
ASSERT_EQ(0x15d42df8u, ImmutableString("textureProjOffset(0H2B1C").hash32());
ASSERT_EQ(0x9a695ee0u, ImmutableString("textureProjOffset(0P2B1C").hash32());
ASSERT_EQ(0x0776d647u, ImmutableString("textureProjOffset(0U2B1C").hash32());
ASSERT_EQ(0x5be66575u, ImmutableString("textureProjOffset(0H3B1C").hash32());
ASSERT_EQ(0xdf3e61ddu, ImmutableString("textureProjOffset(0P3B1C").hash32());
ASSERT_EQ(0x01882d1au, ImmutableString("textureProjOffset(0U3B1C").hash32());
ASSERT_EQ(0x8952b249u, ImmutableString("textureProjOffset(0I3B2C").hash32());
ASSERT_EQ(0x59a05651u, ImmutableString("textureProjOffset(0Q3B2C").hash32());
ASSERT_EQ(0xa506c0ccu, ImmutableString("textureProjOffset(0V3B2C").hash32());
ASSERT_EQ(0xbe73df8fu, ImmutableString("textureProjOffset(0Z3B1C").hash32());
ASSERT_EQ(0x9215c4d9u, ImmutableString("textureLodOffset(0H1B0B1C").hash32());
ASSERT_EQ(0x793a7cc1u, ImmutableString("textureLodOffset(0P1B0B1C").hash32());
ASSERT_EQ(0xf48ef6a2u, ImmutableString("textureLodOffset(0U1B0B1C").hash32());
ASSERT_EQ(0xbd22ce5eu, ImmutableString("textureLodOffset(0I2B0B2C").hash32());
ASSERT_EQ(0x90a846c6u, ImmutableString("textureLodOffset(0Q2B0B2C").hash32());
ASSERT_EQ(0x4ee30447u, ImmutableString("textureLodOffset(0V2B0B2C").hash32());
ASSERT_EQ(0x4a5c1bf4u, ImmutableString("textureLodOffset(0Z2B0B1C").hash32());
ASSERT_EQ(0xa09a8937u, ImmutableString("textureLodOffset(0K2B0B1C").hash32());
ASSERT_EQ(0x58585f7fu, ImmutableString("textureLodOffset(0S2B0B1C").hash32());
ASSERT_EQ(0x2d30964eu, ImmutableString("textureLodOffset(0X2B0B1C").hash32());
ASSERT_EQ(0x559bf8bdu, ImmutableString("textureProjLodOffset(0H2B0B1C").hash32());
ASSERT_EQ(0xddbc72f5u, ImmutableString("textureProjLodOffset(0P2B0B1C").hash32());
ASSERT_EQ(0xeda8ca9eu, ImmutableString("textureProjLodOffset(0U2B0B1C").hash32());
ASSERT_EQ(0x7c675aa4u, ImmutableString("textureProjLodOffset(0H3B0B1C").hash32());
ASSERT_EQ(0xabf9e1fcu, ImmutableString("textureProjLodOffset(0P3B0B1C").hash32());
ASSERT_EQ(0xfb4c331fu, ImmutableString("textureProjLodOffset(0U3B0B1C").hash32());
ASSERT_EQ(0x72403404u, ImmutableString("textureProjLodOffset(0I3B0B2C").hash32());
ASSERT_EQ(0x5c0b0c3cu, ImmutableString("textureProjLodOffset(0Q3B0B2C").hash32());
ASSERT_EQ(0x73cbbd41u, ImmutableString("textureProjLodOffset(0V3B0B2C").hash32());
ASSERT_EQ(0x1a4b729au, ImmutableString("textureProjLodOffset(0Z3B0B1C").hash32());
ASSERT_EQ(0x640bb15fu, ImmutableString("texelFetchOffset(0H1C0C1C").hash32());
ASSERT_EQ(0x38a66077u, ImmutableString("texelFetchOffset(0P1C0C1C").hash32());
ASSERT_EQ(0x8fd50890u, ImmutableString("texelFetchOffset(0U1C0C1C").hash32());
ASSERT_EQ(0x1c1e5a64u, ImmutableString("texelFetchOffset(0I2C0C2C").hash32());
ASSERT_EQ(0xb190dd9cu, ImmutableString("texelFetchOffset(0Q2C0C2C").hash32());
ASSERT_EQ(0xc6608dc1u, ImmutableString("texelFetchOffset(0V2C0C2C").hash32());
ASSERT_EQ(0x5999aca5u, ImmutableString("texelFetchOffset(0K2C0C1C").hash32());
ASSERT_EQ(0x22a80e3du, ImmutableString("texelFetchOffset(0S2C0C1C").hash32());
ASSERT_EQ(0x0da46ec0u, ImmutableString("texelFetchOffset(0X2C0C1C").hash32());
ASSERT_EQ(0xe0101092u, ImmutableString("textureGradOffset(0H1B1B1B1C").hash32());
ASSERT_EQ(0xe707edcau, ImmutableString("textureGradOffset(0P1B1B1B1C").hash32());
ASSERT_EQ(0x098595d1u, ImmutableString("textureGradOffset(0U1B1B1B1C").hash32());
ASSERT_EQ(0x7da4e4cdu, ImmutableString("textureGradOffset(0I2B2B2B2C").hash32());
ASSERT_EQ(0xaf4ae965u, ImmutableString("textureGradOffset(0Q2B2B2B2C").hash32());
ASSERT_EQ(0xc5462e10u, ImmutableString("textureGradOffset(0V2B2B2B2C").hash32());
ASSERT_EQ(0xd04f80efu, ImmutableString("textureGradOffset(0Z2B1B1B1C").hash32());
ASSERT_EQ(0x2fd29b2cu, ImmutableString("textureGradOffset(0K2B1B1B1C").hash32());
ASSERT_EQ(0xa8f6aea4u, ImmutableString("textureGradOffset(0S2B1B1B1C").hash32());
ASSERT_EQ(0x4759a1c9u, ImmutableString("textureGradOffset(0X2B1B1B1C").hash32());
ASSERT_EQ(0x59e1f1f2u, ImmutableString("textureGradOffset(0b3B1B1B1C").hash32());
ASSERT_EQ(0xef12ada0u, ImmutableString("textureProjGradOffset(0H2B1B1B1C").hash32());
ASSERT_EQ(0x455afa58u, ImmutableString("textureProjGradOffset(0P2B1B1B1C").hash32());
ASSERT_EQ(0x96d47d37u, ImmutableString("textureProjGradOffset(0U2B1B1B1C").hash32());
ASSERT_EQ(0x469db0f5u, ImmutableString("textureProjGradOffset(0H3B1B1B1C").hash32());
ASSERT_EQ(0xcbf66d8du, ImmutableString("textureProjGradOffset(0P3B1B1B1C").hash32());
ASSERT_EQ(0x147c8362u, ImmutableString("textureProjGradOffset(0U3B1B1B1C").hash32());
ASSERT_EQ(0x574855cdu, ImmutableString("textureProjGradOffset(0I3B2B2B2C").hash32());
ASSERT_EQ(0x88ee5a65u, ImmutableString("textureProjGradOffset(0Q3B2B2B2C").hash32());
ASSERT_EQ(0x1830b4d0u, ImmutableString("textureProjGradOffset(0V3B2B2B2C").hash32());
ASSERT_EQ(0x8e47a097u, ImmutableString("textureProjGradOffset(0Z3B1B1B1C").hash32());
ASSERT_EQ(0xc336cfd3u, ImmutableString("texture(0L1B").hash32());
ASSERT_EQ(0x726d9e79u, ImmutableString("textureProj(0L2B").hash32());
ASSERT_EQ(0xc86a5444u, ImmutableString("textureProj(0L3B").hash32());
ASSERT_EQ(0x89b5d13eu, ImmutableString("textureSize(0L0C").hash32());
ASSERT_EQ(0xdce2d84eu, ImmutableString("texelFetch(0L1C0C").hash32());
ASSERT_EQ(0x75c877acu, ImmutableString("texture(0M1B").hash32());
ASSERT_EQ(0x5bcc4eaau, ImmutableString("textureProj(0M2B").hash32());
ASSERT_EQ(0x7dcec2c7u, ImmutableString("textureProj(0M3B").hash32());
ASSERT_EQ(0xb3da1777u, ImmutableString("rgb_2_yuv(2B0G").hash32());
ASSERT_EQ(0x7c291893u, ImmutableString("yuv_2_rgb(2B0G").hash32());
ASSERT_EQ(0x0be139b9u, ImmutableString("textureSize(0M0C").hash32());
ASSERT_EQ(0x404f56ddu, ImmutableString("texelFetch(0M1C0C").hash32());
ASSERT_EQ(0x19b1fbf8u, ImmutableString("gl_MaxVertexOutputVectors").hash32());
ASSERT_EQ(0x348a8ebfu, ImmutableString("gl_MaxFragmentInputVectors").hash32());
ASSERT_EQ(0x7b08fc96u, ImmutableString("gl_MinProgramTexelOffset").hash32());
ASSERT_EQ(0x206d8524u, ImmutableString("gl_MaxProgramTexelOffset").hash32());
ASSERT_EQ(0xaee18cb0u, ImmutableString("textureOffset(0H1B1C0B").hash32());
ASSERT_EQ(0xdfde92d8u, ImmutableString("textureOffset(0P1B1C0B").hash32());
ASSERT_EQ(0x563bd7d7u, ImmutableString("textureOffset(0U1B1C0B").hash32());
ASSERT_EQ(0xb07a78bfu, ImmutableString("textureOffset(0I2B2C0B").hash32());
ASSERT_EQ(0x112e5c27u, ImmutableString("textureOffset(0Q2B2C0B").hash32());
ASSERT_EQ(0x18e874deu, ImmutableString("textureOffset(0V2B2C0B").hash32());
ASSERT_EQ(0x522fa659u, ImmutableString("textureOffset(0Z2B1C0B").hash32());
ASSERT_EQ(0xc4f49a7eu, ImmutableString("textureOffset(0K2B1C0B").hash32());
ASSERT_EQ(0xddf5b9e6u, ImmutableString("textureOffset(0S2B1C0B").hash32());
ASSERT_EQ(0x305a9bdfu, ImmutableString("textureOffset(0X2B1C0B").hash32());
ASSERT_EQ(0xdf67b56eu, ImmutableString("textureProjOffset(0H2B1C0B").hash32());
ASSERT_EQ(0xec06a1b6u, ImmutableString("textureProjOffset(0P2B1C0B").hash32());
ASSERT_EQ(0xcae04b35u, ImmutableString("textureProjOffset(0U2B1C0B").hash32());
ASSERT_EQ(0xc44ccce7u, ImmutableString("textureProjOffset(0H3B1C0B").hash32());
ASSERT_EQ(0x7b1b7dcfu, ImmutableString("textureProjOffset(0P3B1C0B").hash32());
ASSERT_EQ(0x5ab4ebd4u, ImmutableString("textureProjOffset(0U3B1C0B").hash32());
ASSERT_EQ(0xd4ea75bbu, ImmutableString("textureProjOffset(0I3B2C0B").hash32());
ASSERT_EQ(0x7cb00963u, ImmutableString("textureProjOffset(0Q3B2C0B").hash32());
ASSERT_EQ(0x13b5a742u, ImmutableString("textureProjOffset(0V3B2C0B").hash32());
ASSERT_EQ(0xb1a6333du, ImmutableString("textureProjOffset(0Z3B1C0B").hash32());
ASSERT_EQ(0xde51954du, ImmutableString("texture(0H1B0B").hash32());
ASSERT_EQ(0x38c7ba95u, ImmutableString("texture(0P1B0B").hash32());
ASSERT_EQ(0x042a180au, ImmutableString("texture(0U1B0B").hash32());
ASSERT_EQ(0xfbe2aeddu, ImmutableString("texture(0I2B0B").hash32());
ASSERT_EQ(0x6c785ca5u, ImmutableString("texture(0Q2B0B").hash32());
ASSERT_EQ(0x43c5755cu, ImmutableString("texture(0V2B0B").hash32());
ASSERT_EQ(0xb92bf800u, ImmutableString("texture(0J2B0B").hash32());
ASSERT_EQ(0xe5810cc8u, ImmutableString("texture(0R2B0B").hash32());
ASSERT_EQ(0x7f200dc3u, ImmutableString("texture(0W2B0B").hash32());
ASSERT_EQ(0x875430c7u, ImmutableString("texture(0K2B0B").hash32());
ASSERT_EQ(0xa702218fu, ImmutableString("texture(0S2B0B").hash32());
ASSERT_EQ(0x1e7afc2eu, ImmutableString("texture(0X2B0B").hash32());
ASSERT_EQ(0xdf9fccd7u, ImmutableString("textureProj(0H2B0B").hash32());
ASSERT_EQ(0xa8305e3fu, ImmutableString("textureProj(0P2B0B").hash32());
ASSERT_EQ(0x3b7b4d8cu, ImmutableString("textureProj(0U2B0B").hash32());
ASSERT_EQ(0xcae3e8c6u, ImmutableString("textureProj(0H3B0B").hash32());
ASSERT_EQ(0x201ad4aeu, ImmutableString("textureProj(0P3B0B").hash32());
ASSERT_EQ(0x53bcaf1du, ImmutableString("textureProj(0U3B0B").hash32());
ASSERT_EQ(0x696b3b81u, ImmutableString("textureProj(0I3B0B").hash32());
ASSERT_EQ(0x4b4881e9u, ImmutableString("textureProj(0Q3B0B").hash32());
ASSERT_EQ(0xa9904518u, ImmutableString("textureProj(0V3B0B").hash32());
ASSERT_EQ(0x68d90930u, ImmutableString("texture(0Z2B0B").hash32());
ASSERT_EQ(0xf79abc24u, ImmutableString("texture(0a3B0B").hash32());
ASSERT_EQ(0x212162acu, ImmutableString("textureProj(0Z3B0B").hash32());
ASSERT_EQ(0x44531081u, ImmutableString("texture(0L1B0B").hash32());
ASSERT_EQ(0xfcf64e0bu, ImmutableString("textureProj(0L2B0B").hash32());
ASSERT_EQ(0x02c4537au, ImmutableString("textureProj(0L3B0B").hash32());
ASSERT_EQ(0x3171cee2u, ImmutableString("texture(0M1B0B").hash32());
ASSERT_EQ(0x3b753944u, ImmutableString("textureProj(0M2B0B").hash32());
ASSERT_EQ(0x14a54bb5u, ImmutableString("textureProj(0M3B0B").hash32());
ASSERT_EQ(0x30de4eebu, ImmutableString("dFdx(0B").hash32());
ASSERT_EQ(0x8edb114eu, ImmutableString("dFdx(1B").hash32());
ASSERT_EQ(0x80e34a09u, ImmutableString("dFdx(2B").hash32());
ASSERT_EQ(0x56e0c954u, ImmutableString("dFdx(3B").hash32());
ASSERT_EQ(0x2a65dfa6u, ImmutableString("dFdy(0B").hash32());
ASSERT_EQ(0x4c6853c3u, ImmutableString("dFdy(1B").hash32());
ASSERT_EQ(0x726ace2cu, ImmutableString("dFdy(2B").hash32());
ASSERT_EQ(0x9c6d4ee1u, ImmutableString("dFdy(3B").hash32());
ASSERT_EQ(0xa6cba313u, ImmutableString("fwidth(0B").hash32());
ASSERT_EQ(0x04c9f876u, ImmutableString("fwidth(1B").hash32());
ASSERT_EQ(0xf6d09e31u, ImmutableString("fwidth(2B").hash32());
ASSERT_EQ(0xccce1d7cu, ImmutableString("fwidth(3B").hash32());
ASSERT_EQ(0x88103c08u, ImmutableString("gl_FragDepth").hash32());
ASSERT_EQ(0x7e8a502du, ImmutableString("gl_InstanceID").hash32());
ASSERT_EQ(0xf39cf560u, ImmutableString("gl_VertexID").hash32());
ASSERT_EQ(0xec388c2du, ImmutableString("gl_ViewID_OVR").hash32());
ASSERT_EQ(0x2c852cb5u, ImmutableString("texture2D(0H1B").hash32());
ASSERT_EQ(0xd6d4ae73u, ImmutableString("texture2DProj(0H2B").hash32());
ASSERT_EQ(0xb4d23a56u, ImmutableString("texture2DProj(0H3B").hash32());
ASSERT_EQ(0x11ea9d29u, ImmutableString("textureCube(0J2B").hash32());
ASSERT_EQ(0xe7d17641u, ImmutableString("texture2D(0L1B").hash32());
ASSERT_EQ(0x5270451fu, ImmutableString("texture2DProj(0L2B").hash32());
ASSERT_EQ(0xb06d0782u, ImmutableString("texture2DProj(0L3B").hash32());
ASSERT_EQ(0x05cd2a61u, ImmutableString("texture2DRect(0N1B").hash32());
ASSERT_EQ(0xc97a55d7u, ImmutableString("texture2DRectProj(0N2B").hash32());
ASSERT_EQ(0xa777e1bau, ImmutableString("texture2DRectProj(0N3B").hash32());
ASSERT_EQ(0x72093d38u, ImmutableString("texture2DGradEXT(0H1B1B1B").hash32());
ASSERT_EQ(0xabd48fdcu, ImmutableString("texture2DProjGradEXT(0H2B1B1B").hash32());
ASSERT_EQ(0x33484f89u, ImmutableString("texture2DProjGradEXT(0H3B1B1B").hash32());
ASSERT_EQ(0x79171da6u, ImmutableString("textureCubeGradEXT(0J2B2B2B").hash32());
ASSERT_EQ(0xd87bae2bu, ImmutableString("gl_MaxVaryingVectors").hash32());
ASSERT_EQ(0x4153e697u, ImmutableString("gl_FragData").hash32());
ASSERT_EQ(0x9dae09f6u, ImmutableString("gl_SecondaryFragDataEXT").hash32());
ASSERT_EQ(0x86a48dcbu, ImmutableString("gl_FragDepthEXT").hash32());
ASSERT_EQ(0x8ee03ca7u, ImmutableString("texture2D(0H1B0B").hash32());
ASSERT_EQ(0x88cd05e1u, ImmutableString("texture2DProj(0H2B0B").hash32());
ASSERT_EQ(0x30daf170u, ImmutableString("texture2DProj(0H3B0B").hash32());
ASSERT_EQ(0xd649f15bu, ImmutableString("textureCube(0J2B0B").hash32());
ASSERT_EQ(0x8682af79u, ImmutableString("texture2DLodEXT(0H1B0B").hash32());
ASSERT_EQ(0xc117a53fu, ImmutableString("texture2DProjLodEXT(0H2B0B").hash32());
ASSERT_EQ(0x39021baeu, ImmutableString("texture2DProjLodEXT(0H3B0B").hash32());
ASSERT_EQ(0x43f81965u, ImmutableString("textureCubeLodEXT(0J2B0B").hash32());
ASSERT_EQ(0x1af4d39eu, ImmutableString("gl_FragColor").hash32());
ASSERT_EQ(0x0cf3085au, ImmutableString("texture2DLod(0H1B0B").hash32());
ASSERT_EQ(0x8ea43616u, ImmutableString("texture2DProjLod(0H2B0B").hash32());
ASSERT_EQ(0x157c8b27u, ImmutableString("texture2DProjLod(0H3B0B").hash32());
ASSERT_EQ(0x8238ae88u, ImmutableString("textureCubeLod(0J2B0B").hash32());
ASSERT_EQ(0xae48fef9u, ImmutableString("gl_SecondaryFragColorEXT").hash32());
ASSERT_EQ(0x2ca6b5f7u, ImmutableString("gl_LastFragData").hash32());
ASSERT_EQ(0x048d047eu, ImmutableString("gl_LastFragColor").hash32());
ASSERT_EQ(0xe1ad07e0u, ImmutableString("gl_LastFragColorARM").hash32());
ASSERT_EQ(0x5ff73ab9u, ImmutableString("radians(0B").hash32());
ASSERT_EQ(0xb5f58384u, ImmutableString("radians(1B").hash32());
ASSERT_EQ(0x8ff3091bu, ImmutableString("radians(2B").hash32());
ASSERT_EQ(0x6df094feu, ImmutableString("radians(3B").hash32());
ASSERT_EQ(0x57cd6fecu, ImmutableString("degrees(0B").hash32());
ASSERT_EQ(0x81cff0a1u, ImmutableString("degrees(1B").hash32());
ASSERT_EQ(0x0fc88166u, ImmutableString("degrees(2B").hash32());
ASSERT_EQ(0x31caf583u, ImmutableString("degrees(3B").hash32());
ASSERT_EQ(0x8a07b54du, ImmutableString("sin(0B").hash32());
ASSERT_EQ(0x60053498u, ImmutableString("sin(1B").hash32());
ASSERT_EQ(0xba0383afu, ImmutableString("sin(2B").hash32());
ASSERT_EQ(0x98010f92u, ImmutableString("sin(3B").hash32());
ASSERT_EQ(0xcff55532u, ImmutableString("cos(0B").hash32());
ASSERT_EQ(0xf1f7c94fu, ImmutableString("cos(1B").hash32());
ASSERT_EQ(0x17fa43b8u, ImmutableString("cos(2B").hash32());
ASSERT_EQ(0x41fcc46du, ImmutableString("cos(3B").hash32());
ASSERT_EQ(0xee8ac486u, ImmutableString("tan(0B").hash32());
ASSERT_EQ(0x108d38a3u, ImmutableString("tan(1B").hash32());
ASSERT_EQ(0xb6907c8cu, ImmutableString("tan(2B").hash32());
ASSERT_EQ(0xe092fd41u, ImmutableString("tan(3B").hash32());
ASSERT_EQ(0x95a6e964u, ImmutableString("asin(0B").hash32());
ASSERT_EQ(0xbfa96a19u, ImmutableString("asin(1B").hash32());
ASSERT_EQ(0xcda2c45eu, ImmutableString("asin(2B").hash32());
ASSERT_EQ(0xefa5387bu, ImmutableString("asin(3B").hash32());
ASSERT_EQ(0x5f31e247u, ImmutableString("acos(0B").hash32());
ASSERT_EQ(0x3d2f6e2au, ImmutableString("acos(1B").hash32());
ASSERT_EQ(0x2f3613e5u, ImmutableString("acos(2B").hash32());
ASSERT_EQ(0x05339330u, ImmutableString("acos(3B").hash32());
ASSERT_EQ(0x82c5e6d5u, ImmutableString("atan(0B0B").hash32());
ASSERT_EQ(0x54d4c019u, ImmutableString("atan(1B1B").hash32());
ASSERT_EQ(0xdeb59d35u, ImmutableString("atan(2B2B").hash32());
ASSERT_EQ(0x0548e241u, ImmutableString("atan(3B3B").hash32());
ASSERT_EQ(0x8e3d93a7u, ImmutableString("atan(0B").hash32());
ASSERT_EQ(0x6c3b1f8au, ImmutableString("atan(1B").hash32());
ASSERT_EQ(0x5e435845u, ImmutableString("atan(2B").hash32());
ASSERT_EQ(0xb4400e10u, ImmutableString("atan(3B").hash32());
ASSERT_EQ(0xd4d6b527u, ImmutableString("pow(0B0B").hash32());
ASSERT_EQ(0x7000d433u, ImmutableString("pow(1B1B").hash32());
ASSERT_EQ(0x60d77e47u, ImmutableString("pow(2B2B").hash32());
ASSERT_EQ(0x31a9230bu, ImmutableString("pow(3B3B").hash32());
ASSERT_EQ(0xb3a5e896u, ImmutableString("exp(0B").hash32());
ASSERT_EQ(0xd5a85cb3u, ImmutableString("exp(1B").hash32());
ASSERT_EQ(0xfbaad71cu, ImmutableString("exp(2B").hash32());
ASSERT_EQ(0xa5ac8e51u, ImmutableString("exp(3B").hash32());
ASSERT_EQ(0x0b09eda9u, ImmutableString("log(0B").hash32());
ASSERT_EQ(0x6106a374u, ImmutableString("log(1B").hash32());
ASSERT_EQ(0x3b04290bu, ImmutableString("log(2B").hash32());
ASSERT_EQ(0x1901b4eeu, ImmutableString("log(3B").hash32());
ASSERT_EQ(0x3a43c8ecu, ImmutableString("exp2(0B").hash32());
ASSERT_EQ(0x644649a1u, ImmutableString("exp2(1B").hash32());
ASSERT_EQ(0xf23eda66u, ImmutableString("exp2(2B").hash32());
ASSERT_EQ(0x14414e83u, ImmutableString("exp2(3B").hash32());
ASSERT_EQ(0xebeb54f1u, ImmutableString("log2(0B").hash32());
ASSERT_EQ(0xc1e8d43cu, ImmutableString("log2(1B").hash32());
ASSERT_EQ(0x9be659d3u, ImmutableString("log2(2B").hash32());
ASSERT_EQ(0xf9e31c36u, ImmutableString("log2(3B").hash32());
ASSERT_EQ(0x1a10ccb7u, ImmutableString("sqrt(0B").hash32());
ASSERT_EQ(0x780d8f1au, ImmutableString("sqrt(1B").hash32());
ASSERT_EQ(0x6a15c7d5u, ImmutableString("sqrt(2B").hash32());
ASSERT_EQ(0x40134720u, ImmutableString("sqrt(3B").hash32());
ASSERT_EQ(0xe50d8305u, ImmutableString("inversesqrt(0B").hash32());
ASSERT_EQ(0x3b0bcbd0u, ImmutableString("inversesqrt(1B").hash32());
ASSERT_EQ(0x15095167u, ImmutableString("inversesqrt(2B").hash32());
ASSERT_EQ(0xf306dd4au, ImmutableString("inversesqrt(3B").hash32());
ASSERT_EQ(0x11769f9bu, ImmutableString("abs(0B").hash32());
ASSERT_EQ(0xef742b7eu, ImmutableString("abs(1B").hash32());
ASSERT_EQ(0xe17ad139u, ImmutableString("abs(2B").hash32());
ASSERT_EQ(0x37791a04u, ImmutableString("abs(3B").hash32());
ASSERT_EQ(0xba70875au, ImmutableString("sign(0B").hash32());
ASSERT_EQ(0x5c7231f7u, ImmutableString("sign(1B").hash32());
ASSERT_EQ(0x8274ac60u, ImmutableString("sign(2B").hash32());
ASSERT_EQ(0xac772d15u, ImmutableString("sign(3B").hash32());
ASSERT_EQ(0x68b063ddu, ImmutableString("floor(0B").hash32());
ASSERT_EQ(0xbead19a8u, ImmutableString("floor(1B").hash32());
ASSERT_EQ(0x98aa9f3fu, ImmutableString("floor(2B").hash32());
ASSERT_EQ(0x76a82b22u, ImmutableString("floor(3B").hash32());
ASSERT_EQ(0x4dc29736u, ImmutableString("ceil(0B").hash32());
ASSERT_EQ(0xefc5d4d3u, ImmutableString("ceil(1B").hash32());
ASSERT_EQ(0x15c84f3cu, ImmutableString("ceil(2B").hash32());
ASSERT_EQ(0x3fcacff1u, ImmutableString("ceil(3B").hash32());
ASSERT_EQ(0x061a7a4fu, ImmutableString("fract(0B").hash32());
ASSERT_EQ(0xe4180632u, ImmutableString("fract(1B").hash32());
ASSERT_EQ(0x561f756du, ImmutableString("fract(2B").hash32());
ASSERT_EQ(0x2c1cf4b8u, ImmutableString("fract(3B").hash32());
ASSERT_EQ(0xed15f051u, ImmutableString("mod(0B0B").hash32());
ASSERT_EQ(0x13e5dde0u, ImmutableString("mod(1B0B").hash32());
ASSERT_EQ(0x046a9b13u, ImmutableString("mod(2B0B").hash32());
ASSERT_EQ(0xbca39522u, ImmutableString("mod(3B0B").hash32());
ASSERT_EQ(0x3de85e95u, ImmutableString("mod(1B1B").hash32());
ASSERT_EQ(0x546f9631u, ImmutableString("mod(2B2B").hash32());
ASSERT_EQ(0xaeabcdddu, ImmutableString("mod(3B3B").hash32());
ASSERT_EQ(0x3b8c728du, ImmutableString("min(0B0B").hash32());
ASSERT_EQ(0x23497dfcu, ImmutableString("min(1B0B").hash32());
ASSERT_EQ(0xc777f74fu, ImmutableString("min(2B0B").hash32());
ASSERT_EQ(0xcc07353eu, ImmutableString("min(3B0B").hash32());
ASSERT_EQ(0x4d4bfeb1u, ImmutableString("min(1B1B").hash32());
ASSERT_EQ(0x177cf26du, ImmutableString("min(2B2B").hash32());
ASSERT_EQ(0xbe0f6df9u, ImmutableString("min(3B3B").hash32());
ASSERT_EQ(0xe7f2b603u, ImmutableString("max(0B0B").hash32());
ASSERT_EQ(0xa02bb012u, ImmutableString("max(1B0B").hash32());
ASSERT_EQ(0xd09e0b41u, ImmutableString("max(2B0B").hash32());
ASSERT_EQ(0x6ac79e50u, ImmutableString("max(3B0B").hash32());
ASSERT_EQ(0xc22e242fu, ImmutableString("max(1B1B").hash32());
ASSERT_EQ(0x009846a3u, ImmutableString("max(2B2B").hash32());
ASSERT_EQ(0x44c523e7u, ImmutableString("max(3B3B").hash32());
ASSERT_EQ(0xbe16c602u, ImmutableString("clamp(0B0B0B").hash32());
ASSERT_EQ(0x5e39910fu, ImmutableString("clamp(1B0B0B").hash32());
ASSERT_EQ(0xccc2d6c8u, ImmutableString("clamp(2B0B0B").hash32());
ASSERT_EQ(0xb154856du, ImmutableString("clamp(3B0B0B").hash32());
ASSERT_EQ(0x6b80211bu, ImmutableString("clamp(1B1B1B").hash32());
ASSERT_EQ(0xf0909e70u, ImmutableString("clamp(2B2B2B").hash32());
ASSERT_EQ(0x33d780d9u, ImmutableString("clamp(3B3B3B").hash32());
ASSERT_EQ(0xb5c1d059u, ImmutableString("mix(0B0B0B").hash32());
ASSERT_EQ(0x1f8d8da5u, ImmutableString("mix(1B1B0B").hash32());
ASSERT_EQ(0x60348539u, ImmutableString("mix(2B2B0B").hash32());
ASSERT_EQ(0xc398271du, ImmutableString("mix(3B3B0B").hash32());
ASSERT_EQ(0xf58b0cf0u, ImmutableString("mix(1B1B1B").hash32());
ASSERT_EQ(0x9030539bu, ImmutableString("mix(2B2B2B").hash32());
ASSERT_EQ(0xd1918162u, ImmutableString("mix(3B3B3B").hash32());
ASSERT_EQ(0xccdc3d05u, ImmutableString("step(0B0B").hash32());
ASSERT_EQ(0x92458549u, ImmutableString("step(1B1B").hash32());
ASSERT_EQ(0x35731765u, ImmutableString("step(2B2B").hash32());
ASSERT_EQ(0xcf6001f1u, ImmutableString("step(3B3B").hash32());
ASSERT_EQ(0x22da85d0u, ImmutableString("step(0B1B").hash32());
ASSERT_EQ(0xfcd80b67u, ImmutableString("step(0B2B").hash32());
ASSERT_EQ(0xdad5974au, ImmutableString("step(0B3B").hash32());
ASSERT_EQ(0xbdc5079du, ImmutableString("smoothstep(0B0B0B").hash32());
ASSERT_EQ(0x29eb2c34u, ImmutableString("smoothstep(1B1B1B").hash32());
ASSERT_EQ(0x45ccdddfu, ImmutableString("smoothstep(2B2B2B").hash32());
ASSERT_EQ(0x372206a6u, ImmutableString("smoothstep(3B3B3B").hash32());
ASSERT_EQ(0x13c35068u, ImmutableString("smoothstep(0B0B1B").hash32());
ASSERT_EQ(0xedc0d5ffu, ImmutableString("smoothstep(0B0B2B").hash32());
ASSERT_EQ(0xcbbe61e2u, ImmutableString("smoothstep(0B0B3B").hash32());
ASSERT_EQ(0x1731e675u, ImmutableString("length(0B").hash32());
ASSERT_EQ(0xed2f65c0u, ImmutableString("length(1B").hash32());
ASSERT_EQ(0x472c21d7u, ImmutableString("length(2B").hash32());
ASSERT_EQ(0x2529adbau, ImmutableString("length(3B").hash32());
ASSERT_EQ(0x97b032ceu, ImmutableString("distance(0B0B").hash32());
ASSERT_EQ(0xfdc4db42u, ImmutableString("distance(1B1B").hash32());
ASSERT_EQ(0x1a473286u, ImmutableString("distance(2B2B").hash32());
ASSERT_EQ(0x0887a662u, ImmutableString("distance(3B3B").hash32());
ASSERT_EQ(0xa05f6bc8u, ImmutableString("dot(0B0B").hash32());
ASSERT_EQ(0x41aa3804u, ImmutableString("dot(1B1B").hash32());
ASSERT_EQ(0xc42d3370u, ImmutableString("dot(2B2B").hash32());
ASSERT_EQ(0x2a4048e4u, ImmutableString("dot(3B3B").hash32());
ASSERT_EQ(0x4c9b39c9u, ImmutableString("cross(2B2B").hash32());
ASSERT_EQ(0xa2e83502u, ImmutableString("normalize(0B").hash32());
ASSERT_EQ(0x44eb729fu, ImmutableString("normalize(1B").hash32());
ASSERT_EQ(0x6aeded08u, ImmutableString("normalize(2B").hash32());
ASSERT_EQ(0x94f06dbdu, ImmutableString("normalize(3B").hash32());
ASSERT_EQ(0xfa8639d9u, ImmutableString("faceforward(0B0B0B").hash32());
ASSERT_EQ(0x3a4f7670u, ImmutableString("faceforward(1B1B1B").hash32());
ASSERT_EQ(0xd4f4bd1bu, ImmutableString("faceforward(2B2B2B").hash32());
ASSERT_EQ(0x1655eae2u, ImmutableString("faceforward(3B3B3B").hash32());
ASSERT_EQ(0x641f1576u, ImmutableString("reflect(0B0B").hash32());
ASSERT_EQ(0xca322aeau, ImmutableString("reflect(1B1B").hash32());
ASSERT_EQ(0x40514dceu, ImmutableString("reflect(2B2B").hash32());
ASSERT_EQ(0x619b508au, ImmutableString("reflect(3B3B").hash32());
ASSERT_EQ(0x762ec4e2u, ImmutableString("refract(0B0B0B").hash32());
ASSERT_EQ(0x0c4b44deu, ImmutableString("refract(1B1B0B").hash32());
ASSERT_EQ(0x3446c6cau, ImmutableString("refract(2B2B0B").hash32());
ASSERT_EQ(0x343e737eu, ImmutableString("refract(3B3B0B").hash32());
ASSERT_EQ(0x2530925bu, ImmutableString("matrixCompMult(5B5B").hash32());
ASSERT_EQ(0xce0b0283u, ImmutableString("matrixCompMult(ABAB").hash32());
ASSERT_EQ(0x646d7617u, ImmutableString("matrixCompMult(FBFB").hash32());
ASSERT_EQ(0x35d2bc55u, ImmutableString("lessThan(1B1B").hash32());
ASSERT_EQ(0x4c59f3f1u, ImmutableString("lessThan(2B2B").hash32());
ASSERT_EQ(0xa694989du, ImmutableString("lessThan(3B3B").hash32());
ASSERT_EQ(0x69652f41u, ImmutableString("lessThan(1C1C").hash32());
ASSERT_EQ(0xf707f2d5u, ImmutableString("lessThan(2C2C").hash32());
ASSERT_EQ(0x421d21e5u, ImmutableString("lessThan(3C3C").hash32());
ASSERT_EQ(0xbb7abcffu, ImmutableString("lessThanEqual(1B1B").hash32());
ASSERT_EQ(0xf9e4df73u, ImmutableString("lessThanEqual(2B2B").hash32());
ASSERT_EQ(0xcab81737u, ImmutableString("lessThanEqual(3B3B").hash32());
ASSERT_EQ(0xef0d2febu, ImmutableString("lessThanEqual(1C1C").hash32());
ASSERT_EQ(0x931af97fu, ImmutableString("lessThanEqual(2C2C").hash32());
ASSERT_EQ(0x965473c7u, ImmutableString("lessThanEqual(3C3C").hash32());
ASSERT_EQ(0x2e4fef86u, ImmutableString("greaterThan(1B1B").hash32());
ASSERT_EQ(0xa46f126au, ImmutableString("greaterThan(2B2B").hash32());
ASSERT_EQ(0x525f6fa6u, ImmutableString("greaterThan(3B3B").hash32());
ASSERT_EQ(0xb9cf953au, ImmutableString("greaterThan(1C1C").hash32());
ASSERT_EQ(0xba1060a6u, ImmutableString("greaterThan(2C2C").hash32());
ASSERT_EQ(0x36d7afdeu, ImmutableString("greaterThan(3C3C").hash32());
ASSERT_EQ(0x98571f82u, ImmutableString("greaterThanEqual(1B1B").hash32());
ASSERT_EQ(0xce27bec6u, ImmutableString("greaterThanEqual(2B2B").hash32());
ASSERT_EQ(0xbc669fa2u, ImmutableString("greaterThanEqual(3B3B").hash32());
ASSERT_EQ(0xe3884196u, ImmutableString("greaterThanEqual(1C1C").hash32());
ASSERT_EQ(0x63c84382u, ImmutableString("greaterThanEqual(2C2C").hash32());
ASSERT_EQ(0xa0dedfdau, ImmutableString("greaterThanEqual(3C3C").hash32());
ASSERT_EQ(0xf68b9ca9u, ImmutableString("equal(1B1B").hash32());
ASSERT_EQ(0x99b92ec5u, ImmutableString("equal(2B2B").hash32());
ASSERT_EQ(0x34e1bad1u, ImmutableString("equal(3B3B").hash32());
ASSERT_EQ(0xab5a7a95u, ImmutableString("equal(1C1C").hash32());
ASSERT_EQ(0x8417e089u, ImmutableString("equal(2C2C").hash32());
ASSERT_EQ(0xd06a4419u, ImmutableString("equal(3C3C").hash32());
ASSERT_EQ(0xeba3b9c1u, ImmutableString("equal(1E1E").hash32());
ASSERT_EQ(0xdc6a3fd9u, ImmutableString("equal(2E2E").hash32());
ASSERT_EQ(0x242c7b45u, ImmutableString("equal(3E3E").hash32());
ASSERT_EQ(0x58ce58e6u, ImmutableString("notEqual(1B1B").hash32());
ASSERT_EQ(0xb5a0c6cau, ImmutableString("notEqual(2B2B").hash32());
ASSERT_EQ(0x7173e986u, ImmutableString("notEqual(3B3B").hash32());
ASSERT_EQ(0x658a699au, ImmutableString("notEqual(1C1C").hash32());
ASSERT_EQ(0x4c7e8006u, ImmutableString("notEqual(2C2C").hash32());
ASSERT_EQ(0xd5eb603eu, ImmutableString("notEqual(3C3C").hash32());
ASSERT_EQ(0x1da7dd5eu, ImmutableString("notEqual(1E1E").hash32());
ASSERT_EQ(0x2ba422c6u, ImmutableString("notEqual(2E2E").hash32());
ASSERT_EQ(0x785bc622u, ImmutableString("notEqual(3E3E").hash32());
ASSERT_EQ(0x32a4419du, ImmutableString("any(1E").hash32());
ASSERT_EQ(0x82a280f6u, ImmutableString("any(2E").hash32());
ASSERT_EQ(0x5ea009b3u, ImmutableString("any(3E").hash32());
ASSERT_EQ(0x0f84439eu, ImmutableString("all(1E").hash32());
ASSERT_EQ(0xbf879745u, ImmutableString("all(2E").hash32());
ASSERT_EQ(0xdb8a01f0u, ImmutableString("all(3E").hash32());
ASSERT_EQ(0xde93f470u, ImmutableString("not(1E").hash32());
ASSERT_EQ(0xee8bbedbu, ImmutableString("not(2E").hash32());
ASSERT_EQ(0x128e361eu, ImmutableString("not(3E").hash32());
ASSERT_EQ(0xdcd239f5u, ImmutableString("gl_DepthRangeParameters").hash32());
ASSERT_EQ(0x5c63b321u, ImmutableString("gl_DepthRange").hash32());
ASSERT_EQ(0x5a89e3d6u, ImmutableString("gl_MaxVertexAttribs").hash32());
ASSERT_EQ(0x6b620a41u, ImmutableString("gl_MaxVertexUniformVectors").hash32());
ASSERT_EQ(0x42355230u, ImmutableString("gl_MaxVertexTextureImageUnits").hash32());
ASSERT_EQ(0x081f826fu, ImmutableString("gl_MaxCombinedTextureImageUnits").hash32());
ASSERT_EQ(0x5625f9cau, ImmutableString("gl_MaxTextureImageUnits").hash32());
ASSERT_EQ(0x89745003u, ImmutableString("gl_MaxFragmentUniformVectors").hash32());
ASSERT_EQ(0x55895c64u, ImmutableString("gl_MaxDrawBuffers").hash32());
ASSERT_EQ(0x3de18904u, ImmutableString("gl_MaxDualSourceDrawBuffersEXT").hash32());
ASSERT_EQ(0x99ac8d74u, ImmutableString("gl_FragCoord").hash32());
ASSERT_EQ(0x6024403cu, ImmutableString("gl_FrontFacing").hash32());
ASSERT_EQ(0x86d91640u, ImmutableString("gl_PointCoord").hash32());
ASSERT_EQ(0x70b0d69au, ImmutableString("gl_PointSize").hash32());
}
} // namespace sh
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment