/* 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 31042.
 */

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* 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)]);
}
