2 * Copyright 2003 VMware, Inc.
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:
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial portions
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.
26 #include "main/version.h"
28 #include "brw_context.h"
29 #include "brw_defines.h"
30 #include "intel_batchbuffer.h"
33 * Initializes potential list of extensions if ctx == NULL, or actually enables
34 * extensions for a context.
37 intelInitExtensions(struct gl_context
*ctx
)
39 struct brw_context
*brw
= brw_context(ctx
);
40 const struct gen_device_info
*devinfo
= &brw
->screen
->devinfo
;
42 assert(devinfo
->gen
>= 4);
44 ctx
->Extensions
.ARB_arrays_of_arrays
= true;
45 ctx
->Extensions
.ARB_buffer_storage
= true;
46 ctx
->Extensions
.ARB_clear_texture
= true;
47 ctx
->Extensions
.ARB_clip_control
= true;
48 ctx
->Extensions
.ARB_copy_image
= true;
49 ctx
->Extensions
.ARB_depth_buffer_float
= true;
50 ctx
->Extensions
.ARB_depth_clamp
= true;
51 ctx
->Extensions
.ARB_depth_texture
= true;
52 ctx
->Extensions
.ARB_draw_elements_base_vertex
= true;
53 ctx
->Extensions
.ARB_draw_instanced
= true;
54 ctx
->Extensions
.ARB_ES2_compatibility
= true;
55 ctx
->Extensions
.ARB_explicit_attrib_location
= true;
56 ctx
->Extensions
.ARB_explicit_uniform_location
= true;
57 ctx
->Extensions
.ARB_fragment_coord_conventions
= true;
58 ctx
->Extensions
.ARB_fragment_program
= true;
59 ctx
->Extensions
.ARB_fragment_program_shadow
= true;
60 ctx
->Extensions
.ARB_fragment_shader
= true;
61 ctx
->Extensions
.ARB_framebuffer_object
= true;
62 ctx
->Extensions
.ARB_half_float_vertex
= true;
63 ctx
->Extensions
.ARB_instanced_arrays
= true;
64 ctx
->Extensions
.ARB_internalformat_query
= true;
65 ctx
->Extensions
.ARB_internalformat_query2
= true;
66 ctx
->Extensions
.ARB_map_buffer_range
= true;
67 ctx
->Extensions
.ARB_occlusion_query
= true;
68 ctx
->Extensions
.ARB_occlusion_query2
= true;
69 ctx
->Extensions
.ARB_point_sprite
= true;
70 ctx
->Extensions
.ARB_polygon_offset_clamp
= true;
71 ctx
->Extensions
.ARB_seamless_cube_map
= true;
72 ctx
->Extensions
.ARB_shader_bit_encoding
= true;
73 ctx
->Extensions
.ARB_shader_draw_parameters
= true;
74 ctx
->Extensions
.ARB_shader_group_vote
= true;
75 ctx
->Extensions
.ARB_shader_texture_lod
= true;
76 ctx
->Extensions
.ARB_shading_language_packing
= true;
77 ctx
->Extensions
.ARB_shadow
= true;
78 ctx
->Extensions
.ARB_sync
= true;
79 ctx
->Extensions
.ARB_texture_border_clamp
= true;
80 ctx
->Extensions
.ARB_texture_compression_rgtc
= true;
81 ctx
->Extensions
.ARB_texture_cube_map
= true;
82 ctx
->Extensions
.ARB_texture_env_combine
= true;
83 ctx
->Extensions
.ARB_texture_env_crossbar
= true;
84 ctx
->Extensions
.ARB_texture_env_dot3
= true;
85 ctx
->Extensions
.ARB_texture_filter_anisotropic
= true;
86 ctx
->Extensions
.ARB_texture_float
= true;
87 ctx
->Extensions
.ARB_texture_mirror_clamp_to_edge
= true;
88 ctx
->Extensions
.ARB_texture_non_power_of_two
= true;
89 ctx
->Extensions
.ARB_texture_rg
= true;
90 ctx
->Extensions
.ARB_texture_rgb10_a2ui
= true;
91 ctx
->Extensions
.ARB_vertex_program
= true;
92 ctx
->Extensions
.ARB_vertex_shader
= true;
93 ctx
->Extensions
.ARB_vertex_type_2_10_10_10_rev
= true;
94 ctx
->Extensions
.ARB_vertex_type_10f_11f_11f_rev
= true;
95 ctx
->Extensions
.EXT_blend_color
= true;
96 ctx
->Extensions
.EXT_blend_equation_separate
= true;
97 ctx
->Extensions
.EXT_blend_func_separate
= true;
98 ctx
->Extensions
.EXT_blend_minmax
= true;
99 ctx
->Extensions
.EXT_draw_buffers2
= true;
100 ctx
->Extensions
.EXT_float_blend
= true;
101 ctx
->Extensions
.EXT_framebuffer_sRGB
= true;
102 ctx
->Extensions
.EXT_gpu_program_parameters
= true;
103 ctx
->Extensions
.EXT_packed_float
= true;
104 ctx
->Extensions
.EXT_pixel_buffer_object
= true;
105 ctx
->Extensions
.EXT_point_parameters
= true;
106 ctx
->Extensions
.EXT_provoking_vertex
= true;
107 ctx
->Extensions
.EXT_render_snorm
= true;
108 ctx
->Extensions
.EXT_sRGB
= true;
109 ctx
->Extensions
.EXT_stencil_two_side
= true;
110 ctx
->Extensions
.EXT_texture_array
= true;
111 ctx
->Extensions
.EXT_texture_env_dot3
= true;
112 ctx
->Extensions
.EXT_texture_filter_anisotropic
= true;
113 ctx
->Extensions
.EXT_texture_integer
= true;
114 ctx
->Extensions
.EXT_texture_shared_exponent
= true;
115 ctx
->Extensions
.EXT_texture_snorm
= true;
116 ctx
->Extensions
.EXT_texture_sRGB
= true;
117 ctx
->Extensions
.EXT_texture_sRGB_decode
= true;
118 ctx
->Extensions
.EXT_texture_sRGB_R8
= true;
119 ctx
->Extensions
.EXT_texture_swizzle
= true;
120 ctx
->Extensions
.EXT_texture_type_2_10_10_10_REV
= true;
121 ctx
->Extensions
.EXT_vertex_array_bgra
= true;
122 ctx
->Extensions
.KHR_robustness
= true;
123 ctx
->Extensions
.AMD_seamless_cubemap_per_texture
= true;
124 ctx
->Extensions
.APPLE_object_purgeable
= true;
125 ctx
->Extensions
.ATI_texture_env_combine3
= true;
126 ctx
->Extensions
.MESA_framebuffer_flip_y
= true;
127 ctx
->Extensions
.MESA_pack_invert
= true;
128 ctx
->Extensions
.NV_conditional_render
= true;
129 ctx
->Extensions
.NV_fog_distance
= true;
130 ctx
->Extensions
.NV_primitive_restart
= true;
131 ctx
->Extensions
.NV_texture_barrier
= true;
132 ctx
->Extensions
.NV_texture_env_combine4
= true;
133 ctx
->Extensions
.NV_texture_rectangle
= true;
134 ctx
->Extensions
.TDFX_texture_compression_FXT1
= true;
135 ctx
->Extensions
.OES_compressed_ETC1_RGB8_texture
= true;
136 ctx
->Extensions
.OES_draw_texture
= true;
137 ctx
->Extensions
.OES_EGL_image
= true;
138 ctx
->Extensions
.OES_EGL_image_external
= true;
139 ctx
->Extensions
.OES_standard_derivatives
= true;
140 ctx
->Extensions
.OES_texture_float
= true;
141 ctx
->Extensions
.OES_texture_float_linear
= true;
142 ctx
->Extensions
.OES_texture_half_float
= true;
143 ctx
->Extensions
.OES_texture_half_float_linear
= true;
145 if (devinfo
->gen
>= 8)
146 ctx
->Const
.GLSLVersion
= 460;
147 else if (devinfo
->is_haswell
&& can_do_pipelined_register_writes(brw
->screen
))
148 ctx
->Const
.GLSLVersion
= 450;
149 else if (devinfo
->gen
>= 7 && can_do_pipelined_register_writes(brw
->screen
))
150 ctx
->Const
.GLSLVersion
= 420;
151 else if (devinfo
->gen
>= 6)
152 ctx
->Const
.GLSLVersion
= 330;
154 ctx
->Const
.GLSLVersion
= 120;
156 if (devinfo
->gen
>= 6)
157 ctx
->Const
.GLSLVersionCompat
= 130;
159 ctx
->Const
.GLSLVersionCompat
= 120;
161 _mesa_override_glsl_version(&ctx
->Const
);
163 ctx
->Extensions
.EXT_shader_integer_mix
= ctx
->Const
.GLSLVersion
>= 130;
164 ctx
->Extensions
.MESA_shader_integer_functions
= ctx
->Const
.GLSLVersion
>= 130;
166 if (devinfo
->is_g4x
|| devinfo
->gen
>= 5) {
167 ctx
->Extensions
.EXT_shader_framebuffer_fetch_non_coherent
= true;
168 ctx
->Extensions
.KHR_blend_equation_advanced
= true;
171 if (devinfo
->gen
>= 5) {
172 ctx
->Extensions
.ARB_texture_query_levels
= ctx
->Const
.GLSLVersion
>= 130;
173 ctx
->Extensions
.ARB_texture_query_lod
= true;
174 ctx
->Extensions
.EXT_timer_query
= true;
177 if (devinfo
->gen
== 6)
178 ctx
->Extensions
.ARB_transform_feedback2
= true;
180 if (devinfo
->gen
>= 6) {
181 ctx
->Extensions
.ARB_blend_func_extended
=
182 !driQueryOptionb(&brw
->optionCache
, "disable_blend_func_extended");
183 ctx
->Extensions
.ARB_conditional_render_inverted
= true;
184 ctx
->Extensions
.ARB_cull_distance
= true;
185 ctx
->Extensions
.ARB_draw_buffers_blend
= true;
186 if (ctx
->API
!= API_OPENGL_COMPAT
||
187 ctx
->Const
.AllowHigherCompatVersion
)
188 ctx
->Extensions
.ARB_enhanced_layouts
= true;
189 ctx
->Extensions
.ARB_ES3_compatibility
= true;
190 ctx
->Extensions
.ARB_fragment_layer_viewport
= true;
191 ctx
->Extensions
.ARB_pipeline_statistics_query
= true;
192 ctx
->Extensions
.ARB_sample_shading
= true;
193 ctx
->Extensions
.ARB_shading_language_420pack
= true;
194 if (ctx
->API
!= API_OPENGL_COMPAT
||
195 ctx
->Const
.AllowHigherCompatVersion
) {
196 ctx
->Extensions
.ARB_texture_buffer_object
= true;
197 ctx
->Extensions
.ARB_texture_buffer_object_rgb32
= true;
198 ctx
->Extensions
.ARB_texture_buffer_range
= true;
200 ctx
->Extensions
.ARB_texture_cube_map_array
= true;
201 ctx
->Extensions
.ARB_texture_gather
= true;
202 ctx
->Extensions
.ARB_texture_multisample
= true;
203 ctx
->Extensions
.ARB_uniform_buffer_object
= true;
204 ctx
->Extensions
.EXT_texture_shadow_lod
= true;
206 if (ctx
->API
!= API_OPENGL_COMPAT
||
207 ctx
->Const
.AllowHigherCompatVersion
)
208 ctx
->Extensions
.AMD_vertex_shader_layer
= true;
209 ctx
->Extensions
.EXT_framebuffer_multisample
= true;
210 ctx
->Extensions
.EXT_framebuffer_multisample_blit_scaled
= true;
211 ctx
->Extensions
.EXT_transform_feedback
= true;
212 ctx
->Extensions
.ARB_transform_feedback_overflow_query
= true;
213 ctx
->Extensions
.OES_depth_texture_cube_map
= true;
214 ctx
->Extensions
.OES_sample_variables
= true;
216 ctx
->Extensions
.ARB_timer_query
= brw
->screen
->hw_has_timestamp
;
217 ctx
->Extensions
.EXT_disjoint_timer_query
=
218 ctx
->Extensions
.ARB_timer_query
;
220 /* Only enable this in core profile because other parts of Mesa behave
221 * slightly differently when the extension is enabled.
223 if (ctx
->API
== API_OPENGL_CORE
) {
224 ctx
->Extensions
.ARB_shader_viewport_layer_array
= true;
225 ctx
->Extensions
.ARB_viewport_array
= true;
226 ctx
->Extensions
.AMD_vertex_shader_viewport_index
= true;
230 brw
->predicate
.supported
= false;
232 if (devinfo
->gen
>= 7) {
233 ctx
->Extensions
.ARB_conservative_depth
= true;
234 ctx
->Extensions
.ARB_derivative_control
= true;
235 ctx
->Extensions
.ARB_framebuffer_no_attachments
= true;
236 if (ctx
->API
!= API_OPENGL_COMPAT
||
237 ctx
->Const
.AllowHigherCompatVersion
) {
238 ctx
->Extensions
.ARB_gpu_shader5
= true;
239 ctx
->Extensions
.ARB_gpu_shader_fp64
= true;
241 ctx
->Extensions
.ARB_shader_atomic_counters
= true;
242 ctx
->Extensions
.ARB_shader_atomic_counter_ops
= true;
243 ctx
->Extensions
.ARB_shader_clock
= true;
244 ctx
->Extensions
.ARB_shader_image_load_store
= true;
245 ctx
->Extensions
.ARB_shader_image_size
= true;
246 ctx
->Extensions
.ARB_shader_precision
= true;
247 ctx
->Extensions
.ARB_shader_texture_image_samples
= true;
248 if (ctx
->API
!= API_OPENGL_COMPAT
||
249 ctx
->Const
.AllowHigherCompatVersion
)
250 ctx
->Extensions
.ARB_tessellation_shader
= true;
251 ctx
->Extensions
.ARB_texture_compression_bptc
= true;
252 ctx
->Extensions
.ARB_texture_view
= true;
253 ctx
->Extensions
.ARB_shader_storage_buffer_object
= true;
254 ctx
->Extensions
.ARB_vertex_attrib_64bit
= true;
255 ctx
->Extensions
.EXT_shader_samples_identical
= true;
256 ctx
->Extensions
.OES_primitive_bounding_box
= true;
257 ctx
->Extensions
.OES_texture_buffer
= true;
259 if (can_do_pipelined_register_writes(brw
->screen
)) {
260 ctx
->Extensions
.ARB_draw_indirect
= true;
261 ctx
->Extensions
.ARB_transform_feedback2
= true;
262 ctx
->Extensions
.ARB_transform_feedback3
= true;
263 ctx
->Extensions
.ARB_transform_feedback_instanced
= true;
265 if (can_do_compute_dispatch(brw
->screen
) &&
266 ctx
->Const
.MaxComputeWorkGroupSize
[0] >= 1024) {
267 ctx
->Extensions
.ARB_compute_shader
= true;
268 ctx
->Extensions
.ARB_ES3_1_compatibility
=
269 devinfo
->gen
>= 8 || devinfo
->is_haswell
;
270 ctx
->Extensions
.NV_compute_shader_derivatives
= true;
273 if (can_do_predicate_writes(brw
->screen
)) {
274 brw
->predicate
.supported
= true;
275 ctx
->Extensions
.ARB_indirect_parameters
= true;
279 ctx
->Extensions
.ARB_gl_spirv
= true;
280 ctx
->Extensions
.ARB_spirv_extensions
= true;
283 if (devinfo
->gen
>= 8 || devinfo
->is_haswell
) {
284 ctx
->Extensions
.ARB_stencil_texturing
= true;
285 ctx
->Extensions
.ARB_texture_stencil8
= true;
286 ctx
->Extensions
.OES_geometry_shader
= true;
287 ctx
->Extensions
.OES_texture_cube_map_array
= true;
288 ctx
->Extensions
.OES_viewport_array
= true;
291 if (devinfo
->gen
>= 8 || devinfo
->is_haswell
|| devinfo
->is_baytrail
) {
292 ctx
->Extensions
.ARB_robust_buffer_access_behavior
= true;
295 if (can_do_mi_math_and_lrr(brw
->screen
)) {
296 ctx
->Extensions
.ARB_query_buffer_object
= true;
299 if (devinfo
->gen
>= 8 || devinfo
->is_baytrail
) {
300 /* For now, we can't enable OES_texture_view on Gen 7 because of
301 * some piglit failures coming from
302 * piglit/tests/spec/arb_texture_view/rendering-formats.c that need
305 ctx
->Extensions
.OES_texture_view
= true;
308 if (devinfo
->gen
>= 7) {
309 /* We can safely enable OES_copy_image on Gen 7, since we emulate
310 * the ETC2 support using the shadow_miptree to store the
313 ctx
->Extensions
.OES_copy_image
= true;
316 if (devinfo
->gen
>= 8) {
317 ctx
->Extensions
.ARB_gpu_shader_int64
= true;
318 /* requires ARB_gpu_shader_int64 */
319 ctx
->Extensions
.ARB_shader_ballot
= true;
320 ctx
->Extensions
.ARB_ES3_2_compatibility
= true;
323 if (devinfo
->gen
>= 9) {
324 ctx
->Extensions
.ANDROID_extension_pack_es31a
= true;
325 ctx
->Extensions
.AMD_depth_clamp_separate
= true;
326 ctx
->Extensions
.ARB_post_depth_coverage
= true;
327 ctx
->Extensions
.ARB_shader_stencil_export
= true;
328 ctx
->Extensions
.EXT_shader_framebuffer_fetch
= true;
329 ctx
->Extensions
.INTEL_conservative_rasterization
= true;
330 ctx
->Extensions
.INTEL_shader_atomic_float_minmax
= true;
331 ctx
->Extensions
.KHR_blend_equation_advanced_coherent
= true;
332 ctx
->Extensions
.KHR_texture_compression_astc_ldr
= true;
333 ctx
->Extensions
.KHR_texture_compression_astc_sliced_3d
= true;
336 * From the Skylake PRM Vol. 7 (Memory Fence Message, page 221):
337 * "A memory fence message issued by a thread causes further messages
338 * issued by the thread to be blocked until all previous data port
339 * messages have completed, or the results can be globally observed from
340 * the point of view of other threads in the system."
342 * From the Haswell PRM Vol. 7 (Memory Fence, page 256):
343 * "A memory fence message issued by a thread causes further messages
344 * issued by the thread to be blocked until all previous messages issued
345 * by the thread to that data port (data cache or render cache) have
346 * been globally observed from the point of view of other threads in the
349 * Summarized: For ARB_fragment_shader_interlock to work, we need to
350 * ensure memory access ordering for all messages to the dataport from
351 * all threads. Memory fence messages prior to SKL only provide memory
352 * access ordering for messages from the same thread, so we can only
353 * support the feature from Gen9 onwards.
357 ctx
->Extensions
.ARB_fragment_shader_interlock
= true;
360 if (gen_device_info_is_9lp(devinfo
))
361 ctx
->Extensions
.KHR_texture_compression_astc_hdr
= true;
363 if (devinfo
->gen
>= 6)
364 ctx
->Extensions
.INTEL_performance_query
= true;
366 if (ctx
->API
!= API_OPENGL_COMPAT
||
367 ctx
->Const
.AllowHigherCompatVersion
)
368 ctx
->Extensions
.ARB_base_instance
= true;
369 if (ctx
->API
!= API_OPENGL_CORE
)
370 ctx
->Extensions
.ARB_color_buffer_float
= true;
372 ctx
->Extensions
.EXT_texture_compression_s3tc
= true;
373 ctx
->Extensions
.EXT_texture_compression_s3tc_srgb
= true;
374 ctx
->Extensions
.ANGLE_texture_compression_dxt
= true;