/* 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)
{
	switch (value)
	{
		case EGL_TRUE:	return "EGL_TRUE";
		case EGL_FALSE:	return "EGL_FALSE";
		default:		return DE_NULL;
	}
}

const char* getBoolDontCareName (int value)
{
	switch (value)
	{
		case EGL_TRUE:		return "EGL_TRUE";
		case EGL_FALSE:		return "EGL_FALSE";
		case EGL_DONT_CARE:	return "EGL_DONT_CARE";
		default:			return DE_NULL;
	}
}

const char* getAPIName (int value)
{
	switch (value)
	{
		case EGL_OPENGL_API:	return "EGL_OPENGL_API";
		case EGL_OPENGL_ES_API:	return "EGL_OPENGL_ES_API";
		case EGL_OPENVG_API:	return "EGL_OPENVG_API";
		default:				return DE_NULL;
	}
}

const char* getErrorName (int value)
{
	switch (value)
	{
		case EGL_SUCCESS:				return "EGL_SUCCESS";
		case EGL_NOT_INITIALIZED:		return "EGL_NOT_INITIALIZED";
		case EGL_BAD_ACCESS:			return "EGL_BAD_ACCESS";
		case EGL_BAD_ALLOC:				return "EGL_BAD_ALLOC";
		case EGL_BAD_ATTRIBUTE:			return "EGL_BAD_ATTRIBUTE";
		case EGL_BAD_CONFIG:			return "EGL_BAD_CONFIG";
		case EGL_BAD_CONTEXT:			return "EGL_BAD_CONTEXT";
		case EGL_BAD_CURRENT_SURFACE:	return "EGL_BAD_CURRENT_SURFACE";
		case EGL_BAD_DISPLAY:			return "EGL_BAD_DISPLAY";
		case EGL_BAD_MATCH:				return "EGL_BAD_MATCH";
		case EGL_BAD_NATIVE_PIXMAP:		return "EGL_BAD_NATIVE_PIXMAP";
		case EGL_BAD_NATIVE_WINDOW:		return "EGL_BAD_NATIVE_WINDOW";
		case EGL_BAD_PARAMETER:			return "EGL_BAD_PARAMETER";
		case EGL_BAD_SURFACE:			return "EGL_BAD_SURFACE";
		case EGL_CONTEXT_LOST:			return "EGL_CONTEXT_LOST";
		default:						return DE_NULL;
	}
}

const char* getContextAttribName (int value)
{
	switch (value)
	{
		case EGL_CONFIG_ID:					return "EGL_CONFIG_ID";
		case EGL_CONTEXT_CLIENT_TYPE:		return "EGL_CONTEXT_CLIENT_TYPE";
		case EGL_CONTEXT_CLIENT_VERSION:	return "EGL_CONTEXT_CLIENT_VERSION";
		case EGL_RENDER_BUFFER:				return "EGL_RENDER_BUFFER";
		default:							return DE_NULL;
	}
}

const char* getConfigAttribName (int value)
{
	switch (value)
	{
		case EGL_BUFFER_SIZE:				return "EGL_BUFFER_SIZE";
		case EGL_RED_SIZE:					return "EGL_RED_SIZE";
		case EGL_GREEN_SIZE:				return "EGL_GREEN_SIZE";
		case EGL_BLUE_SIZE:					return "EGL_BLUE_SIZE";
		case EGL_LUMINANCE_SIZE:			return "EGL_LUMINANCE_SIZE";
		case EGL_ALPHA_SIZE:				return "EGL_ALPHA_SIZE";
		case EGL_ALPHA_MASK_SIZE:			return "EGL_ALPHA_MASK_SIZE";
		case EGL_BIND_TO_TEXTURE_RGB:		return "EGL_BIND_TO_TEXTURE_RGB";
		case EGL_BIND_TO_TEXTURE_RGBA:		return "EGL_BIND_TO_TEXTURE_RGBA";
		case EGL_COLOR_BUFFER_TYPE:			return "EGL_COLOR_BUFFER_TYPE";
		case EGL_CONFIG_CAVEAT:				return "EGL_CONFIG_CAVEAT";
		case EGL_CONFIG_ID:					return "EGL_CONFIG_ID";
		case EGL_CONFORMANT:				return "EGL_CONFORMANT";
		case EGL_DEPTH_SIZE:				return "EGL_DEPTH_SIZE";
		case EGL_LEVEL:						return "EGL_LEVEL";
		case EGL_MATCH_NATIVE_PIXMAP:		return "EGL_MATCH_NATIVE_PIXMAP";
		case EGL_MAX_SWAP_INTERVAL:			return "EGL_MAX_SWAP_INTERVAL";
		case EGL_MIN_SWAP_INTERVAL:			return "EGL_MIN_SWAP_INTERVAL";
		case EGL_NATIVE_RENDERABLE:			return "EGL_NATIVE_RENDERABLE";
		case EGL_NATIVE_VISUAL_TYPE:		return "EGL_NATIVE_VISUAL_TYPE";
		case EGL_RENDERABLE_TYPE:			return "EGL_RENDERABLE_TYPE";
		case EGL_SAMPLE_BUFFERS:			return "EGL_SAMPLE_BUFFERS";
		case EGL_SAMPLES:					return "EGL_SAMPLES";
		case EGL_STENCIL_SIZE:				return "EGL_STENCIL_SIZE";
		case EGL_SURFACE_TYPE:				return "EGL_SURFACE_TYPE";
		case EGL_TRANSPARENT_TYPE:			return "EGL_TRANSPARENT_TYPE";
		case EGL_TRANSPARENT_RED_VALUE:		return "EGL_TRANSPARENT_RED_VALUE";
		case EGL_TRANSPARENT_GREEN_VALUE:	return "EGL_TRANSPARENT_GREEN_VALUE";
		case EGL_TRANSPARENT_BLUE_VALUE:	return "EGL_TRANSPARENT_BLUE_VALUE";
		default:							return DE_NULL;
	}
}

const char* getSurfaceAttribName (int value)
{
	switch (value)
	{
		case EGL_CONFIG_ID:				return "EGL_CONFIG_ID";
		case EGL_WIDTH:					return "EGL_WIDTH";
		case EGL_HEIGHT:				return "EGL_HEIGHT";
		case EGL_HORIZONTAL_RESOLUTION:	return "EGL_HORIZONTAL_RESOLUTION";
		case EGL_VERTICAL_RESOLUTION:	return "EGL_VERTICAL_RESOLUTION";
		case EGL_LARGEST_PBUFFER:		return "EGL_LARGEST_PBUFFER";
		case EGL_MIPMAP_TEXTURE:		return "EGL_MIPMAP_TEXTURE";
		case EGL_MIPMAP_LEVEL:			return "EGL_MIPMAP_LEVEL";
		case EGL_MULTISAMPLE_RESOLVE:	return "EGL_MULTISAMPLE_RESOLVE";
		case EGL_PIXEL_ASPECT_RATIO:	return "EGL_PIXEL_ASPECT_RATIO";
		case EGL_RENDER_BUFFER:			return "EGL_RENDER_BUFFER";
		case EGL_SWAP_BEHAVIOR:			return "EGL_SWAP_BEHAVIOR";
		case EGL_TEXTURE_FORMAT:		return "EGL_TEXTURE_FORMAT";
		case EGL_TEXTURE_TARGET:		return "EGL_TEXTURE_TARGET";
		case EGL_ALPHA_FORMAT:			return "EGL_ALPHA_FORMAT";
		case EGL_COLORSPACE:			return "EGL_COLORSPACE";
		default:						return DE_NULL;
	}
}

const char* getYuvOrderName (int value)
{
	switch (value)
	{
		case EGL_NONE:					return "EGL_NONE";
		case EGL_YUV_ORDER_YUV_EXT:		return "EGL_YUV_ORDER_YUV_EXT";
		case EGL_YUV_ORDER_YVU_EXT:		return "EGL_YUV_ORDER_YVU_EXT";
		case EGL_YUV_ORDER_YUYV_EXT:	return "EGL_YUV_ORDER_YUYV_EXT";
		case EGL_YUV_ORDER_UYVY_EXT:	return "EGL_YUV_ORDER_UYVY_EXT";
		case EGL_YUV_ORDER_YVYU_EXT:	return "EGL_YUV_ORDER_YVYU_EXT";
		case EGL_YUV_ORDER_VYUY_EXT:	return "EGL_YUV_ORDER_VYUY_EXT";
		case EGL_YUV_ORDER_AYUV_EXT:	return "EGL_YUV_ORDER_AYUV_EXT";
		default:						return DE_NULL;
	}
}

const char* getYuvPlaneBppName (int value)
{
	switch (value)
	{
		case EGL_YUV_PLANE_BPP_0_EXT:	return "EGL_YUV_PLANE_BPP_0_EXT";
		case EGL_YUV_PLANE_BPP_8_EXT:	return "EGL_YUV_PLANE_BPP_8_EXT";
		case EGL_YUV_PLANE_BPP_10_EXT:	return "EGL_YUV_PLANE_BPP_10_EXT";
		default:						return DE_NULL;
	}
}

const char* getSurfaceTargetName (int value)
{
	switch (value)
	{
		case EGL_READ:	return "EGL_READ";
		case EGL_DRAW:	return "EGL_DRAW";
		default:		return DE_NULL;
	}
}

const char* getColorBufferTypeName (int value)
{
	switch (value)
	{
		case EGL_RGB_BUFFER:		return "EGL_RGB_BUFFER";
		case EGL_LUMINANCE_BUFFER:	return "EGL_LUMINANCE_BUFFER";
		default:					return DE_NULL;
	}
}

const char* getConfigCaveatName (int value)
{
	switch (value)
	{
		case EGL_NONE:					return "EGL_NONE";
		case EGL_SLOW_CONFIG:			return "EGL_SLOW_CONFIG";
		case EGL_NON_CONFORMANT_CONFIG:	return "EGL_NON_CONFORMANT_CONFIG";
		default:						return DE_NULL;
	}
}

const char* getTransparentTypeName (int value)
{
	switch (value)
	{
		case EGL_NONE:				return "EGL_NONE";
		case EGL_TRANSPARENT_RGB:	return "EGL_TRANSPARENT_RGB";
		default:					return DE_NULL;
	}
}

const char* getMultisampleResolveName (int value)
{
	switch (value)
	{
		case EGL_MULTISAMPLE_RESOLVE_DEFAULT:	return "EGL_MULTISAMPLE_RESOLVE_DEFAULT";
		case EGL_MULTISAMPLE_RESOLVE_BOX:		return "EGL_MULTISAMPLE_RESOLVE_BOX";
		default:								return DE_NULL;
	}
}

const char* getRenderBufferName (int value)
{
	switch (value)
	{
		case EGL_SINGLE_BUFFER:	return "EGL_SINGLE_BUFFER";
		case EGL_BACK_BUFFER:	return "EGL_BACK_BUFFER";
		default:				return DE_NULL;
	}
}

const char* getSwapBehaviorName (int value)
{
	switch (value)
	{
		case EGL_BUFFER_DESTROYED:	return "EGL_BUFFER_DESTROYED";
		case EGL_BUFFER_PRESERVED:	return "EGL_BUFFER_PRESERVED";
		default:					return DE_NULL;
	}
}

const char* getTextureFormatName (int value)
{
	switch (value)
	{
		case EGL_NO_TEXTURE:	return "EGL_NO_TEXTURE";
		case EGL_TEXTURE_RGB:	return "EGL_TEXTURE_RGB";
		case EGL_TEXTURE_RGBA:	return "EGL_TEXTURE_RGBA";
		default:				return DE_NULL;
	}
}

const char* getTextureTargetName (int value)
{
	switch (value)
	{
		case EGL_NO_TEXTURE:	return "EGL_NO_TEXTURE";
		case EGL_TEXTURE_2D:	return "EGL_TEXTURE_2D";
		default:				return DE_NULL;
	}
}

const char* getAlphaFormatName (int value)
{
	switch (value)
	{
		case EGL_ALPHA_FORMAT_NONPRE:	return "EGL_ALPHA_FORMAT_NONPRE";
		case EGL_ALPHA_FORMAT_PRE:		return "EGL_ALPHA_FORMAT_PRE";
		default:						return DE_NULL;
	}
}

const char* getColorspaceName (int value)
{
	switch (value)
	{
		case EGL_COLORSPACE_sRGB:	return "EGL_COLORSPACE_sRGB";
		case EGL_COLORSPACE_LINEAR:	return "EGL_COLORSPACE_LINEAR";
		default:					return DE_NULL;
	}
}

tcu::Format::Bitfield<16> getAPIBitsStr (int value)
{
	static const tcu::Format::BitDesc s_desc[] =
	{
		tcu::Format::BitDesc(EGL_OPENGL_BIT,			"EGL_OPENGL_BIT"),
		tcu::Format::BitDesc(EGL_OPENGL_ES_BIT,			"EGL_OPENGL_ES_BIT"),
		tcu::Format::BitDesc(EGL_OPENGL_ES2_BIT,		"EGL_OPENGL_ES2_BIT"),
		tcu::Format::BitDesc(EGL_OPENGL_ES3_BIT_KHR,	"EGL_OPENGL_ES3_BIT_KHR"),
		tcu::Format::BitDesc(EGL_OPENVG_BIT,			"EGL_OPENVG_BIT"),
	};
	return tcu::Format::Bitfield<16>(value, &s_desc[0], &s_desc[DE_LENGTH_OF_ARRAY(s_desc)]);
}

tcu::Format::Bitfield<16> getSurfaceBitsStr (int value)
{
	static const tcu::Format::BitDesc s_desc[] =
	{
		tcu::Format::BitDesc(EGL_PBUFFER_BIT,					"EGL_PBUFFER_BIT"),
		tcu::Format::BitDesc(EGL_PIXMAP_BIT,					"EGL_PIXMAP_BIT"),
		tcu::Format::BitDesc(EGL_WINDOW_BIT,					"EGL_WINDOW_BIT"),
		tcu::Format::BitDesc(EGL_MULTISAMPLE_RESOLVE_BOX_BIT,	"EGL_MULTISAMPLE_RESOLVE_BOX_BIT"),
		tcu::Format::BitDesc(EGL_SWAP_BEHAVIOR_PRESERVED_BIT,	"EGL_SWAP_BEHAVIOR_PRESERVED_BIT"),
		tcu::Format::BitDesc(EGL_VG_ALPHA_FORMAT_PRE_BIT,		"EGL_VG_ALPHA_FORMAT_PRE_BIT"),
		tcu::Format::BitDesc(EGL_VG_COLORSPACE_LINEAR_BIT,		"EGL_VG_COLORSPACE_LINEAR_BIT"),
		tcu::Format::BitDesc(EGL_LOCK_SURFACE_BIT_KHR,			"EGL_LOCK_SURFACE_BIT_KHR"),
		tcu::Format::BitDesc(EGL_OPTIMAL_FORMAT_BIT_KHR,		"EGL_OPTIMAL_FORMAT_BIT_KHR"),
	};
	return tcu::Format::Bitfield<16>(value, &s_desc[0], &s_desc[DE_LENGTH_OF_ARRAY(s_desc)]);
}
