Compare commits
	
		
			67 Commits
		
	
	
		
			mesa-18.2.
			...
			gles3-fmt-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					ae0120f247 | ||
| 
						 | 
					787bbe65ff | ||
| 
						 | 
					5f96348c60 | ||
| 
						 | 
					fe23a2c5e1 | ||
| 
						 | 
					54d744bfc4 | ||
| 
						 | 
					b1c62e9533 | ||
| 
						 | 
					0faa38ccc6 | ||
| 
						 | 
					ed9f608070 | ||
| 
						 | 
					b68dc0c5ee | ||
| 
						 | 
					add9b77cbd | ||
| 
						 | 
					64e0be7d0b | ||
| 
						 | 
					166c4d211d | ||
| 
						 | 
					fef9526cb6 | ||
| 
						 | 
					a33dc45d2f | ||
| 
						 | 
					95da613011 | ||
| 
						 | 
					9824382dbd | ||
| 
						 | 
					067e9170ef | ||
| 
						 | 
					28236b2f28 | ||
| 
						 | 
					a1ef7b34ce | ||
| 
						 | 
					8d99b25045 | ||
| 
						 | 
					3613e67b4a | ||
| 
						 | 
					566ce73fab | ||
| 
						 | 
					4fd482b841 | ||
| 
						 | 
					555245eeb7 | ||
| 
						 | 
					e76ddbf0f8 | ||
| 
						 | 
					8b89a5bbf5 | ||
| 
						 | 
					56e2a876e4 | ||
| 
						 | 
					acac9cdde0 | ||
| 
						 | 
					8a88168a90 | ||
| 
						 | 
					18aca7ac5a | ||
| 
						 | 
					4dd38352e5 | ||
| 
						 | 
					a0333d34a7 | ||
| 
						 | 
					5d1c69be02 | ||
| 
						 | 
					e68b841b3c | ||
| 
						 | 
					3b495d815f | ||
| 
						 | 
					0538b36bac | ||
| 
						 | 
					d3d6e05349 | ||
| 
						 | 
					4014ee4567 | ||
| 
						 | 
					b83a83dcdf | ||
| 
						 | 
					19864a4b1c | ||
| 
						 | 
					24d89bc7ea | ||
| 
						 | 
					84b2017c30 | ||
| 
						 | 
					a9c1fa067c | ||
| 
						 | 
					d9228105e1 | ||
| 
						 | 
					4b7bea48ee | ||
| 
						 | 
					b1a21a9f7c | ||
| 
						 | 
					f7a82c00cd | ||
| 
						 | 
					d053e8e85b | ||
| 
						 | 
					0f16eafa17 | ||
| 
						 | 
					43413b3fdd | ||
| 
						 | 
					974d48a061 | ||
| 
						 | 
					173e4f7a42 | ||
| 
						 | 
					026099f93a | ||
| 
						 | 
					feba88049f | ||
| 
						 | 
					cf6ddcecda | ||
| 
						 | 
					244d6eb094 | ||
| 
						 | 
					7a4eca8280 | ||
| 
						 | 
					3d0890d39d | ||
| 
						 | 
					2a18d71dbe | ||
| 
						 | 
					13fa793585 | ||
| 
						 | 
					fca1ec5bfa | ||
| 
						 | 
					5b9df1c245 | ||
| 
						 | 
					bdea9b9460 | ||
| 
						 | 
					e1ccb71996 | ||
| 
						 | 
					db902c4948 | ||
| 
						 | 
					a40737f505 | ||
| 
						 | 
					dbee8d3ea2 | 
@@ -826,8 +826,9 @@ struct __DRIdri2LoaderExtensionRec {
 | 
			
		||||
 | 
			
		||||
#define __DRI_API_OPENGL	0	/**< OpenGL compatibility profile */
 | 
			
		||||
#define __DRI_API_GLES		1	/**< OpenGL ES 1.x */
 | 
			
		||||
#define __DRI_API_GLES2		2	/**< OpenGL ES 2.0 or 3.0 */
 | 
			
		||||
#define __DRI_API_GLES2		2	/**< OpenGL ES 2.x */
 | 
			
		||||
#define __DRI_API_OPENGL_CORE	3	/**< OpenGL 3.2+ core profile */
 | 
			
		||||
#define __DRI_API_GLES3		4	/**< OpenGL ES 3.x */
 | 
			
		||||
 | 
			
		||||
#define __DRI_CTX_ATTRIB_MAJOR_VERSION		0
 | 
			
		||||
#define __DRI_CTX_ATTRIB_MINOR_VERSION		1
 | 
			
		||||
 
 | 
			
		||||
@@ -465,7 +465,10 @@ dri2_setup_screen(_EGLDisplay *disp)
 | 
			
		||||
      api_mask = dri2_dpy->dri2->getAPIMask(dri2_dpy->dri_screen);
 | 
			
		||||
   } else {
 | 
			
		||||
      assert(dri2_dpy->swrast);
 | 
			
		||||
      api_mask = 1 << __DRI_API_OPENGL | 1 << __DRI_API_GLES | 1 << __DRI_API_GLES2;
 | 
			
		||||
      api_mask = 1 << __DRI_API_OPENGL |
 | 
			
		||||
                 1 << __DRI_API_GLES |
 | 
			
		||||
                 1 << __DRI_API_GLES2 |
 | 
			
		||||
                 1 << __DRI_API_GLES3;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   disp->ClientAPIs = 0;
 | 
			
		||||
@@ -475,6 +478,8 @@ dri2_setup_screen(_EGLDisplay *disp)
 | 
			
		||||
      disp->ClientAPIs |= EGL_OPENGL_ES_BIT;
 | 
			
		||||
   if (api_mask & (1 << __DRI_API_GLES2))
 | 
			
		||||
      disp->ClientAPIs |= EGL_OPENGL_ES2_BIT;
 | 
			
		||||
   if (api_mask & (1 << __DRI_API_GLES3))
 | 
			
		||||
      disp->ClientAPIs |= EGL_OPENGL_ES3_BIT_KHR;
 | 
			
		||||
 | 
			
		||||
   assert(dri2_dpy->dri2 || dri2_dpy->swrast);
 | 
			
		||||
   disp->Extensions.KHR_surfaceless_context = EGL_TRUE;
 | 
			
		||||
@@ -737,8 +742,10 @@ dri2_create_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf,
 | 
			
		||||
         api = __DRI_API_GLES;
 | 
			
		||||
         break;
 | 
			
		||||
      case 2:
 | 
			
		||||
         api = __DRI_API_GLES3;
 | 
			
		||||
         break;
 | 
			
		||||
      case 3:
 | 
			
		||||
         api = __DRI_API_GLES2;
 | 
			
		||||
         api = __DRI_API_GLES3;
 | 
			
		||||
         break;
 | 
			
		||||
      default:
 | 
			
		||||
	 _eglError(EGL_BAD_PARAMETER, "eglCreateContext");
 | 
			
		||||
 
 | 
			
		||||
@@ -331,6 +331,7 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching)
 | 
			
		||||
            mask = EGL_OPENGL_ES_BIT |
 | 
			
		||||
                   EGL_OPENVG_BIT |
 | 
			
		||||
                   EGL_OPENGL_ES2_BIT |
 | 
			
		||||
                   EGL_OPENGL_ES3_BIT_KHR |
 | 
			
		||||
                   EGL_OPENGL_BIT;
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
 
 | 
			
		||||
@@ -54,9 +54,11 @@ _eglGetContextAPIBit(_EGLContext *ctx)
 | 
			
		||||
         bit = EGL_OPENGL_ES_BIT;
 | 
			
		||||
         break;
 | 
			
		||||
      case 2:
 | 
			
		||||
      case 3:
 | 
			
		||||
         bit = EGL_OPENGL_ES2_BIT;
 | 
			
		||||
         break;
 | 
			
		||||
      case 3:
 | 
			
		||||
         bit = EGL_OPENGL_ES3_BIT_KHR;
 | 
			
		||||
         break;
 | 
			
		||||
      default:
 | 
			
		||||
         break;
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@
 | 
			
		||||
   (EGL_OPENGL_ES_BIT   | \
 | 
			
		||||
    EGL_OPENVG_BIT      | \
 | 
			
		||||
    EGL_OPENGL_ES2_BIT  | \
 | 
			
		||||
    EGL_OPENGL_ES3_BIT_KHR | \
 | 
			
		||||
    EGL_OPENGL_BIT)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -140,6 +140,9 @@ _eglUpdateAPIsString(_EGLDisplay *dpy)
 | 
			
		||||
   if (dpy->ClientAPIs & EGL_OPENGL_ES2_BIT)
 | 
			
		||||
      strcat(apis, "OpenGL_ES2 ");
 | 
			
		||||
 | 
			
		||||
   if (dpy->ClientAPIs & EGL_OPENGL_ES3_BIT_KHR)
 | 
			
		||||
      strcat(apis, "OpenGL_ES3 ");
 | 
			
		||||
 | 
			
		||||
   if (dpy->ClientAPIs & EGL_OPENVG_BIT)
 | 
			
		||||
      strcat(apis, "OpenVG ");
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -435,11 +435,14 @@ _eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface,
 | 
			
		||||
{
 | 
			
		||||
   EGLint confval;
 | 
			
		||||
   EGLint err = EGL_SUCCESS;
 | 
			
		||||
   EGLint all_es_bits = EGL_OPENGL_ES_BIT |
 | 
			
		||||
                        EGL_OPENGL_ES2_BIT |
 | 
			
		||||
                        EGL_OPENGL_ES3_BIT_KHR;
 | 
			
		||||
 | 
			
		||||
   switch (attribute) {
 | 
			
		||||
   case EGL_MIPMAP_LEVEL:
 | 
			
		||||
      confval = surface->Config->RenderableType;
 | 
			
		||||
      if (!(confval & (EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT))) {
 | 
			
		||||
      if (!(confval & all_es_bits)) {
 | 
			
		||||
         err = EGL_BAD_PARAMETER;
 | 
			
		||||
         break;
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
@@ -260,6 +260,8 @@ HEXADECIMAL_INTEGER	0[xX][0-9a-fA-F]+[uU]?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
"##" {
 | 
			
		||||
	if (parser->is_gles)
 | 
			
		||||
		glcpp_error(yylloc, yyextra, "Token pasting (##) is illegal in GLES");
 | 
			
		||||
	return PASTE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -363,6 +363,8 @@ integer_constant:
 | 
			
		||||
expression:
 | 
			
		||||
	integer_constant
 | 
			
		||||
|	IDENTIFIER {
 | 
			
		||||
		if (parser->is_gles)
 | 
			
		||||
			glcpp_error(& @1, parser, "undefined macro %s in expression (illegal in GLES)", $1);
 | 
			
		||||
		$$ = 0;
 | 
			
		||||
	}
 | 
			
		||||
|	expression OR expression {
 | 
			
		||||
@@ -1179,15 +1181,18 @@ glcpp_parser_create (const struct gl_extensions *extensions, int api)
 | 
			
		||||
	parser->has_new_source_number = 0;
 | 
			
		||||
	parser->new_source_number = 0;
 | 
			
		||||
 | 
			
		||||
	parser->is_gles = false;
 | 
			
		||||
 | 
			
		||||
	/* Add pre-defined macros. */
 | 
			
		||||
	if (extensions != NULL) {
 | 
			
		||||
	   if (extensions->OES_EGL_image_external)
 | 
			
		||||
	      add_builtin_define(parser, "GL_OES_EGL_image_external", 1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (api == API_OPENGLES2)
 | 
			
		||||
	if (api == API_OPENGLES2) {
 | 
			
		||||
		parser->is_gles = true;
 | 
			
		||||
		add_builtin_define(parser, "GL_ES", 1);
 | 
			
		||||
	else {
 | 
			
		||||
	} else {
 | 
			
		||||
	   add_builtin_define(parser, "GL_ARB_draw_buffers", 1);
 | 
			
		||||
	   add_builtin_define(parser, "GL_ARB_texture_rectangle", 1);
 | 
			
		||||
 | 
			
		||||
@@ -2026,11 +2031,6 @@ static void
 | 
			
		||||
_glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t version,
 | 
			
		||||
                                         const char *es_identifier)
 | 
			
		||||
{
 | 
			
		||||
	/* Note: We assume that if any identifier is present, it means ES.
 | 
			
		||||
         * The GLSL parser will double-check that the identifier is correct.
 | 
			
		||||
	 */
 | 
			
		||||
	bool is_es = es_identifier != NULL;
 | 
			
		||||
 | 
			
		||||
	macro_t *macro = hash_table_find (parser->defines, "__VERSION__");
 | 
			
		||||
	if (macro) {
 | 
			
		||||
		hash_table_remove (parser->defines, "__VERSION__");
 | 
			
		||||
@@ -2038,17 +2038,23 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio
 | 
			
		||||
	}
 | 
			
		||||
	add_builtin_define (parser, "__VERSION__", version);
 | 
			
		||||
 | 
			
		||||
	if (version == 100)
 | 
			
		||||
		is_es = true;
 | 
			
		||||
	if (is_es)
 | 
			
		||||
	/* If we didn't have a GLES context to begin with, (indicated
 | 
			
		||||
	 * by parser->api), then the version declaration here might
 | 
			
		||||
	 * indicate GLES. */
 | 
			
		||||
	if (! parser->is_gles &&
 | 
			
		||||
	    (version == 100 ||
 | 
			
		||||
	     (es_identifier && (strcmp(es_identifier, "es") == 0))))
 | 
			
		||||
	{
 | 
			
		||||
		parser->is_gles = true;
 | 
			
		||||
		add_builtin_define (parser, "GL_ES", 1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Currently, all ES2/ES3 implementations support highp in the
 | 
			
		||||
	 * fragment shader, so we always define this macro in ES2/ES3.
 | 
			
		||||
	 * If we ever get a driver that doesn't support highp, we'll
 | 
			
		||||
	 * need to add a flag to the gl_context and check that here.
 | 
			
		||||
	 */
 | 
			
		||||
	if (version >= 130 || is_es)
 | 
			
		||||
	if (version >= 130 || parser->is_gles)
 | 
			
		||||
		add_builtin_define (parser, "GL_FRAGMENT_PRECISION_HIGH", 1);
 | 
			
		||||
 | 
			
		||||
	ralloc_asprintf_rewrite_tail (&parser->output, &parser->output_length,
 | 
			
		||||
 
 | 
			
		||||
@@ -182,6 +182,7 @@ struct glcpp_parser {
 | 
			
		||||
	int new_line_number;
 | 
			
		||||
	bool has_new_source_number;
 | 
			
		||||
	int new_source_number;
 | 
			
		||||
	bool is_gles;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gl_extensions;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								src/mapi/glapi/gen/ARB_ES3_compatibility.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/mapi/glapi/gen/ARB_ES3_compatibility.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
<?xml version="1.0"?>
 | 
			
		||||
<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd">
 | 
			
		||||
 | 
			
		||||
<OpenGLAPI>
 | 
			
		||||
 | 
			
		||||
<category name="GL_ARB_ES3_compatibility" number="127">
 | 
			
		||||
    <enum name="COMPRESSED_RGB8_ETC2"				value="0x9274"/>
 | 
			
		||||
    <enum name="COMPRESSED_SRGB8_ETC2"				value="0x9275"/>
 | 
			
		||||
    <enum name="COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"	value="0x9276"/>
 | 
			
		||||
    <enum name="COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"	value="0x9277"/>
 | 
			
		||||
    <enum name="COMPRESSED_RGBA8_ETC2_EAC"			value="0x9278"/>
 | 
			
		||||
    <enum name="COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"		value="0x9279"/>
 | 
			
		||||
    <enum name="COMPRESSED_R11_EAC"				value="0x9270"/>
 | 
			
		||||
    <enum name="COMPRESSED_SIGNED_R11_EAC"			value="0x9271"/>
 | 
			
		||||
    <enum name="COMPRESSED_RG11_EAC"				value="0x9272"/>
 | 
			
		||||
    <enum name="COMPRESSED_SIGNED_RG11_EAC"			value="0x9273"/>
 | 
			
		||||
    <enum name="PRIMITIVE_RESTART_FIXED_INDEX"			value="0x8D69"/>
 | 
			
		||||
    <enum name="ANY_SAMPLES_PASSED_CONSERVATIVE"		value="0x8D6A"/>
 | 
			
		||||
    <enum name="MAX_ELEMENT_INDEX"				value="0x8D6B"/>
 | 
			
		||||
    <enum name="TEXTURE_IMMUTABLE_LEVELS"			value="0x82DF"/>
 | 
			
		||||
</category>
 | 
			
		||||
 | 
			
		||||
</OpenGLAPI>
 | 
			
		||||
@@ -595,7 +595,7 @@
 | 
			
		||||
  <enum name="MAX_FRAGMENT_INPUT_COMPONENTS"        value="0x9125"/>
 | 
			
		||||
  <enum name="CONTEXT_PROFILE_MASK"                 value="0x9126"/>
 | 
			
		||||
 | 
			
		||||
  <function name="GetInteger64i_v" offset="assign" es2="3.0" exec="skip">
 | 
			
		||||
  <function name="GetInteger64i_v" offset="assign" es2="3.0">
 | 
			
		||||
    <param name="cap" type="GLenum"/>
 | 
			
		||||
    <param name="index" type="GLuint"/>
 | 
			
		||||
    <param name="data" type="GLint64 *"/>
 | 
			
		||||
 
 | 
			
		||||
@@ -101,6 +101,7 @@ API_XML = \
 | 
			
		||||
	ARB_draw_elements_base_vertex.xml \
 | 
			
		||||
	ARB_draw_instanced.xml \
 | 
			
		||||
	ARB_ES2_compatibility.xml \
 | 
			
		||||
	ARB_ES3_compatibility.xml \
 | 
			
		||||
	ARB_framebuffer_object.xml \
 | 
			
		||||
	ARB_geometry_shader4.xml \
 | 
			
		||||
	ARB_instanced_arrays.xml \
 | 
			
		||||
@@ -144,6 +145,7 @@ COMMON = $(API_XML) \
 | 
			
		||||
	gl_and_es_API.xml \
 | 
			
		||||
	es_EXT.xml \
 | 
			
		||||
	ARB_ES2_compatibility.xml \
 | 
			
		||||
	ARB_ES3_compatibility.xml \
 | 
			
		||||
	ARB_get_program_binary.xml \
 | 
			
		||||
	OES_fixed_point.xml \
 | 
			
		||||
	OES_single_precision.xml
 | 
			
		||||
 
 | 
			
		||||
@@ -8277,7 +8277,11 @@
 | 
			
		||||
 | 
			
		||||
<xi:include href="ARB_robustness.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
 | 
			
		||||
 | 
			
		||||
<!-- ARB extensions #106...#108 -->
 | 
			
		||||
<!-- ARB extensions #106 -->
 | 
			
		||||
 | 
			
		||||
<xi:include href="ARB_base_instance.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
 | 
			
		||||
 | 
			
		||||
<!-- ARB extensions #108 -->
 | 
			
		||||
 | 
			
		||||
<category name="GL_ARB_transform_feedback_instanced" number="109">
 | 
			
		||||
  <function name="DrawTransformFeedbackInstanced" offset="assign"
 | 
			
		||||
@@ -8304,10 +8308,14 @@
 | 
			
		||||
 | 
			
		||||
<!-- ARB extensions #114...#116 -->
 | 
			
		||||
 | 
			
		||||
<xi:include href="ARB_base_instance.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
 | 
			
		||||
 | 
			
		||||
<xi:include href="ARB_texture_storage.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
 | 
			
		||||
 | 
			
		||||
<!-- ARB extensions #118...#126 -->
 | 
			
		||||
 | 
			
		||||
<xi:include href="ARB_ES3_compatibility.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
 | 
			
		||||
 | 
			
		||||
<!-- ARB extensions #128...#131 -->
 | 
			
		||||
 | 
			
		||||
<xi:include href="ARB_invalidate_subdata.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
 | 
			
		||||
 | 
			
		||||
<!-- Non-ARB extensions sorted by extension number. -->
 | 
			
		||||
 
 | 
			
		||||
@@ -189,6 +189,7 @@ dri2CreateContextAttribs(__DRIscreen *screen, int api,
 | 
			
		||||
	mesa_api = API_OPENGLES;
 | 
			
		||||
	break;
 | 
			
		||||
    case __DRI_API_GLES2:
 | 
			
		||||
    case __DRI_API_GLES3:
 | 
			
		||||
	mesa_api = API_OPENGLES2;
 | 
			
		||||
	break;
 | 
			
		||||
    case __DRI_API_OPENGL_CORE:
 | 
			
		||||
 
 | 
			
		||||
@@ -123,6 +123,7 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
 | 
			
		||||
            mesa_api = API_OPENGLES;
 | 
			
		||||
            break;
 | 
			
		||||
    case __DRI_API_GLES2:
 | 
			
		||||
    case __DRI_API_GLES3:
 | 
			
		||||
            mesa_api = API_OPENGLES2;
 | 
			
		||||
            break;
 | 
			
		||||
    case __DRI_API_OPENGL_CORE:
 | 
			
		||||
 
 | 
			
		||||
@@ -52,23 +52,33 @@ i830InitDriverFunctions(struct dd_function_table *functions)
 | 
			
		||||
extern const struct tnl_pipeline_stage *intel_pipeline[];
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
i830CreateContext(const struct gl_config * mesaVis,
 | 
			
		||||
i830CreateContext(int api,
 | 
			
		||||
                  const struct gl_config * mesaVis,
 | 
			
		||||
                  __DRIcontext * driContextPriv,
 | 
			
		||||
                  unsigned major_version,
 | 
			
		||||
                  unsigned minor_version,
 | 
			
		||||
                  unsigned *error,
 | 
			
		||||
                  void *sharedContextPrivate)
 | 
			
		||||
{
 | 
			
		||||
   struct dd_function_table functions;
 | 
			
		||||
   struct i830_context *i830 = rzalloc(NULL, struct i830_context);
 | 
			
		||||
   struct intel_context *intel = &i830->intel;
 | 
			
		||||
   struct gl_context *ctx = &intel->ctx;
 | 
			
		||||
   if (!i830)
 | 
			
		||||
 | 
			
		||||
   if (!i830) {
 | 
			
		||||
      *error = __DRI_CTX_ERROR_NO_MEMORY;
 | 
			
		||||
      return false;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   i830InitVtbl(i830);
 | 
			
		||||
   i830InitDriverFunctions(&functions);
 | 
			
		||||
 | 
			
		||||
   if (!intelInitContext(intel, __DRI_API_OPENGL, mesaVis, driContextPriv,
 | 
			
		||||
                         sharedContextPrivate, &functions)) {
 | 
			
		||||
      free(i830);
 | 
			
		||||
   if (!intelInitContext(intel, __DRI_API_OPENGL,
 | 
			
		||||
                         major_version, minor_version,
 | 
			
		||||
                         mesaVis, driContextPriv,
 | 
			
		||||
                         sharedContextPrivate, &functions,
 | 
			
		||||
                         error)) {
 | 
			
		||||
      ralloc_free(i830);
 | 
			
		||||
      return false;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -178,8 +178,12 @@ i830_state_draw_region(struct intel_context *intel,
 | 
			
		||||
/* i830_context.c
 | 
			
		||||
 */
 | 
			
		||||
extern bool
 | 
			
		||||
i830CreateContext(const struct gl_config * mesaVis,
 | 
			
		||||
i830CreateContext(int api,
 | 
			
		||||
                  const struct gl_config * mesaVis,
 | 
			
		||||
                  __DRIcontext * driContextPriv,
 | 
			
		||||
                  unsigned major_version,
 | 
			
		||||
                  unsigned minor_version,
 | 
			
		||||
                  unsigned *error,
 | 
			
		||||
                  void *sharedContextPrivate);
 | 
			
		||||
 | 
			
		||||
/* i830_tex.c, i830_texstate.c
 | 
			
		||||
 
 | 
			
		||||
@@ -168,33 +168,11 @@ i915CreateContext(int api,
 | 
			
		||||
 | 
			
		||||
   i915InitDriverFunctions(&functions);
 | 
			
		||||
 | 
			
		||||
   if (!intelInitContext(intel, api, mesaVis, driContextPriv,
 | 
			
		||||
                         sharedContextPrivate, &functions)) {
 | 
			
		||||
      *error = __DRI_CTX_ERROR_NO_MEMORY;
 | 
			
		||||
      return false;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Now that the extension bits are known, filter against the requested API
 | 
			
		||||
    * and version.
 | 
			
		||||
    */
 | 
			
		||||
   switch (api) {
 | 
			
		||||
   case API_OPENGL_COMPAT: {
 | 
			
		||||
      const unsigned max_version =
 | 
			
		||||
         (ctx->Extensions.ARB_fragment_shader &&
 | 
			
		||||
          ctx->Extensions.ARB_occlusion_query) ? 20 : 15;
 | 
			
		||||
      const unsigned req_version = major_version * 10 + minor_version;
 | 
			
		||||
 | 
			
		||||
      if (req_version > max_version) {
 | 
			
		||||
         *error = __DRI_CTX_ERROR_BAD_VERSION;
 | 
			
		||||
         return false;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
   }
 | 
			
		||||
   case API_OPENGLES:
 | 
			
		||||
   case API_OPENGLES2:
 | 
			
		||||
      break;
 | 
			
		||||
   default:
 | 
			
		||||
      *error = __DRI_CTX_ERROR_BAD_API;
 | 
			
		||||
   if (!intelInitContext(intel, api, major_version, minor_version,
 | 
			
		||||
                         mesaVis, driContextPriv,
 | 
			
		||||
                         sharedContextPrivate, &functions,
 | 
			
		||||
                         error)) {
 | 
			
		||||
      ralloc_free(i915);
 | 
			
		||||
      return false;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -87,47 +87,8 @@ brwCreateContext(int api,
 | 
			
		||||
   __DRIscreen *sPriv = driContextPriv->driScreenPriv;
 | 
			
		||||
   struct intel_screen *screen = sPriv->driverPrivate;
 | 
			
		||||
   struct dd_function_table functions;
 | 
			
		||||
   const unsigned req_version = major_version * 10 + minor_version;
 | 
			
		||||
   unsigned max_supported_version = 0;
 | 
			
		||||
   unsigned i;
 | 
			
		||||
 | 
			
		||||
#ifdef TEXTURE_FLOAT_ENABLED
 | 
			
		||||
   bool has_texture_float = true;
 | 
			
		||||
#else
 | 
			
		||||
   bool has_texture_float = false;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   bool supports_gl30 = has_texture_float &&
 | 
			
		||||
                        (screen->gen == 6 ||
 | 
			
		||||
                         (screen->gen == 7 &&
 | 
			
		||||
                          screen->kernel_has_gen7_sol_reset));
 | 
			
		||||
 | 
			
		||||
   /* Determine max_supported_version. */
 | 
			
		||||
   switch (api) {
 | 
			
		||||
   case API_OPENGL_COMPAT:
 | 
			
		||||
      max_supported_version = supports_gl30 ? 30 : 21;
 | 
			
		||||
      break;
 | 
			
		||||
   case API_OPENGLES:
 | 
			
		||||
      max_supported_version = 11;
 | 
			
		||||
      break;
 | 
			
		||||
   case API_OPENGLES2:
 | 
			
		||||
      max_supported_version = 20;
 | 
			
		||||
      break;
 | 
			
		||||
   case API_OPENGL_CORE:
 | 
			
		||||
      max_supported_version = supports_gl30 ? 31 : 0;
 | 
			
		||||
      break;
 | 
			
		||||
   default:
 | 
			
		||||
      break;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (max_supported_version == 0) {
 | 
			
		||||
      *error = __DRI_CTX_ERROR_BAD_API;
 | 
			
		||||
      return false;
 | 
			
		||||
   } else if (req_version > max_supported_version) {
 | 
			
		||||
      *error = __DRI_CTX_ERROR_BAD_VERSION;
 | 
			
		||||
      return false;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   struct brw_context *brw = rzalloc(NULL, struct brw_context);
 | 
			
		||||
   if (!brw) {
 | 
			
		||||
      printf("%s: failed to alloc context\n", __FUNCTION__);
 | 
			
		||||
@@ -147,10 +108,12 @@ brwCreateContext(int api,
 | 
			
		||||
   struct intel_context *intel = &brw->intel;
 | 
			
		||||
   struct gl_context *ctx = &intel->ctx;
 | 
			
		||||
 | 
			
		||||
   if (!intelInitContext( intel, api, mesaVis, driContextPriv,
 | 
			
		||||
			  sharedContextPrivate, &functions )) {
 | 
			
		||||
   if (!intelInitContext( intel, api, major_version, minor_version,
 | 
			
		||||
                          mesaVis, driContextPriv,
 | 
			
		||||
			  sharedContextPrivate, &functions,
 | 
			
		||||
			  error)) {
 | 
			
		||||
      printf("%s: failed to init intel context\n", __FUNCTION__);
 | 
			
		||||
      *error = __DRI_CTX_ERROR_NO_MEMORY;
 | 
			
		||||
      ralloc_free(brw);
 | 
			
		||||
      return false;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
@@ -365,8 +328,8 @@ brwCreateContext(int api,
 | 
			
		||||
 | 
			
		||||
   intel->batch.need_workaround_flush = true;
 | 
			
		||||
 | 
			
		||||
   ctx->VertexProgram._MaintainTnlProgram = true;
 | 
			
		||||
   ctx->FragmentProgram._MaintainTexEnvProgram = true;
 | 
			
		||||
   ctx->VertexProgram._MaintainTnlProgram = ctx->API != API_OPENGL_CORE;
 | 
			
		||||
   ctx->FragmentProgram._MaintainTexEnvProgram = ctx->API != API_OPENGL_CORE;
 | 
			
		||||
 | 
			
		||||
   brw_draw_init( brw );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -52,13 +52,13 @@ can_cut_index_handle_restart_index(struct gl_context *ctx,
 | 
			
		||||
 | 
			
		||||
   switch (ib->type) {
 | 
			
		||||
   case GL_UNSIGNED_BYTE:
 | 
			
		||||
      cut_index_will_work = (ctx->Array.RestartIndex & 0xff) == 0xff;
 | 
			
		||||
      cut_index_will_work = (ctx->Array._RestartIndex & 0xff) == 0xff;
 | 
			
		||||
      break;
 | 
			
		||||
   case GL_UNSIGNED_SHORT:
 | 
			
		||||
      cut_index_will_work = (ctx->Array.RestartIndex & 0xffff) == 0xffff;
 | 
			
		||||
      cut_index_will_work = (ctx->Array._RestartIndex & 0xffff) == 0xffff;
 | 
			
		||||
      break;
 | 
			
		||||
   case GL_UNSIGNED_INT:
 | 
			
		||||
      cut_index_will_work = ctx->Array.RestartIndex == 0xffffffff;
 | 
			
		||||
      cut_index_will_work = ctx->Array._RestartIndex == 0xffffffff;
 | 
			
		||||
      break;
 | 
			
		||||
   default:
 | 
			
		||||
      cut_index_will_work = false;
 | 
			
		||||
@@ -157,7 +157,7 @@ brw_handle_primitive_restart(struct gl_context *ctx,
 | 
			
		||||
   /* If PrimitiveRestart is not enabled, then we aren't concerned about
 | 
			
		||||
    * handling this draw.
 | 
			
		||||
    */
 | 
			
		||||
   if (!(ctx->Array.PrimitiveRestart)) {
 | 
			
		||||
   if (!(ctx->Array._PrimitiveRestart)) {
 | 
			
		||||
      return GL_FALSE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -195,6 +195,7 @@ brw_queryobj_get_results(struct gl_context *ctx,
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case GL_ANY_SAMPLES_PASSED:
 | 
			
		||||
   case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
 | 
			
		||||
      /* Set true if any of the sub-queries passed. */
 | 
			
		||||
      for (i = query->first_index; i <= query->last_index; i++) {
 | 
			
		||||
	 if (results[i * 2 + 1] != results[i * 2]) {
 | 
			
		||||
@@ -261,6 +262,7 @@ brw_begin_query(struct gl_context *ctx, struct gl_query_object *q)
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case GL_ANY_SAMPLES_PASSED:
 | 
			
		||||
   case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
 | 
			
		||||
   case GL_SAMPLES_PASSED_ARB:
 | 
			
		||||
      /* Reset our driver's tracking of query state. */
 | 
			
		||||
      drm_intel_bo_unreference(query->bo);
 | 
			
		||||
@@ -316,6 +318,7 @@ brw_end_query(struct gl_context *ctx, struct gl_query_object *q)
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case GL_ANY_SAMPLES_PASSED:
 | 
			
		||||
   case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
 | 
			
		||||
   case GL_SAMPLES_PASSED_ARB:
 | 
			
		||||
      if (query->bo) {
 | 
			
		||||
	 brw_emit_query_end(brw);
 | 
			
		||||
 
 | 
			
		||||
@@ -579,13 +579,55 @@ intelInitDriverFunctions(struct dd_function_table *functions)
 | 
			
		||||
   intel_init_syncobj_functions(functions);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
validate_context_version(struct intel_screen *screen,
 | 
			
		||||
                         int mesa_api,
 | 
			
		||||
                         unsigned major_version,
 | 
			
		||||
                         unsigned minor_version,
 | 
			
		||||
                         unsigned *dri_ctx_error)
 | 
			
		||||
{
 | 
			
		||||
   unsigned req_version = 10 * major_version + minor_version;
 | 
			
		||||
   unsigned max_version = 0;
 | 
			
		||||
 | 
			
		||||
   switch (mesa_api) {
 | 
			
		||||
   case API_OPENGL_COMPAT:
 | 
			
		||||
      max_version = screen->max_gl_compat_version;
 | 
			
		||||
      break;
 | 
			
		||||
   case API_OPENGL_CORE:
 | 
			
		||||
      max_version = screen->max_gl_core_version;
 | 
			
		||||
      break;
 | 
			
		||||
   case API_OPENGLES:
 | 
			
		||||
      max_version = screen->max_gl_es1_version;
 | 
			
		||||
      break;
 | 
			
		||||
   case API_OPENGLES2:
 | 
			
		||||
      max_version = screen->max_gl_es2_version;
 | 
			
		||||
      break;
 | 
			
		||||
   default:
 | 
			
		||||
      max_version = 0;
 | 
			
		||||
      break;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (max_version == 0) {
 | 
			
		||||
      *dri_ctx_error = __DRI_CTX_ERROR_BAD_API;
 | 
			
		||||
      return false;
 | 
			
		||||
   } else if (req_version > max_version) {
 | 
			
		||||
      *dri_ctx_error = __DRI_CTX_ERROR_BAD_VERSION;
 | 
			
		||||
      return false;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
intelInitContext(struct intel_context *intel,
 | 
			
		||||
		 int api,
 | 
			
		||||
                 int api,
 | 
			
		||||
                 unsigned major_version,
 | 
			
		||||
                 unsigned minor_version,
 | 
			
		||||
                 const struct gl_config * mesaVis,
 | 
			
		||||
                 __DRIcontext * driContextPriv,
 | 
			
		||||
                 void *sharedContextPrivate,
 | 
			
		||||
                 struct dd_function_table *functions)
 | 
			
		||||
                 struct dd_function_table *functions,
 | 
			
		||||
                 unsigned *dri_ctx_error)
 | 
			
		||||
{
 | 
			
		||||
   struct gl_context *ctx = &intel->ctx;
 | 
			
		||||
   struct gl_context *shareCtx = (struct gl_context *) sharedContextPrivate;
 | 
			
		||||
@@ -595,7 +637,14 @@ intelInitContext(struct intel_context *intel,
 | 
			
		||||
   struct gl_config visual;
 | 
			
		||||
 | 
			
		||||
   /* we can't do anything without a connection to the device */
 | 
			
		||||
   if (intelScreen->bufmgr == NULL)
 | 
			
		||||
   if (intelScreen->bufmgr == NULL) {
 | 
			
		||||
      *dri_ctx_error = __DRI_CTX_ERROR_NO_MEMORY;
 | 
			
		||||
      return false;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (!validate_context_version(intelScreen,
 | 
			
		||||
                                 api, major_version, minor_version,
 | 
			
		||||
                                 dri_ctx_error))
 | 
			
		||||
      return false;
 | 
			
		||||
 | 
			
		||||
   /* Can't rely on invalidate events, fall back to glViewport hack */
 | 
			
		||||
@@ -611,6 +660,7 @@ intelInitContext(struct intel_context *intel,
 | 
			
		||||
 | 
			
		||||
   if (!_mesa_initialize_context(&intel->ctx, api, mesaVis, shareCtx,
 | 
			
		||||
                                 functions)) {
 | 
			
		||||
      *dri_ctx_error = __DRI_CTX_ERROR_NO_MEMORY;
 | 
			
		||||
      printf("%s: failed to init mesa context\n", __FUNCTION__);
 | 
			
		||||
      return false;
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
@@ -514,11 +514,14 @@ extern int INTEL_DEBUG;
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
extern bool intelInitContext(struct intel_context *intel,
 | 
			
		||||
				  int api,
 | 
			
		||||
                                  const struct gl_config * mesaVis,
 | 
			
		||||
                                  __DRIcontext * driContextPriv,
 | 
			
		||||
                                  void *sharedContextPrivate,
 | 
			
		||||
                                  struct dd_function_table *functions);
 | 
			
		||||
                             int api,
 | 
			
		||||
                             unsigned major_version,
 | 
			
		||||
                             unsigned minor_version,
 | 
			
		||||
                             const struct gl_config * mesaVis,
 | 
			
		||||
                             __DRIcontext * driContextPriv,
 | 
			
		||||
                             void *sharedContextPrivate,
 | 
			
		||||
                             struct dd_function_table *functions,
 | 
			
		||||
                             unsigned *dri_ctx_error);
 | 
			
		||||
 | 
			
		||||
extern void intelFinish(struct gl_context * ctx);
 | 
			
		||||
extern void intel_flush_rendering_to_batch(struct gl_context *ctx);
 | 
			
		||||
 
 | 
			
		||||
@@ -104,6 +104,7 @@ intelInitExtensions(struct gl_context *ctx)
 | 
			
		||||
      ctx->Extensions.ARB_uniform_buffer_object = true;
 | 
			
		||||
      ctx->Extensions.ARB_texture_buffer_object = true;
 | 
			
		||||
      ctx->Extensions.ARB_texture_cube_map_array = true;
 | 
			
		||||
      ctx->Extensions.ARB_ES3_compatibility = true;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (intel->gen >= 5)
 | 
			
		||||
 
 | 
			
		||||
@@ -753,8 +753,12 @@ intelDestroyBuffer(__DRIdrawable * driDrawPriv)
 | 
			
		||||
 * functions.
 | 
			
		||||
 */
 | 
			
		||||
extern bool
 | 
			
		||||
i830CreateContext(const struct gl_config *mesaVis,
 | 
			
		||||
i830CreateContext(int api,
 | 
			
		||||
                  const struct gl_config *mesaVis,
 | 
			
		||||
		  __DRIcontext *driContextPriv,
 | 
			
		||||
		  unsigned major_version,
 | 
			
		||||
		  unsigned minor_version,
 | 
			
		||||
		  unsigned *error,
 | 
			
		||||
		  void *sharedContextPrivate);
 | 
			
		||||
 | 
			
		||||
extern bool
 | 
			
		||||
@@ -796,27 +800,10 @@ intelCreateContext(gl_api api,
 | 
			
		||||
                                  major_version, minor_version, error,
 | 
			
		||||
                                  sharedContextPrivate);
 | 
			
		||||
   } else {
 | 
			
		||||
      switch (api) {
 | 
			
		||||
      case API_OPENGL_COMPAT:
 | 
			
		||||
         if (major_version > 1 || minor_version > 3) {
 | 
			
		||||
            *error = __DRI_CTX_ERROR_BAD_VERSION;
 | 
			
		||||
            success = false;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
      case API_OPENGLES:
 | 
			
		||||
         break;
 | 
			
		||||
      default:
 | 
			
		||||
         *error = __DRI_CTX_ERROR_BAD_API;
 | 
			
		||||
         success = false;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (success) {
 | 
			
		||||
         intelScreen->no_vbo = true;
 | 
			
		||||
         success = i830CreateContext(mesaVis, driContextPriv,
 | 
			
		||||
                                     sharedContextPrivate);
 | 
			
		||||
         if (!success)
 | 
			
		||||
            *error = __DRI_CTX_ERROR_NO_MEMORY;
 | 
			
		||||
      }
 | 
			
		||||
      intelScreen->no_vbo = true;
 | 
			
		||||
      success = i830CreateContext(api, mesaVis, driContextPriv,
 | 
			
		||||
                                  major_version, minor_version, error,
 | 
			
		||||
                                  sharedContextPrivate);
 | 
			
		||||
   }
 | 
			
		||||
#else
 | 
			
		||||
   success = brwCreateContext(api, mesaVis,
 | 
			
		||||
@@ -1050,6 +1037,90 @@ intel_screen_make_configs(__DRIscreen *dri_screen)
 | 
			
		||||
   return configs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
set_max_gl_versions(struct intel_screen *screen)
 | 
			
		||||
{
 | 
			
		||||
#ifdef TEXTURE_FLOAT_ENABLED
 | 
			
		||||
   bool has_texture_float = true;
 | 
			
		||||
#else
 | 
			
		||||
   bool has_texture_float = false;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   switch (screen->gen) {
 | 
			
		||||
   case 7:
 | 
			
		||||
      if (has_texture_float && screen->kernel_has_gen7_sol_reset) {
 | 
			
		||||
         screen->max_gl_core_version = 31;
 | 
			
		||||
         screen->max_gl_compat_version = 30;
 | 
			
		||||
         screen->max_gl_es1_version = 11;
 | 
			
		||||
         screen->max_gl_es2_version = 30;
 | 
			
		||||
      } else {
 | 
			
		||||
         screen->max_gl_core_version = 0;
 | 
			
		||||
         screen->max_gl_compat_version = 21;
 | 
			
		||||
         screen->max_gl_es1_version = 11;
 | 
			
		||||
         screen->max_gl_es2_version = 20;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
   case 6:
 | 
			
		||||
      if (has_texture_float) {
 | 
			
		||||
         screen->max_gl_core_version = 31;
 | 
			
		||||
         screen->max_gl_compat_version = 30;
 | 
			
		||||
         screen->max_gl_es1_version = 11;
 | 
			
		||||
         screen->max_gl_es2_version = 30;
 | 
			
		||||
      } else {
 | 
			
		||||
         screen->max_gl_core_version = 0;
 | 
			
		||||
         screen->max_gl_compat_version = 21;
 | 
			
		||||
         screen->max_gl_es1_version = 11;
 | 
			
		||||
         screen->max_gl_es2_version = 20;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
   case 5:
 | 
			
		||||
   case 4:
 | 
			
		||||
      screen->max_gl_core_version = 0;
 | 
			
		||||
      screen->max_gl_compat_version = 21;
 | 
			
		||||
      screen->max_gl_es1_version = 11;
 | 
			
		||||
      screen->max_gl_es2_version = 20;
 | 
			
		||||
      break;
 | 
			
		||||
   case 3: {
 | 
			
		||||
      bool has_fragment_shader = driQueryOptionb(&screen->optionCache, "fragment_shader");
 | 
			
		||||
      bool has_occlusion_query = driQueryOptionb(&screen->optionCache, "stub_occlusion_query");
 | 
			
		||||
 | 
			
		||||
      screen->max_gl_core_version = 0;
 | 
			
		||||
      screen->max_gl_es1_version = 11;
 | 
			
		||||
 | 
			
		||||
      if (has_fragment_shader && has_occlusion_query) {
 | 
			
		||||
         screen->max_gl_compat_version = 21;
 | 
			
		||||
      } else {
 | 
			
		||||
         screen->max_gl_compat_version = 14;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (has_fragment_shader) {
 | 
			
		||||
         screen->max_gl_es2_version = 20;
 | 
			
		||||
      } else {
 | 
			
		||||
         screen->max_gl_es2_version = 0;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      break;
 | 
			
		||||
   }
 | 
			
		||||
   case 2:
 | 
			
		||||
      screen->max_gl_core_version = 0;
 | 
			
		||||
      screen->max_gl_compat_version = 13;
 | 
			
		||||
      screen->max_gl_es1_version = 11;
 | 
			
		||||
      screen->max_gl_es2_version = 0;
 | 
			
		||||
      break;
 | 
			
		||||
   default:
 | 
			
		||||
      assert(!"unrecognized intel_screen::gen");
 | 
			
		||||
      break;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
#ifndef FEATURE_ES1
 | 
			
		||||
   screen->max_gl_es1_version = 0;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef FEATURE_ES2
 | 
			
		||||
   screen->max_gl_es2_version = 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This is the driver specific part of the createNewScreen entry point.
 | 
			
		||||
 * Called when using DRI2.
 | 
			
		||||
@@ -1060,7 +1131,6 @@ static const
 | 
			
		||||
__DRIconfig **intelInitScreen2(__DRIscreen *psp)
 | 
			
		||||
{
 | 
			
		||||
   struct intel_screen *intelScreen;
 | 
			
		||||
   unsigned int api_mask;
 | 
			
		||||
 | 
			
		||||
   if (psp->dri2.loader->base.version <= 2 ||
 | 
			
		||||
       psp->dri2.loader->getBuffersWithFormat == NULL) {
 | 
			
		||||
@@ -1119,19 +1189,18 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp)
 | 
			
		||||
 | 
			
		||||
   intel_override_separate_stencil(intelScreen);
 | 
			
		||||
 | 
			
		||||
   api_mask = (1 << __DRI_API_OPENGL);
 | 
			
		||||
#if FEATURE_ES1
 | 
			
		||||
   api_mask |= (1 << __DRI_API_GLES);
 | 
			
		||||
#endif
 | 
			
		||||
#if FEATURE_ES2
 | 
			
		||||
   api_mask |= (1 << __DRI_API_GLES2);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   if (IS_9XX(intelScreen->deviceID) || IS_965(intelScreen->deviceID))
 | 
			
		||||
      psp->api_mask = api_mask;
 | 
			
		||||
 | 
			
		||||
   intelScreen->hw_has_swizzling = intel_detect_swizzling(intelScreen);
 | 
			
		||||
 | 
			
		||||
   set_max_gl_versions(intelScreen);
 | 
			
		||||
 | 
			
		||||
   psp->api_mask = (1 << __DRI_API_OPENGL);
 | 
			
		||||
   if (intelScreen->max_gl_es1_version > 0)
 | 
			
		||||
      psp->api_mask |= (1 << __DRI_API_GLES);
 | 
			
		||||
   if (intelScreen->max_gl_es2_version > 0)
 | 
			
		||||
      psp->api_mask |= (1 << __DRI_API_GLES2);
 | 
			
		||||
   if (intelScreen->max_gl_es2_version >= 30)
 | 
			
		||||
      psp->api_mask |= (1 << __DRI_API_GLES3);
 | 
			
		||||
 | 
			
		||||
   psp->extensions = intelScreenExtensions;
 | 
			
		||||
 | 
			
		||||
   return (const __DRIconfig**) intel_screen_make_configs(psp);
 | 
			
		||||
 
 | 
			
		||||
@@ -40,6 +40,11 @@ struct intel_screen
 | 
			
		||||
   int deviceID;
 | 
			
		||||
   int gen;
 | 
			
		||||
 | 
			
		||||
   int max_gl_core_version;
 | 
			
		||||
   int max_gl_compat_version;
 | 
			
		||||
   int max_gl_es1_version;
 | 
			
		||||
   int max_gl_es2_version;
 | 
			
		||||
 | 
			
		||||
   int logTextureGranularity;
 | 
			
		||||
 | 
			
		||||
   __DRIscreen *driScrnPriv;
 | 
			
		||||
 
 | 
			
		||||
@@ -239,8 +239,11 @@ intelTexImage(struct gl_context * ctx,
 | 
			
		||||
       __FUNCTION__, texImage->Width, texImage->Height, texImage->Depth,
 | 
			
		||||
       pixels);
 | 
			
		||||
 | 
			
		||||
   _mesa_store_teximage(ctx, dims, texImage,
 | 
			
		||||
                        format, type, pixels, unpack);
 | 
			
		||||
   ctx->Driver.AllocTextureImageBuffer(ctx, texImage);
 | 
			
		||||
   if (format != GL_NONE && type != GL_NONE) {
 | 
			
		||||
      _mesa_store_teximage(ctx, dims, texImage,
 | 
			
		||||
                           format, type, pixels, unpack);
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1636,7 +1636,7 @@ void GLAPIENTRY _ae_ArrayElement( GLint elt )
 | 
			
		||||
   /* If PrimitiveRestart is enabled and the index is the RestartIndex
 | 
			
		||||
    * then we call PrimitiveRestartNV and return.
 | 
			
		||||
    */
 | 
			
		||||
   if (ctx->Array.PrimitiveRestart && (elt == ctx->Array.RestartIndex)) {
 | 
			
		||||
   if (ctx->Array._PrimitiveRestart && (elt == ctx->Array._RestartIndex)) {
 | 
			
		||||
      CALL_PrimitiveRestartNV((struct _glapi_table *)disp, ());
 | 
			
		||||
      return;
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
@@ -1377,7 +1377,10 @@ copy_array_attrib(struct gl_context *ctx,
 | 
			
		||||
   dest->LockFirst = src->LockFirst;
 | 
			
		||||
   dest->LockCount = src->LockCount;
 | 
			
		||||
   dest->PrimitiveRestart = src->PrimitiveRestart;
 | 
			
		||||
   dest->PrimitiveRestartFixedIndex = src->PrimitiveRestartFixedIndex;
 | 
			
		||||
   dest->_PrimitiveRestart = src->_PrimitiveRestart;
 | 
			
		||||
   dest->RestartIndex = src->RestartIndex;
 | 
			
		||||
   dest->_RestartIndex = src->_RestartIndex;
 | 
			
		||||
   /* skip NewState */
 | 
			
		||||
   /* skip RebindArrays */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -136,10 +136,24 @@ get_buffer(struct gl_context *ctx, const char *func, GLenum target)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static inline GLbitfield
 | 
			
		||||
default_access_mode(const struct gl_context *ctx)
 | 
			
		||||
/**
 | 
			
		||||
 * Convert a GLbitfield describing the mapped buffer access flags
 | 
			
		||||
 * into one of GL_READ_WRITE, GL_READ_ONLY, or GL_WRITE_ONLY.
 | 
			
		||||
 */
 | 
			
		||||
static GLenum
 | 
			
		||||
simplified_access_mode(struct gl_context *ctx, GLbitfield access)
 | 
			
		||||
{
 | 
			
		||||
   /* Table 2.6 on page 31 (page 44 of the PDF) of the OpenGL 1.5 spec says:
 | 
			
		||||
   const GLbitfield rwFlags = GL_MAP_READ_BIT | GL_MAP_WRITE_BIT;
 | 
			
		||||
   if ((access & rwFlags) == rwFlags)
 | 
			
		||||
      return GL_READ_WRITE;
 | 
			
		||||
   if ((access & GL_MAP_READ_BIT) == GL_MAP_READ_BIT)
 | 
			
		||||
      return GL_READ_ONLY;
 | 
			
		||||
   if ((access & GL_MAP_WRITE_BIT) == GL_MAP_WRITE_BIT)
 | 
			
		||||
      return GL_WRITE_ONLY;
 | 
			
		||||
 | 
			
		||||
   /* Otherwise, AccessFlags is zero (the default state).
 | 
			
		||||
    *
 | 
			
		||||
    * Table 2.6 on page 31 (page 44 of the PDF) of the OpenGL 1.5 spec says:
 | 
			
		||||
    *
 | 
			
		||||
    * Name           Type  Initial Value  Legal Values
 | 
			
		||||
    * ...            ...   ...            ...
 | 
			
		||||
@@ -155,26 +169,9 @@ default_access_mode(const struct gl_context *ctx)
 | 
			
		||||
    * The difference is because GL_OES_mapbuffer only supports mapping buffers
 | 
			
		||||
    * write-only.
 | 
			
		||||
    */
 | 
			
		||||
   return _mesa_is_gles(ctx)
 | 
			
		||||
      ? GL_MAP_WRITE_BIT : (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT);
 | 
			
		||||
}
 | 
			
		||||
   assert(access == 0);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Convert a GLbitfield describing the mapped buffer access flags
 | 
			
		||||
 * into one of GL_READ_WRITE, GL_READ_ONLY, or GL_WRITE_ONLY.
 | 
			
		||||
 */
 | 
			
		||||
static GLenum
 | 
			
		||||
simplified_access_mode(GLbitfield access)
 | 
			
		||||
{
 | 
			
		||||
   const GLbitfield rwFlags = GL_MAP_READ_BIT | GL_MAP_WRITE_BIT;
 | 
			
		||||
   if ((access & rwFlags) == rwFlags)
 | 
			
		||||
      return GL_READ_WRITE;
 | 
			
		||||
   if ((access & GL_MAP_READ_BIT) == GL_MAP_READ_BIT)
 | 
			
		||||
      return GL_READ_ONLY;
 | 
			
		||||
   if ((access & GL_MAP_WRITE_BIT) == GL_MAP_WRITE_BIT)
 | 
			
		||||
      return GL_WRITE_ONLY;
 | 
			
		||||
   return GL_READ_WRITE; /* this should never happen, but no big deal */
 | 
			
		||||
   return _mesa_is_gles(ctx) ? GL_WRITE_ONLY : GL_READ_WRITE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -354,7 +351,7 @@ _mesa_initialize_buffer_object( struct gl_context *ctx,
 | 
			
		||||
   obj->RefCount = 1;
 | 
			
		||||
   obj->Name = name;
 | 
			
		||||
   obj->Usage = GL_STATIC_DRAW_ARB;
 | 
			
		||||
   obj->AccessFlags = default_access_mode(ctx);
 | 
			
		||||
   obj->AccessFlags = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -864,7 +861,7 @@ _mesa_DeleteBuffers(GLsizei n, const GLuint *ids)
 | 
			
		||||
         if (_mesa_bufferobj_mapped(bufObj)) {
 | 
			
		||||
            /* if mapped, unmap it now */
 | 
			
		||||
            ctx->Driver.UnmapBuffer(ctx, bufObj);
 | 
			
		||||
            bufObj->AccessFlags = default_access_mode(ctx);
 | 
			
		||||
            bufObj->AccessFlags = 0;
 | 
			
		||||
            bufObj->Pointer = NULL;
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
@@ -1064,7 +1061,7 @@ _mesa_BufferData(GLenum target, GLsizeiptrARB size,
 | 
			
		||||
   if (_mesa_bufferobj_mapped(bufObj)) {
 | 
			
		||||
      /* Unmap the existing buffer.  We'll replace it now.  Not an error. */
 | 
			
		||||
      ctx->Driver.UnmapBuffer(ctx, bufObj);
 | 
			
		||||
      bufObj->AccessFlags = default_access_mode(ctx);
 | 
			
		||||
      bufObj->AccessFlags = 0;
 | 
			
		||||
      ASSERT(bufObj->Pointer == NULL);
 | 
			
		||||
   }  
 | 
			
		||||
 | 
			
		||||
@@ -1282,7 +1279,7 @@ _mesa_UnmapBuffer(GLenum target)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   status = ctx->Driver.UnmapBuffer( ctx, bufObj );
 | 
			
		||||
   bufObj->AccessFlags = default_access_mode(ctx);
 | 
			
		||||
   bufObj->AccessFlags = 0;
 | 
			
		||||
   ASSERT(bufObj->Pointer == NULL);
 | 
			
		||||
   ASSERT(bufObj->Offset == 0);
 | 
			
		||||
   ASSERT(bufObj->Length == 0);
 | 
			
		||||
@@ -1310,7 +1307,7 @@ _mesa_GetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
 | 
			
		||||
      *params = bufObj->Usage;
 | 
			
		||||
      return;
 | 
			
		||||
   case GL_BUFFER_ACCESS_ARB:
 | 
			
		||||
      *params = simplified_access_mode(bufObj->AccessFlags);
 | 
			
		||||
      *params = simplified_access_mode(ctx, bufObj->AccessFlags);
 | 
			
		||||
      return;
 | 
			
		||||
   case GL_BUFFER_MAPPED_ARB:
 | 
			
		||||
      *params = _mesa_bufferobj_mapped(bufObj);
 | 
			
		||||
@@ -1364,7 +1361,7 @@ _mesa_GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
 | 
			
		||||
      *params = bufObj->Usage;
 | 
			
		||||
      return;
 | 
			
		||||
   case GL_BUFFER_ACCESS_ARB:
 | 
			
		||||
      *params = simplified_access_mode(bufObj->AccessFlags);
 | 
			
		||||
      *params = simplified_access_mode(ctx, bufObj->AccessFlags);
 | 
			
		||||
      return;
 | 
			
		||||
   case GL_BUFFER_ACCESS_FLAGS:
 | 
			
		||||
      if (!ctx->Extensions.ARB_map_buffer_range)
 | 
			
		||||
 
 | 
			
		||||
@@ -290,6 +290,10 @@ _mesa_DrawBuffers(GLsizei n, const GLenum *buffers)
 | 
			
		||||
 | 
			
		||||
   /* Turns out n==0 is a valid input that should not produce an error.
 | 
			
		||||
    * The remaining code below correctly handles the n==0 case.
 | 
			
		||||
    *
 | 
			
		||||
    * From the OpenGL 3.0 specification, page 258:
 | 
			
		||||
    * "An INVALID_VALUE error is generated if n is greater than
 | 
			
		||||
    *  MAX_DRAW_BUFFERS."
 | 
			
		||||
    */
 | 
			
		||||
   if (n < 0 || n > (GLsizei) ctx->Const.MaxDrawBuffers) {
 | 
			
		||||
      _mesa_error(ctx, GL_INVALID_VALUE, "glDrawBuffersARB(n)");
 | 
			
		||||
@@ -305,20 +309,76 @@ _mesa_DrawBuffers(GLsizei n, const GLenum *buffers)
 | 
			
		||||
         destMask[output] = 0x0;
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
         /* From the OpenGL 3.0 specification, page 258:
 | 
			
		||||
          * "If the GL is bound to a framebuffer object and DrawBuffers is
 | 
			
		||||
          *  supplied with [...] COLOR_ATTACHMENTm where m is greater than or
 | 
			
		||||
          *  equal to the value of MAX_COLOR_ATTACHMENTS, then the error
 | 
			
		||||
          *  INVALID_OPERATION results."
 | 
			
		||||
          */
 | 
			
		||||
         if (_mesa_is_user_fbo(ctx->DrawBuffer) && buffers[output] >=
 | 
			
		||||
             GL_COLOR_ATTACHMENT0 + ctx->Const.MaxDrawBuffers) {
 | 
			
		||||
            _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawBuffersARB(buffer)");
 | 
			
		||||
            return;
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
         destMask[output] = draw_buffer_enum_to_bitmask(buffers[output]);
 | 
			
		||||
         if (destMask[output] == BAD_MASK
 | 
			
		||||
             || _mesa_bitcount(destMask[output]) > 1) {
 | 
			
		||||
 | 
			
		||||
         /* From the OpenGL 3.0 specification, page 258:
 | 
			
		||||
          * "Each buffer listed in bufs must be one of the values from tables
 | 
			
		||||
          *  4.5 or 4.6.  Otherwise, an INVALID_ENUM error is generated.
 | 
			
		||||
          */
 | 
			
		||||
         if (destMask[output] == BAD_MASK) {
 | 
			
		||||
            _mesa_error(ctx, GL_INVALID_ENUM, "glDrawBuffersARB(buffer)");
 | 
			
		||||
            return;
 | 
			
		||||
         }         
 | 
			
		||||
 | 
			
		||||
         /* From the OpenGL 3.0 specification, page 259:
 | 
			
		||||
          * "For both the default framebuffer and framebuffer objects, the
 | 
			
		||||
          *  constants FRONT, BACK, LEFT, RIGHT, and FRONT_AND_BACK are not
 | 
			
		||||
          *  valid in the bufs array passed to DrawBuffers, and will result in
 | 
			
		||||
          *  the error INVALID_OPERATION.  This restriction is because these
 | 
			
		||||
          *  constants may themselves refer to multiple buffers, as shown in
 | 
			
		||||
          *  table 4.4."
 | 
			
		||||
          */
 | 
			
		||||
         if (_mesa_bitcount(destMask[output]) > 1) {
 | 
			
		||||
            _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawBuffersARB(buffer)");
 | 
			
		||||
            return;
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
         /* From the OpenGL 3.0 specification, page 259:
 | 
			
		||||
          * "If the GL is bound to the default framebuffer and DrawBuffers is
 | 
			
		||||
          *  supplied with a constant (other than NONE) that does not indicate
 | 
			
		||||
          *  any of the color buffers allocated to the GL context by the window
 | 
			
		||||
          *  system, the error INVALID_OPERATION will be generated.
 | 
			
		||||
          *
 | 
			
		||||
          *  If the GL is bound to a framebuffer object and DrawBuffers is
 | 
			
		||||
          *  supplied with a constant from table 4.6 [...] then the error
 | 
			
		||||
          *  INVALID_OPERATION results."
 | 
			
		||||
          */
 | 
			
		||||
         destMask[output] &= supportedMask;
 | 
			
		||||
         if (destMask[output] == 0) {
 | 
			
		||||
            _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
                        "glDrawBuffersARB(unsupported buffer)");
 | 
			
		||||
            return;
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
         /* ES 3.0 is even more restrictive.  From the ES 3.0 spec, page 180:
 | 
			
		||||
          * "If the GL is bound to a framebuffer object, the ith buffer listed
 | 
			
		||||
          *  in bufs must be COLOR_ATTACHMENTi or NONE. [...] INVALID_OPERATION."
 | 
			
		||||
          */
 | 
			
		||||
         if (_mesa_is_gles3(ctx) && _mesa_is_user_fbo(ctx->DrawBuffer) &&
 | 
			
		||||
             buffers[output] != GL_NONE &&
 | 
			
		||||
             buffers[output] != GL_COLOR_ATTACHMENT0 + output) {
 | 
			
		||||
            _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawBuffers(buffer)");
 | 
			
		||||
            return;
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
         /* From the OpenGL 3.0 specification, page 258:
 | 
			
		||||
          * "Except for NONE, a buffer may not appear more than once in the
 | 
			
		||||
          *  array pointed to by bufs.  Specifying a buffer more then once will
 | 
			
		||||
          *  result in the error INVALID_OPERATION."
 | 
			
		||||
          */
 | 
			
		||||
         if (destMask[output] & usedBufferMask) {
 | 
			
		||||
            /* can't specify a dest buffer more than once! */
 | 
			
		||||
            _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
                        "glDrawBuffersARB(duplicated buffer)");
 | 
			
		||||
            return;
 | 
			
		||||
 
 | 
			
		||||
@@ -656,6 +656,9 @@ _mesa_init_constants(struct gl_context *ctx)
 | 
			
		||||
 | 
			
		||||
   /* PrimitiveRestart */
 | 
			
		||||
   ctx->Const.PrimitiveRestartInSoftware = GL_FALSE;
 | 
			
		||||
 | 
			
		||||
   /* ES 3.0 or ARB_ES3_compatibility */
 | 
			
		||||
   ctx->Const.MaxElementIndex = 0xffffffffu;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -48,6 +48,20 @@
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
update_derived_primitive_restart_state(struct gl_context *ctx)
 | 
			
		||||
{
 | 
			
		||||
   /* Update derived primitive restart state.
 | 
			
		||||
    */
 | 
			
		||||
   if (ctx->Array.PrimitiveRestart)
 | 
			
		||||
      ctx->Array._RestartIndex = ctx->Array.RestartIndex;
 | 
			
		||||
   else
 | 
			
		||||
      ctx->Array._RestartIndex = ~0;
 | 
			
		||||
 | 
			
		||||
   ctx->Array._PrimitiveRestart = ctx->Array.PrimitiveRestart
 | 
			
		||||
      || ctx->Array.PrimitiveRestartFixedIndex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helper to enable/disable client-side state.
 | 
			
		||||
 */
 | 
			
		||||
@@ -119,6 +133,8 @@ client_state(struct gl_context *ctx, GLenum cap, GLboolean state)
 | 
			
		||||
 | 
			
		||||
   *var = state;
 | 
			
		||||
 | 
			
		||||
   update_derived_primitive_restart_state(ctx);
 | 
			
		||||
 | 
			
		||||
   if (state)
 | 
			
		||||
      arrayObj->_Enabled |= flag;
 | 
			
		||||
   else
 | 
			
		||||
@@ -967,6 +983,17 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
 | 
			
		||||
         if (ctx->Array.PrimitiveRestart != state) {
 | 
			
		||||
            FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
 | 
			
		||||
            ctx->Array.PrimitiveRestart = state;
 | 
			
		||||
            update_derived_primitive_restart_state(ctx);
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_PRIMITIVE_RESTART_FIXED_INDEX:
 | 
			
		||||
	 if (!_mesa_is_gles3(ctx) && !ctx->Extensions.ARB_ES3_compatibility)
 | 
			
		||||
            goto invalid_enum_error;
 | 
			
		||||
         if (ctx->Array.PrimitiveRestartFixedIndex != state) {
 | 
			
		||||
            FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
 | 
			
		||||
            ctx->Array.PrimitiveRestartFixedIndex = state;
 | 
			
		||||
            update_derived_primitive_restart_state(ctx);
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
@@ -1542,6 +1569,12 @@ _mesa_IsEnabled( GLenum cap )
 | 
			
		||||
         }
 | 
			
		||||
         return ctx->Array.PrimitiveRestart;
 | 
			
		||||
 | 
			
		||||
      case GL_PRIMITIVE_RESTART_FIXED_INDEX:
 | 
			
		||||
	 if (!_mesa_is_gles3(ctx) && !ctx->Extensions.ARB_ES3_compatibility) {
 | 
			
		||||
            goto invalid_enum_error;
 | 
			
		||||
         }
 | 
			
		||||
         return ctx->Array.PrimitiveRestartFixedIndex;
 | 
			
		||||
 | 
			
		||||
      /* GL3.0 - GL_framebuffer_sRGB */
 | 
			
		||||
      case GL_FRAMEBUFFER_SRGB_EXT:
 | 
			
		||||
         if (!_mesa_is_desktop_gl(ctx))
 | 
			
		||||
 
 | 
			
		||||
@@ -222,7 +222,7 @@ _mesa_get_attachment(struct gl_context *ctx, struct gl_framebuffer *fb,
 | 
			
		||||
      }
 | 
			
		||||
      return &fb->Attachment[BUFFER_COLOR0 + i];
 | 
			
		||||
   case GL_DEPTH_STENCIL_ATTACHMENT:
 | 
			
		||||
      if (!_mesa_is_desktop_gl(ctx))
 | 
			
		||||
      if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
 | 
			
		||||
	 return NULL;
 | 
			
		||||
      /* fall-through */
 | 
			
		||||
   case GL_DEPTH_ATTACHMENT_EXT:
 | 
			
		||||
@@ -492,7 +492,7 @@ _mesa_is_legal_color_format(const struct gl_context *ctx, GLenum baseFormat)
 | 
			
		||||
   case GL_LUMINANCE_ALPHA:
 | 
			
		||||
   case GL_INTENSITY:
 | 
			
		||||
   case GL_ALPHA:
 | 
			
		||||
      return ctx->Extensions.ARB_framebuffer_object;
 | 
			
		||||
      return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_framebuffer_object;
 | 
			
		||||
   case GL_RED:
 | 
			
		||||
   case GL_RG:
 | 
			
		||||
      return ctx->Extensions.ARB_texture_rg;
 | 
			
		||||
@@ -502,6 +502,57 @@ _mesa_is_legal_color_format(const struct gl_context *ctx, GLenum baseFormat)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Is the given base format a legal format for a color renderbuffer?
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean
 | 
			
		||||
is_format_color_renderable(const struct gl_context *ctx, gl_format format, GLenum internalFormat)
 | 
			
		||||
{
 | 
			
		||||
   const GLenum baseFormat =
 | 
			
		||||
      _mesa_get_format_base_format(format);
 | 
			
		||||
   GLboolean valid;
 | 
			
		||||
 | 
			
		||||
   valid = _mesa_is_legal_color_format(ctx, baseFormat);
 | 
			
		||||
   if (!valid || _mesa_is_desktop_gl(ctx)) {
 | 
			
		||||
      return valid;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Reject additional cases for GLES */
 | 
			
		||||
   switch (internalFormat) {
 | 
			
		||||
   case GL_RGBA32F:
 | 
			
		||||
   case GL_RGBA16F:
 | 
			
		||||
   case GL_RGBA8_SNORM:
 | 
			
		||||
   case GL_RGB32F:
 | 
			
		||||
   case GL_RGB32I:
 | 
			
		||||
   case GL_RGB32UI:
 | 
			
		||||
   case GL_RGB16F:
 | 
			
		||||
   case GL_RGB16I:
 | 
			
		||||
   case GL_RGB16UI:
 | 
			
		||||
   case GL_RGB8_SNORM:
 | 
			
		||||
   case GL_RGB8I:
 | 
			
		||||
   case GL_RGB8UI:
 | 
			
		||||
   case GL_SRGB8:
 | 
			
		||||
   case GL_R11F_G11F_B10F:
 | 
			
		||||
   case GL_RGB9_E5:
 | 
			
		||||
   case GL_RG32F:
 | 
			
		||||
   case GL_RG16F:
 | 
			
		||||
   case GL_RG8_SNORM:
 | 
			
		||||
   case GL_R32F:
 | 
			
		||||
   case GL_R16F:
 | 
			
		||||
   case GL_R8_SNORM:
 | 
			
		||||
      return GL_FALSE;
 | 
			
		||||
   default:
 | 
			
		||||
      break;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (format == MESA_FORMAT_ARGB2101010 && internalFormat != GL_RGB10_A2) {
 | 
			
		||||
      return GL_FALSE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   return GL_TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Is the given base format a legal format for a depth/stencil renderbuffer?
 | 
			
		||||
 */
 | 
			
		||||
@@ -567,7 +618,7 @@ test_attachment_completeness(const struct gl_context *ctx, GLenum format,
 | 
			
		||||
      baseFormat = _mesa_get_format_base_format(texImage->TexFormat);
 | 
			
		||||
 | 
			
		||||
      if (format == GL_COLOR) {
 | 
			
		||||
         if (!_mesa_is_legal_color_format(ctx, baseFormat)) {
 | 
			
		||||
         if (!is_format_color_renderable(ctx, texImage->TexFormat, texImage->InternalFormat)) {
 | 
			
		||||
            att_incomplete("bad format");
 | 
			
		||||
            att->Complete = GL_FALSE;
 | 
			
		||||
            return;
 | 
			
		||||
@@ -621,7 +672,7 @@ test_attachment_completeness(const struct gl_context *ctx, GLenum format,
 | 
			
		||||
         return;
 | 
			
		||||
      }
 | 
			
		||||
      if (format == GL_COLOR) {
 | 
			
		||||
         if (!_mesa_is_legal_color_format(ctx, baseFormat)) {
 | 
			
		||||
         if (!is_format_color_renderable(ctx, att->Renderbuffer->Format, att->Renderbuffer->InternalFormat)) {
 | 
			
		||||
            att_incomplete("bad renderbuffer color format");
 | 
			
		||||
            att->Complete = GL_FALSE;
 | 
			
		||||
            return;
 | 
			
		||||
@@ -750,7 +801,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
 | 
			
		||||
         f = texImg->_BaseFormat;
 | 
			
		||||
         attFormat = texImg->TexFormat;
 | 
			
		||||
         numImages++;
 | 
			
		||||
         if (!_mesa_is_legal_color_format(ctx, f) &&
 | 
			
		||||
         if (!is_format_color_renderable(ctx, attFormat, texImg->InternalFormat) &&
 | 
			
		||||
             !is_legal_depth_format(ctx, f)) {
 | 
			
		||||
            fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT;
 | 
			
		||||
            fbo_incomplete("texture attachment incomplete", -1);
 | 
			
		||||
@@ -1110,7 +1161,7 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
 | 
			
		||||
   case GL_RGB16:
 | 
			
		||||
      return _mesa_is_desktop_gl(ctx) ? GL_RGB : 0;
 | 
			
		||||
   case GL_SRGB8_EXT:
 | 
			
		||||
      return _mesa_is_desktop_gl(ctx) || _mesa_is_gles3(ctx) ? GL_RGB : 0;
 | 
			
		||||
      return _mesa_is_desktop_gl(ctx) ? GL_RGB : 0;
 | 
			
		||||
   case GL_RGBA4:
 | 
			
		||||
   case GL_RGB5_A1:
 | 
			
		||||
   case GL_RGBA8:
 | 
			
		||||
@@ -1170,32 +1221,28 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
 | 
			
		||||
         ? GL_RG : 0;
 | 
			
		||||
   /* signed normalized texture formats */
 | 
			
		||||
   case GL_R8_SNORM:
 | 
			
		||||
      return ctx->Version >= 30
 | 
			
		||||
         || (ctx->API == API_OPENGL_COMPAT && ctx->Extensions.EXT_texture_snorm)
 | 
			
		||||
      return (ctx->API == API_OPENGL_COMPAT && ctx->Extensions.EXT_texture_snorm)
 | 
			
		||||
         ? GL_RED : 0;
 | 
			
		||||
   case GL_RED_SNORM:
 | 
			
		||||
   case GL_R16_SNORM:
 | 
			
		||||
      return _mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_snorm
 | 
			
		||||
         ? GL_RED : 0;
 | 
			
		||||
   case GL_RG8_SNORM:
 | 
			
		||||
      return ctx->Version >= 30
 | 
			
		||||
         || (ctx->API == API_OPENGL_COMPAT && ctx->Extensions.EXT_texture_snorm)
 | 
			
		||||
      return (ctx->API == API_OPENGL_COMPAT && ctx->Extensions.EXT_texture_snorm)
 | 
			
		||||
         ? GL_RG : 0;
 | 
			
		||||
   case GL_RG_SNORM:
 | 
			
		||||
   case GL_RG16_SNORM:
 | 
			
		||||
      return _mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_snorm
 | 
			
		||||
         ? GL_RG : 0;
 | 
			
		||||
   case GL_RGB8_SNORM:
 | 
			
		||||
      return ctx->Version >= 30
 | 
			
		||||
         || (ctx->API == API_OPENGL_COMPAT && ctx->Extensions.EXT_texture_snorm)
 | 
			
		||||
      return (ctx->API == API_OPENGL_COMPAT && ctx->Extensions.EXT_texture_snorm)
 | 
			
		||||
         ? GL_RGB : 0;
 | 
			
		||||
   case GL_RGB_SNORM:
 | 
			
		||||
   case GL_RGB16_SNORM:
 | 
			
		||||
      return _mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_snorm
 | 
			
		||||
         ? GL_RGB : 0;
 | 
			
		||||
   case GL_RGBA8_SNORM:
 | 
			
		||||
      return ctx->Version >= 30
 | 
			
		||||
         || (ctx->API == API_OPENGL_COMPAT && ctx->Extensions.EXT_texture_snorm)
 | 
			
		||||
      return (ctx->API == API_OPENGL_COMPAT && ctx->Extensions.EXT_texture_snorm)
 | 
			
		||||
         ? GL_RGBA : 0;
 | 
			
		||||
   case GL_RGBA_SNORM:
 | 
			
		||||
   case GL_RGBA16_SNORM:
 | 
			
		||||
@@ -1227,25 +1274,21 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
 | 
			
		||||
             ctx->Extensions.ARB_framebuffer_object ? GL_INTENSITY : 0;
 | 
			
		||||
   case GL_R16F:
 | 
			
		||||
   case GL_R32F:
 | 
			
		||||
      return ctx->Version >= 30
 | 
			
		||||
         || (ctx->API == API_OPENGL_COMPAT &&
 | 
			
		||||
      return (ctx->API == API_OPENGL_COMPAT &&
 | 
			
		||||
             ctx->Extensions.ARB_texture_rg &&
 | 
			
		||||
             ctx->Extensions.ARB_texture_float) ? GL_RED : 0;
 | 
			
		||||
   case GL_RG16F:
 | 
			
		||||
   case GL_RG32F:
 | 
			
		||||
      return ctx->Version >= 30
 | 
			
		||||
         || (ctx->API == API_OPENGL_COMPAT &&
 | 
			
		||||
      return (ctx->API == API_OPENGL_COMPAT &&
 | 
			
		||||
             ctx->Extensions.ARB_texture_rg &&
 | 
			
		||||
             ctx->Extensions.ARB_texture_float) ? GL_RG : 0;
 | 
			
		||||
   case GL_RGB16F:
 | 
			
		||||
   case GL_RGB32F:
 | 
			
		||||
      return (_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_float)
 | 
			
		||||
         || _mesa_is_gles3(ctx)
 | 
			
		||||
         ? GL_RGB : 0;
 | 
			
		||||
   case GL_RGBA16F:
 | 
			
		||||
   case GL_RGBA32F:
 | 
			
		||||
      return (_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_float)
 | 
			
		||||
         || _mesa_is_gles3(ctx)
 | 
			
		||||
         ? GL_RGBA : 0;
 | 
			
		||||
   case GL_ALPHA16F_ARB:
 | 
			
		||||
   case GL_ALPHA32F_ARB:
 | 
			
		||||
@@ -1270,10 +1313,10 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
 | 
			
		||||
   case GL_RGB9_E5:
 | 
			
		||||
      return (_mesa_is_desktop_gl(ctx)
 | 
			
		||||
              && ctx->Extensions.EXT_texture_shared_exponent)
 | 
			
		||||
         || _mesa_is_gles3(ctx) ? GL_RGB : 0;
 | 
			
		||||
         ? GL_RGB : 0;
 | 
			
		||||
   case GL_R11F_G11F_B10F:
 | 
			
		||||
      return (_mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_packed_float)
 | 
			
		||||
         || _mesa_is_gles3(ctx) ? GL_RGB : 0;
 | 
			
		||||
         ? GL_RGB : 0;
 | 
			
		||||
 | 
			
		||||
   case GL_RGBA8UI_EXT:
 | 
			
		||||
   case GL_RGBA16UI_EXT:
 | 
			
		||||
@@ -1291,8 +1334,7 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
 | 
			
		||||
   case GL_RGB8I_EXT:
 | 
			
		||||
   case GL_RGB16I_EXT:
 | 
			
		||||
   case GL_RGB32I_EXT:
 | 
			
		||||
      return ctx->Version >= 30
 | 
			
		||||
         || (_mesa_is_desktop_gl(ctx) &&
 | 
			
		||||
      return (_mesa_is_desktop_gl(ctx) &&
 | 
			
		||||
             ctx->Extensions.EXT_texture_integer) ? GL_RGB : 0;
 | 
			
		||||
 | 
			
		||||
   case GL_R8UI:
 | 
			
		||||
@@ -1312,8 +1354,7 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
 | 
			
		||||
   case GL_RG16I:
 | 
			
		||||
   case GL_RG32UI:
 | 
			
		||||
   case GL_RG32I:
 | 
			
		||||
      return ctx->Version >= 30
 | 
			
		||||
         || (_mesa_is_desktop_gl(ctx) &&
 | 
			
		||||
      return (_mesa_is_desktop_gl(ctx) &&
 | 
			
		||||
             ctx->Extensions.ARB_texture_rg &&
 | 
			
		||||
             ctx->Extensions.EXT_texture_integer) ? GL_RG : 0;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2696,6 +2696,20 @@ unpack_int_rgba_ABGR2101010_UINT(const GLuint *src, GLuint dst[][4], GLuint n)
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
unpack_int_rgba_ARGB2101010(const GLuint *src, GLuint dst[][4], GLuint n)
 | 
			
		||||
{
 | 
			
		||||
   unsigned int i;
 | 
			
		||||
 | 
			
		||||
   for (i = 0; i < n; i++) {
 | 
			
		||||
      GLuint tmp = src[i];
 | 
			
		||||
      dst[i][0] = (tmp >> 20) & 0x3ff;
 | 
			
		||||
      dst[i][1] = (tmp >> 10) & 0x3ff;
 | 
			
		||||
      dst[i][2] = (tmp >> 0) & 0x3ff;
 | 
			
		||||
      dst[i][3] = (tmp >> 30) & 0x3;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_mesa_unpack_uint_rgba_row(gl_format format, GLuint n,
 | 
			
		||||
                           const void *src, GLuint dst[][4])
 | 
			
		||||
@@ -2871,6 +2885,10 @@ _mesa_unpack_uint_rgba_row(gl_format format, GLuint n,
 | 
			
		||||
      unpack_int_rgba_ABGR2101010_UINT(src, dst, n);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case MESA_FORMAT_ARGB2101010:
 | 
			
		||||
      unpack_int_rgba_ARGB2101010(src, dst, n);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   default:
 | 
			
		||||
      _mesa_problem(NULL, "%s: bad format %s", __FUNCTION__,
 | 
			
		||||
                    _mesa_get_format_name(format));
 | 
			
		||||
 
 | 
			
		||||
@@ -42,6 +42,7 @@
 | 
			
		||||
#include "framebuffer.h"
 | 
			
		||||
#include "renderbuffer.h"
 | 
			
		||||
#include "texobj.h"
 | 
			
		||||
#include "glformats.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -898,6 +899,25 @@ _mesa_get_color_read_type(struct gl_context *ctx)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns the read renderbuffer for the specified format.
 | 
			
		||||
 */
 | 
			
		||||
struct gl_renderbuffer *
 | 
			
		||||
_mesa_get_read_renderbuffer(struct gl_context *ctx, GLenum format)
 | 
			
		||||
{
 | 
			
		||||
   struct gl_framebuffer *rfb = ctx->ReadBuffer;
 | 
			
		||||
 | 
			
		||||
   if (_mesa_is_color_format(format)) {
 | 
			
		||||
      return rfb->Attachment[rfb->_ColorReadBufferIndex].Renderbuffer;
 | 
			
		||||
   } else if (_mesa_is_depth_format(format) ||
 | 
			
		||||
              _mesa_is_depthstencil_format(format)) {
 | 
			
		||||
      return rfb->Attachment[BUFFER_DEPTH].Renderbuffer;
 | 
			
		||||
   } else {
 | 
			
		||||
      return rfb->Attachment[BUFFER_STENCIL].Renderbuffer;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print framebuffer info to stderr, for debugging.
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,7 @@
 | 
			
		||||
 | 
			
		||||
struct gl_config;
 | 
			
		||||
struct gl_context;
 | 
			
		||||
struct gl_renderbuffer;
 | 
			
		||||
 | 
			
		||||
extern struct gl_framebuffer *
 | 
			
		||||
_mesa_create_framebuffer(const struct gl_config *visual);
 | 
			
		||||
@@ -96,6 +97,9 @@ _mesa_get_color_read_type(struct gl_context *ctx);
 | 
			
		||||
extern GLenum
 | 
			
		||||
_mesa_get_color_read_format(struct gl_context *ctx);
 | 
			
		||||
 | 
			
		||||
extern struct gl_renderbuffer *
 | 
			
		||||
_mesa_get_read_renderbuffer(struct gl_context *ctx, GLenum format);
 | 
			
		||||
 | 
			
		||||
extern void
 | 
			
		||||
_mesa_print_framebuffer(const struct gl_framebuffer *fb);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -131,6 +131,7 @@ enum value_extra {
 | 
			
		||||
   EXTRA_API_GL,
 | 
			
		||||
   EXTRA_API_GL_CORE,
 | 
			
		||||
   EXTRA_API_ES2,
 | 
			
		||||
   EXTRA_API_ES3,
 | 
			
		||||
   EXTRA_NEW_BUFFERS, 
 | 
			
		||||
   EXTRA_NEW_FRAG_CLAMP,
 | 
			
		||||
   EXTRA_VALID_DRAW_BUFFER,
 | 
			
		||||
@@ -290,14 +291,30 @@ static const int extra_texture_buffer_object[] = {
 | 
			
		||||
   EXTRA_END
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const int extra_ARB_transform_feedback2_api_es3[] = {
 | 
			
		||||
   EXT(ARB_transform_feedback2),
 | 
			
		||||
   EXTRA_API_ES3,
 | 
			
		||||
   EXTRA_END
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const int extra_ARB_uniform_buffer_object_and_geometry_shader[] = {
 | 
			
		||||
   EXT(ARB_uniform_buffer_object),
 | 
			
		||||
   EXT(ARB_geometry_shader4),
 | 
			
		||||
   EXTRA_END
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const int extra_ARB_ES2_compatibility_api_es2[] = {
 | 
			
		||||
   EXT(ARB_ES2_compatibility),
 | 
			
		||||
   EXTRA_API_ES2,
 | 
			
		||||
   EXTRA_END
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const int extra_ARB_ES3_compatibility_api_es3[] = {
 | 
			
		||||
   EXT(ARB_ES3_compatibility),
 | 
			
		||||
   EXTRA_API_ES3,
 | 
			
		||||
   EXTRA_END
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
EXTRA_EXT(ARB_ES2_compatibility);
 | 
			
		||||
EXTRA_EXT(ARB_texture_cube_map);
 | 
			
		||||
EXTRA_EXT(MESA_texture_array);
 | 
			
		||||
EXTRA_EXT2(EXT_secondary_color, ARB_vertex_program);
 | 
			
		||||
@@ -322,7 +339,6 @@ EXTRA_EXT(ARB_seamless_cube_map);
 | 
			
		||||
EXTRA_EXT(ARB_sync);
 | 
			
		||||
EXTRA_EXT(ARB_vertex_shader);
 | 
			
		||||
EXTRA_EXT(EXT_transform_feedback);
 | 
			
		||||
EXTRA_EXT(ARB_transform_feedback2);
 | 
			
		||||
EXTRA_EXT(ARB_transform_feedback3);
 | 
			
		||||
EXTRA_EXT(EXT_pixel_buffer_object);
 | 
			
		||||
EXTRA_EXT(ARB_vertex_program);
 | 
			
		||||
@@ -348,6 +364,12 @@ static const int extra_version_30[] = { EXTRA_VERSION_30, EXTRA_END };
 | 
			
		||||
static const int extra_version_31[] = { EXTRA_VERSION_31, EXTRA_END };
 | 
			
		||||
static const int extra_version_32[] = { EXTRA_VERSION_32, EXTRA_END };
 | 
			
		||||
 | 
			
		||||
static const int extra_gl30_es3[] = {
 | 
			
		||||
    EXTRA_VERSION_30,
 | 
			
		||||
    EXTRA_API_ES3,
 | 
			
		||||
    EXTRA_END,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const int
 | 
			
		||||
extra_ARB_vertex_program_api_es2[] = {
 | 
			
		||||
   EXT(ARB_vertex_program),
 | 
			
		||||
@@ -874,6 +896,12 @@ check_extra(struct gl_context *ctx, const char *func, const struct value_desc *d
 | 
			
		||||
	    enabled++;
 | 
			
		||||
	 }
 | 
			
		||||
	 break;
 | 
			
		||||
      case EXTRA_API_ES3:
 | 
			
		||||
	 if (_mesa_is_gles3(ctx)) {
 | 
			
		||||
	    total++;
 | 
			
		||||
	    enabled++;
 | 
			
		||||
	 }
 | 
			
		||||
	 break;
 | 
			
		||||
      case EXTRA_API_GL:
 | 
			
		||||
	 if (_mesa_is_desktop_gl(ctx)) {
 | 
			
		||||
	    total++;
 | 
			
		||||
@@ -973,6 +1001,15 @@ find_value(const char *func, GLenum pname, void **p, union value *v)
 | 
			
		||||
   int api;
 | 
			
		||||
 | 
			
		||||
   api = ctx->API;
 | 
			
		||||
   /* We index into the table_set[] list of per-API hash tables using the API's
 | 
			
		||||
    * value in the gl_api enum. Since GLES 3 doesn't have an API_OPENGL* enum
 | 
			
		||||
    * value since it's compatible with GLES2 its entry in table_set[] is at the
 | 
			
		||||
    * end.
 | 
			
		||||
    */
 | 
			
		||||
   STATIC_ASSERT(Elements(table_set) == API_OPENGL_LAST + 2);
 | 
			
		||||
   if (_mesa_is_gles3(ctx)) {
 | 
			
		||||
      api = API_OPENGL_LAST + 1;
 | 
			
		||||
   }
 | 
			
		||||
   mask = Elements(table(api)) - 1;
 | 
			
		||||
   hash = (pname * prime_factor);
 | 
			
		||||
   while (1) {
 | 
			
		||||
@@ -1626,7 +1663,7 @@ _mesa_GetBooleani_v( GLenum pname, GLuint index, GLboolean *params )
 | 
			
		||||
{
 | 
			
		||||
   union value v;
 | 
			
		||||
   enum value_type type =
 | 
			
		||||
      find_value_indexed("glGetBooleanIndexedv", pname, index, &v);
 | 
			
		||||
      find_value_indexed("glGetBooleani_v", pname, index, &v);
 | 
			
		||||
 | 
			
		||||
   switch (type) {
 | 
			
		||||
   case TYPE_INT:
 | 
			
		||||
@@ -1651,7 +1688,7 @@ _mesa_GetIntegeri_v( GLenum pname, GLuint index, GLint *params )
 | 
			
		||||
{
 | 
			
		||||
   union value v;
 | 
			
		||||
   enum value_type type =
 | 
			
		||||
      find_value_indexed("glGetIntegerIndexedv", pname, index, &v);
 | 
			
		||||
      find_value_indexed("glGetIntegeri_v", pname, index, &v);
 | 
			
		||||
 | 
			
		||||
   switch (type) {
 | 
			
		||||
   case TYPE_INT:
 | 
			
		||||
@@ -1672,11 +1709,11 @@ _mesa_GetIntegeri_v( GLenum pname, GLuint index, GLint *params )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GLAPIENTRY
 | 
			
		||||
_mesa_GetInteger64Indexedv( GLenum pname, GLuint index, GLint64 *params )
 | 
			
		||||
_mesa_GetInteger64i_v( GLenum pname, GLuint index, GLint64 *params )
 | 
			
		||||
{
 | 
			
		||||
   union value v;
 | 
			
		||||
   enum value_type type =
 | 
			
		||||
      find_value_indexed("glGetIntegerIndexedv", pname, index, &v);      
 | 
			
		||||
      find_value_indexed("glGetInteger64i_v", pname, index, &v);
 | 
			
		||||
 | 
			
		||||
   switch (type) {
 | 
			
		||||
   case TYPE_INT:
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,7 @@ extern void GLAPIENTRY
 | 
			
		||||
_mesa_GetIntegeri_v( GLenum pname, GLuint index, GLint *params );
 | 
			
		||||
 | 
			
		||||
extern void GLAPIENTRY
 | 
			
		||||
_mesa_GetInteger64Indexedv( GLenum pname, GLuint index, GLint64 *params );
 | 
			
		||||
_mesa_GetInteger64i_v( GLenum pname, GLuint index, GLint64 *params );
 | 
			
		||||
 | 
			
		||||
extern void GLAPIENTRY
 | 
			
		||||
_mesa_GetPointerv( GLenum pname, GLvoid **params );
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ prime_factor = 89
 | 
			
		||||
prime_step = 281
 | 
			
		||||
hash_table_size = 1024
 | 
			
		||||
 | 
			
		||||
gl_apis=set(["GL", "GL_CORE", "GLES", "GLES2"])
 | 
			
		||||
gl_apis=set(["GL", "GL_CORE", "GLES", "GLES2", "GLES3"])
 | 
			
		||||
 | 
			
		||||
def print_header():
 | 
			
		||||
   print "typedef const unsigned short table_t[%d];\n" % (hash_table_size)
 | 
			
		||||
@@ -67,6 +67,7 @@ api_enum = [
 | 
			
		||||
   'GLES',
 | 
			
		||||
   'GLES2',
 | 
			
		||||
   'GL_CORE',
 | 
			
		||||
   'GLES3', # Not in gl_api enum in mtypes.h
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
def api_index(api):
 | 
			
		||||
@@ -166,6 +167,9 @@ def generate_hash_tables(enum_list, enabled_apis, param_descriptors):
 | 
			
		||||
 | 
			
		||||
         for api in valid_apis:
 | 
			
		||||
            add_to_hash_table(tables[api], hash_val, len(params))
 | 
			
		||||
            # Also add GLES2 items to the GLES3 hash table
 | 
			
		||||
            if api == "GLES2":
 | 
			
		||||
               add_to_hash_table(tables["GLES3"], hash_val, len(params))
 | 
			
		||||
 | 
			
		||||
         params.append(["GL_" + enum_name, param[1]])
 | 
			
		||||
 | 
			
		||||
@@ -183,6 +187,8 @@ def opt_to_apis(feature):
 | 
			
		||||
   apis = set([_map[feature]])
 | 
			
		||||
   if "GL" in apis:
 | 
			
		||||
      apis.add("GL_CORE")
 | 
			
		||||
   if "GLES2" in apis:
 | 
			
		||||
      apis.add("GLES3")
 | 
			
		||||
 | 
			
		||||
   return apis
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -204,12 +204,6 @@ descriptor=[
 | 
			
		||||
  [ "TEXTURE_COORD_ARRAY_TYPE", "LOC_CUSTOM, TYPE_ENUM, offsetof(struct gl_client_array, Type), NO_EXTRA" ],
 | 
			
		||||
  [ "TEXTURE_COORD_ARRAY_STRIDE", "LOC_CUSTOM, TYPE_INT, offsetof(struct gl_client_array, Stride), NO_EXTRA" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_ES2_compatibility
 | 
			
		||||
  [ "SHADER_COMPILER", "CONST(1), extra_ARB_ES2_compatibility" ],
 | 
			
		||||
  [ "MAX_VARYING_VECTORS", "CONTEXT_INT(Const.MaxVarying), extra_ARB_ES2_compatibility" ],
 | 
			
		||||
  [ "MAX_VERTEX_UNIFORM_VECTORS", "LOC_CUSTOM, TYPE_INT, 0, extra_ARB_ES2_compatibility" ],
 | 
			
		||||
  [ "MAX_FRAGMENT_UNIFORM_VECTORS", "LOC_CUSTOM, TYPE_INT, 0, extra_ARB_ES2_compatibility" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_multitexture
 | 
			
		||||
  [ "MAX_TEXTURE_UNITS", "CONTEXT_INT(Const.MaxTextureUnits), NO_EXTRA" ],
 | 
			
		||||
  [ "CLIENT_ACTIVE_TEXTURE", "LOC_CUSTOM, TYPE_INT, 0, NO_EXTRA" ],
 | 
			
		||||
@@ -232,15 +226,8 @@ descriptor=[
 | 
			
		||||
# GL_OES_point_sprite
 | 
			
		||||
  [ "POINT_SPRITE_NV", "CONTEXT_BOOL(Point.PointSprite), extra_NV_point_sprite_ARB_point_sprite" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_fragment_shader
 | 
			
		||||
  [ "MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB", "CONTEXT_INT(Const.FragmentProgram.MaxUniformComponents), extra_ARB_fragment_shader" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_vertex_shader
 | 
			
		||||
  [ "MAX_VERTEX_UNIFORM_COMPONENTS_ARB", "CONTEXT_INT(Const.VertexProgram.MaxUniformComponents), extra_ARB_vertex_shader" ],
 | 
			
		||||
  [ "MAX_VARYING_FLOATS_ARB", "LOC_CUSTOM, TYPE_INT, 0, extra_ARB_vertex_shader" ],
 | 
			
		||||
 | 
			
		||||
# GL_EXT_texture_lod_bias
 | 
			
		||||
  [ "MAX_TEXTURE_LOD_BIAS_EXT", "CONTEXT_FLOAT(Const.MaxTextureLodBias), NO_EXTRA" ],
 | 
			
		||||
]},
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -317,6 +304,73 @@ descriptor=[
 | 
			
		||||
 | 
			
		||||
# GL_NV_read_buffer
 | 
			
		||||
  [ "READ_BUFFER", "LOC_CUSTOM, TYPE_ENUM, NO_OFFSET, extra_NV_read_buffer_api_gl" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_ES2_compatibility
 | 
			
		||||
  [ "SHADER_COMPILER", "CONST(1), extra_ARB_ES2_compatibility_api_es2" ],
 | 
			
		||||
  [ "MAX_VARYING_VECTORS", "CONTEXT_INT(Const.MaxVarying), extra_ARB_ES2_compatibility_api_es2" ],
 | 
			
		||||
  [ "MAX_VERTEX_UNIFORM_VECTORS", "LOC_CUSTOM, TYPE_INT, 0, extra_ARB_ES2_compatibility_api_es2" ],
 | 
			
		||||
  [ "MAX_FRAGMENT_UNIFORM_VECTORS", "LOC_CUSTOM, TYPE_INT, 0, extra_ARB_ES2_compatibility_api_es2" ],
 | 
			
		||||
]},
 | 
			
		||||
 | 
			
		||||
# GLES3 is not a typo.
 | 
			
		||||
{ "apis": ["GL", "GLES", "GLES3", "GL_CORE"], "params": [
 | 
			
		||||
# GL_EXT_texture_lod_bias
 | 
			
		||||
  [ "MAX_TEXTURE_LOD_BIAS_EXT", "CONTEXT_FLOAT(Const.MaxTextureLodBias), NO_EXTRA" ],
 | 
			
		||||
]},
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Enums in  OpenGL and ES 3.0
 | 
			
		||||
{ "apis": ["GL", "GL_CORE", "GLES3"], "params": [
 | 
			
		||||
# GL 3.0 / GLES3
 | 
			
		||||
  [ "NUM_EXTENSIONS", "LOC_CUSTOM, TYPE_INT, 0, extra_gl30_es3" ],
 | 
			
		||||
  [ "MAJOR_VERSION", "LOC_CUSTOM, TYPE_INT, 0, extra_gl30_es3" ],
 | 
			
		||||
  [ "MINOR_VERSION", "LOC_CUSTOM, TYPE_INT, 0, extra_gl30_es3" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_ES3_compatibility
 | 
			
		||||
  [ "MAX_ELEMENT_INDEX", "CONTEXT_INT64(Const.MaxElementIndex), extra_ARB_ES3_compatibility_api_es3"],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_fragment_shader
 | 
			
		||||
  [ "MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB", "CONTEXT_INT(Const.FragmentProgram.MaxUniformComponents), extra_ARB_fragment_shader" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_framebuffer_object
 | 
			
		||||
  [ "MAX_SAMPLES", "CONTEXT_INT(Const.MaxSamples), extra_ARB_framebuffer_object_EXT_framebuffer_multisample" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_sync
 | 
			
		||||
  [ "MAX_SERVER_WAIT_TIMEOUT", "CONTEXT_INT64(Const.MaxServerWaitTimeout), extra_ARB_sync" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_transform_feedback2
 | 
			
		||||
  [ "TRANSFORM_FEEDBACK_BUFFER_PAUSED", "LOC_CUSTOM, TYPE_BOOLEAN, 0, extra_ARB_transform_feedback2_api_es3" ],
 | 
			
		||||
  [ "TRANSFORM_FEEDBACK_BUFFER_ACTIVE", "LOC_CUSTOM, TYPE_BOOLEAN, 0, extra_ARB_transform_feedback2_api_es3" ],
 | 
			
		||||
  [ "TRANSFORM_FEEDBACK_BINDING", "LOC_CUSTOM, TYPE_INT, 0, extra_ARB_transform_feedback2_api_es3" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_uniform_buffer_object
 | 
			
		||||
  [ "MAX_VERTEX_UNIFORM_BLOCKS", "CONTEXT_INT(Const.VertexProgram.MaxUniformBlocks), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "MAX_FRAGMENT_UNIFORM_BLOCKS", "CONTEXT_INT(Const.FragmentProgram.MaxUniformBlocks), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "MAX_COMBINED_UNIFORM_BLOCKS", "CONTEXT_INT(Const.MaxCombinedUniformBlocks), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "MAX_UNIFORM_BLOCK_SIZE", "CONTEXT_INT(Const.MaxUniformBlockSize), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "MAX_UNIFORM_BUFFER_BINDINGS", "CONTEXT_INT(Const.MaxUniformBufferBindings), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS", "CONTEXT_INT(Const.VertexProgram.MaxCombinedUniformComponents), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS", "CONTEXT_INT(Const.FragmentProgram.MaxCombinedUniformComponents), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "UNIFORM_BUFFER_OFFSET_ALIGNMENT", "CONTEXT_INT(Const.UniformBufferOffsetAlignment), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "UNIFORM_BUFFER_BINDING", "LOC_CUSTOM, TYPE_INT, 0, extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_vertex_shader
 | 
			
		||||
  [ "MAX_VERTEX_UNIFORM_COMPONENTS_ARB", "CONTEXT_INT(Const.VertexProgram.MaxUniformComponents), extra_ARB_vertex_shader" ],
 | 
			
		||||
 | 
			
		||||
# GL_EXT_framebuffer_blit
 | 
			
		||||
# NOTE: GL_DRAW_FRAMEBUFFER_BINDING_EXT == GL_FRAMEBUFFER_BINDING_EXT
 | 
			
		||||
  [ "READ_FRAMEBUFFER_BINDING_EXT", "LOC_CUSTOM, TYPE_INT, 0, extra_EXT_framebuffer_blit" ],
 | 
			
		||||
 | 
			
		||||
# GL_EXT_pixel_buffer_object
 | 
			
		||||
  [ "PIXEL_PACK_BUFFER_BINDING_EXT", "LOC_CUSTOM, TYPE_INT, 0, extra_EXT_pixel_buffer_object" ],
 | 
			
		||||
  [ "PIXEL_UNPACK_BUFFER_BINDING_EXT", "LOC_CUSTOM, TYPE_INT, 0, extra_EXT_pixel_buffer_object" ],
 | 
			
		||||
 | 
			
		||||
# GL_EXT_transform_feedback
 | 
			
		||||
  [ "TRANSFORM_FEEDBACK_BUFFER_BINDING", "LOC_CUSTOM, TYPE_INT, 0, extra_EXT_transform_feedback" ],
 | 
			
		||||
  [ "RASTERIZER_DISCARD", "CONTEXT_BOOL(RasterDiscard), extra_EXT_transform_feedback" ],
 | 
			
		||||
  [ "MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS", "CONTEXT_INT(Const.MaxTransformFeedbackInterleavedComponents), extra_EXT_transform_feedback" ],
 | 
			
		||||
  [ "MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS", "CONTEXT_INT(Const.MaxTransformFeedbackBuffers), extra_EXT_transform_feedback" ],
 | 
			
		||||
  [ "MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS", "CONTEXT_INT(Const.MaxTransformFeedbackSeparateComponents), extra_EXT_transform_feedback" ],
 | 
			
		||||
]},
 | 
			
		||||
 | 
			
		||||
{ "apis": ["GLES", "GLES2"], "params": [
 | 
			
		||||
@@ -327,10 +381,6 @@ descriptor=[
 | 
			
		||||
 | 
			
		||||
# Enums unique to OpenGL ES 2.0
 | 
			
		||||
{ "apis": ["GLES2"], "params": [
 | 
			
		||||
  [ "MAX_FRAGMENT_UNIFORM_VECTORS", "LOC_CUSTOM, TYPE_INT, 0, NO_EXTRA" ],
 | 
			
		||||
  [ "MAX_VARYING_VECTORS", "CONTEXT_INT(Const.MaxVarying), NO_EXTRA" ],
 | 
			
		||||
  [ "MAX_VERTEX_UNIFORM_VECTORS", "LOC_CUSTOM, TYPE_INT, 0, NO_EXTRA" ],
 | 
			
		||||
  [ "SHADER_COMPILER", "CONST(1), NO_EXTRA" ],
 | 
			
		||||
# OES_get_program_binary
 | 
			
		||||
  [ "NUM_SHADER_BINARY_FORMATS", "CONST(0), NO_EXTRA" ],
 | 
			
		||||
  [ "SHADER_BINARY_FORMATS", "CONST(0), NO_EXTRA" ],
 | 
			
		||||
@@ -536,10 +586,6 @@ descriptor=[
 | 
			
		||||
  [ "SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB", "LOC_CUSTOM, TYPE_INT, offsetof(struct gl_array_object, VertexAttrib[VERT_ATTRIB_COLOR1].BufferObj), NO_EXTRA" ],
 | 
			
		||||
  [ "FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB", "LOC_CUSTOM, TYPE_INT, offsetof(struct gl_array_object, VertexAttrib[VERT_ATTRIB_FOG].BufferObj), NO_EXTRA" ],
 | 
			
		||||
 | 
			
		||||
# GL_EXT_pixel_buffer_object
 | 
			
		||||
  [ "PIXEL_PACK_BUFFER_BINDING_EXT", "LOC_CUSTOM, TYPE_INT, 0, extra_EXT_pixel_buffer_object" ],
 | 
			
		||||
  [ "PIXEL_UNPACK_BUFFER_BINDING_EXT", "LOC_CUSTOM, TYPE_INT, 0, extra_EXT_pixel_buffer_object" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_vertex_program
 | 
			
		||||
# == GL_VERTEX_PROGRAM_NV
 | 
			
		||||
  [ "VERTEX_PROGRAM_ARB", "CONTEXT_BOOL(VertexProgram.Enabled), extra_ARB_vertex_program" ],
 | 
			
		||||
@@ -580,38 +626,16 @@ descriptor=[
 | 
			
		||||
  [ "NUM_LOOPBACK_COMPONENTS_ATI", "CONST(3), extra_ATI_fragment_shader" ],
 | 
			
		||||
  [ "NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI", "CONST(3), extra_ATI_fragment_shader" ],
 | 
			
		||||
 | 
			
		||||
# GL_EXT_framebuffer_blit
 | 
			
		||||
# NOTE: GL_DRAW_FRAMEBUFFER_BINDING_EXT == GL_FRAMEBUFFER_BINDING_EXT
 | 
			
		||||
  [ "READ_FRAMEBUFFER_BINDING_EXT", "LOC_CUSTOM, TYPE_INT, 0, extra_EXT_framebuffer_blit" ],
 | 
			
		||||
 | 
			
		||||
# GL_EXT_provoking_vertex
 | 
			
		||||
  [ "PROVOKING_VERTEX_EXT", "CONTEXT_ENUM(Light.ProvokingVertex), extra_EXT_provoking_vertex" ],
 | 
			
		||||
  [ "QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT", "CONTEXT_BOOL(Const.QuadsFollowProvokingVertexConvention), extra_EXT_provoking_vertex" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_framebuffer_object
 | 
			
		||||
  [ "MAX_SAMPLES", "CONTEXT_INT(Const.MaxSamples), extra_ARB_framebuffer_object_EXT_framebuffer_multisample" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_seamless_cube_map
 | 
			
		||||
  [ "TEXTURE_CUBE_MAP_SEAMLESS", "CONTEXT_BOOL(Texture.CubeMapSeamless), extra_ARB_seamless_cube_map" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_sync
 | 
			
		||||
  [ "MAX_SERVER_WAIT_TIMEOUT", "CONTEXT_INT64(Const.MaxServerWaitTimeout), extra_ARB_sync" ],
 | 
			
		||||
 | 
			
		||||
# GL_EXT_texture_integer
 | 
			
		||||
  [ "RGBA_INTEGER_MODE_EXT", "BUFFER_BOOL(_IntegerColor), extra_EXT_texture_integer" ],
 | 
			
		||||
 | 
			
		||||
# GL_EXT_transform_feedback
 | 
			
		||||
  [ "TRANSFORM_FEEDBACK_BUFFER_BINDING", "LOC_CUSTOM, TYPE_INT, 0, extra_EXT_transform_feedback" ],
 | 
			
		||||
  [ "RASTERIZER_DISCARD", "CONTEXT_BOOL(RasterDiscard), extra_EXT_transform_feedback" ],
 | 
			
		||||
  [ "MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS", "CONTEXT_INT(Const.MaxTransformFeedbackInterleavedComponents), extra_EXT_transform_feedback" ],
 | 
			
		||||
  [ "MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS", "CONTEXT_INT(Const.MaxTransformFeedbackBuffers), extra_EXT_transform_feedback" ],
 | 
			
		||||
  [ "MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS", "CONTEXT_INT(Const.MaxTransformFeedbackSeparateComponents), extra_EXT_transform_feedback" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_transform_feedback2
 | 
			
		||||
  [ "TRANSFORM_FEEDBACK_BUFFER_PAUSED", "LOC_CUSTOM, TYPE_BOOLEAN, 0, extra_ARB_transform_feedback2" ],
 | 
			
		||||
  [ "TRANSFORM_FEEDBACK_BUFFER_ACTIVE", "LOC_CUSTOM, TYPE_BOOLEAN, 0, extra_ARB_transform_feedback2" ],
 | 
			
		||||
  [ "TRANSFORM_FEEDBACK_BINDING", "LOC_CUSTOM, TYPE_INT, 0, extra_ARB_transform_feedback2" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_transform_feedback3
 | 
			
		||||
  [ "MAX_TRANSFORM_FEEDBACK_BUFFERS", "CONTEXT_INT(Const.MaxTransformFeedbackBuffers), extra_ARB_transform_feedback3" ],
 | 
			
		||||
  [ "MAX_VERTEX_STREAMS", "CONTEXT_INT(Const.MaxVertexStreams), extra_ARB_transform_feedback3" ],
 | 
			
		||||
@@ -642,9 +666,6 @@ descriptor=[
 | 
			
		||||
  [ "SAMPLER_BINDING", "LOC_CUSTOM, TYPE_INT, GL_SAMPLER_BINDING, NO_EXTRA" ],
 | 
			
		||||
 | 
			
		||||
# GL 3.0
 | 
			
		||||
  [ "NUM_EXTENSIONS", "LOC_CUSTOM, TYPE_INT, 0, extra_version_30" ],
 | 
			
		||||
  [ "MAJOR_VERSION", "LOC_CUSTOM, TYPE_INT, 0, extra_version_30" ],
 | 
			
		||||
  [ "MINOR_VERSION", "LOC_CUSTOM, TYPE_INT, 0, extra_version_30" ],
 | 
			
		||||
  [ "CONTEXT_FLAGS", "CONTEXT_INT(Const.ContextFlags), extra_version_30" ],
 | 
			
		||||
 | 
			
		||||
# GL3.0 / GL_EXT_framebuffer_sRGB
 | 
			
		||||
@@ -671,17 +692,8 @@ descriptor=[
 | 
			
		||||
  [ "MAX_DUAL_SOURCE_DRAW_BUFFERS", "CONTEXT_INT(Const.MaxDualSourceDrawBuffers), extra_ARB_blend_func_extended" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_uniform_buffer_object
 | 
			
		||||
  [ "MAX_VERTEX_UNIFORM_BLOCKS", "CONTEXT_INT(Const.VertexProgram.MaxUniformBlocks), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "MAX_FRAGMENT_UNIFORM_BLOCKS", "CONTEXT_INT(Const.FragmentProgram.MaxUniformBlocks), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "MAX_GEOMETRY_UNIFORM_BLOCKS", "CONTEXT_INT(Const.GeometryProgram.MaxUniformBlocks), extra_ARB_uniform_buffer_object_and_geometry_shader" ],
 | 
			
		||||
  [ "MAX_COMBINED_UNIFORM_BLOCKS", "CONTEXT_INT(Const.MaxCombinedUniformBlocks), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "MAX_UNIFORM_BLOCK_SIZE", "CONTEXT_INT(Const.MaxUniformBlockSize), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "MAX_UNIFORM_BUFFER_BINDINGS", "CONTEXT_INT(Const.MaxUniformBufferBindings), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS", "CONTEXT_INT(Const.VertexProgram.MaxCombinedUniformComponents), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS", "CONTEXT_INT(Const.FragmentProgram.MaxCombinedUniformComponents), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS", "CONTEXT_INT(Const.GeometryProgram.MaxCombinedUniformComponents), extra_ARB_uniform_buffer_object_and_geometry_shader" ],
 | 
			
		||||
  [ "UNIFORM_BUFFER_OFFSET_ALIGNMENT", "CONTEXT_INT(Const.UniformBufferOffsetAlignment), extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
  [ "UNIFORM_BUFFER_BINDING", "LOC_CUSTOM, TYPE_INT, 0, extra_ARB_uniform_buffer_object" ],
 | 
			
		||||
 | 
			
		||||
# GL_ARB_timer_query
 | 
			
		||||
  [ "TIMESTAMP", "LOC_CUSTOM, TYPE_INT64, 0, extra_ARB_timer_query" ],
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,9 @@ shading_language_version(struct gl_context *ctx)
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case API_OPENGLES2:
 | 
			
		||||
      return (const GLubyte *) "OpenGL ES GLSL ES 1.0.16";
 | 
			
		||||
      return (ctx->Version < 30)
 | 
			
		||||
         ? (const GLubyte *) "OpenGL ES GLSL ES 1.0.16"
 | 
			
		||||
         : (const GLubyte *) "OpenGL ES GLSL ES 3.0";
 | 
			
		||||
 | 
			
		||||
   case API_OPENGLES:
 | 
			
		||||
      /* fall-through */
 | 
			
		||||
 
 | 
			
		||||
@@ -271,7 +271,8 @@ _mesa_bytes_per_pixel(GLenum format, GLenum type)
 | 
			
		||||
   case GL_UNSIGNED_INT_10_10_10_2:
 | 
			
		||||
   case GL_UNSIGNED_INT_2_10_10_10_REV:
 | 
			
		||||
      if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
 | 
			
		||||
          format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
 | 
			
		||||
          format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT ||
 | 
			
		||||
          format == GL_RGB)
 | 
			
		||||
         return sizeof(GLuint);
 | 
			
		||||
      else
 | 
			
		||||
         return -1;
 | 
			
		||||
@@ -353,21 +354,9 @@ _mesa_bytes_per_vertex_attrib(GLint comps, GLenum type)
 | 
			
		||||
 * Test if the given format is an integer (non-normalized) format.
 | 
			
		||||
 */
 | 
			
		||||
GLboolean
 | 
			
		||||
_mesa_is_enum_format_integer(GLenum format)
 | 
			
		||||
_mesa_is_enum_format_unsigned_int(GLenum format)
 | 
			
		||||
{
 | 
			
		||||
   switch (format) {
 | 
			
		||||
   /* generic integer formats */
 | 
			
		||||
   case GL_RED_INTEGER_EXT:
 | 
			
		||||
   case GL_GREEN_INTEGER_EXT:
 | 
			
		||||
   case GL_BLUE_INTEGER_EXT:
 | 
			
		||||
   case GL_ALPHA_INTEGER_EXT:
 | 
			
		||||
   case GL_RGB_INTEGER_EXT:
 | 
			
		||||
   case GL_RGBA_INTEGER_EXT:
 | 
			
		||||
   case GL_BGR_INTEGER_EXT:
 | 
			
		||||
   case GL_BGRA_INTEGER_EXT:
 | 
			
		||||
   case GL_LUMINANCE_INTEGER_EXT:
 | 
			
		||||
   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
 | 
			
		||||
   case GL_RG_INTEGER:
 | 
			
		||||
   /* specific integer formats */
 | 
			
		||||
   case GL_RGBA32UI_EXT:
 | 
			
		||||
   case GL_RGB32UI_EXT:
 | 
			
		||||
@@ -393,6 +382,34 @@ _mesa_is_enum_format_integer(GLenum format)
 | 
			
		||||
   case GL_INTENSITY8UI_EXT:
 | 
			
		||||
   case GL_LUMINANCE8UI_EXT:
 | 
			
		||||
   case GL_LUMINANCE_ALPHA8UI_EXT:
 | 
			
		||||
   case GL_RGB10_A2UI:
 | 
			
		||||
      return GL_TRUE;
 | 
			
		||||
   default:
 | 
			
		||||
      return GL_FALSE;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Test if the given format is an integer (non-normalized) format.
 | 
			
		||||
 */
 | 
			
		||||
GLboolean
 | 
			
		||||
_mesa_is_enum_format_signed_int(GLenum format)
 | 
			
		||||
{
 | 
			
		||||
   switch (format) {
 | 
			
		||||
   /* generic integer formats */
 | 
			
		||||
   case GL_RED_INTEGER_EXT:
 | 
			
		||||
   case GL_GREEN_INTEGER_EXT:
 | 
			
		||||
   case GL_BLUE_INTEGER_EXT:
 | 
			
		||||
   case GL_ALPHA_INTEGER_EXT:
 | 
			
		||||
   case GL_RGB_INTEGER_EXT:
 | 
			
		||||
   case GL_RGBA_INTEGER_EXT:
 | 
			
		||||
   case GL_BGR_INTEGER_EXT:
 | 
			
		||||
   case GL_BGRA_INTEGER_EXT:
 | 
			
		||||
   case GL_LUMINANCE_INTEGER_EXT:
 | 
			
		||||
   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
 | 
			
		||||
   case GL_RG_INTEGER:
 | 
			
		||||
   /* specific integer formats */
 | 
			
		||||
   case GL_RGBA32I_EXT:
 | 
			
		||||
   case GL_RGB32I_EXT:
 | 
			
		||||
   case GL_RG32I:
 | 
			
		||||
@@ -417,7 +434,6 @@ _mesa_is_enum_format_integer(GLenum format)
 | 
			
		||||
   case GL_INTENSITY8I_EXT:
 | 
			
		||||
   case GL_LUMINANCE8I_EXT:
 | 
			
		||||
   case GL_LUMINANCE_ALPHA8I_EXT:
 | 
			
		||||
   case GL_RGB10_A2UI:
 | 
			
		||||
      return GL_TRUE;
 | 
			
		||||
   default:
 | 
			
		||||
      return GL_FALSE;
 | 
			
		||||
@@ -425,6 +441,17 @@ _mesa_is_enum_format_integer(GLenum format)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Test if the given format is an integer (non-normalized) format.
 | 
			
		||||
 */
 | 
			
		||||
GLboolean
 | 
			
		||||
_mesa_is_enum_format_integer(GLenum format)
 | 
			
		||||
{
 | 
			
		||||
   return _mesa_is_enum_format_unsigned_int(format) ||
 | 
			
		||||
          _mesa_is_enum_format_signed_int(format);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Test if the given type is an integer (non-normalized) format.
 | 
			
		||||
 */
 | 
			
		||||
@@ -1031,6 +1058,32 @@ _mesa_base_format_has_channel(GLenum base_format, GLenum pname)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns the number of channels/components for a base format.
 | 
			
		||||
 */
 | 
			
		||||
GLint
 | 
			
		||||
_mesa_base_format_component_count(GLenum base_format)
 | 
			
		||||
{
 | 
			
		||||
   switch (base_format) {
 | 
			
		||||
   case GL_RED:
 | 
			
		||||
   case GL_ALPHA:
 | 
			
		||||
   case GL_INTENSITY:
 | 
			
		||||
   case GL_DEPTH_COMPONENT:
 | 
			
		||||
      return 1;
 | 
			
		||||
   case GL_RG:
 | 
			
		||||
   case GL_LUMINANCE_ALPHA:
 | 
			
		||||
   case GL_DEPTH_STENCIL:
 | 
			
		||||
      return 2;
 | 
			
		||||
   case GL_RGB:
 | 
			
		||||
      return 3;
 | 
			
		||||
   case GL_RGBA:
 | 
			
		||||
      return 4;
 | 
			
		||||
   default:
 | 
			
		||||
      return -1;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * If format is a generic compressed format, return the corresponding
 | 
			
		||||
 * non-compressed format.  For other formats, return the format as-is.
 | 
			
		||||
@@ -1236,6 +1289,10 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx,
 | 
			
		||||
          ctx->Extensions.ARB_texture_rgb10_a2ui) {
 | 
			
		||||
         break; /* OK */
 | 
			
		||||
      }
 | 
			
		||||
      if (type == GL_UNSIGNED_INT_2_10_10_10_REV && format == GL_RGB &&
 | 
			
		||||
          ctx->API == API_OPENGLES2) {
 | 
			
		||||
         break; /* OK by GL_EXT_texture_type_2_10_10_10_REV */
 | 
			
		||||
      }
 | 
			
		||||
      return GL_INVALID_OPERATION;
 | 
			
		||||
 | 
			
		||||
   case GL_UNSIGNED_INT_24_8:
 | 
			
		||||
@@ -1349,6 +1406,11 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx,
 | 
			
		||||
            case GL_UNSIGNED_SHORT_5_6_5:
 | 
			
		||||
            case GL_UNSIGNED_SHORT_5_6_5_REV:
 | 
			
		||||
               return GL_NO_ERROR;
 | 
			
		||||
            case GL_UNSIGNED_INT_2_10_10_10_REV:
 | 
			
		||||
               /* OK by GL_EXT_texture_type_2_10_10_10_REV */
 | 
			
		||||
               if (ctx->API == API_OPENGLES2) {
 | 
			
		||||
                  return GL_NO_ERROR;
 | 
			
		||||
               }
 | 
			
		||||
            case GL_HALF_FLOAT:
 | 
			
		||||
               return ctx->Extensions.ARB_half_float_pixel
 | 
			
		||||
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
 | 
			
		||||
@@ -1425,8 +1487,18 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx,
 | 
			
		||||
         else if (ctx->Extensions.ARB_depth_buffer_float &&
 | 
			
		||||
             type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV)
 | 
			
		||||
            return GL_NO_ERROR;
 | 
			
		||||
         else
 | 
			
		||||
         switch (type) {
 | 
			
		||||
         case GL_BYTE:
 | 
			
		||||
         case GL_UNSIGNED_BYTE:
 | 
			
		||||
         case GL_SHORT:
 | 
			
		||||
         case GL_UNSIGNED_SHORT:
 | 
			
		||||
         case GL_INT:
 | 
			
		||||
         case GL_UNSIGNED_INT:
 | 
			
		||||
         case GL_FLOAT:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_ENUM;
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
      case GL_DUDV_ATI:
 | 
			
		||||
      case GL_DU8DV8_ATI:
 | 
			
		||||
@@ -1617,3 +1689,442 @@ _mesa_es_error_check_format_and_type(GLenum format, GLenum type,
 | 
			
		||||
 | 
			
		||||
   return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Do error checking of format/type combinations for OpenGL ES 3
 | 
			
		||||
 * glTex[Sub]Image.
 | 
			
		||||
 * \return error code, or GL_NO_ERROR.
 | 
			
		||||
 */
 | 
			
		||||
GLenum
 | 
			
		||||
_mesa_es3_error_check_format_and_type(GLenum format, GLenum type,
 | 
			
		||||
                                      GLenum internalFormat,
 | 
			
		||||
                                      unsigned dimensions)
 | 
			
		||||
{
 | 
			
		||||
   GLboolean type_valid = GL_TRUE;
 | 
			
		||||
 | 
			
		||||
   switch (format) {
 | 
			
		||||
   case GL_RGBA:
 | 
			
		||||
      switch (type) {
 | 
			
		||||
      case GL_UNSIGNED_BYTE:
 | 
			
		||||
         switch (internalFormat) {
 | 
			
		||||
         case GL_RGBA:
 | 
			
		||||
         case GL_RGBA8:
 | 
			
		||||
         case GL_RGB5_A1:
 | 
			
		||||
         case GL_RGBA4:
 | 
			
		||||
         case GL_SRGB8_ALPHA8_EXT:
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_BYTE:
 | 
			
		||||
         if (internalFormat != GL_RGBA8_SNORM)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_SHORT_4_4_4_4:
 | 
			
		||||
         switch (internalFormat) {
 | 
			
		||||
         case GL_RGBA:
 | 
			
		||||
         case GL_RGBA4:
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_SHORT_5_5_5_1:
 | 
			
		||||
         switch (internalFormat) {
 | 
			
		||||
         case GL_RGBA:
 | 
			
		||||
         case GL_RGB5_A1:
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_INT_2_10_10_10_REV:
 | 
			
		||||
         switch (internalFormat) {
 | 
			
		||||
         case GL_RGBA: /* XXX: Spec does *not* say this, but the test expects it */
 | 
			
		||||
         case GL_RGB10_A2:
 | 
			
		||||
         case GL_RGB5_A1:
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_HALF_FLOAT:
 | 
			
		||||
         if (internalFormat != GL_RGBA16F)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_FLOAT:
 | 
			
		||||
         switch (internalFormat) {
 | 
			
		||||
         case GL_RGBA16F:
 | 
			
		||||
         case GL_RGBA32F:
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      default:
 | 
			
		||||
         return GL_INVALID_OPERATION;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case GL_RGBA_INTEGER:
 | 
			
		||||
      switch (type) {
 | 
			
		||||
      case GL_UNSIGNED_BYTE:
 | 
			
		||||
         if (internalFormat != GL_RGBA8UI)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_BYTE:
 | 
			
		||||
         if (internalFormat != GL_RGBA8I)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_SHORT:
 | 
			
		||||
         if (internalFormat != GL_RGBA16UI)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_SHORT:
 | 
			
		||||
         if (internalFormat != GL_RGBA16I)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_INT:
 | 
			
		||||
         if (internalFormat != GL_RGBA32UI)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_INT:
 | 
			
		||||
         if (internalFormat != GL_RGBA32I)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_INT_2_10_10_10_REV:
 | 
			
		||||
         if (internalFormat != GL_RGB10_A2UI)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      default:
 | 
			
		||||
         return GL_INVALID_OPERATION;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case GL_RGB:
 | 
			
		||||
      switch (type) {
 | 
			
		||||
      case GL_UNSIGNED_BYTE:
 | 
			
		||||
         switch (internalFormat) {
 | 
			
		||||
         case GL_RGB:
 | 
			
		||||
         case GL_RGB8:
 | 
			
		||||
         case GL_RGB565:
 | 
			
		||||
         case GL_SRGB8:
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_BYTE:
 | 
			
		||||
         if (internalFormat != GL_RGB8_SNORM)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_SHORT_5_6_5:
 | 
			
		||||
         switch (internalFormat) {
 | 
			
		||||
         case GL_RGB:
 | 
			
		||||
         case GL_RGB565:
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_INT_10F_11F_11F_REV:
 | 
			
		||||
         if (internalFormat != GL_R11F_G11F_B10F)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_INT_5_9_9_9_REV:
 | 
			
		||||
         if (internalFormat != GL_RGB9_E5)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_HALF_FLOAT:
 | 
			
		||||
         switch (internalFormat) {
 | 
			
		||||
         case GL_RGB16F:
 | 
			
		||||
         case GL_R11F_G11F_B10F:
 | 
			
		||||
         case GL_RGB9_E5:
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_FLOAT:
 | 
			
		||||
         switch (internalFormat) {
 | 
			
		||||
         case GL_RGB16F:
 | 
			
		||||
         case GL_RGB32F:
 | 
			
		||||
         case GL_R11F_G11F_B10F:
 | 
			
		||||
         case GL_RGB9_E5:
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_INT_2_10_10_10_REV:
 | 
			
		||||
         switch (internalFormat) {
 | 
			
		||||
         case GL_RGB:
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      default:
 | 
			
		||||
         return GL_INVALID_OPERATION;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case GL_RGB_INTEGER:
 | 
			
		||||
      switch (type) {
 | 
			
		||||
      case GL_UNSIGNED_BYTE:
 | 
			
		||||
         if (internalFormat != GL_RGB8UI)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_BYTE:
 | 
			
		||||
         if (internalFormat != GL_RGB8I)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_SHORT:
 | 
			
		||||
         if (internalFormat != GL_RGB16UI)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_SHORT:
 | 
			
		||||
         if (internalFormat != GL_RGB16I)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_INT:
 | 
			
		||||
         if (internalFormat != GL_RGB32UI)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_INT:
 | 
			
		||||
         if (internalFormat != GL_RGB32I)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      default:
 | 
			
		||||
         return GL_INVALID_OPERATION;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case GL_RG:
 | 
			
		||||
      switch (type) {
 | 
			
		||||
      case GL_UNSIGNED_BYTE:
 | 
			
		||||
         if (internalFormat != GL_RG8)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_BYTE:
 | 
			
		||||
         if (internalFormat != GL_RG8_SNORM)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_HALF_FLOAT:
 | 
			
		||||
         if (internalFormat != GL_RG16F)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_FLOAT:
 | 
			
		||||
         switch (internalFormat) {
 | 
			
		||||
         case GL_RG16F:
 | 
			
		||||
         case GL_RG32F:
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      default:
 | 
			
		||||
         return GL_INVALID_OPERATION;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case GL_RG_INTEGER:
 | 
			
		||||
      switch (type) {
 | 
			
		||||
      case GL_UNSIGNED_BYTE:
 | 
			
		||||
         if (internalFormat != GL_RG8UI)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_BYTE:
 | 
			
		||||
         if (internalFormat != GL_RG8I)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_SHORT:
 | 
			
		||||
         if (internalFormat != GL_RG16UI)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_SHORT:
 | 
			
		||||
         if (internalFormat != GL_RG16I)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_INT:
 | 
			
		||||
         if (internalFormat != GL_RG32UI)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_INT:
 | 
			
		||||
         if (internalFormat != GL_RG32I)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      default:
 | 
			
		||||
         return GL_INVALID_OPERATION;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case GL_RED:
 | 
			
		||||
      switch (type) {
 | 
			
		||||
      case GL_UNSIGNED_BYTE:
 | 
			
		||||
         if (internalFormat != GL_R8)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_BYTE:
 | 
			
		||||
         if (internalFormat != GL_R8_SNORM)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_HALF_FLOAT:
 | 
			
		||||
         if (internalFormat != GL_R16F)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_FLOAT:
 | 
			
		||||
         switch (internalFormat) {
 | 
			
		||||
         case GL_R16F:
 | 
			
		||||
         case GL_R32F:
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      default:
 | 
			
		||||
         return GL_INVALID_OPERATION;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case GL_RED_INTEGER:
 | 
			
		||||
      switch (type) {
 | 
			
		||||
      case GL_UNSIGNED_BYTE:
 | 
			
		||||
         if (internalFormat != GL_R8UI)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_BYTE:
 | 
			
		||||
         if (internalFormat != GL_R8I)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_SHORT:
 | 
			
		||||
         if (internalFormat != GL_R16UI)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_SHORT:
 | 
			
		||||
         if (internalFormat != GL_R16I)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_INT:
 | 
			
		||||
         if (internalFormat != GL_R32UI)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_INT:
 | 
			
		||||
         if (internalFormat != GL_R32I)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      default:
 | 
			
		||||
         return GL_INVALID_OPERATION;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case GL_DEPTH_COMPONENT:
 | 
			
		||||
      if (dimensions != 2) {
 | 
			
		||||
         return GL_INVALID_OPERATION;
 | 
			
		||||
      }
 | 
			
		||||
      switch (type) {
 | 
			
		||||
      case GL_UNSIGNED_SHORT:
 | 
			
		||||
         if (internalFormat != GL_DEPTH_COMPONENT16)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_UNSIGNED_INT:
 | 
			
		||||
         switch (internalFormat) {
 | 
			
		||||
         case GL_DEPTH_COMPONENT16:
 | 
			
		||||
         case GL_DEPTH_COMPONENT24:
 | 
			
		||||
            break;
 | 
			
		||||
         default:
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_FLOAT:
 | 
			
		||||
         if (internalFormat != GL_DEPTH_COMPONENT32F)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      default:
 | 
			
		||||
         return GL_INVALID_OPERATION;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case GL_DEPTH_STENCIL:
 | 
			
		||||
      if (dimensions != 2) {
 | 
			
		||||
         return GL_INVALID_OPERATION;
 | 
			
		||||
      }
 | 
			
		||||
      switch (type) {
 | 
			
		||||
      case GL_UNSIGNED_INT_24_8:
 | 
			
		||||
         if (internalFormat != GL_DEPTH24_STENCIL8)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
 | 
			
		||||
         if (internalFormat != GL_DEPTH32F_STENCIL8)
 | 
			
		||||
            return GL_INVALID_OPERATION;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      default:
 | 
			
		||||
         return GL_INVALID_OPERATION;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
   case GL_ALPHA:
 | 
			
		||||
   case GL_LUMINANCE:
 | 
			
		||||
   case GL_LUMINANCE_ALPHA:
 | 
			
		||||
      if (type != GL_UNSIGNED_BYTE || format != internalFormat)
 | 
			
		||||
         return GL_INVALID_OPERATION;
 | 
			
		||||
      break;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -61,6 +61,12 @@ _mesa_is_type_unsigned(GLenum type);
 | 
			
		||||
extern GLboolean
 | 
			
		||||
_mesa_is_enum_format_integer(GLenum format);
 | 
			
		||||
 | 
			
		||||
extern GLboolean
 | 
			
		||||
_mesa_is_enum_format_unsigned_int(GLenum format);
 | 
			
		||||
 | 
			
		||||
extern GLboolean
 | 
			
		||||
_mesa_is_enum_format_signed_int(GLenum format);
 | 
			
		||||
 | 
			
		||||
extern GLboolean
 | 
			
		||||
_mesa_is_enum_format_or_type_integer(GLenum format, GLenum type);
 | 
			
		||||
 | 
			
		||||
@@ -94,6 +100,9 @@ _mesa_base_format_to_integer_format(GLenum format);
 | 
			
		||||
extern GLboolean
 | 
			
		||||
_mesa_base_format_has_channel(GLenum base_format, GLenum pname);
 | 
			
		||||
 | 
			
		||||
extern GLint
 | 
			
		||||
_mesa_base_format_component_count(GLenum base_format);
 | 
			
		||||
 | 
			
		||||
extern GLenum
 | 
			
		||||
_mesa_generic_compressed_format_to_uncompressed_format(GLenum format);
 | 
			
		||||
 | 
			
		||||
@@ -111,6 +120,11 @@ extern GLenum
 | 
			
		||||
_mesa_es_error_check_format_and_type(GLenum format, GLenum type,
 | 
			
		||||
                                     unsigned dimensions);
 | 
			
		||||
 | 
			
		||||
extern GLenum
 | 
			
		||||
_mesa_es3_error_check_format_and_type(GLenum format, GLenum type,
 | 
			
		||||
                                      GLenum internalFormat,
 | 
			
		||||
                                      unsigned dimensions);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1634,9 +1634,20 @@ struct gl_array_attrib
 | 
			
		||||
   GLuint LockFirst;            /**< GL_EXT_compiled_vertex_array */
 | 
			
		||||
   GLuint LockCount;            /**< GL_EXT_compiled_vertex_array */
 | 
			
		||||
 | 
			
		||||
   /** GL 3.1 (slightly different from GL_NV_primitive_restart) */
 | 
			
		||||
   /**
 | 
			
		||||
    * \name Primitive restart controls
 | 
			
		||||
    *
 | 
			
		||||
    * Primitive restart is enabled if either \c PrimitiveRestart or
 | 
			
		||||
    * \c PrimitiveRestart is set.  If \c PrimitiveRestart is set, then
 | 
			
		||||
    * \c RestartIndex is used as the cut vertex.  Otherwise ~0 is used.
 | 
			
		||||
    */
 | 
			
		||||
   /*@{*/
 | 
			
		||||
   GLboolean PrimitiveRestart;
 | 
			
		||||
   GLboolean PrimitiveRestartFixedIndex;
 | 
			
		||||
   GLboolean _PrimitiveRestart;
 | 
			
		||||
   GLuint RestartIndex;
 | 
			
		||||
   GLuint _RestartIndex;
 | 
			
		||||
   /*@}*/
 | 
			
		||||
 | 
			
		||||
   /* GL_ARB_vertex_buffer_object */
 | 
			
		||||
   struct gl_buffer_object *ArrayBufferObj;
 | 
			
		||||
@@ -2962,6 +2973,17 @@ struct gl_constants
 | 
			
		||||
    * Drivers that support transform feedback must set this value to GL_FALSE.
 | 
			
		||||
    */
 | 
			
		||||
   GLboolean DisableVaryingPacking;
 | 
			
		||||
 | 
			
		||||
   /*
 | 
			
		||||
    * Maximum value supported for an index in DrawElements and friends.
 | 
			
		||||
    *
 | 
			
		||||
    * This must be at least (1ull<<24)-1.  The default value is
 | 
			
		||||
    * (1ull<<32)-1.
 | 
			
		||||
    *
 | 
			
		||||
    * \since ES 3.0 or GL_ARB_ES3_compatibility
 | 
			
		||||
    * \sa _mesa_init_constants
 | 
			
		||||
    */
 | 
			
		||||
   GLuint64 MaxElementIndex;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -3358,6 +3380,7 @@ typedef enum
 | 
			
		||||
   API_OPENGLES,
 | 
			
		||||
   API_OPENGLES2,
 | 
			
		||||
   API_OPENGL_CORE,
 | 
			
		||||
   API_OPENGL_LAST = API_OPENGL_CORE,
 | 
			
		||||
} gl_api;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -885,7 +885,7 @@ _mesa_pack_rgba_span_from_uints(struct gl_context *ctx, GLuint n, GLuint rgba[][
 | 
			
		||||
#undef FN_NAME
 | 
			
		||||
 | 
			
		||||
#define DST_TYPE GLubyte
 | 
			
		||||
#define SRC_CONVERT(x) MAX2(x, 0)
 | 
			
		||||
#define SRC_CONVERT(x) CLAMP(x, 0, 0x7f)
 | 
			
		||||
#define FN_NAME pack_ubyte_from_int_rgba
 | 
			
		||||
#include "pack_tmp.h"
 | 
			
		||||
#undef DST_TYPE
 | 
			
		||||
@@ -3641,7 +3641,11 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
 | 
			
		||||
               rgba[i][rDst] = ((p      ) & 0x3ff) * rs;
 | 
			
		||||
               rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
 | 
			
		||||
               rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
 | 
			
		||||
               rgba[i][aDst] = ((p >> 30)        ) * as;
 | 
			
		||||
               if (aSrc < 0) {
 | 
			
		||||
                  rgba[i][aDst] = 1.0F;
 | 
			
		||||
               } else {
 | 
			
		||||
                  rgba[i][aDst] = (p >> 30) * as;
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
         else {
 | 
			
		||||
@@ -3652,7 +3656,11 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
 | 
			
		||||
               rgba[i][rDst] = ((p      ) & 0x3ff) * rs;
 | 
			
		||||
               rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
 | 
			
		||||
               rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
 | 
			
		||||
               rgba[i][aDst] = ((p >> 30)        ) * as;
 | 
			
		||||
               if (aSrc < 0) {
 | 
			
		||||
                  rgba[i][aDst] = 1.0F;
 | 
			
		||||
               } else {
 | 
			
		||||
                  rgba[i][aDst] = (p >> 30) * as;
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 
 | 
			
		||||
@@ -147,6 +147,12 @@ get_query_binding_point(struct gl_context *ctx, GLenum target)
 | 
			
		||||
         return &ctx->Query.CurrentOcclusionObject;
 | 
			
		||||
      else
 | 
			
		||||
         return NULL;
 | 
			
		||||
   case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
 | 
			
		||||
      if (ctx->Extensions.ARB_ES3_compatibility
 | 
			
		||||
          || (ctx->API == API_OPENGLES2 && ctx->Version >= 30))
 | 
			
		||||
         return &ctx->Query.CurrentOcclusionObject;
 | 
			
		||||
      else
 | 
			
		||||
         return NULL;
 | 
			
		||||
   case GL_TIME_ELAPSED_EXT:
 | 
			
		||||
      if (ctx->Extensions.EXT_timer_query)
 | 
			
		||||
         return &ctx->Query.CurrentTimerObject;
 | 
			
		||||
@@ -577,7 +583,8 @@ _mesa_GetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
 | 
			
		||||
         if (!q->Ready)
 | 
			
		||||
            ctx->Driver.WaitQuery(ctx, q);
 | 
			
		||||
         /* if result is too large for returned type, clamp to max value */
 | 
			
		||||
         if (q->Target == GL_ANY_SAMPLES_PASSED) {
 | 
			
		||||
         if (q->Target == GL_ANY_SAMPLES_PASSED
 | 
			
		||||
             || q->Target == GL_ANY_SAMPLES_PASSED_CONSERVATIVE) {
 | 
			
		||||
            if (q->Result)
 | 
			
		||||
               *params = GL_TRUE;
 | 
			
		||||
            else
 | 
			
		||||
@@ -628,7 +635,8 @@ _mesa_GetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
 | 
			
		||||
         if (!q->Ready)
 | 
			
		||||
            ctx->Driver.WaitQuery(ctx, q);
 | 
			
		||||
         /* if result is too large for returned type, clamp to max value */
 | 
			
		||||
         if (q->Target == GL_ANY_SAMPLES_PASSED) {
 | 
			
		||||
         if (q->Target == GL_ANY_SAMPLES_PASSED
 | 
			
		||||
             || q->Target == GL_ANY_SAMPLES_PASSED_CONSERVATIVE) {
 | 
			
		||||
            if (q->Result)
 | 
			
		||||
               *params = GL_TRUE;
 | 
			
		||||
            else
 | 
			
		||||
 
 | 
			
		||||
@@ -325,6 +325,11 @@ slow_read_rgba_pixels( struct gl_context *ctx,
 | 
			
		||||
   GLboolean dst_is_integer = _mesa_is_enum_format_integer(format);
 | 
			
		||||
   GLboolean dst_is_uint = _mesa_is_format_unsigned(rbFormat);
 | 
			
		||||
 | 
			
		||||
   if (_mesa_is_format_integer_color(rbFormat) && format == GL_RGBA && type == GL_UNSIGNED_BYTE) {
 | 
			
		||||
      format = GL_RGBA_INTEGER;
 | 
			
		||||
      dst_is_integer = GL_TRUE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   dstStride = _mesa_image_row_stride(packing, width, format, type);
 | 
			
		||||
   dst = (GLubyte *) _mesa_image_address2d(packing, pixels, width, height,
 | 
			
		||||
					   format, type, 0, 0);
 | 
			
		||||
@@ -674,12 +679,57 @@ _mesa_readpixels(struct gl_context *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLenum
 | 
			
		||||
read_pixels_es3_error_check(GLenum format, GLenum type,
 | 
			
		||||
                            GLenum internalFormat)
 | 
			
		||||
{
 | 
			
		||||
   GLboolean is_unsigned_int = GL_FALSE;
 | 
			
		||||
   GLboolean is_signed_int = GL_FALSE;
 | 
			
		||||
 | 
			
		||||
   if (!_mesa_is_color_format(internalFormat)) {
 | 
			
		||||
      return GL_INVALID_OPERATION;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   is_unsigned_int = _mesa_is_enum_format_unsigned_int(internalFormat);
 | 
			
		||||
   if (!is_unsigned_int) {
 | 
			
		||||
      is_signed_int = _mesa_is_enum_format_signed_int(internalFormat);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   switch (format) {
 | 
			
		||||
   case GL_RGBA:
 | 
			
		||||
      if (type == GL_UNSIGNED_BYTE)
 | 
			
		||||
         return GL_NO_ERROR;
 | 
			
		||||
      if (internalFormat == GL_RGB10_A2 &&
 | 
			
		||||
          type == GL_UNSIGNED_INT_2_10_10_10_REV)
 | 
			
		||||
         return GL_NO_ERROR;
 | 
			
		||||
      if (internalFormat == GL_RGB10_A2UI && type == GL_UNSIGNED_BYTE)
 | 
			
		||||
         return GL_NO_ERROR;
 | 
			
		||||
      break;
 | 
			
		||||
   case GL_BGRA:
 | 
			
		||||
      /* GL_EXT_read_format_bgra */
 | 
			
		||||
      if (type == GL_UNSIGNED_BYTE ||
 | 
			
		||||
          type == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
 | 
			
		||||
          type == GL_UNSIGNED_SHORT_1_5_5_5_REV)
 | 
			
		||||
         return GL_NO_ERROR;
 | 
			
		||||
      break;
 | 
			
		||||
   case GL_RGBA_INTEGER:
 | 
			
		||||
      if ((is_signed_int && type == GL_INT) ||
 | 
			
		||||
          (is_unsigned_int && type == GL_UNSIGNED_INT))
 | 
			
		||||
         return GL_NO_ERROR;
 | 
			
		||||
      break;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   return GL_INVALID_OPERATION;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void GLAPIENTRY
 | 
			
		||||
_mesa_ReadnPixelsARB( GLint x, GLint y, GLsizei width, GLsizei height,
 | 
			
		||||
		      GLenum format, GLenum type, GLsizei bufSize,
 | 
			
		||||
                      GLvoid *pixels )
 | 
			
		||||
{
 | 
			
		||||
   GLenum err;
 | 
			
		||||
   GLenum err = GL_NO_ERROR;
 | 
			
		||||
   struct gl_renderbuffer *rb;
 | 
			
		||||
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 | 
			
		||||
@@ -699,6 +749,22 @@ _mesa_ReadnPixelsARB( GLint x, GLint y, GLsizei width, GLsizei height,
 | 
			
		||||
      return;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (ctx->NewState)
 | 
			
		||||
      _mesa_update_state(ctx);
 | 
			
		||||
 | 
			
		||||
   if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
 | 
			
		||||
      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
 | 
			
		||||
                  "glReadPixels(incomplete framebuffer)" );
 | 
			
		||||
      return;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   rb = _mesa_get_read_renderbuffer(ctx, format);
 | 
			
		||||
   if (rb == NULL) {
 | 
			
		||||
      _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
                  "glReadPixels(read buffer)");
 | 
			
		||||
      return;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* OpenGL ES 1.x and OpenGL ES 2.0 impose additional restrictions on the
 | 
			
		||||
    * combinations of format and type that can be used.
 | 
			
		||||
    *
 | 
			
		||||
@@ -707,15 +773,21 @@ _mesa_ReadnPixelsARB( GLint x, GLint y, GLsizei width, GLsizei height,
 | 
			
		||||
    * preferred combination.  This code doesn't know what that preferred
 | 
			
		||||
    * combination is, and Mesa can handle anything valid.  Just work instead.
 | 
			
		||||
    */
 | 
			
		||||
   if (_mesa_is_gles(ctx) && ctx->Version < 30) {
 | 
			
		||||
      err = _mesa_es_error_check_format_and_type(format, type, 2);
 | 
			
		||||
      if (err == GL_NO_ERROR) {
 | 
			
		||||
         if (type == GL_FLOAT || type == GL_HALF_FLOAT_OES) {
 | 
			
		||||
            err = GL_INVALID_OPERATION;
 | 
			
		||||
         } else if (format == GL_DEPTH_COMPONENT
 | 
			
		||||
                    || format == GL_DEPTH_STENCIL) {
 | 
			
		||||
            err = GL_INVALID_ENUM;
 | 
			
		||||
   if (_mesa_is_gles(ctx)) {
 | 
			
		||||
      if (ctx->Version < 30) {
 | 
			
		||||
         err = _mesa_es_error_check_format_and_type(format, type, 2);
 | 
			
		||||
         if (err == GL_NO_ERROR) {
 | 
			
		||||
            if (type == GL_FLOAT || type == GL_HALF_FLOAT_OES) {
 | 
			
		||||
               err = GL_INVALID_OPERATION;
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
      } else {
 | 
			
		||||
         err = read_pixels_es3_error_check(format, type, rb->InternalFormat);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (err == GL_NO_ERROR && (format == GL_DEPTH_COMPONENT
 | 
			
		||||
          || format == GL_DEPTH_STENCIL)) {
 | 
			
		||||
         err = GL_INVALID_ENUM;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (err != GL_NO_ERROR) {
 | 
			
		||||
@@ -726,9 +798,6 @@ _mesa_ReadnPixelsARB( GLint x, GLint y, GLsizei width, GLsizei height,
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (ctx->NewState)
 | 
			
		||||
      _mesa_update_state(ctx);
 | 
			
		||||
 | 
			
		||||
   err = _mesa_error_check_format_and_type(ctx, format, type);
 | 
			
		||||
   if (err != GL_NO_ERROR) {
 | 
			
		||||
      _mesa_error(ctx, err, "glReadPixels(invalid format %s and/or type %s)",
 | 
			
		||||
@@ -737,12 +806,6 @@ _mesa_ReadnPixelsARB( GLint x, GLint y, GLsizei width, GLsizei height,
 | 
			
		||||
      return;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
 | 
			
		||||
      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
 | 
			
		||||
                  "glReadPixels(incomplete framebuffer)" );
 | 
			
		||||
      return;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (_mesa_is_user_fbo(ctx->ReadBuffer) &&
 | 
			
		||||
       ctx->ReadBuffer->Visual.samples > 0) {
 | 
			
		||||
      _mesa_error(ctx, GL_INVALID_OPERATION, "glReadPixels(multisample FBO)");
 | 
			
		||||
@@ -754,17 +817,25 @@ _mesa_ReadnPixelsARB( GLint x, GLint y, GLsizei width, GLsizei height,
 | 
			
		||||
      return;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Check that the destination format and source buffer are both
 | 
			
		||||
    * integer-valued or both non-integer-valued.
 | 
			
		||||
    */
 | 
			
		||||
   if (ctx->Extensions.EXT_texture_integer && _mesa_is_color_format(format)) {
 | 
			
		||||
      const struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer;
 | 
			
		||||
      const GLboolean srcInteger = _mesa_is_format_integer_color(rb->Format);
 | 
			
		||||
      const GLboolean dstInteger = _mesa_is_enum_format_integer(format);
 | 
			
		||||
      if (dstInteger != srcInteger) {
 | 
			
		||||
         _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
                     "glReadPixels(integer / non-integer format mismatch");
 | 
			
		||||
         return;
 | 
			
		||||
      if (_mesa_get_color_read_format(ctx) == format &&
 | 
			
		||||
          _mesa_get_color_read_type(ctx) == type) {
 | 
			
		||||
         /* IMPLEMENTATION_COLOR_READ_FORMAT and
 | 
			
		||||
          * IMPLEMENTATION_COLOR_READ_TYPE are being used. Therefore
 | 
			
		||||
          * we don't need to check integer vs. non-integer below.
 | 
			
		||||
          */
 | 
			
		||||
      } else {
 | 
			
		||||
         /* Check that the destination format and source buffer are both
 | 
			
		||||
          * integer-valued or both non-integer-valued.
 | 
			
		||||
          */
 | 
			
		||||
         const struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer;
 | 
			
		||||
         const GLboolean srcInteger = _mesa_is_format_integer_color(rb->Format);
 | 
			
		||||
         const GLboolean dstInteger = _mesa_is_enum_format_integer(format);
 | 
			
		||||
         if (dstInteger != srcInteger) {
 | 
			
		||||
            _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
                        "glReadPixels(integer / non-integer format mismatch");
 | 
			
		||||
            return;
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -465,18 +465,20 @@ _mesa_update_state_locked( struct gl_context *ctx )
 | 
			
		||||
   if (MESA_VERBOSE & VERBOSE_STATE)
 | 
			
		||||
      _mesa_print_state("_mesa_update_state", new_state);
 | 
			
		||||
 | 
			
		||||
   /* Determine which state flags effect vertex/fragment program state */
 | 
			
		||||
   if (ctx->FragmentProgram._MaintainTexEnvProgram) {
 | 
			
		||||
      prog_flags |= (_NEW_BUFFERS | _NEW_TEXTURE | _NEW_FOG |
 | 
			
		||||
		     _NEW_VARYING_VP_INPUTS | _NEW_LIGHT | _NEW_POINT |
 | 
			
		||||
		     _NEW_RENDERMODE | _NEW_PROGRAM | _NEW_FRAG_CLAMP |
 | 
			
		||||
		     _NEW_COLOR);
 | 
			
		||||
   }
 | 
			
		||||
   if (ctx->VertexProgram._MaintainTnlProgram) {
 | 
			
		||||
      prog_flags |= (_NEW_VARYING_VP_INPUTS | _NEW_TEXTURE |
 | 
			
		||||
                     _NEW_TEXTURE_MATRIX | _NEW_TRANSFORM | _NEW_POINT |
 | 
			
		||||
                     _NEW_FOG | _NEW_LIGHT |
 | 
			
		||||
                     _MESA_NEW_NEED_EYE_COORDS);
 | 
			
		||||
   if (ctx->API == API_OPENGL_COMPAT || ctx->API == API_OPENGLES) {
 | 
			
		||||
      /* Determine which state flags effect vertex/fragment program state */
 | 
			
		||||
      if (ctx->FragmentProgram._MaintainTexEnvProgram) {
 | 
			
		||||
         prog_flags |= (_NEW_BUFFERS | _NEW_TEXTURE | _NEW_FOG |
 | 
			
		||||
                        _NEW_VARYING_VP_INPUTS | _NEW_LIGHT | _NEW_POINT |
 | 
			
		||||
                        _NEW_RENDERMODE | _NEW_PROGRAM | _NEW_FRAG_CLAMP |
 | 
			
		||||
                        _NEW_COLOR);
 | 
			
		||||
      }
 | 
			
		||||
      if (ctx->VertexProgram._MaintainTnlProgram) {
 | 
			
		||||
         prog_flags |= (_NEW_VARYING_VP_INPUTS | _NEW_TEXTURE |
 | 
			
		||||
                        _NEW_TEXTURE_MATRIX | _NEW_TRANSFORM | _NEW_POINT |
 | 
			
		||||
                        _NEW_FOG | _NEW_LIGHT |
 | 
			
		||||
                        _MESA_NEW_NEED_EYE_COORDS);
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /*
 | 
			
		||||
@@ -486,8 +488,10 @@ _mesa_update_state_locked( struct gl_context *ctx )
 | 
			
		||||
   if (new_state & prog_flags)
 | 
			
		||||
      update_program_enables( ctx );
 | 
			
		||||
 | 
			
		||||
   if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION))
 | 
			
		||||
      _mesa_update_modelview_project( ctx, new_state );
 | 
			
		||||
   if (ctx->API == API_OPENGL_COMPAT || ctx->API == API_OPENGLES) {
 | 
			
		||||
      if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION))
 | 
			
		||||
         _mesa_update_modelview_project( ctx, new_state );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (new_state & (_NEW_PROGRAM|_NEW_TEXTURE|_NEW_TEXTURE_MATRIX))
 | 
			
		||||
      _mesa_update_texture( ctx, new_state );
 | 
			
		||||
@@ -501,8 +505,10 @@ _mesa_update_state_locked( struct gl_context *ctx )
 | 
			
		||||
   if (new_state & _NEW_POLYGON)
 | 
			
		||||
      update_polygon( ctx );
 | 
			
		||||
 | 
			
		||||
   if (new_state & _NEW_LIGHT)
 | 
			
		||||
      _mesa_update_lighting( ctx );
 | 
			
		||||
   if (ctx->API == API_OPENGL_COMPAT || ctx->API == API_OPENGLES) {
 | 
			
		||||
      if (new_state & _NEW_LIGHT)
 | 
			
		||||
         _mesa_update_lighting( ctx );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (new_state & (_NEW_LIGHT | _NEW_PROGRAM))
 | 
			
		||||
      update_twoside( ctx );
 | 
			
		||||
@@ -516,8 +522,10 @@ _mesa_update_state_locked( struct gl_context *ctx )
 | 
			
		||||
   if (new_state & _NEW_PIXEL)
 | 
			
		||||
      _mesa_update_pixel( ctx, new_state );
 | 
			
		||||
 | 
			
		||||
   if (new_state & _MESA_NEW_SEPARATE_SPECULAR)
 | 
			
		||||
      update_separate_specular( ctx );
 | 
			
		||||
   if (ctx->API == API_OPENGL_COMPAT || ctx->API == API_OPENGLES) {
 | 
			
		||||
      if (new_state & _MESA_NEW_SEPARATE_SPECULAR)
 | 
			
		||||
         update_separate_specular( ctx );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (new_state & (_NEW_BUFFERS | _NEW_VIEWPORT))
 | 
			
		||||
      update_viewport_matrix(ctx);
 | 
			
		||||
 
 | 
			
		||||
@@ -1310,8 +1310,7 @@ const struct function gles3_functions_possible[] = {
 | 
			
		||||
   // We check for the aliased -OES version in GLES 2
 | 
			
		||||
   // { "glGetBufferPointerv", 30, -1 },
 | 
			
		||||
   { "glGetFragDataLocation", 30, -1 },
 | 
			
		||||
   /// XXX: Missing implementation of glGetInteger64i_v
 | 
			
		||||
   // { "glGetInteger64i_v", 30, -1 },
 | 
			
		||||
   { "glGetInteger64i_v", 30, -1 },
 | 
			
		||||
   { "glGetInteger64v", 30, -1 },
 | 
			
		||||
   { "glGetIntegeri_v", 30, -1 },
 | 
			
		||||
   // XXX: Missing implementation of ARB_internalformat_query
 | 
			
		||||
 
 | 
			
		||||
@@ -807,6 +807,7 @@ const struct enum_info everything[] = {
 | 
			
		||||
   { 0x8256, "GL_RESET_NOTIFICATION_STRATEGY_ARB" },
 | 
			
		||||
   { 0x8257, "GL_PROGRAM_BINARY_RETRIEVABLE_HINT" },
 | 
			
		||||
   { 0x8261, "GL_NO_RESET_NOTIFICATION_ARB" },
 | 
			
		||||
   { 0x82DF, "GL_TEXTURE_IMMUTABLE_LEVELS" },
 | 
			
		||||
   { 0x8362, "GL_UNSIGNED_BYTE_2_3_3_REV" },
 | 
			
		||||
   { 0x8363, "GL_UNSIGNED_SHORT_5_6_5" },
 | 
			
		||||
   { 0x8364, "GL_UNSIGNED_SHORT_5_6_5_REV" },
 | 
			
		||||
@@ -1662,6 +1663,9 @@ const struct enum_info everything[] = {
 | 
			
		||||
   { 0x8D55, "GL_RENDERBUFFER_STENCIL_SIZE" },
 | 
			
		||||
   { 0x8D56, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE" },
 | 
			
		||||
   { 0x8D57, "GL_MAX_SAMPLES" },
 | 
			
		||||
   { 0x8D69, "GL_PRIMITIVE_RESTART_FIXED_INDEX" },
 | 
			
		||||
   { 0x8D6A, "GL_ANY_SAMPLES_PASSED_CONSERVATIVE" },
 | 
			
		||||
   { 0x8D6B, "GL_MAX_ELEMENT_INDEX" },
 | 
			
		||||
   { 0x8D70, "GL_RGBA32UI" },
 | 
			
		||||
   { 0x8D71, "GL_RGB32UI" },
 | 
			
		||||
   { 0x8D72, "GL_ALPHA32UI_EXT" },
 | 
			
		||||
@@ -1828,6 +1832,16 @@ const struct enum_info everything[] = {
 | 
			
		||||
   { 0x9146, "GL_DEBUG_SEVERITY_HIGH_ARB" },
 | 
			
		||||
   { 0x9147, "GL_DEBUG_SEVERITY_MEDIUM_ARB" },
 | 
			
		||||
   { 0x9148, "GL_DEBUG_SEVERITY_LOW_ARB" },
 | 
			
		||||
   { 0x9274, "GL_COMPRESSED_RGB8_ETC2" },
 | 
			
		||||
   { 0x9275, "GL_COMPRESSED_SRGB8_ETC2" },
 | 
			
		||||
   { 0x9276, "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2" },
 | 
			
		||||
   { 0x9277, "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2" },
 | 
			
		||||
   { 0x9278, "GL_COMPRESSED_RGBA8_ETC2_EAC" },
 | 
			
		||||
   { 0x9279, "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC" },
 | 
			
		||||
   { 0x9270, "GL_COMPRESSED_R11_EAC" },
 | 
			
		||||
   { 0x9271, "GL_COMPRESSED_SIGNED_R11_EAC" },
 | 
			
		||||
   { 0x9272, "GL_COMPRESSED_RG11_EAC" },
 | 
			
		||||
   { 0x9273, "GL_COMPRESSED_SIGNED_RG11_EAC" },
 | 
			
		||||
   { 0x19262, "GL_RASTER_POSITION_UNCLIPPED_IBM" },
 | 
			
		||||
   { 0, NULL }
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -75,7 +75,9 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
 | 
			
		||||
	    RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
 | 
			
		||||
	 } else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
 | 
			
		||||
	    RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
 | 
			
		||||
	 }
 | 
			
		||||
         } else if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
 | 
			
		||||
            RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010);
 | 
			
		||||
         }
 | 
			
		||||
	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
 | 
			
		||||
	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
 | 
			
		||||
	 break;
 | 
			
		||||
@@ -111,6 +113,10 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
 | 
			
		||||
      /* shallow RGB formats */
 | 
			
		||||
      case 3:
 | 
			
		||||
      case GL_RGB:
 | 
			
		||||
         if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
 | 
			
		||||
            RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010);
 | 
			
		||||
         }
 | 
			
		||||
         /* fallthrough */
 | 
			
		||||
      case GL_RGB8:
 | 
			
		||||
	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
 | 
			
		||||
	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
 | 
			
		||||
 
 | 
			
		||||
@@ -1893,23 +1893,30 @@ texture_error_check( struct gl_context *ctx,
 | 
			
		||||
    * requires GL_OES_texture_float) are filtered elsewhere.
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
   if (_mesa_is_gles(ctx) && !_mesa_is_gles3(ctx)) {
 | 
			
		||||
      if (format != internalFormat) {
 | 
			
		||||
   if (_mesa_is_gles(ctx)) {
 | 
			
		||||
      if (_mesa_is_gles3(ctx)) {
 | 
			
		||||
         err = _mesa_es3_error_check_format_and_type(format, type,
 | 
			
		||||
                                                     internalFormat,
 | 
			
		||||
                                                     dimensions);
 | 
			
		||||
      } else {
 | 
			
		||||
         if (format != internalFormat) {
 | 
			
		||||
         _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
                     "glTexImage%dD(format = %s, internalFormat = %s)",
 | 
			
		||||
                     dimensions,
 | 
			
		||||
                     _mesa_lookup_enum_by_nr(format),
 | 
			
		||||
                     _mesa_lookup_enum_by_nr(internalFormat));
 | 
			
		||||
         return GL_TRUE;
 | 
			
		||||
      }
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
      err = _mesa_es_error_check_format_and_type(format, type, dimensions);
 | 
			
		||||
         err = _mesa_es_error_check_format_and_type(format, type, dimensions);
 | 
			
		||||
      }
 | 
			
		||||
      if (err != GL_NO_ERROR) {
 | 
			
		||||
         _mesa_error(ctx, err,
 | 
			
		||||
                     "glTexImage%dD(format = %s, type = %s)",
 | 
			
		||||
                     "glTexImage%dD(format = %s, type = %s, internalFormat = %s)",
 | 
			
		||||
                     dimensions,
 | 
			
		||||
                     _mesa_lookup_enum_by_nr(format),
 | 
			
		||||
                     _mesa_lookup_enum_by_nr(type));
 | 
			
		||||
                     _mesa_lookup_enum_by_nr(type),
 | 
			
		||||
                     _mesa_lookup_enum_by_nr(internalFormat));
 | 
			
		||||
         return GL_TRUE;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
@@ -1947,8 +1954,9 @@ texture_error_check( struct gl_context *ctx,
 | 
			
		||||
   err = _mesa_error_check_format_and_type(ctx, format, type);
 | 
			
		||||
   if (err != GL_NO_ERROR) {
 | 
			
		||||
      _mesa_error(ctx, err,
 | 
			
		||||
                  "glTexImage%dD(incompatible format 0x%x, type 0x%x)",
 | 
			
		||||
                  dimensions, format, type);
 | 
			
		||||
                  "glTexImage%dD(incompatible format = %s, type = %s)",
 | 
			
		||||
                  dimensions, _mesa_lookup_enum_by_nr(format),
 | 
			
		||||
                  _mesa_lookup_enum_by_nr(type));
 | 
			
		||||
      return GL_TRUE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
@@ -1960,8 +1968,9 @@ texture_error_check( struct gl_context *ctx,
 | 
			
		||||
       (_mesa_is_depthstencil_format(internalFormat) != _mesa_is_depthstencil_format(format)) ||
 | 
			
		||||
       (_mesa_is_dudv_format(internalFormat) != _mesa_is_dudv_format(format))) {
 | 
			
		||||
      _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
                  "glTexImage%dD(incompatible internalFormat 0x%x, format 0x%x)",
 | 
			
		||||
                  dimensions, internalFormat, format);
 | 
			
		||||
                  "glTexImage%dD(incompatible internalFormat = %s, format = %s)",
 | 
			
		||||
                  dimensions, _mesa_lookup_enum_by_nr(internalFormat),
 | 
			
		||||
                  _mesa_lookup_enum_by_nr(format));
 | 
			
		||||
      return GL_TRUE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
@@ -2263,8 +2272,9 @@ texsubimage_error_check(struct gl_context *ctx, GLuint dimensions,
 | 
			
		||||
   err = _mesa_error_check_format_and_type(ctx, format, type);
 | 
			
		||||
   if (err != GL_NO_ERROR) {
 | 
			
		||||
      _mesa_error(ctx, err,
 | 
			
		||||
                  "glTexSubImage%dD(incompatible format 0x%x, type 0x%x)",
 | 
			
		||||
                  dimensions, format, type);
 | 
			
		||||
                  "glTexSubImage%dD(incompatible format = %s, type = %s)",
 | 
			
		||||
                  dimensions, _mesa_lookup_enum_by_nr(format),
 | 
			
		||||
                  _mesa_lookup_enum_by_nr(type));
 | 
			
		||||
      return GL_TRUE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
@@ -2313,6 +2323,29 @@ texsubimage_error_check(struct gl_context *ctx, GLuint dimensions,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
is_srgb_format(GLenum internalFormat)
 | 
			
		||||
{
 | 
			
		||||
   switch (internalFormat) {
 | 
			
		||||
   case GL_SRGB_EXT:
 | 
			
		||||
   case GL_SRGB8_EXT:
 | 
			
		||||
   case GL_COMPRESSED_SRGB_EXT:
 | 
			
		||||
   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
 | 
			
		||||
   case GL_SRGB_ALPHA_EXT:
 | 
			
		||||
   case GL_SRGB8_ALPHA8_EXT:
 | 
			
		||||
   case GL_COMPRESSED_SRGB_ALPHA_EXT:
 | 
			
		||||
   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
 | 
			
		||||
   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
 | 
			
		||||
   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
 | 
			
		||||
   case GL_COMPRESSED_SRGB8_ETC2:
 | 
			
		||||
   case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
 | 
			
		||||
   case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
 | 
			
		||||
      return true;
 | 
			
		||||
   default:
 | 
			
		||||
      return false;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Test glCopyTexImage[12]D() parameters for errors.
 | 
			
		||||
 * 
 | 
			
		||||
@@ -2337,6 +2370,9 @@ copytexture_error_check( struct gl_context *ctx, GLuint dimensions,
 | 
			
		||||
                         GLint width, GLint height, GLint border )
 | 
			
		||||
{
 | 
			
		||||
   GLint baseFormat;
 | 
			
		||||
   GLint rb_base_format;
 | 
			
		||||
   struct gl_renderbuffer *rb;
 | 
			
		||||
   GLenum rb_internal_format;
 | 
			
		||||
 | 
			
		||||
   /* check target */
 | 
			
		||||
   if (!legal_texsubimage_target(ctx, dimensions, target)) {
 | 
			
		||||
@@ -2381,28 +2417,59 @@ copytexture_error_check( struct gl_context *ctx, GLuint dimensions,
 | 
			
		||||
      return GL_TRUE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* OpenGL ES 1.x and OpenGL ES 2.0 impose additional restrictions on the
 | 
			
		||||
    * internalFormat.
 | 
			
		||||
    */
 | 
			
		||||
   if (_mesa_is_gles(ctx) && !_mesa_is_gles3(ctx)) {
 | 
			
		||||
      switch (internalFormat) {
 | 
			
		||||
      case GL_ALPHA:
 | 
			
		||||
      case GL_RGB:
 | 
			
		||||
      case GL_RGBA:
 | 
			
		||||
      case GL_LUMINANCE:
 | 
			
		||||
      case GL_LUMINANCE_ALPHA:
 | 
			
		||||
         break;
 | 
			
		||||
      default:
 | 
			
		||||
   rb = _mesa_get_read_renderbuffer(ctx, internalFormat);
 | 
			
		||||
   if (rb == NULL) {
 | 
			
		||||
      _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
                  "glCopyTexImage%dD(read buffer)", dimensions);
 | 
			
		||||
      return GL_TRUE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   rb_internal_format = rb->InternalFormat;
 | 
			
		||||
   baseFormat = _mesa_base_tex_format(ctx, internalFormat);
 | 
			
		||||
   rb_base_format = _mesa_base_tex_format(ctx, rb->InternalFormat);
 | 
			
		||||
   if (baseFormat < 0) {
 | 
			
		||||
      _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
                  "glCopyTexImage%dD(internalFormat)", dimensions);
 | 
			
		||||
      return GL_TRUE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (_mesa_is_color_format(internalFormat)) {
 | 
			
		||||
      if (rb_base_format < 0) {
 | 
			
		||||
         _mesa_error(ctx, GL_INVALID_VALUE,
 | 
			
		||||
                     "glCopyTexImage%dD(internalFormat)", dimensions);
 | 
			
		||||
         return GL_TRUE;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   baseFormat = _mesa_base_tex_format(ctx, internalFormat);
 | 
			
		||||
   if (baseFormat < 0) {
 | 
			
		||||
      _mesa_error(ctx, GL_INVALID_VALUE,
 | 
			
		||||
                  "glCopyTexImage%dD(internalFormat)", dimensions);
 | 
			
		||||
   if (_mesa_is_gles(ctx)) {
 | 
			
		||||
      bool valid = true;
 | 
			
		||||
      if (_mesa_base_format_component_count(baseFormat) >
 | 
			
		||||
          _mesa_base_format_component_count(rb_base_format)) {
 | 
			
		||||
         valid = false;
 | 
			
		||||
      }
 | 
			
		||||
      if (baseFormat == GL_DEPTH_COMPONENT ||
 | 
			
		||||
          baseFormat == GL_DEPTH_STENCIL ||
 | 
			
		||||
          rb_base_format == GL_DEPTH_COMPONENT ||
 | 
			
		||||
          rb_base_format == GL_DEPTH_STENCIL ||
 | 
			
		||||
          ((baseFormat == GL_LUMINANCE_ALPHA ||
 | 
			
		||||
            baseFormat == GL_ALPHA) &&
 | 
			
		||||
           rb_base_format != GL_RGBA) ||
 | 
			
		||||
          internalFormat == GL_RGB9_E5) {
 | 
			
		||||
         valid = false;
 | 
			
		||||
      }
 | 
			
		||||
      if (internalFormat == GL_RGB9_E5) {
 | 
			
		||||
         valid = false;
 | 
			
		||||
      }
 | 
			
		||||
      if (!valid) {
 | 
			
		||||
         _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
                     "glCopyTexImage%dD(internalFormat)", dimensions);
 | 
			
		||||
         return GL_TRUE;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (is_srgb_format(internalFormat) != is_srgb_format(rb_internal_format)) {
 | 
			
		||||
      _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
                  "glCopyTexImage%dD(srgb usage mismatch)", dimensions);
 | 
			
		||||
      return GL_TRUE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
@@ -2420,13 +2487,20 @@ copytexture_error_check( struct gl_context *ctx, GLuint dimensions,
 | 
			
		||||
    *      integer format and the read color buffer is an integer format."
 | 
			
		||||
    */
 | 
			
		||||
   if (_mesa_is_color_format(internalFormat)) {
 | 
			
		||||
      struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer;
 | 
			
		||||
 | 
			
		||||
      if (_mesa_is_enum_format_integer(rb->InternalFormat) !=
 | 
			
		||||
	  _mesa_is_enum_format_integer(internalFormat)) {
 | 
			
		||||
	 _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
		     "glCopyTexImage%dD(integer vs non-integer)", dimensions);
 | 
			
		||||
	 return GL_TRUE;
 | 
			
		||||
      bool is_int = _mesa_is_enum_format_integer(internalFormat);
 | 
			
		||||
      bool is_rbint = _mesa_is_enum_format_integer(rb_internal_format);
 | 
			
		||||
      if (is_int || is_rbint) {
 | 
			
		||||
         if (is_int != is_rbint) {
 | 
			
		||||
            _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
                        "glCopyTexImage%dD(integer vs non-integer)", dimensions);
 | 
			
		||||
            return GL_TRUE;
 | 
			
		||||
         } else if (_mesa_is_gles(ctx) &&
 | 
			
		||||
                    _mesa_is_enum_format_unsigned_int(internalFormat) !=
 | 
			
		||||
                      _mesa_is_enum_format_unsigned_int(rb_internal_format)) {
 | 
			
		||||
            _mesa_error(ctx, GL_INVALID_OPERATION,
 | 
			
		||||
                        "glCopyTexImage%dD(signed vs unsigned integer)", dimensions);
 | 
			
		||||
            return GL_TRUE;
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1714,18 +1714,23 @@ _mesa_texstore_argb2101010(TEXSTORE_PARAMS)
 | 
			
		||||
                                                 srcPacking,
 | 
			
		||||
                                                 ctx->_ImageTransferState);
 | 
			
		||||
      const GLfloat *src = tempImage;
 | 
			
		||||
      GLushort aMask = 0;
 | 
			
		||||
      GLint img, row, col;
 | 
			
		||||
      if (!tempImage)
 | 
			
		||||
         return GL_FALSE;
 | 
			
		||||
      if (srcFormat == GL_RGB) {
 | 
			
		||||
         aMask = 0xffff;
 | 
			
		||||
      }
 | 
			
		||||
      for (img = 0; img < srcDepth; img++) {
 | 
			
		||||
         GLubyte *dstRow = dstSlices[img];
 | 
			
		||||
         if (baseInternalFormat == GL_RGBA) {
 | 
			
		||||
         if (baseInternalFormat == GL_RGBA || baseInternalFormat == GL_RGB) {
 | 
			
		||||
            for (row = 0; row < srcHeight; row++) {
 | 
			
		||||
               GLuint *dstUI = (GLuint *) dstRow;
 | 
			
		||||
               for (col = 0; col < srcWidth; col++) {
 | 
			
		||||
                  GLushort a,r,g,b;
 | 
			
		||||
 | 
			
		||||
                  UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
 | 
			
		||||
                  a = a | aMask;
 | 
			
		||||
                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
 | 
			
		||||
                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
 | 
			
		||||
                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
 | 
			
		||||
@@ -1734,20 +1739,6 @@ _mesa_texstore_argb2101010(TEXSTORE_PARAMS)
 | 
			
		||||
               }
 | 
			
		||||
               dstRow += dstRowStride;
 | 
			
		||||
            }
 | 
			
		||||
         } else if (baseInternalFormat == GL_RGB) {
 | 
			
		||||
            for (row = 0; row < srcHeight; row++) {
 | 
			
		||||
               GLuint *dstUI = (GLuint *) dstRow;
 | 
			
		||||
               for (col = 0; col < srcWidth; col++) {
 | 
			
		||||
                  GLushort r,g,b;
 | 
			
		||||
 | 
			
		||||
                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
 | 
			
		||||
                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
 | 
			
		||||
                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
 | 
			
		||||
                  dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b);
 | 
			
		||||
                  src += 4;
 | 
			
		||||
               }
 | 
			
		||||
               dstRow += dstRowStride;
 | 
			
		||||
            }
 | 
			
		||||
         } else {
 | 
			
		||||
            ASSERT(0);
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
@@ -864,7 +864,8 @@ _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
 | 
			
		||||
 | 
			
		||||
   /* GL_INVALID_VALUE is generated if `transpose' is not GL_FALSE.
 | 
			
		||||
    * http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml */
 | 
			
		||||
   if (ctx->API == API_OPENGLES || ctx->API == API_OPENGLES2) {
 | 
			
		||||
   if (ctx->API == API_OPENGLES
 | 
			
		||||
       || (ctx->API == API_OPENGLES2 && ctx->Version < 30)) {
 | 
			
		||||
      if (transpose) {
 | 
			
		||||
	 _mesa_error(ctx, GL_INVALID_VALUE,
 | 
			
		||||
		     "glUniformMatrix(matrix transpose is not GL_FALSE)");
 | 
			
		||||
 
 | 
			
		||||
@@ -151,21 +151,21 @@ update_array(struct gl_context *ctx,
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (_mesa_is_gles(ctx)) {
 | 
			
		||||
      /* Once Mesa gets support for GL_OES_vertex_half_float this mask will
 | 
			
		||||
       * change.  Adding support for this extension isn't quite as trivial as
 | 
			
		||||
       * we'd like because ES uses a different enum value for GL_HALF_FLOAT.
 | 
			
		||||
       */
 | 
			
		||||
      legalTypesMask &= ~(FIXED_GL_BIT | HALF_BIT | DOUBLE_BIT);
 | 
			
		||||
      legalTypesMask &= ~(FIXED_GL_BIT | DOUBLE_BIT);
 | 
			
		||||
 | 
			
		||||
      /* GL_INT and GL_UNSIGNED_INT data is not allowed in OpenGL ES until
 | 
			
		||||
       * 3.0.  The 2_10_10_10 types are added in OpenGL ES 3.0 or
 | 
			
		||||
       * GL_OES_vertex_type_10_10_10_2.
 | 
			
		||||
       * GL_OES_vertex_type_10_10_10_2.  GL_HALF_FLOAT data is not allowed
 | 
			
		||||
       * until 3.0 or with the GL_OES_vertex_half float extension, which isn't
 | 
			
		||||
       * quite as trivial as we'd like because it uses a different enum value
 | 
			
		||||
       * for GL_HALF_FLOAT_OES.
 | 
			
		||||
       */
 | 
			
		||||
      if (ctx->Version < 30) {
 | 
			
		||||
         legalTypesMask &= ~(UNSIGNED_INT_BIT
 | 
			
		||||
                             | INT_BIT
 | 
			
		||||
                             | UNSIGNED_INT_2_10_10_10_REV_BIT
 | 
			
		||||
                             | INT_2_10_10_10_REV_BIT);
 | 
			
		||||
                             | INT_2_10_10_10_REV_BIT
 | 
			
		||||
                             | HALF_BIT);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      /* BGRA ordering is not supported in ES contexts.
 | 
			
		||||
@@ -1113,9 +1113,10 @@ _mesa_PrimitiveRestartIndex(GLuint index)
 | 
			
		||||
 | 
			
		||||
   ASSERT_OUTSIDE_BEGIN_END(ctx);
 | 
			
		||||
 | 
			
		||||
   if (ctx->Array.RestartIndex != index) {
 | 
			
		||||
   ctx->Array.RestartIndex = index;
 | 
			
		||||
   if (ctx->Array.PrimitiveRestart && ctx->Array._RestartIndex != index) {
 | 
			
		||||
      FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
 | 
			
		||||
      ctx->Array.RestartIndex = index;
 | 
			
		||||
      ctx->Array._RestartIndex = index;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -323,7 +323,28 @@ compute_version_es2(struct gl_context *ctx)
 | 
			
		||||
                              ctx->Extensions.ARB_fragment_shader &&
 | 
			
		||||
                              ctx->Extensions.ARB_texture_non_power_of_two &&
 | 
			
		||||
                              ctx->Extensions.EXT_blend_equation_separate);
 | 
			
		||||
   if (ver_2_0) {
 | 
			
		||||
   /* FINISHME: This list isn't quite right. */
 | 
			
		||||
   const GLboolean ver_3_0 = (ctx->Extensions.ARB_half_float_vertex &&
 | 
			
		||||
                              ctx->Extensions.ARB_map_buffer_range &&
 | 
			
		||||
                              ctx->Extensions.ARB_shader_texture_lod &&
 | 
			
		||||
                              ctx->Extensions.ARB_texture_float &&
 | 
			
		||||
                              ctx->Extensions.ARB_texture_rg &&
 | 
			
		||||
                              ctx->Extensions.ARB_texture_compression_rgtc &&
 | 
			
		||||
                              ctx->Extensions.EXT_draw_buffers2 &&
 | 
			
		||||
                              /* ctx->Extensions.ARB_framebuffer_object && */
 | 
			
		||||
                              ctx->Extensions.EXT_framebuffer_sRGB &&
 | 
			
		||||
                              ctx->Extensions.EXT_packed_float &&
 | 
			
		||||
                              ctx->Extensions.EXT_texture_array &&
 | 
			
		||||
                              ctx->Extensions.EXT_texture_shared_exponent &&
 | 
			
		||||
                              ctx->Extensions.EXT_transform_feedback &&
 | 
			
		||||
                              ctx->Extensions.NV_conditional_render &&
 | 
			
		||||
                              ctx->Extensions.ARB_draw_instanced &&
 | 
			
		||||
                              ctx->Extensions.ARB_uniform_buffer_object &&
 | 
			
		||||
                              ctx->Extensions.EXT_texture_snorm &&
 | 
			
		||||
                              ctx->Extensions.NV_primitive_restart);
 | 
			
		||||
   if (ver_3_0) {
 | 
			
		||||
      ctx->Version = 30;
 | 
			
		||||
   } else if (ver_2_0) {
 | 
			
		||||
      ctx->Version = 20;
 | 
			
		||||
   } else {
 | 
			
		||||
      _mesa_problem(ctx, "Incomplete OpenGL ES 2.0 support.");
 | 
			
		||||
 
 | 
			
		||||
@@ -94,6 +94,7 @@ st_BeginQuery(struct gl_context *ctx, struct gl_query_object *q)
 | 
			
		||||
   /* convert GL query type to Gallium query type */
 | 
			
		||||
   switch (q->Target) {
 | 
			
		||||
   case GL_ANY_SAMPLES_PASSED:
 | 
			
		||||
   case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
 | 
			
		||||
      /* fall-through */
 | 
			
		||||
   case GL_SAMPLES_PASSED_ARB:
 | 
			
		||||
      type = PIPE_QUERY_OCCLUSION_COUNTER;
 | 
			
		||||
 
 | 
			
		||||
@@ -230,8 +230,8 @@ st_draw_vbo(struct gl_context *ctx,
 | 
			
		||||
      /* The VBO module handles restart for the non-indexed GLDrawArrays
 | 
			
		||||
       * so we only set these fields for indexed drawing:
 | 
			
		||||
       */
 | 
			
		||||
      info.primitive_restart = ctx->Array.PrimitiveRestart;
 | 
			
		||||
      info.restart_index = ctx->Array.RestartIndex;
 | 
			
		||||
      info.primitive_restart = ctx->Array._PrimitiveRestart;
 | 
			
		||||
      info.restart_index = ctx->Array._RestartIndex;
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      /* Transform feedback drawing is always non-indexed. */
 | 
			
		||||
 
 | 
			
		||||
@@ -90,8 +90,8 @@ vbo_get_minmax_index(struct gl_context *ctx,
 | 
			
		||||
		     GLuint *min_index, GLuint *max_index,
 | 
			
		||||
		     const GLuint count)
 | 
			
		||||
{
 | 
			
		||||
   const GLboolean restart = ctx->Array.PrimitiveRestart;
 | 
			
		||||
   const GLuint restartIndex = ctx->Array.RestartIndex;
 | 
			
		||||
   const GLboolean restart = ctx->Array._PrimitiveRestart;
 | 
			
		||||
   const GLuint restartIndex = ctx->Array._RestartIndex;
 | 
			
		||||
   const int index_size = vbo_sizeof_ib_type(ib->type);
 | 
			
		||||
   const char *indices;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
@@ -536,7 +536,7 @@ vbo_handle_primitive_restart(struct gl_context *ctx,
 | 
			
		||||
 | 
			
		||||
   if ((ib != NULL) &&
 | 
			
		||||
       ctx->Const.PrimitiveRestartInSoftware &&
 | 
			
		||||
       ctx->Array.PrimitiveRestart) {
 | 
			
		||||
       ctx->Array._PrimitiveRestart) {
 | 
			
		||||
      /* Handle primitive restart in software */
 | 
			
		||||
      vbo_sw_primitive_restart(ctx, prim, nr_prims, ib);
 | 
			
		||||
   } else {
 | 
			
		||||
@@ -572,10 +572,10 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
 | 
			
		||||
   prim[0].base_instance = baseInstance;
 | 
			
		||||
 | 
			
		||||
   /* Implement the primitive restart index */
 | 
			
		||||
   if (ctx->Array.PrimitiveRestart && ctx->Array.RestartIndex < count) {
 | 
			
		||||
   if (ctx->Array._PrimitiveRestart && ctx->Array._RestartIndex < count) {
 | 
			
		||||
      GLuint primCount = 0;
 | 
			
		||||
 | 
			
		||||
      if (ctx->Array.RestartIndex == start) {
 | 
			
		||||
      if (ctx->Array._RestartIndex == start) {
 | 
			
		||||
         /* special case: RestartIndex at beginning */
 | 
			
		||||
         if (count > 1) {
 | 
			
		||||
            prim[0].start = start + 1;
 | 
			
		||||
@@ -583,7 +583,7 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
 | 
			
		||||
            primCount = 1;
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
      else if (ctx->Array.RestartIndex == start + count - 1) {
 | 
			
		||||
      else if (ctx->Array._RestartIndex == start + count - 1) {
 | 
			
		||||
         /* special case: RestartIndex at end */
 | 
			
		||||
         if (count > 1) {
 | 
			
		||||
            prim[0].start = start;
 | 
			
		||||
@@ -594,10 +594,10 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
 | 
			
		||||
      else {
 | 
			
		||||
         /* general case: RestartIndex in middle, split into two prims */
 | 
			
		||||
         prim[0].start = start;
 | 
			
		||||
         prim[0].count = ctx->Array.RestartIndex - start;
 | 
			
		||||
         prim[0].count = ctx->Array._RestartIndex - start;
 | 
			
		||||
 | 
			
		||||
         prim[1] = prim[0];
 | 
			
		||||
         prim[1].start = ctx->Array.RestartIndex + 1;
 | 
			
		||||
         prim[1].start = ctx->Array._RestartIndex + 1;
 | 
			
		||||
         prim[1].count = count - prim[1].start;
 | 
			
		||||
 | 
			
		||||
         primCount = 2;
 | 
			
		||||
 
 | 
			
		||||
@@ -171,7 +171,7 @@ vbo_sw_primitive_restart(struct gl_context *ctx,
 | 
			
		||||
   GLuint sub_prim_num;
 | 
			
		||||
   GLuint end_index;
 | 
			
		||||
   GLuint sub_end_index;
 | 
			
		||||
   GLuint restart_index = ctx->Array.RestartIndex;
 | 
			
		||||
   GLuint restart_index = ctx->Array._RestartIndex;
 | 
			
		||||
   struct _mesa_prim temp_prim;
 | 
			
		||||
   struct vbo_context *vbo = vbo_context(ctx);
 | 
			
		||||
   vbo_draw_func draw_prims_func = vbo->draw_prims;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user