intel_extensions.c revision 75968a668e44b3fd7c9b9277937c005366fca116
1/* 2 * Copyright 2003 VMware, Inc. 3 * All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sublicense, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial portions 15 * of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26#include "main/version.h" 27 28#include "brw_context.h" 29#include "brw_defines.h" 30#include "intel_batchbuffer.h" 31 32/** 33 * Initializes potential list of extensions if ctx == NULL, or actually enables 34 * extensions for a context. 35 */ 36void 37intelInitExtensions(struct gl_context *ctx) 38{ 39 struct brw_context *brw = brw_context(ctx); 40 41 assert(brw->gen >= 4); 42 43 ctx->Extensions.ARB_arrays_of_arrays = true; 44 ctx->Extensions.ARB_buffer_storage = true; 45 ctx->Extensions.ARB_clear_texture = true; 46 ctx->Extensions.ARB_clip_control = true; 47 ctx->Extensions.ARB_copy_image = true; 48 ctx->Extensions.ARB_depth_buffer_float = true; 49 ctx->Extensions.ARB_depth_clamp = true; 50 ctx->Extensions.ARB_depth_texture = true; 51 ctx->Extensions.ARB_draw_elements_base_vertex = true; 52 ctx->Extensions.ARB_draw_instanced = true; 53 ctx->Extensions.ARB_ES2_compatibility = true; 54 ctx->Extensions.ARB_explicit_attrib_location = true; 55 ctx->Extensions.ARB_explicit_uniform_location = true; 56 ctx->Extensions.ARB_fragment_coord_conventions = true; 57 ctx->Extensions.ARB_fragment_program = true; 58 ctx->Extensions.ARB_fragment_program_shadow = true; 59 ctx->Extensions.ARB_fragment_shader = true; 60 ctx->Extensions.ARB_framebuffer_object = true; 61 ctx->Extensions.ARB_half_float_vertex = true; 62 ctx->Extensions.ARB_instanced_arrays = true; 63 ctx->Extensions.ARB_internalformat_query = true; 64 ctx->Extensions.ARB_internalformat_query2 = true; 65 ctx->Extensions.ARB_map_buffer_range = true; 66 ctx->Extensions.ARB_occlusion_query = true; 67 ctx->Extensions.ARB_occlusion_query2 = true; 68 ctx->Extensions.ARB_pipeline_statistics_query = true; 69 ctx->Extensions.ARB_point_sprite = true; 70 ctx->Extensions.ARB_seamless_cube_map = true; 71 ctx->Extensions.ARB_shader_bit_encoding = true; 72 ctx->Extensions.ARB_shader_draw_parameters = true; 73 ctx->Extensions.ARB_shader_texture_lod = true; 74 ctx->Extensions.ARB_shading_language_packing = true; 75 ctx->Extensions.ARB_shadow = true; 76 ctx->Extensions.ARB_sync = true; 77 ctx->Extensions.ARB_texture_border_clamp = true; 78 ctx->Extensions.ARB_texture_compression_rgtc = true; 79 ctx->Extensions.ARB_texture_cube_map = true; 80 ctx->Extensions.ARB_texture_env_combine = true; 81 ctx->Extensions.ARB_texture_env_crossbar = true; 82 ctx->Extensions.ARB_texture_env_dot3 = true; 83 ctx->Extensions.ARB_texture_float = true; 84 ctx->Extensions.ARB_texture_mirror_clamp_to_edge = true; 85 ctx->Extensions.ARB_texture_non_power_of_two = true; 86 ctx->Extensions.ARB_texture_rg = true; 87 ctx->Extensions.ARB_texture_rgb10_a2ui = true; 88 ctx->Extensions.ARB_vertex_program = true; 89 ctx->Extensions.ARB_vertex_shader = true; 90 ctx->Extensions.ARB_vertex_type_2_10_10_10_rev = true; 91 ctx->Extensions.ARB_vertex_type_10f_11f_11f_rev = true; 92 ctx->Extensions.EXT_blend_color = true; 93 ctx->Extensions.EXT_blend_equation_separate = true; 94 ctx->Extensions.EXT_blend_func_separate = true; 95 ctx->Extensions.EXT_blend_minmax = true; 96 ctx->Extensions.EXT_draw_buffers2 = true; 97 ctx->Extensions.EXT_framebuffer_sRGB = true; 98 ctx->Extensions.EXT_gpu_program_parameters = true; 99 ctx->Extensions.EXT_packed_float = true; 100 ctx->Extensions.EXT_pixel_buffer_object = true; 101 ctx->Extensions.EXT_point_parameters = true; 102 ctx->Extensions.EXT_polygon_offset_clamp = true; 103 ctx->Extensions.EXT_provoking_vertex = true; 104 ctx->Extensions.EXT_stencil_two_side = true; 105 ctx->Extensions.EXT_texture_array = true; 106 ctx->Extensions.EXT_texture_env_dot3 = true; 107 ctx->Extensions.EXT_texture_filter_anisotropic = true; 108 ctx->Extensions.EXT_texture_integer = true; 109 ctx->Extensions.EXT_texture_shared_exponent = true; 110 ctx->Extensions.EXT_texture_snorm = true; 111 ctx->Extensions.EXT_texture_sRGB = true; 112 ctx->Extensions.EXT_texture_sRGB_decode = true; 113 ctx->Extensions.EXT_texture_swizzle = true; 114 ctx->Extensions.EXT_vertex_array_bgra = true; 115 ctx->Extensions.KHR_robustness = true; 116 ctx->Extensions.AMD_seamless_cubemap_per_texture = true; 117 ctx->Extensions.APPLE_object_purgeable = true; 118 ctx->Extensions.ATI_separate_stencil = true; 119 ctx->Extensions.ATI_texture_env_combine3 = true; 120 ctx->Extensions.MESA_pack_invert = true; 121 ctx->Extensions.NV_conditional_render = true; 122 ctx->Extensions.NV_primitive_restart = true; 123 ctx->Extensions.NV_texture_barrier = true; 124 ctx->Extensions.NV_texture_env_combine4 = true; 125 ctx->Extensions.NV_texture_rectangle = true; 126 ctx->Extensions.TDFX_texture_compression_FXT1 = true; 127 ctx->Extensions.OES_compressed_ETC1_RGB8_texture = true; 128 ctx->Extensions.OES_draw_texture = true; 129 ctx->Extensions.OES_EGL_image = true; 130 ctx->Extensions.OES_EGL_image_external = true; 131 ctx->Extensions.OES_standard_derivatives = true; 132 ctx->Extensions.OES_texture_float = true; 133 ctx->Extensions.OES_texture_float_linear = true; 134 ctx->Extensions.OES_texture_half_float = true; 135 ctx->Extensions.OES_texture_half_float_linear = true; 136 137 if (brw->gen >= 8) 138 ctx->Const.GLSLVersion = 450; 139 else if (brw->is_haswell && can_do_pipelined_register_writes(brw->screen)) 140 ctx->Const.GLSLVersion = 420; 141 else if (brw->gen >= 6) 142 ctx->Const.GLSLVersion = 330; 143 else 144 ctx->Const.GLSLVersion = 120; 145 _mesa_override_glsl_version(&ctx->Const); 146 147 ctx->Extensions.EXT_shader_integer_mix = ctx->Const.GLSLVersion >= 130; 148 ctx->Extensions.MESA_shader_integer_functions = ctx->Const.GLSLVersion >= 130; 149 150 if (brw->is_g4x || brw->gen >= 5) { 151 ctx->Extensions.MESA_shader_framebuffer_fetch_non_coherent = true; 152 ctx->Extensions.KHR_blend_equation_advanced = true; 153 } 154 155 if (brw->gen >= 5) { 156 ctx->Extensions.ARB_texture_query_levels = ctx->Const.GLSLVersion >= 130; 157 ctx->Extensions.ARB_texture_query_lod = true; 158 ctx->Extensions.EXT_timer_query = true; 159 } 160 161 if (brw->gen >= 6) { 162 ctx->Extensions.ARB_blend_func_extended = 163 !driQueryOptionb(&brw->optionCache, "disable_blend_func_extended"); 164 ctx->Extensions.ARB_conditional_render_inverted = true; 165 ctx->Extensions.ARB_cull_distance = true; 166 ctx->Extensions.ARB_draw_buffers_blend = true; 167 ctx->Extensions.ARB_enhanced_layouts = true; 168 ctx->Extensions.ARB_ES3_compatibility = true; 169 ctx->Extensions.ARB_fragment_layer_viewport = true; 170 ctx->Extensions.ARB_sample_shading = true; 171 ctx->Extensions.ARB_shading_language_420pack = true; 172 ctx->Extensions.ARB_texture_buffer_object = true; 173 ctx->Extensions.ARB_texture_buffer_object_rgb32 = true; 174 ctx->Extensions.ARB_texture_buffer_range = true; 175 ctx->Extensions.ARB_texture_cube_map_array = true; 176 ctx->Extensions.ARB_texture_gather = true; 177 ctx->Extensions.ARB_texture_multisample = true; 178 ctx->Extensions.ARB_uniform_buffer_object = true; 179 180 ctx->Extensions.AMD_vertex_shader_layer = true; 181 ctx->Extensions.EXT_framebuffer_multisample = true; 182 ctx->Extensions.EXT_framebuffer_multisample_blit_scaled = true; 183 ctx->Extensions.EXT_transform_feedback = true; 184 ctx->Extensions.OES_depth_texture_cube_map = true; 185 ctx->Extensions.OES_sample_variables = true; 186 187 ctx->Extensions.ARB_timer_query = brw->screen->hw_has_timestamp; 188 189 /* Only enable this in core profile because other parts of Mesa behave 190 * slightly differently when the extension is enabled. 191 */ 192 if (ctx->API == API_OPENGL_CORE) { 193 ctx->Extensions.ARB_shader_subroutine = true; 194 ctx->Extensions.ARB_shader_viewport_layer_array = true; 195 ctx->Extensions.ARB_viewport_array = true; 196 ctx->Extensions.AMD_vertex_shader_viewport_index = true; 197 } 198 } 199 200 brw->predicate.supported = false; 201 202 if (brw->gen >= 7) { 203 ctx->Extensions.ARB_conservative_depth = true; 204 ctx->Extensions.ARB_derivative_control = true; 205 ctx->Extensions.ARB_framebuffer_no_attachments = true; 206 ctx->Extensions.ARB_gpu_shader5 = true; 207 ctx->Extensions.ARB_shader_atomic_counters = true; 208 ctx->Extensions.ARB_shader_atomic_counter_ops = true; 209 ctx->Extensions.ARB_shader_clock = true; 210 ctx->Extensions.ARB_shader_image_load_store = true; 211 ctx->Extensions.ARB_shader_image_size = true; 212 ctx->Extensions.ARB_shader_texture_image_samples = true; 213 ctx->Extensions.ARB_tessellation_shader = true; 214 ctx->Extensions.ARB_texture_compression_bptc = true; 215 ctx->Extensions.ARB_texture_view = true; 216 ctx->Extensions.ARB_shader_storage_buffer_object = true; 217 ctx->Extensions.EXT_shader_samples_identical = true; 218 ctx->Extensions.OES_primitive_bounding_box = true; 219 ctx->Extensions.OES_texture_buffer = true; 220 221 if (can_do_pipelined_register_writes(brw->screen)) { 222 ctx->Extensions.ARB_draw_indirect = true; 223 ctx->Extensions.ARB_transform_feedback2 = true; 224 ctx->Extensions.ARB_transform_feedback3 = true; 225 ctx->Extensions.ARB_transform_feedback_instanced = true; 226 227 if (can_do_compute_dispatch(brw->screen) && 228 ctx->Const.MaxComputeWorkGroupSize[0] >= 1024) { 229 ctx->Extensions.ARB_compute_shader = true; 230 ctx->Extensions.ARB_ES3_1_compatibility = 231 brw->gen >= 8 || brw->is_haswell; 232 } 233 234 if (can_do_predicate_writes(brw->screen)) 235 brw->predicate.supported = true; 236 } 237 } 238 239 if (brw->gen >= 8 || brw->is_haswell) { 240 ctx->Extensions.ARB_gpu_shader_fp64 = true; 241 ctx->Extensions.ARB_shader_precision = true; 242 ctx->Extensions.ARB_stencil_texturing = true; 243 ctx->Extensions.ARB_texture_stencil8 = true; 244 ctx->Extensions.ARB_vertex_attrib_64bit = true; 245 ctx->Extensions.OES_geometry_shader = true; 246 ctx->Extensions.OES_texture_cube_map_array = true; 247 ctx->Extensions.OES_viewport_array = true; 248 } 249 250 if (brw->gen >= 8 || brw->is_haswell || brw->is_baytrail) { 251 ctx->Extensions.ARB_robust_buffer_access_behavior = true; 252 } 253 254 if (can_do_mi_math_and_lrr(brw->screen)) { 255 ctx->Extensions.ARB_query_buffer_object = true; 256 } 257 258 if (brw->gen >= 8 || brw->is_baytrail) { 259 /* For now, we only enable OES_copy_image on platforms that support 260 * ETC2 natively in hardware. We would need more hacks to support it 261 * elsewhere. 262 */ 263 ctx->Extensions.OES_copy_image = true; 264 } 265 266 if (brw->gen >= 8) { 267 ctx->Extensions.ARB_ES3_2_compatibility = true; 268 } 269 270 if (brw->gen >= 9) { 271 ctx->Extensions.ANDROID_extension_pack_es31a = true; 272 ctx->Extensions.ARB_shader_stencil_export = true; 273 ctx->Extensions.KHR_blend_equation_advanced_coherent = true; 274 ctx->Extensions.KHR_texture_compression_astc_ldr = true; 275 ctx->Extensions.KHR_texture_compression_astc_sliced_3d = true; 276 ctx->Extensions.INTEL_conservative_rasterization = true; 277 ctx->Extensions.MESA_shader_framebuffer_fetch = true; 278 ctx->Extensions.ARB_post_depth_coverage = true; 279 } 280 281 if (ctx->API == API_OPENGL_CORE) 282 ctx->Extensions.ARB_base_instance = true; 283 if (ctx->API != API_OPENGL_CORE) 284 ctx->Extensions.ARB_color_buffer_float = true; 285 286 if (ctx->Mesa_DXTn || driQueryOptionb(&brw->optionCache, "force_s3tc_enable")) 287 ctx->Extensions.EXT_texture_compression_s3tc = true; 288 289 ctx->Extensions.ANGLE_texture_compression_dxt = true; 290} 291