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