/* 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 32725.
 */
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*							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>	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); }
