1 /**************************************************************************
3 * Copyright 2003 VMware, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
28 #include "main/version.h"
30 #include "brw_context.h"
31 #include "intel_batchbuffer.h"
32 #include "intel_reg.h"
36 * Test if we can use MI_LOAD_REGISTER_MEM from an untrusted batchbuffer.
38 * Some combinations of hardware and kernel versions allow this feature,
39 * while others don't. Instead of trying to enumerate every case, just
40 * try and write a register and see if works.
43 can_do_pipelined_register_writes(struct brw_context
*brw
)
45 /* Supposedly, Broadwell just works. */
49 static int result
= -1;
53 /* We use SO_WRITE_OFFSET0 since you're supposed to write it (unlike the
54 * statistics registers), and we already reset it to zero before using it.
56 const int reg
= GEN7_SO_WRITE_OFFSET(0);
57 const int expected_value
= 0x1337d0d0;
58 const int offset
= 100;
60 /* The register we picked only exists on Gen7+. */
61 assert(brw
->gen
== 7);
64 /* Set a value in a BO to a known quantity. The workaround BO already
65 * exists and doesn't contain anything important, so we may as well use it.
67 drm_intel_bo_map(brw
->workaround_bo
, true);
68 data
= brw
->workaround_bo
->virtual;
69 data
[offset
] = 0xffffffff;
70 drm_intel_bo_unmap(brw
->workaround_bo
);
72 /* Write the register. */
74 OUT_BATCH(MI_LOAD_REGISTER_IMM
| (3 - 2));
76 OUT_BATCH(expected_value
);
79 brw_emit_mi_flush(brw
);
81 /* Save the register's value back to the buffer. */
83 OUT_BATCH(MI_STORE_REGISTER_MEM
| (3 - 2));
85 OUT_RELOC(brw
->workaround_bo
,
86 I915_GEM_DOMAIN_INSTRUCTION
, I915_GEM_DOMAIN_INSTRUCTION
,
87 offset
* sizeof(uint32_t));
90 intel_batchbuffer_flush(brw
);
92 /* Check whether the value got written. */
93 drm_intel_bo_map(brw
->workaround_bo
, false);
94 data
= brw
->workaround_bo
->virtual;
95 bool success
= data
[offset
] == expected_value
;
96 drm_intel_bo_unmap(brw
->workaround_bo
);
104 can_write_oacontrol(struct brw_context
*brw
)
106 if (brw
->gen
< 6 || brw
->gen
>= 8)
109 static int result
= -1;
113 /* Set "Select Context ID" to a particular address (which is likely not a
114 * context), but leave all counting disabled. This should be harmless.
116 const int expected_value
= 0x31337000;
117 const int offset
= 110;
120 /* Set a value in a BO to a known quantity. The workaround BO already
121 * exists and doesn't contain anything important, so we may as well use it.
123 drm_intel_bo_map(brw
->workaround_bo
, true);
124 data
= brw
->workaround_bo
->virtual;
125 data
[offset
] = 0xffffffff;
126 drm_intel_bo_unmap(brw
->workaround_bo
);
128 /* Write OACONTROL. */
130 OUT_BATCH(MI_LOAD_REGISTER_IMM
| (3 - 2));
131 OUT_BATCH(OACONTROL
);
132 OUT_BATCH(expected_value
);
135 brw_emit_mi_flush(brw
);
137 /* Save the register's value back to the buffer. */
139 OUT_BATCH(MI_STORE_REGISTER_MEM
| (3 - 2));
140 OUT_BATCH(OACONTROL
);
141 OUT_RELOC(brw
->workaround_bo
,
142 I915_GEM_DOMAIN_INSTRUCTION
, I915_GEM_DOMAIN_INSTRUCTION
,
143 offset
* sizeof(uint32_t));
146 brw_emit_mi_flush(brw
);
148 /* Set OACONTROL back to zero (everything off). */
150 OUT_BATCH(MI_LOAD_REGISTER_IMM
| (3 - 2));
151 OUT_BATCH(OACONTROL
);
155 intel_batchbuffer_flush(brw
);
157 /* Check whether the value got written. */
158 drm_intel_bo_map(brw
->workaround_bo
, false);
159 data
= brw
->workaround_bo
->virtual;
160 bool success
= data
[offset
] == expected_value
;
161 drm_intel_bo_unmap(brw
->workaround_bo
);
169 * Initializes potential list of extensions if ctx == NULL, or actually enables
170 * extensions for a context.
173 intelInitExtensions(struct gl_context
*ctx
)
175 struct brw_context
*brw
= brw_context(ctx
);
177 assert(brw
->gen
>= 4);
179 ctx
->Extensions
.ARB_buffer_storage
= true;
180 ctx
->Extensions
.ARB_clear_texture
= true;
181 ctx
->Extensions
.ARB_clip_control
= true;
182 ctx
->Extensions
.ARB_copy_image
= true;
183 ctx
->Extensions
.ARB_depth_buffer_float
= true;
184 ctx
->Extensions
.ARB_depth_clamp
= true;
185 ctx
->Extensions
.ARB_depth_texture
= true;
186 ctx
->Extensions
.ARB_draw_elements_base_vertex
= true;
187 ctx
->Extensions
.ARB_draw_instanced
= true;
188 ctx
->Extensions
.ARB_ES2_compatibility
= true;
189 ctx
->Extensions
.ARB_explicit_attrib_location
= true;
190 ctx
->Extensions
.ARB_explicit_uniform_location
= true;
191 ctx
->Extensions
.ARB_fragment_coord_conventions
= true;
192 ctx
->Extensions
.ARB_fragment_program
= true;
193 ctx
->Extensions
.ARB_fragment_program_shadow
= true;
194 ctx
->Extensions
.ARB_fragment_shader
= true;
195 ctx
->Extensions
.ARB_framebuffer_object
= true;
196 ctx
->Extensions
.ARB_half_float_vertex
= true;
197 ctx
->Extensions
.ARB_instanced_arrays
= true;
198 ctx
->Extensions
.ARB_internalformat_query
= true;
199 ctx
->Extensions
.ARB_map_buffer_range
= true;
200 ctx
->Extensions
.ARB_occlusion_query
= true;
201 ctx
->Extensions
.ARB_occlusion_query2
= true;
202 ctx
->Extensions
.ARB_pipeline_statistics_query
= true;
203 ctx
->Extensions
.ARB_point_sprite
= true;
204 ctx
->Extensions
.ARB_seamless_cube_map
= true;
205 ctx
->Extensions
.ARB_shader_bit_encoding
= true;
206 ctx
->Extensions
.ARB_shader_texture_lod
= true;
207 ctx
->Extensions
.ARB_shadow
= true;
208 ctx
->Extensions
.ARB_sync
= true;
209 ctx
->Extensions
.ARB_texture_border_clamp
= true;
210 ctx
->Extensions
.ARB_texture_compression_rgtc
= true;
211 ctx
->Extensions
.ARB_texture_cube_map
= true;
212 ctx
->Extensions
.ARB_texture_env_combine
= true;
213 ctx
->Extensions
.ARB_texture_env_crossbar
= true;
214 ctx
->Extensions
.ARB_texture_env_dot3
= true;
215 ctx
->Extensions
.ARB_texture_float
= true;
216 ctx
->Extensions
.ARB_texture_mirror_clamp_to_edge
= true;
217 ctx
->Extensions
.ARB_texture_non_power_of_two
= true;
218 ctx
->Extensions
.ARB_texture_rg
= true;
219 ctx
->Extensions
.ARB_texture_rgb10_a2ui
= true;
220 ctx
->Extensions
.ARB_vertex_program
= true;
221 ctx
->Extensions
.ARB_vertex_shader
= true;
222 ctx
->Extensions
.ARB_vertex_type_2_10_10_10_rev
= true;
223 ctx
->Extensions
.ARB_vertex_type_10f_11f_11f_rev
= true;
224 ctx
->Extensions
.EXT_blend_color
= true;
225 ctx
->Extensions
.EXT_blend_equation_separate
= true;
226 ctx
->Extensions
.EXT_blend_func_separate
= true;
227 ctx
->Extensions
.EXT_blend_minmax
= true;
228 ctx
->Extensions
.EXT_draw_buffers2
= true;
229 ctx
->Extensions
.EXT_framebuffer_sRGB
= true;
230 ctx
->Extensions
.EXT_gpu_program_parameters
= true;
231 ctx
->Extensions
.EXT_packed_float
= true;
232 ctx
->Extensions
.EXT_pixel_buffer_object
= true;
233 ctx
->Extensions
.EXT_point_parameters
= true;
234 ctx
->Extensions
.EXT_provoking_vertex
= true;
235 ctx
->Extensions
.EXT_stencil_two_side
= true;
236 ctx
->Extensions
.EXT_texture_array
= true;
237 ctx
->Extensions
.EXT_texture_env_dot3
= true;
238 ctx
->Extensions
.EXT_texture_filter_anisotropic
= true;
239 ctx
->Extensions
.EXT_texture_integer
= true;
240 ctx
->Extensions
.EXT_texture_shared_exponent
= true;
241 ctx
->Extensions
.EXT_texture_snorm
= true;
242 ctx
->Extensions
.EXT_texture_sRGB
= true;
243 ctx
->Extensions
.EXT_texture_sRGB_decode
= true;
244 ctx
->Extensions
.EXT_texture_swizzle
= true;
245 ctx
->Extensions
.EXT_vertex_array_bgra
= true;
246 ctx
->Extensions
.AMD_seamless_cubemap_per_texture
= true;
247 ctx
->Extensions
.APPLE_object_purgeable
= true;
248 ctx
->Extensions
.ATI_separate_stencil
= true;
249 ctx
->Extensions
.ATI_texture_env_combine3
= true;
250 ctx
->Extensions
.MESA_pack_invert
= true;
251 ctx
->Extensions
.NV_conditional_render
= true;
252 ctx
->Extensions
.NV_primitive_restart
= true;
253 ctx
->Extensions
.NV_texture_env_combine4
= true;
254 ctx
->Extensions
.NV_texture_rectangle
= true;
255 ctx
->Extensions
.TDFX_texture_compression_FXT1
= true;
256 ctx
->Extensions
.OES_compressed_ETC1_RGB8_texture
= true;
257 ctx
->Extensions
.OES_draw_texture
= true;
258 ctx
->Extensions
.OES_EGL_image
= true;
259 ctx
->Extensions
.OES_EGL_image_external
= true;
260 ctx
->Extensions
.OES_standard_derivatives
= true;
261 ctx
->Extensions
.OES_texture_float
= true;
262 ctx
->Extensions
.OES_texture_float_linear
= true;
263 ctx
->Extensions
.OES_texture_half_float
= true;
264 ctx
->Extensions
.OES_texture_half_float_linear
= true;
267 ctx
->Const
.GLSLVersion
= 330;
269 ctx
->Const
.GLSLVersion
= 120;
270 _mesa_override_glsl_version(&ctx
->Const
);
273 ctx
->Extensions
.ARB_texture_query_levels
= ctx
->Const
.GLSLVersion
>= 130;
274 ctx
->Extensions
.ARB_texture_query_lod
= true;
275 ctx
->Extensions
.EXT_shader_integer_mix
= ctx
->Const
.GLSLVersion
>= 130;
276 ctx
->Extensions
.EXT_timer_query
= true;
278 if (brw
->gen
== 5 || can_write_oacontrol(brw
)) {
279 ctx
->Extensions
.AMD_performance_monitor
= true;
280 ctx
->Extensions
.INTEL_performance_query
= true;
285 ctx
->Extensions
.ARB_blend_func_extended
=
286 !driQueryOptionb(&brw
->optionCache
, "disable_blend_func_extended");
287 ctx
->Extensions
.ARB_conditional_render_inverted
= true;
288 ctx
->Extensions
.ARB_draw_buffers_blend
= true;
289 ctx
->Extensions
.ARB_ES3_compatibility
= true;
290 ctx
->Extensions
.ARB_sample_shading
= true;
291 ctx
->Extensions
.ARB_shading_language_420pack
= true;
292 ctx
->Extensions
.ARB_shading_language_packing
= true;
293 ctx
->Extensions
.ARB_texture_buffer_object
= true;
294 ctx
->Extensions
.ARB_texture_buffer_object_rgb32
= true;
295 ctx
->Extensions
.ARB_texture_buffer_range
= true;
296 ctx
->Extensions
.ARB_texture_cube_map_array
= true;
297 ctx
->Extensions
.ARB_texture_gather
= true;
298 ctx
->Extensions
.ARB_texture_multisample
= true;
299 ctx
->Extensions
.ARB_uniform_buffer_object
= true;
301 ctx
->Extensions
.AMD_vertex_shader_layer
= true;
302 ctx
->Extensions
.EXT_framebuffer_multisample
= true;
303 ctx
->Extensions
.EXT_framebuffer_multisample_blit_scaled
= true;
304 ctx
->Extensions
.EXT_polygon_offset_clamp
= true;
305 ctx
->Extensions
.EXT_transform_feedback
= true;
306 ctx
->Extensions
.OES_depth_texture_cube_map
= true;
308 ctx
->Extensions
.ARB_timer_query
= brw
->intelScreen
->hw_has_timestamp
;
310 /* Only enable this in core profile because other parts of Mesa behave
311 * slightly differently when the extension is enabled.
313 if (ctx
->API
== API_OPENGL_CORE
) {
314 ctx
->Extensions
.ARB_shader_subroutine
= true;
315 ctx
->Extensions
.ARB_viewport_array
= true;
316 ctx
->Extensions
.AMD_vertex_shader_viewport_index
= true;
320 brw
->predicate
.supported
= false;
323 ctx
->Extensions
.ARB_conservative_depth
= true;
324 ctx
->Extensions
.ARB_derivative_control
= true;
325 ctx
->Extensions
.ARB_framebuffer_no_attachments
= true;
326 ctx
->Extensions
.ARB_gpu_shader5
= true;
327 ctx
->Extensions
.ARB_shader_atomic_counters
= true;
328 ctx
->Extensions
.ARB_texture_compression_bptc
= true;
329 ctx
->Extensions
.ARB_texture_view
= true;
331 if (can_do_pipelined_register_writes(brw
)) {
332 ctx
->Extensions
.ARB_draw_indirect
= true;
333 ctx
->Extensions
.ARB_transform_feedback2
= true;
334 ctx
->Extensions
.ARB_transform_feedback3
= true;
335 ctx
->Extensions
.ARB_transform_feedback_instanced
= true;
337 if (brw
->intelScreen
->cmd_parser_version
>= 2)
338 brw
->predicate
.supported
= true;
341 /* Only enable this in core profile because other parts of Mesa behave
342 * slightly differently when the extension is enabled.
344 if (ctx
->API
== API_OPENGL_CORE
) {
345 ctx
->Extensions
.ARB_viewport_array
= true;
346 ctx
->Extensions
.AMD_vertex_shader_viewport_index
= true;
347 ctx
->Extensions
.ARB_shader_subroutine
= true;
352 ctx
->Extensions
.ARB_stencil_texturing
= true;
355 if (ctx
->API
== API_OPENGL_CORE
)
356 ctx
->Extensions
.ARB_base_instance
= true;
357 if (ctx
->API
!= API_OPENGL_CORE
)
358 ctx
->Extensions
.ARB_color_buffer_float
= true;
360 if (ctx
->Mesa_DXTn
|| driQueryOptionb(&brw
->optionCache
, "force_s3tc_enable"))
361 ctx
->Extensions
.EXT_texture_compression_s3tc
= true;
363 ctx
->Extensions
.ANGLE_texture_compression_dxt
= true;