/* 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 33315.
 */
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*							getYuvOrderName				(int value);
const char*							getYuvPlaneBppName			(int value);
const char*							getColorComponentTypeName	(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>	getYuvOrderStr				(int value)		{ return tcu::Format::Enum<int, 2>(getYuvOrderName, value); }
inline tcu::Format::Enum<int, 2>	getYuvPlaneBppStr			(int value)		{ return tcu::Format::Enum<int, 2>(getYuvPlaneBppName, value); }
inline tcu::Format::Enum<int, 2>	getColorComponentTypeStr	(int value)		{ return tcu::Format::Enum<int, 2>(getColorComponentTypeName, 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); }
