Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/drivers/iris/iris_screen.c
4565 views
1
/*
2
* Copyright © 2017 Intel Corporation
3
*
4
* Permission is hereby granted, free of charge, to any person obtaining a
5
* copy of this software and associated documentation files (the "Software"),
6
* to deal in the Software without restriction, including without limitation
7
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
* and/or sell copies of the Software, and to permit persons to whom the
9
* Software is furnished to do so, subject to the following conditions:
10
*
11
* The above copyright notice and this permission notice shall be included
12
* in all copies or substantial portions of the Software.
13
*
14
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20
* DEALINGS IN THE SOFTWARE.
21
*/
22
23
/**
24
* @file iris_screen.c
25
*
26
* Screen related driver hooks and capability lists.
27
*
28
* A program may use multiple rendering contexts (iris_context), but
29
* they all share a common screen (iris_screen). Global driver state
30
* can be stored in the screen; it may be accessed by multiple threads.
31
*/
32
33
#include <stdio.h>
34
#include <errno.h>
35
#include <sys/ioctl.h>
36
#include "pipe/p_defines.h"
37
#include "pipe/p_state.h"
38
#include "pipe/p_context.h"
39
#include "pipe/p_screen.h"
40
#include "util/debug.h"
41
#include "util/u_inlines.h"
42
#include "util/format/u_format.h"
43
#include "util/u_transfer_helper.h"
44
#include "util/u_upload_mgr.h"
45
#include "util/ralloc.h"
46
#include "util/xmlconfig.h"
47
#include "drm-uapi/i915_drm.h"
48
#include "iris_context.h"
49
#include "iris_defines.h"
50
#include "iris_fence.h"
51
#include "iris_pipe.h"
52
#include "iris_resource.h"
53
#include "iris_screen.h"
54
#include "compiler/glsl_types.h"
55
#include "intel/compiler/brw_compiler.h"
56
#include "intel/common/intel_gem.h"
57
#include "intel/common/intel_l3_config.h"
58
#include "intel/common/intel_uuid.h"
59
#include "iris_monitor.h"
60
61
#define genX_call(devinfo, func, ...) \
62
switch ((devinfo)->verx10) { \
63
case 125: \
64
gfx125_##func(__VA_ARGS__); \
65
break; \
66
case 120: \
67
gfx12_##func(__VA_ARGS__); \
68
break; \
69
case 110: \
70
gfx11_##func(__VA_ARGS__); \
71
break; \
72
case 90: \
73
gfx9_##func(__VA_ARGS__); \
74
break; \
75
case 80: \
76
gfx8_##func(__VA_ARGS__); \
77
break; \
78
default: \
79
unreachable("Unknown hardware generation"); \
80
}
81
82
static void
83
iris_flush_frontbuffer(struct pipe_screen *_screen,
84
struct pipe_context *_pipe,
85
struct pipe_resource *resource,
86
unsigned level, unsigned layer,
87
void *context_private, struct pipe_box *box)
88
{
89
}
90
91
static const char *
92
iris_get_vendor(struct pipe_screen *pscreen)
93
{
94
return "Intel";
95
}
96
97
static const char *
98
iris_get_device_vendor(struct pipe_screen *pscreen)
99
{
100
return "Intel";
101
}
102
103
static void
104
iris_get_device_uuid(struct pipe_screen *pscreen, char *uuid)
105
{
106
struct iris_screen *screen = (struct iris_screen *)pscreen;
107
const struct isl_device *isldev = &screen->isl_dev;
108
109
intel_uuid_compute_device_id((uint8_t *)uuid, isldev, PIPE_UUID_SIZE);
110
}
111
112
static void
113
iris_get_driver_uuid(struct pipe_screen *pscreen, char *uuid)
114
{
115
struct iris_screen *screen = (struct iris_screen *)pscreen;
116
const struct intel_device_info *devinfo = &screen->devinfo;
117
118
intel_uuid_compute_driver_id((uint8_t *)uuid, devinfo, PIPE_UUID_SIZE);
119
}
120
121
static bool
122
iris_enable_clover()
123
{
124
static int enable = -1;
125
if (enable < 0)
126
enable = env_var_as_boolean("IRIS_ENABLE_CLOVER", false);
127
return enable;
128
}
129
130
static void
131
iris_warn_clover()
132
{
133
static bool warned = false;
134
if (warned)
135
return;
136
137
warned = true;
138
fprintf(stderr, "WARNING: OpenCL support via iris+clover is incomplete.\n"
139
"For a complete and conformant OpenCL implementation, use\n"
140
"https://github.com/intel/compute-runtime instead\n");
141
}
142
143
static const char *
144
iris_get_name(struct pipe_screen *pscreen)
145
{
146
struct iris_screen *screen = (struct iris_screen *)pscreen;
147
static char buf[128];
148
const char *name = intel_get_device_name(screen->pci_id);
149
150
if (!name)
151
name = "Intel Unknown";
152
153
snprintf(buf, sizeof(buf), "Mesa %s", name);
154
return buf;
155
}
156
157
static int
158
iris_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
159
{
160
struct iris_screen *screen = (struct iris_screen *)pscreen;
161
const struct intel_device_info *devinfo = &screen->devinfo;
162
163
switch (param) {
164
case PIPE_CAP_NPOT_TEXTURES:
165
case PIPE_CAP_ANISOTROPIC_FILTER:
166
case PIPE_CAP_POINT_SPRITE:
167
case PIPE_CAP_OCCLUSION_QUERY:
168
case PIPE_CAP_QUERY_TIME_ELAPSED:
169
case PIPE_CAP_TEXTURE_SWIZZLE:
170
case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE:
171
case PIPE_CAP_BLEND_EQUATION_SEPARATE:
172
case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD:
173
case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES:
174
case PIPE_CAP_VERTEX_SHADER_SATURATE:
175
case PIPE_CAP_PRIMITIVE_RESTART:
176
case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX:
177
case PIPE_CAP_INDEP_BLEND_ENABLE:
178
case PIPE_CAP_INDEP_BLEND_FUNC:
179
case PIPE_CAP_RGB_OVERRIDE_DST_ALPHA_BLEND:
180
case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
181
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
182
case PIPE_CAP_DEPTH_CLIP_DISABLE:
183
case PIPE_CAP_TGSI_INSTANCEID:
184
case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
185
case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
186
case PIPE_CAP_SEAMLESS_CUBE_MAP:
187
case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
188
case PIPE_CAP_CONDITIONAL_RENDER:
189
case PIPE_CAP_TEXTURE_BARRIER:
190
case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
191
case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
192
case PIPE_CAP_COMPUTE:
193
case PIPE_CAP_START_INSTANCE:
194
case PIPE_CAP_QUERY_TIMESTAMP:
195
case PIPE_CAP_TEXTURE_MULTISAMPLE:
196
case PIPE_CAP_CUBE_MAP_ARRAY:
197
case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
198
case PIPE_CAP_QUERY_PIPELINE_STATISTICS_SINGLE:
199
case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
200
case PIPE_CAP_TEXTURE_QUERY_LOD:
201
case PIPE_CAP_SAMPLE_SHADING:
202
case PIPE_CAP_FORCE_PERSAMPLE_INTERP:
203
case PIPE_CAP_DRAW_INDIRECT:
204
case PIPE_CAP_MULTI_DRAW_INDIRECT:
205
case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
206
case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
207
case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
208
case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
209
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
210
case PIPE_CAP_TGSI_PACK_HALF_FLOAT:
211
case PIPE_CAP_ACCELERATED:
212
case PIPE_CAP_UMA:
213
case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
214
case PIPE_CAP_CLIP_HALFZ:
215
case PIPE_CAP_TGSI_TEXCOORD:
216
case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
217
case PIPE_CAP_DOUBLES:
218
case PIPE_CAP_INT64:
219
case PIPE_CAP_INT64_DIVMOD:
220
case PIPE_CAP_SAMPLER_VIEW_TARGET:
221
case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
222
case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
223
case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:
224
case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
225
case PIPE_CAP_CULL_DISTANCE:
226
case PIPE_CAP_PACKED_UNIFORMS:
227
case PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET:
228
case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
229
case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:
230
case PIPE_CAP_POLYGON_OFFSET_CLAMP:
231
case PIPE_CAP_QUERY_SO_OVERFLOW:
232
case PIPE_CAP_QUERY_BUFFER_OBJECT:
233
case PIPE_CAP_TGSI_TEX_TXF_LZ:
234
case PIPE_CAP_TGSI_TXQS:
235
case PIPE_CAP_TGSI_CLOCK:
236
case PIPE_CAP_TGSI_BALLOT:
237
case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
238
case PIPE_CAP_CLEAR_TEXTURE:
239
case PIPE_CAP_CLEAR_SCISSORED:
240
case PIPE_CAP_TGSI_VOTE:
241
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
242
case PIPE_CAP_TEXTURE_GATHER_SM5:
243
case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
244
case PIPE_CAP_GLSL_TESS_LEVELS_AS_INPUTS:
245
case PIPE_CAP_LOAD_CONSTBUF:
246
case PIPE_CAP_NIR_COMPACT_ARRAYS:
247
case PIPE_CAP_DRAW_PARAMETERS:
248
case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
249
case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
250
case PIPE_CAP_COMPUTE_SHADER_DERIVATIVES:
251
case PIPE_CAP_INVALIDATE_BUFFER:
252
case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
253
case PIPE_CAP_CS_DERIVED_SYSTEM_VALUES_SUPPORTED:
254
case PIPE_CAP_TEXTURE_SHADOW_LOD:
255
case PIPE_CAP_SHADER_SAMPLES_IDENTICAL:
256
case PIPE_CAP_GL_SPIRV:
257
case PIPE_CAP_GL_SPIRV_VARIABLE_POINTERS:
258
case PIPE_CAP_DEMOTE_TO_HELPER_INVOCATION:
259
case PIPE_CAP_NATIVE_FENCE_FD:
260
case PIPE_CAP_MEMOBJ:
261
case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
262
case PIPE_CAP_FENCE_SIGNAL:
263
return true;
264
case PIPE_CAP_FBFETCH:
265
return BRW_MAX_DRAW_BUFFERS;
266
case PIPE_CAP_FBFETCH_COHERENT:
267
case PIPE_CAP_CONSERVATIVE_RASTER_INNER_COVERAGE:
268
case PIPE_CAP_POST_DEPTH_COVERAGE:
269
case PIPE_CAP_SHADER_STENCIL_EXPORT:
270
case PIPE_CAP_DEPTH_CLIP_DISABLE_SEPARATE:
271
case PIPE_CAP_FRAGMENT_SHADER_INTERLOCK:
272
case PIPE_CAP_ATOMIC_FLOAT_MINMAX:
273
return devinfo->ver >= 9;
274
case PIPE_CAP_DEPTH_BOUNDS_TEST:
275
return devinfo->ver >= 12;
276
case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
277
return 1;
278
case PIPE_CAP_MAX_RENDER_TARGETS:
279
return BRW_MAX_DRAW_BUFFERS;
280
case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
281
return 16384;
282
case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
283
return IRIS_MAX_MIPLEVELS; /* 16384x16384 */
284
case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
285
return 12; /* 2048x2048 */
286
case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
287
return 4;
288
case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
289
return 2048;
290
case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
291
return BRW_MAX_SOL_BINDINGS / IRIS_MAX_SOL_BUFFERS;
292
case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
293
return BRW_MAX_SOL_BINDINGS;
294
case PIPE_CAP_GLSL_FEATURE_LEVEL:
295
case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY:
296
return 460;
297
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
298
/* 3DSTATE_CONSTANT_XS requires the start of UBOs to be 32B aligned */
299
return 32;
300
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
301
return IRIS_MAP_BUFFER_ALIGNMENT;
302
case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
303
return 4;
304
case PIPE_CAP_MAX_SHADER_BUFFER_SIZE:
305
return 1 << 27;
306
case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
307
return 16; // XXX: u_screen says 256 is the minimum value...
308
case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
309
return true;
310
case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
311
return IRIS_MAX_TEXTURE_BUFFER_SIZE;
312
case PIPE_CAP_MAX_VIEWPORTS:
313
return 16;
314
case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
315
return 256;
316
case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
317
return 1024;
318
case PIPE_CAP_MAX_GS_INVOCATIONS:
319
return 32;
320
case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
321
return 4;
322
case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
323
return -32;
324
case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
325
return 31;
326
case PIPE_CAP_MAX_VERTEX_STREAMS:
327
return 4;
328
case PIPE_CAP_VENDOR_ID:
329
return 0x8086;
330
case PIPE_CAP_DEVICE_ID:
331
return screen->pci_id;
332
case PIPE_CAP_VIDEO_MEMORY: {
333
/* Once a batch uses more than 75% of the maximum mappable size, we
334
* assume that there's some fragmentation, and we start doing extra
335
* flushing, etc. That's the big cliff apps will care about.
336
*/
337
const unsigned gpu_mappable_megabytes =
338
(devinfo->aperture_bytes * 3 / 4) / (1024 * 1024);
339
340
const long system_memory_pages = sysconf(_SC_PHYS_PAGES);
341
const long system_page_size = sysconf(_SC_PAGE_SIZE);
342
343
if (system_memory_pages <= 0 || system_page_size <= 0)
344
return -1;
345
346
const uint64_t system_memory_bytes =
347
(uint64_t) system_memory_pages * (uint64_t) system_page_size;
348
349
const unsigned system_memory_megabytes =
350
(unsigned) (system_memory_bytes / (1024 * 1024));
351
352
return MIN2(system_memory_megabytes, gpu_mappable_megabytes);
353
}
354
case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
355
case PIPE_CAP_MAX_VARYINGS:
356
return 32;
357
case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
358
/* AMD_pinned_memory assumes the flexibility of using client memory
359
* for any buffer (incl. vertex buffers) which rules out the prospect
360
* of using snooped buffers, as using snooped buffers without
361
* cogniscience is likely to be detrimental to performance and require
362
* extensive checking in the driver for correctness, e.g. to prevent
363
* illegal snoop <-> snoop transfers.
364
*/
365
return devinfo->has_llc;
366
case PIPE_CAP_THROTTLE:
367
return screen->driconf.disable_throttling ? 0 : 1;
368
369
case PIPE_CAP_CONTEXT_PRIORITY_MASK:
370
return PIPE_CONTEXT_PRIORITY_LOW |
371
PIPE_CONTEXT_PRIORITY_MEDIUM |
372
PIPE_CONTEXT_PRIORITY_HIGH;
373
374
case PIPE_CAP_FRONTEND_NOOP:
375
return true;
376
377
// XXX: don't hardcode 00:00:02.0 PCI here
378
case PIPE_CAP_PCI_GROUP:
379
return 0;
380
case PIPE_CAP_PCI_BUS:
381
return 0;
382
case PIPE_CAP_PCI_DEVICE:
383
return 2;
384
case PIPE_CAP_PCI_FUNCTION:
385
return 0;
386
387
case PIPE_CAP_OPENCL_INTEGER_FUNCTIONS:
388
case PIPE_CAP_INTEGER_MULTIPLY_32X16:
389
return true;
390
391
case PIPE_CAP_ALLOW_DYNAMIC_VAO_FASTPATH:
392
/* Internal details of VF cache make this optimization harmful on GFX
393
* version 8 and 9, because generated VERTEX_BUFFER_STATEs are cached
394
* separately.
395
*/
396
return devinfo->ver >= 11;
397
398
default:
399
return u_pipe_screen_get_param_defaults(pscreen, param);
400
}
401
return 0;
402
}
403
404
static float
405
iris_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
406
{
407
switch (param) {
408
case PIPE_CAPF_MAX_LINE_WIDTH:
409
case PIPE_CAPF_MAX_LINE_WIDTH_AA:
410
return 7.375f;
411
412
case PIPE_CAPF_MAX_POINT_WIDTH:
413
case PIPE_CAPF_MAX_POINT_WIDTH_AA:
414
return 255.0f;
415
416
case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
417
return 16.0f;
418
case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
419
return 15.0f;
420
case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
421
case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
422
case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
423
return 0.0f;
424
default:
425
unreachable("unknown param");
426
}
427
}
428
429
static int
430
iris_get_shader_param(struct pipe_screen *pscreen,
431
enum pipe_shader_type p_stage,
432
enum pipe_shader_cap param)
433
{
434
gl_shader_stage stage = stage_from_pipe(p_stage);
435
436
/* this is probably not totally correct.. but it's a start: */
437
switch (param) {
438
case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
439
return stage == MESA_SHADER_FRAGMENT ? 1024 : 16384;
440
case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
441
case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
442
case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
443
return stage == MESA_SHADER_FRAGMENT ? 1024 : 0;
444
445
case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
446
return UINT_MAX;
447
448
case PIPE_SHADER_CAP_MAX_INPUTS:
449
return stage == MESA_SHADER_VERTEX ? 16 : 32;
450
case PIPE_SHADER_CAP_MAX_OUTPUTS:
451
return 32;
452
case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
453
return 16 * 1024 * sizeof(float);
454
case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
455
return 16;
456
case PIPE_SHADER_CAP_MAX_TEMPS:
457
return 256; /* GL_MAX_PROGRAM_TEMPORARIES_ARB */
458
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
459
return 0;
460
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
461
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
462
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
463
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
464
/* Lie about these to avoid st/mesa's GLSL IR lowering of indirects,
465
* which we don't want. Our compiler backend will check brw_compiler's
466
* options and call nir_lower_indirect_derefs appropriately anyway.
467
*/
468
return true;
469
case PIPE_SHADER_CAP_SUBROUTINES:
470
return 0;
471
case PIPE_SHADER_CAP_INTEGERS:
472
return 1;
473
case PIPE_SHADER_CAP_INT64_ATOMICS:
474
case PIPE_SHADER_CAP_FP16:
475
case PIPE_SHADER_CAP_FP16_DERIVATIVES:
476
case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
477
case PIPE_SHADER_CAP_INT16:
478
case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
479
return 0;
480
case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
481
case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
482
case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
483
return IRIS_MAX_TEXTURE_SAMPLERS;
484
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
485
return IRIS_MAX_ABOS + IRIS_MAX_SSBOS;
486
case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
487
case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
488
return 0;
489
case PIPE_SHADER_CAP_PREFERRED_IR:
490
return PIPE_SHADER_IR_NIR;
491
case PIPE_SHADER_CAP_SUPPORTED_IRS: {
492
int irs = 1 << PIPE_SHADER_IR_NIR;
493
if (iris_enable_clover())
494
irs |= 1 << PIPE_SHADER_IR_NIR_SERIALIZED;
495
return irs;
496
}
497
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
498
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
499
return 1;
500
case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
501
case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:
502
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
503
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
504
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
505
case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
506
case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
507
return 0;
508
default:
509
unreachable("unknown shader param");
510
}
511
}
512
513
static int
514
iris_get_compute_param(struct pipe_screen *pscreen,
515
enum pipe_shader_ir ir_type,
516
enum pipe_compute_cap param,
517
void *ret)
518
{
519
struct iris_screen *screen = (struct iris_screen *)pscreen;
520
const struct intel_device_info *devinfo = &screen->devinfo;
521
522
/* Limit max_threads to 64 for the GPGPU_WALKER command. */
523
const unsigned max_threads = MIN2(64, devinfo->max_cs_threads);
524
const uint32_t max_invocations = 32 * max_threads;
525
526
#define RET(x) do { \
527
if (ret) \
528
memcpy(ret, x, sizeof(x)); \
529
return sizeof(x); \
530
} while (0)
531
532
switch (param) {
533
case PIPE_COMPUTE_CAP_ADDRESS_BITS:
534
/* This gets queried on clover device init and is never queried by the
535
* OpenGL state tracker.
536
*/
537
iris_warn_clover();
538
RET((uint32_t []){ 64 });
539
540
case PIPE_COMPUTE_CAP_IR_TARGET:
541
if (ret)
542
strcpy(ret, "gen");
543
return 4;
544
545
case PIPE_COMPUTE_CAP_GRID_DIMENSION:
546
RET((uint64_t []) { 3 });
547
548
case PIPE_COMPUTE_CAP_MAX_GRID_SIZE:
549
RET(((uint64_t []) { 65535, 65535, 65535 }));
550
551
case PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE:
552
/* MaxComputeWorkGroupSize[0..2] */
553
RET(((uint64_t []) {max_invocations, max_invocations, max_invocations}));
554
555
case PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK:
556
/* MaxComputeWorkGroupInvocations */
557
case PIPE_COMPUTE_CAP_MAX_VARIABLE_THREADS_PER_BLOCK:
558
/* MaxComputeVariableGroupInvocations */
559
RET((uint64_t []) { max_invocations });
560
561
case PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE:
562
/* MaxComputeSharedMemorySize */
563
RET((uint64_t []) { 64 * 1024 });
564
565
case PIPE_COMPUTE_CAP_IMAGES_SUPPORTED:
566
RET((uint32_t []) { 0 });
567
568
case PIPE_COMPUTE_CAP_SUBGROUP_SIZE:
569
RET((uint32_t []) { BRW_SUBGROUP_SIZE });
570
571
case PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE:
572
case PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE:
573
RET((uint64_t []) { 1 << 30 }); /* TODO */
574
575
case PIPE_COMPUTE_CAP_MAX_CLOCK_FREQUENCY:
576
RET((uint32_t []) { 400 }); /* TODO */
577
578
case PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS: {
579
unsigned total_num_subslices = 0;
580
for (unsigned i = 0; i < devinfo->num_slices; i++)
581
total_num_subslices += devinfo->num_subslices[i];
582
RET((uint32_t []) { total_num_subslices });
583
}
584
585
case PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE:
586
/* MaxComputeSharedMemorySize */
587
RET((uint64_t []) { 64 * 1024 });
588
589
case PIPE_COMPUTE_CAP_MAX_INPUT_SIZE:
590
/* We could probably allow more; this is the OpenCL minimum */
591
RET((uint64_t []) { 1024 });
592
593
default:
594
unreachable("unknown compute param");
595
}
596
}
597
598
static uint64_t
599
iris_get_timestamp(struct pipe_screen *pscreen)
600
{
601
struct iris_screen *screen = (struct iris_screen *) pscreen;
602
const unsigned TIMESTAMP = 0x2358;
603
uint64_t result;
604
605
iris_reg_read(screen->bufmgr, TIMESTAMP | 1, &result);
606
607
result = intel_device_info_timebase_scale(&screen->devinfo, result);
608
result &= (1ull << TIMESTAMP_BITS) - 1;
609
610
return result;
611
}
612
613
void
614
iris_screen_destroy(struct iris_screen *screen)
615
{
616
iris_destroy_screen_measure(screen);
617
glsl_type_singleton_decref();
618
iris_bo_unreference(screen->workaround_bo);
619
u_transfer_helper_destroy(screen->base.transfer_helper);
620
iris_bufmgr_unref(screen->bufmgr);
621
disk_cache_destroy(screen->disk_cache);
622
close(screen->winsys_fd);
623
ralloc_free(screen);
624
}
625
626
static void
627
iris_screen_unref(struct pipe_screen *pscreen)
628
{
629
iris_pscreen_unref(pscreen);
630
}
631
632
static void
633
iris_query_memory_info(struct pipe_screen *pscreen,
634
struct pipe_memory_info *info)
635
{
636
}
637
638
static const void *
639
iris_get_compiler_options(struct pipe_screen *pscreen,
640
enum pipe_shader_ir ir,
641
enum pipe_shader_type pstage)
642
{
643
struct iris_screen *screen = (struct iris_screen *) pscreen;
644
gl_shader_stage stage = stage_from_pipe(pstage);
645
assert(ir == PIPE_SHADER_IR_NIR);
646
647
return screen->compiler->glsl_compiler_options[stage].NirOptions;
648
}
649
650
static struct disk_cache *
651
iris_get_disk_shader_cache(struct pipe_screen *pscreen)
652
{
653
struct iris_screen *screen = (struct iris_screen *) pscreen;
654
return screen->disk_cache;
655
}
656
657
static int
658
iris_getparam(int fd, int param, int *value)
659
{
660
struct drm_i915_getparam gp = { .param = param, .value = value };
661
662
if (ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp) == -1)
663
return -errno;
664
665
return 0;
666
}
667
668
static int
669
iris_getparam_integer(int fd, int param)
670
{
671
int value = -1;
672
673
if (iris_getparam(fd, param, &value) == 0)
674
return value;
675
676
return -1;
677
}
678
679
static const struct intel_l3_config *
680
iris_get_default_l3_config(const struct intel_device_info *devinfo,
681
bool compute)
682
{
683
bool wants_dc_cache = true;
684
bool has_slm = compute;
685
const struct intel_l3_weights w =
686
intel_get_default_l3_weights(devinfo, wants_dc_cache, has_slm);
687
return intel_get_l3_config(devinfo, w);
688
}
689
690
static void
691
iris_shader_debug_log(void *data, const char *fmt, ...)
692
{
693
struct pipe_debug_callback *dbg = data;
694
unsigned id = 0;
695
va_list args;
696
697
if (!dbg->debug_message)
698
return;
699
700
va_start(args, fmt);
701
dbg->debug_message(dbg->data, &id, PIPE_DEBUG_TYPE_SHADER_INFO, fmt, args);
702
va_end(args);
703
}
704
705
static void
706
iris_shader_perf_log(void *data, const char *fmt, ...)
707
{
708
struct pipe_debug_callback *dbg = data;
709
unsigned id = 0;
710
va_list args;
711
va_start(args, fmt);
712
713
if (INTEL_DEBUG & DEBUG_PERF) {
714
va_list args_copy;
715
va_copy(args_copy, args);
716
vfprintf(stderr, fmt, args_copy);
717
va_end(args_copy);
718
}
719
720
if (dbg->debug_message) {
721
dbg->debug_message(dbg->data, &id, PIPE_DEBUG_TYPE_PERF_INFO, fmt, args);
722
}
723
724
va_end(args);
725
}
726
727
static void
728
iris_detect_kernel_features(struct iris_screen *screen)
729
{
730
/* Kernel 5.2+ */
731
if (intel_gem_supports_syncobj_wait(screen->fd))
732
screen->kernel_features |= KERNEL_HAS_WAIT_FOR_SUBMIT;
733
}
734
735
static bool
736
iris_init_identifier_bo(struct iris_screen *screen)
737
{
738
void *bo_map;
739
740
bo_map = iris_bo_map(NULL, screen->workaround_bo, MAP_READ | MAP_WRITE);
741
if (!bo_map)
742
return false;
743
744
screen->workaround_bo->kflags |= EXEC_OBJECT_CAPTURE;
745
screen->workaround_address = (struct iris_address) {
746
.bo = screen->workaround_bo,
747
.offset = ALIGN(
748
intel_debug_write_identifiers(bo_map, 4096, "Iris") + 8, 8),
749
};
750
751
iris_bo_unmap(screen->workaround_bo);
752
753
return true;
754
}
755
756
struct pipe_screen *
757
iris_screen_create(int fd, const struct pipe_screen_config *config)
758
{
759
/* Here are the i915 features we need for Iris (in chronological order) :
760
* - I915_PARAM_HAS_EXEC_NO_RELOC (3.10)
761
* - I915_PARAM_HAS_EXEC_HANDLE_LUT (3.10)
762
* - I915_PARAM_HAS_EXEC_BATCH_FIRST (4.13)
763
* - I915_PARAM_HAS_EXEC_FENCE_ARRAY (4.14)
764
* - I915_PARAM_HAS_CONTEXT_ISOLATION (4.16)
765
*
766
* Checking the last feature availability will include all previous ones.
767
*/
768
if (iris_getparam_integer(fd, I915_PARAM_HAS_CONTEXT_ISOLATION) <= 0) {
769
debug_error("Kernel is too old for Iris. Consider upgrading to kernel v4.16.\n");
770
return NULL;
771
}
772
773
struct iris_screen *screen = rzalloc(NULL, struct iris_screen);
774
if (!screen)
775
return NULL;
776
777
if (!intel_get_device_info_from_fd(fd, &screen->devinfo))
778
return NULL;
779
screen->pci_id = screen->devinfo.chipset_id;
780
screen->no_hw = screen->devinfo.no_hw;
781
782
p_atomic_set(&screen->refcount, 1);
783
784
if (screen->devinfo.ver < 8 || screen->devinfo.is_cherryview)
785
return NULL;
786
787
bool bo_reuse = false;
788
int bo_reuse_mode = driQueryOptioni(config->options, "bo_reuse");
789
switch (bo_reuse_mode) {
790
case DRI_CONF_BO_REUSE_DISABLED:
791
break;
792
case DRI_CONF_BO_REUSE_ALL:
793
bo_reuse = true;
794
break;
795
}
796
797
screen->bufmgr = iris_bufmgr_get_for_fd(&screen->devinfo, fd, bo_reuse);
798
if (!screen->bufmgr)
799
return NULL;
800
801
screen->fd = iris_bufmgr_get_fd(screen->bufmgr);
802
screen->winsys_fd = fd;
803
804
if (getenv("INTEL_NO_HW") != NULL)
805
screen->no_hw = true;
806
807
screen->workaround_bo =
808
iris_bo_alloc(screen->bufmgr, "workaround", 4096, 1,
809
IRIS_MEMZONE_OTHER, 0);
810
if (!screen->workaround_bo)
811
return NULL;
812
813
if (!iris_init_identifier_bo(screen))
814
return NULL;
815
816
brw_process_intel_debug_variable();
817
818
screen->driconf.dual_color_blend_by_location =
819
driQueryOptionb(config->options, "dual_color_blend_by_location");
820
screen->driconf.disable_throttling =
821
driQueryOptionb(config->options, "disable_throttling");
822
screen->driconf.always_flush_cache =
823
driQueryOptionb(config->options, "always_flush_cache");
824
825
screen->precompile = env_var_as_boolean("shader_precompile", true);
826
827
isl_device_init(&screen->isl_dev, &screen->devinfo, false);
828
829
screen->compiler = brw_compiler_create(screen, &screen->devinfo);
830
screen->compiler->shader_debug_log = iris_shader_debug_log;
831
screen->compiler->shader_perf_log = iris_shader_perf_log;
832
screen->compiler->supports_pull_constants = false;
833
screen->compiler->supports_shader_constants = true;
834
screen->compiler->compact_params = false;
835
screen->compiler->indirect_ubos_use_sampler = screen->devinfo.ver < 12;
836
837
screen->l3_config_3d = iris_get_default_l3_config(&screen->devinfo, false);
838
screen->l3_config_cs = iris_get_default_l3_config(&screen->devinfo, true);
839
840
iris_disk_cache_init(screen);
841
842
slab_create_parent(&screen->transfer_pool,
843
sizeof(struct iris_transfer), 64);
844
845
screen->subslice_total = intel_device_info_subslice_total(&screen->devinfo);
846
assert(screen->subslice_total >= 1);
847
848
iris_detect_kernel_features(screen);
849
850
struct pipe_screen *pscreen = &screen->base;
851
852
iris_init_screen_fence_functions(pscreen);
853
iris_init_screen_resource_functions(pscreen);
854
iris_init_screen_measure(screen);
855
856
pscreen->destroy = iris_screen_unref;
857
pscreen->get_name = iris_get_name;
858
pscreen->get_vendor = iris_get_vendor;
859
pscreen->get_device_vendor = iris_get_device_vendor;
860
pscreen->get_param = iris_get_param;
861
pscreen->get_shader_param = iris_get_shader_param;
862
pscreen->get_compute_param = iris_get_compute_param;
863
pscreen->get_paramf = iris_get_paramf;
864
pscreen->get_compiler_options = iris_get_compiler_options;
865
pscreen->get_device_uuid = iris_get_device_uuid;
866
pscreen->get_driver_uuid = iris_get_driver_uuid;
867
pscreen->get_disk_shader_cache = iris_get_disk_shader_cache;
868
pscreen->is_format_supported = iris_is_format_supported;
869
pscreen->context_create = iris_create_context;
870
pscreen->flush_frontbuffer = iris_flush_frontbuffer;
871
pscreen->get_timestamp = iris_get_timestamp;
872
pscreen->query_memory_info = iris_query_memory_info;
873
pscreen->get_driver_query_group_info = iris_get_monitor_group_info;
874
pscreen->get_driver_query_info = iris_get_monitor_info;
875
876
genX_call(&screen->devinfo, init_screen_state, screen);
877
878
glsl_type_singleton_init_or_ref();
879
880
return pscreen;
881
}
882
883