/* WARNING: This is auto-generated file. Do not modify, since changes will
 * be lost! Modify the generating script instead.
 *
 * Generated from Khronos EGL API description (egl.xml) revision 28861.
 */
const char*							getBooleanName				(int value);
const char*							getBoolDontCareName			(int value);
const char*							getAPIName					(int value);
const char*							getErrorName				(int value);
const char*							getContextAttribName		(int value);
const char*							getConfigAttribName			(int value);
const char*							getSurfaceAttribName		(int value);
const char*							getSurfaceTargetName		(int value);
const char*							getColorBufferTypeName		(int value);
const char*							getConfigCaveatName			(int value);
const char*							getTransparentTypeName		(int value);
const char*							getMultisampleResolveName	(int value);
const char*							getRenderBufferName			(int value);
const char*							getSwapBehaviorName			(int value);
const char*							getTextureFormatName		(int value);
const char*							getTextureTargetName		(int value);
const char*							getAlphaFormatName			(int value);
const char*							getColorspaceName			(int value);
tcu::Format::Bitfield<16>			getAPIBitsStr				(int value);
tcu::Format::Bitfield<16>			getSurfaceBitsStr			(int value);
inline tcu::Format::Enum<int, 2>	getBooleanStr				(int value)		{ return tcu::Format::Enum<int, 2>(getBooleanName, value); }
inline tcu::Format::Enum<int, 2>	getBoolDontCareStr			(int value)		{ return tcu::Format::Enum<int, 2>(getBoolDontCareName, value); }
inline tcu::Format::Enum<int, 2>	getAPIStr					(int value)		{ return tcu::Format::Enum<int, 2>(getAPIName, value); }
inline tcu::Format::Enum<int, 2>	getErrorStr					(int value)		{ return tcu::Format::Enum<int, 2>(getErrorName, value); }
inline tcu::Format::Enum<int, 2>	getContextAttribStr			(int value)		{ return tcu::Format::Enum<int, 2>(getContextAttribName, value); }
inline tcu::Format::Enum<int, 2>	getConfigAttribStr			(int value)		{ return tcu::Format::Enum<int, 2>(getConfigAttribName, value); }
inline tcu::Format::Enum<int, 2>	getSurfaceAttribStr			(int value)		{ return tcu::Format::Enum<int, 2>(getSurfaceAttribName, value); }
inline tcu::Format::Enum<int, 2>	getSurfaceTargetStr			(int value)		{ return tcu::Format::Enum<int, 2>(getSurfaceTargetName, value); }
inline tcu::Format::Enum<int, 2>	getColorBufferTypeStr		(int value)		{ return tcu::Format::Enum<int, 2>(getColorBufferTypeName, value); }
inline tcu::Format::Enum<int, 2>	getConfigCaveatStr			(int value)		{ return tcu::Format::Enum<int, 2>(getConfigCaveatName, value); }
inline tcu::Format::Enum<int, 2>	getTransparentTypeStr		(int value)		{ return tcu::Format::Enum<int, 2>(getTransparentTypeName, value); }
inline tcu::Format::Enum<int, 2>	getMultisampleResolveStr	(int value)		{ return tcu::Format::Enum<int, 2>(getMultisampleResolveName, value); }
inline tcu::Format::Enum<int, 2>	getRenderBufferStr			(int value)		{ return tcu::Format::Enum<int, 2>(getRenderBufferName, value); }
inline tcu::Format::Enum<int, 2>	getSwapBehaviorStr			(int value)		{ return tcu::Format::Enum<int, 2>(getSwapBehaviorName, value); }
inline tcu::Format::Enum<int, 2>	getTextureFormatStr			(int value)		{ return tcu::Format::Enum<int, 2>(getTextureFormatName, value); }
inline tcu::Format::Enum<int, 2>	getTextureTargetStr			(int value)		{ return tcu::Format::Enum<int, 2>(getTextureTargetName, value); }
inline tcu::Format::Enum<int, 2>	getAlphaFormatStr			(int value)		{ return tcu::Format::Enum<int, 2>(getAlphaFormatName, value); }
inline tcu::Format::Enum<int, 2>	getColorspaceStr			(int value)		{ return tcu::Format::Enum<int, 2>(getColorspaceName, value); }
