+ int i, glsl_feature_level;
+ GLboolean *extensions = (GLboolean *) &ctx->Extensions;
+
+ static const struct st_extension_cap_mapping cap_mapping[] = {
+ { o(ARB_base_instance), PIPE_CAP_START_INSTANCE },
+ { o(ARB_depth_clamp), PIPE_CAP_DEPTH_CLIP_DISABLE },
+ { o(ARB_depth_texture), PIPE_CAP_TEXTURE_SHADOW_MAP },
+ { o(ARB_draw_buffers_blend), PIPE_CAP_INDEP_BLEND_FUNC },
+ { o(ARB_draw_instanced), PIPE_CAP_TGSI_INSTANCEID },
+ { o(ARB_fragment_program_shadow), PIPE_CAP_TEXTURE_SHADOW_MAP },
+ { o(ARB_instanced_arrays), PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR },
+ { o(ARB_occlusion_query), PIPE_CAP_OCCLUSION_QUERY },
+ { o(ARB_occlusion_query2), PIPE_CAP_OCCLUSION_QUERY },
+ { o(ARB_point_sprite), PIPE_CAP_POINT_SPRITE },
+ { o(ARB_seamless_cube_map), PIPE_CAP_SEAMLESS_CUBE_MAP },
+ { o(ARB_shader_stencil_export), PIPE_CAP_SHADER_STENCIL_EXPORT },
+ { o(ARB_shader_texture_lod), PIPE_CAP_SM3 },
+ { o(ARB_shadow), PIPE_CAP_TEXTURE_SHADOW_MAP },
+ { o(ARB_texture_non_power_of_two), PIPE_CAP_NPOT_TEXTURES },
+ { o(ARB_transform_feedback2), PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME },
+ { o(ARB_transform_feedback3), PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME },
+
+ { o(EXT_blend_equation_separate), PIPE_CAP_BLEND_EQUATION_SEPARATE },
+ { o(EXT_draw_buffers2), PIPE_CAP_INDEP_BLEND_ENABLE },
+ { o(EXT_shadow_funcs), PIPE_CAP_TEXTURE_SHADOW_MAP },
+ { o(EXT_stencil_two_side), PIPE_CAP_TWO_SIDED_STENCIL },
+ { o(EXT_texture_array), PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS },
+ { o(EXT_texture_filter_anisotropic), PIPE_CAP_ANISOTROPIC_FILTER },
+ { o(EXT_texture_mirror_clamp), PIPE_CAP_TEXTURE_MIRROR_CLAMP },
+ { o(EXT_texture_swizzle), PIPE_CAP_TEXTURE_SWIZZLE },
+ { o(EXT_timer_query), PIPE_CAP_TIMER_QUERY },
+ { o(EXT_transform_feedback), PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS },
+
+ { o(AMD_seamless_cubemap_per_texture), PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE },
+ { o(ATI_separate_stencil), PIPE_CAP_TWO_SIDED_STENCIL },
+ { o(ATI_texture_mirror_once), PIPE_CAP_TEXTURE_MIRROR_CLAMP },
+ { o(NV_conditional_render), PIPE_CAP_CONDITIONAL_RENDER },
+ { o(NV_texture_barrier), PIPE_CAP_TEXTURE_BARRIER },
+ /* GL_NV_point_sprite is not supported by gallium because we don't
+ * support the GL_POINT_SPRITE_R_MODE_NV option. */
+ { o(MESA_texture_array), PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS },
+
+ { o(OES_standard_derivatives), PIPE_CAP_SM3 }
+ };
+
+ /* Required: render target and sampler support */
+ static const struct st_extension_format_mapping rendertarget_mapping[] = {
+ { { o(ARB_texture_float) },
+ { PIPE_FORMAT_R32G32B32A32_FLOAT,
+ PIPE_FORMAT_R16G16B16A16_FLOAT } },
+
+ { { o(ARB_texture_rgb10_a2ui) },
+ { PIPE_FORMAT_B10G10R10A2_UINT } },
+
+ { { o(EXT_framebuffer_sRGB) },
+ { PIPE_FORMAT_A8B8G8R8_SRGB,
+ PIPE_FORMAT_B8G8R8A8_SRGB },
+ GL_TRUE }, /* at least one format must be supported */
+
+ { { o(EXT_packed_float) },
+ { PIPE_FORMAT_R11G11B10_FLOAT } },
+
+ { { o(EXT_texture_integer) },
+ { PIPE_FORMAT_R32G32B32A32_UINT,
+ PIPE_FORMAT_R32G32B32A32_SINT } },
+ };
+
+ /* Required: depth stencil and sampler support */
+ static const struct st_extension_format_mapping depthstencil_mapping[] = {
+ { { o(ARB_depth_buffer_float) },
+ { PIPE_FORMAT_Z32_FLOAT,
+ PIPE_FORMAT_Z32_FLOAT_S8X24_UINT } },
+
+ { { o(ARB_framebuffer_object),
+ o(EXT_packed_depth_stencil) },
+ { PIPE_FORMAT_S8_UINT_Z24_UNORM,
+ PIPE_FORMAT_Z24_UNORM_S8_UINT },
+ GL_TRUE }, /* at least one format must be supported */
+ };
+
+ /* Required: sampler support */
+ static const struct st_extension_format_mapping texture_mapping[] = {
+ { { o(ARB_texture_compression_rgtc) },
+ { PIPE_FORMAT_RGTC1_UNORM,
+ PIPE_FORMAT_RGTC1_SNORM,
+ PIPE_FORMAT_RGTC2_UNORM,
+ PIPE_FORMAT_RGTC2_SNORM } },
+
+ { { o(ARB_texture_rg) },
+ { PIPE_FORMAT_R8G8_UNORM } },
+
+ { { o(EXT_texture_compression_latc) },
+ { PIPE_FORMAT_LATC1_UNORM,
+ PIPE_FORMAT_LATC1_SNORM,
+ PIPE_FORMAT_LATC2_UNORM,
+ PIPE_FORMAT_LATC2_SNORM } },
+
+ { { o(EXT_texture_compression_s3tc),
+ o(S3_s3tc) },
+ { PIPE_FORMAT_DXT1_RGB,
+ PIPE_FORMAT_DXT1_RGBA,
+ PIPE_FORMAT_DXT3_RGBA,
+ PIPE_FORMAT_DXT5_RGBA } },
+
+ { { o(EXT_texture_shared_exponent) },
+ { PIPE_FORMAT_R9G9B9E5_FLOAT } },
+
+ { { o(EXT_texture_snorm) },
+ { PIPE_FORMAT_R8G8B8A8_SNORM } },
+
+ { { o(EXT_texture_sRGB),
+ o(EXT_texture_sRGB_decode) },
+ { PIPE_FORMAT_A8B8G8R8_SRGB,
+ PIPE_FORMAT_B8G8R8A8_SRGB },
+ GL_TRUE }, /* at least one format must be supported */
+
+ { { o(ATI_texture_compression_3dc) },
+ { PIPE_FORMAT_LATC2_UNORM } },
+
+ { { o(MESA_ycbcr_texture) },
+ { PIPE_FORMAT_UYVY,
+ PIPE_FORMAT_YUYV },
+ GL_TRUE }, /* at least one format must be supported */
+
+ { { o(OES_compressed_ETC1_RGB8_texture) },
+ { PIPE_FORMAT_ETC1_RGB8 } },
+ };
+
+ /* Required: vertex fetch support. */
+ static const struct st_extension_format_mapping vertex_mapping[] = {
+ { { o(ARB_vertex_type_2_10_10_10_rev) },
+ { PIPE_FORMAT_R10G10B10A2_UNORM,
+ PIPE_FORMAT_B10G10R10A2_UNORM,
+ PIPE_FORMAT_R10G10B10A2_SNORM,
+ PIPE_FORMAT_B10G10R10A2_SNORM,
+ PIPE_FORMAT_R10G10B10A2_USCALED,
+ PIPE_FORMAT_B10G10R10A2_USCALED,
+ PIPE_FORMAT_R10G10B10A2_SSCALED,
+ PIPE_FORMAT_B10G10R10A2_SSCALED } },
+ };