Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/drivers/i915/i915_screen.c
4570 views
1
/**************************************************************************
2
*
3
* Copyright 2008 VMware, Inc.
4
* All Rights Reserved.
5
*
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:
13
*
14
* The above copyright notice and this permission notice (including the
15
* next paragraph) shall be included in all copies or substantial portions
16
* of the Software.
17
*
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.
25
*
26
**************************************************************************/
27
28
#include "compiler/nir/nir.h"
29
#include "draw/draw_context.h"
30
#include "util/format/u_format.h"
31
#include "util/format/u_format_s3tc.h"
32
#include "util/os_misc.h"
33
#include "util/u_inlines.h"
34
#include "util/u_memory.h"
35
#include "util/u_screen.h"
36
#include "util/u_string.h"
37
38
#include "i915_context.h"
39
#include "i915_debug.h"
40
#include "i915_public.h"
41
#include "i915_reg.h"
42
#include "i915_resource.h"
43
#include "i915_screen.h"
44
#include "i915_winsys.h"
45
46
/*
47
* Probe functions
48
*/
49
50
static const char *
51
i915_get_vendor(struct pipe_screen *screen)
52
{
53
return "Mesa Project";
54
}
55
56
static const char *
57
i915_get_device_vendor(struct pipe_screen *screen)
58
{
59
return "Intel";
60
}
61
62
static const char *
63
i915_get_name(struct pipe_screen *screen)
64
{
65
static char buffer[128];
66
const char *chipset;
67
68
switch (i915_screen(screen)->iws->pci_id) {
69
case PCI_CHIP_I915_G:
70
chipset = "915G";
71
break;
72
case PCI_CHIP_I915_GM:
73
chipset = "915GM";
74
break;
75
case PCI_CHIP_I945_G:
76
chipset = "945G";
77
break;
78
case PCI_CHIP_I945_GM:
79
chipset = "945GM";
80
break;
81
case PCI_CHIP_I945_GME:
82
chipset = "945GME";
83
break;
84
case PCI_CHIP_G33_G:
85
chipset = "G33";
86
break;
87
case PCI_CHIP_Q35_G:
88
chipset = "Q35";
89
break;
90
case PCI_CHIP_Q33_G:
91
chipset = "Q33";
92
break;
93
case PCI_CHIP_PINEVIEW_G:
94
chipset = "Pineview G";
95
break;
96
case PCI_CHIP_PINEVIEW_M:
97
chipset = "Pineview M";
98
break;
99
default:
100
chipset = "unknown";
101
break;
102
}
103
104
snprintf(buffer, sizeof(buffer), "i915 (chipset: %s)", chipset);
105
return buffer;
106
}
107
108
static const nir_shader_compiler_options i915_compiler_options = {
109
.fuse_ffma32 = true,
110
.lower_bitops = true, /* required for !CAP_INTEGERS nir_to_tgsi */
111
.lower_extract_byte = true,
112
.lower_extract_word = true,
113
.lower_fdiv = true,
114
.lower_fdph = true,
115
.lower_flrp32 = true,
116
.lower_fmod = true,
117
.lower_rotate = true,
118
.lower_uniforms_to_ubo = true,
119
.lower_vector_cmp = true,
120
.use_interpolated_input_intrinsics = true,
121
};
122
123
static const struct nir_shader_compiler_options gallivm_nir_options = {
124
.lower_bitops = true, /* required for !CAP_INTEGERS nir_to_tgsi */
125
.lower_scmp = true,
126
.lower_flrp32 = true,
127
.lower_flrp64 = true,
128
.lower_fsat = true,
129
.lower_bitfield_insert_to_shifts = true,
130
.lower_bitfield_extract_to_shifts = true,
131
.lower_fdph = true,
132
.lower_ffma16 = true,
133
.lower_ffma32 = true,
134
.lower_ffma64 = true,
135
.lower_fmod = true,
136
.lower_hadd = true,
137
.lower_add_sat = true,
138
.lower_ldexp = true,
139
.lower_pack_snorm_2x16 = true,
140
.lower_pack_snorm_4x8 = true,
141
.lower_pack_unorm_2x16 = true,
142
.lower_pack_unorm_4x8 = true,
143
.lower_pack_half_2x16 = true,
144
.lower_pack_split = true,
145
.lower_unpack_snorm_2x16 = true,
146
.lower_unpack_snorm_4x8 = true,
147
.lower_unpack_unorm_2x16 = true,
148
.lower_unpack_unorm_4x8 = true,
149
.lower_unpack_half_2x16 = true,
150
.lower_extract_byte = true,
151
.lower_extract_word = true,
152
.lower_rotate = true,
153
.lower_uadd_carry = true,
154
.lower_usub_borrow = true,
155
.lower_mul_2x32_64 = true,
156
.lower_ifind_msb = true,
157
.max_unroll_iterations = 32,
158
.use_interpolated_input_intrinsics = true,
159
.lower_cs_local_index_from_id = true,
160
.lower_uniforms_to_ubo = true,
161
.lower_vector_cmp = true,
162
.lower_device_index_to_zero = true,
163
/* .support_16bit_alu = true, */
164
};
165
166
static const void *
167
i915_get_compiler_options(struct pipe_screen *pscreen, enum pipe_shader_ir ir,
168
enum pipe_shader_type shader)
169
{
170
assert(ir == PIPE_SHADER_IR_NIR);
171
if (shader == PIPE_SHADER_FRAGMENT)
172
return &i915_compiler_options;
173
else
174
return &gallivm_nir_options;
175
}
176
177
static int
178
i915_get_shader_param(struct pipe_screen *screen, enum pipe_shader_type shader,
179
enum pipe_shader_cap cap)
180
{
181
switch (cap) {
182
case PIPE_SHADER_CAP_PREFERRED_IR:
183
return PIPE_SHADER_IR_NIR;
184
case PIPE_SHADER_CAP_SUPPORTED_IRS:
185
return (1 << PIPE_SHADER_IR_NIR) | (1 << PIPE_SHADER_IR_TGSI);
186
187
case PIPE_SHADER_CAP_INTEGERS:
188
/* mesa/st requires that this cap is the same across stages, and the FS
189
* can't do ints.
190
*/
191
return 0;
192
193
case PIPE_SHADER_CAP_INT16:
194
return 0;
195
196
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
197
/* While draw could normally handle this for the VS, the NIR lowering
198
* to regs can't handle our non-native-integers, so we have to lower to
199
* if ladders.
200
*/
201
return 0;
202
203
default:
204
break;
205
}
206
207
switch (shader) {
208
case PIPE_SHADER_VERTEX:
209
switch (cap) {
210
case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
211
case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
212
return 0;
213
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
214
case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
215
return 0;
216
default:
217
return draw_get_shader_param(shader, cap);
218
}
219
case PIPE_SHADER_FRAGMENT:
220
/* XXX: some of these are just shader model 2.0 values, fix this! */
221
switch (cap) {
222
case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
223
return I915_MAX_ALU_INSN + I915_MAX_TEX_INSN;
224
case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
225
return I915_MAX_ALU_INSN;
226
case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
227
return I915_MAX_TEX_INSN;
228
case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
229
return 8;
230
case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
231
return 0;
232
case PIPE_SHADER_CAP_MAX_INPUTS:
233
return 10;
234
case PIPE_SHADER_CAP_MAX_OUTPUTS:
235
return 1;
236
case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
237
return 32 * sizeof(float[4]);
238
case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
239
return 1;
240
case PIPE_SHADER_CAP_MAX_TEMPS:
241
return 12; /* XXX: 12 -> 32 ? */
242
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
243
case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
244
return 0;
245
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
246
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
247
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
248
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
249
case PIPE_SHADER_CAP_SUBROUTINES:
250
return 0;
251
case PIPE_SHADER_CAP_INT64_ATOMICS:
252
case PIPE_SHADER_CAP_FP16:
253
case PIPE_SHADER_CAP_FP16_DERIVATIVES:
254
case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
255
case PIPE_SHADER_CAP_INT16:
256
case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
257
return 0;
258
case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
259
case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
260
return I915_TEX_UNITS;
261
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
262
case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
263
case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
264
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
265
case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
266
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
267
case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
268
case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
269
case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:
270
case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
271
case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
272
return 0;
273
274
case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
275
return 32;
276
default:
277
debug_printf("%s: Unknown cap %u.\n", __FUNCTION__, cap);
278
return 0;
279
}
280
break;
281
default:
282
return 0;
283
}
284
}
285
286
static int
287
i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
288
{
289
struct i915_screen *is = i915_screen(screen);
290
291
switch (cap) {
292
/* Supported features (boolean caps). */
293
case PIPE_CAP_ANISOTROPIC_FILTER:
294
case PIPE_CAP_NPOT_TEXTURES:
295
case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
296
case PIPE_CAP_POINT_SPRITE:
297
case PIPE_CAP_PRIMITIVE_RESTART: /* draw module */
298
case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX:
299
case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
300
case PIPE_CAP_BLEND_EQUATION_SEPARATE:
301
case PIPE_CAP_TGSI_INSTANCEID:
302
case PIPE_CAP_VERTEX_COLOR_CLAMPED:
303
case PIPE_CAP_USER_VERTEX_BUFFERS:
304
case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
305
return 1;
306
307
case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
308
case PIPE_CAP_PCI_GROUP:
309
case PIPE_CAP_PCI_BUS:
310
case PIPE_CAP_PCI_DEVICE:
311
case PIPE_CAP_PCI_FUNCTION:
312
return 0;
313
314
case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
315
case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
316
return 0;
317
318
case PIPE_CAP_SHAREABLE_SHADERS:
319
/* Can't expose shareable shaders because the draw shaders reference the
320
* draw module's state, which is per-context.
321
*/
322
return 0;
323
324
case PIPE_CAP_MAX_GS_INVOCATIONS:
325
return 32;
326
327
case PIPE_CAP_MAX_SHADER_BUFFER_SIZE:
328
return 1 << 27;
329
330
case PIPE_CAP_MAX_VIEWPORTS:
331
return 1;
332
333
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
334
return 64;
335
336
case PIPE_CAP_GLSL_FEATURE_LEVEL:
337
case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY:
338
return 120;
339
340
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
341
return 16;
342
343
/* Features we can lie about (boolean caps). */
344
case PIPE_CAP_OCCLUSION_QUERY:
345
return is->debug.lie ? 1 : 0;
346
347
/* Texturing. */
348
case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
349
return 1 << (I915_MAX_TEXTURE_2D_LEVELS - 1);
350
case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
351
return I915_MAX_TEXTURE_3D_LEVELS;
352
case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
353
return 1 << (I915_MAX_TEXTURE_2D_LEVELS - 1);
354
355
/* Render targets. */
356
case PIPE_CAP_MAX_RENDER_TARGETS:
357
return 1;
358
359
case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
360
return 2048;
361
362
/* Fragment coordinate conventions. */
363
case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
364
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
365
return 1;
366
case PIPE_CAP_ENDIANNESS:
367
return PIPE_ENDIAN_LITTLE;
368
case PIPE_CAP_MAX_VARYINGS:
369
return 10;
370
371
case PIPE_CAP_NIR_IMAGES_AS_DEREF:
372
return 0;
373
374
case PIPE_CAP_VENDOR_ID:
375
return 0x8086;
376
case PIPE_CAP_DEVICE_ID:
377
return is->iws->pci_id;
378
case PIPE_CAP_ACCELERATED:
379
return 1;
380
case PIPE_CAP_VIDEO_MEMORY: {
381
/* Once a batch uses more than 75% of the maximum mappable size, we
382
* assume that there's some fragmentation, and we start doing extra
383
* flushing, etc. That's the big cliff apps will care about.
384
*/
385
const int gpu_mappable_megabytes =
386
is->iws->aperture_size(is->iws) * 3 / 4;
387
uint64_t system_memory;
388
389
if (!os_get_total_physical_memory(&system_memory))
390
return 0;
391
392
return MIN2(gpu_mappable_megabytes, (int)(system_memory >> 20));
393
}
394
case PIPE_CAP_UMA:
395
return 1;
396
397
default:
398
return u_pipe_screen_get_param_defaults(screen, cap);
399
}
400
}
401
402
static float
403
i915_get_paramf(struct pipe_screen *screen, enum pipe_capf cap)
404
{
405
switch (cap) {
406
case PIPE_CAPF_MAX_LINE_WIDTH:
407
FALLTHROUGH;
408
case PIPE_CAPF_MAX_LINE_WIDTH_AA:
409
return 7.5;
410
411
case PIPE_CAPF_MAX_POINT_WIDTH:
412
FALLTHROUGH;
413
case PIPE_CAPF_MAX_POINT_WIDTH_AA:
414
return 255.0;
415
416
case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
417
return 4.0;
418
419
case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
420
return 16.0;
421
422
case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
423
FALLTHROUGH;
424
case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
425
FALLTHROUGH;
426
case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
427
return 0.0f;
428
429
default:
430
debug_printf("%s: Unknown cap %u.\n", __FUNCTION__, cap);
431
return 0;
432
}
433
}
434
435
bool
436
i915_is_format_supported(struct pipe_screen *screen, enum pipe_format format,
437
enum pipe_texture_target target, unsigned sample_count,
438
unsigned storage_sample_count, unsigned tex_usage)
439
{
440
static const enum pipe_format tex_supported[] = {
441
PIPE_FORMAT_B8G8R8A8_UNORM, PIPE_FORMAT_B8G8R8A8_SRGB,
442
PIPE_FORMAT_B8G8R8X8_UNORM, PIPE_FORMAT_R8G8B8A8_UNORM,
443
PIPE_FORMAT_R8G8B8X8_UNORM, PIPE_FORMAT_B4G4R4A4_UNORM,
444
PIPE_FORMAT_B5G6R5_UNORM, PIPE_FORMAT_B5G5R5A1_UNORM,
445
PIPE_FORMAT_B10G10R10A2_UNORM, PIPE_FORMAT_L8_UNORM, PIPE_FORMAT_A8_UNORM,
446
PIPE_FORMAT_I8_UNORM, PIPE_FORMAT_L8A8_UNORM, PIPE_FORMAT_UYVY,
447
PIPE_FORMAT_YUYV,
448
/* XXX why not?
449
PIPE_FORMAT_Z16_UNORM, */
450
PIPE_FORMAT_DXT1_RGB, PIPE_FORMAT_DXT1_RGBA, PIPE_FORMAT_DXT3_RGBA,
451
PIPE_FORMAT_DXT5_RGBA, PIPE_FORMAT_Z24X8_UNORM,
452
PIPE_FORMAT_Z24_UNORM_S8_UINT, PIPE_FORMAT_NONE /* list terminator */
453
};
454
static const enum pipe_format render_supported[] = {
455
PIPE_FORMAT_B8G8R8A8_UNORM, PIPE_FORMAT_B8G8R8X8_UNORM,
456
PIPE_FORMAT_R8G8B8A8_UNORM, PIPE_FORMAT_R8G8B8X8_UNORM,
457
PIPE_FORMAT_B5G6R5_UNORM, PIPE_FORMAT_B5G5R5A1_UNORM,
458
PIPE_FORMAT_B4G4R4A4_UNORM, PIPE_FORMAT_B10G10R10A2_UNORM,
459
PIPE_FORMAT_L8_UNORM, PIPE_FORMAT_A8_UNORM,
460
PIPE_FORMAT_I8_UNORM, PIPE_FORMAT_NONE /* list terminator */
461
};
462
static const enum pipe_format depth_supported[] = {
463
/* XXX why not?
464
PIPE_FORMAT_Z16_UNORM, */
465
PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_Z24_UNORM_S8_UINT,
466
PIPE_FORMAT_NONE /* list terminator */
467
};
468
const enum pipe_format *list;
469
uint32_t i;
470
471
if (sample_count > 1)
472
return false;
473
474
if (MAX2(1, sample_count) != MAX2(1, storage_sample_count))
475
return false;
476
477
if (tex_usage & PIPE_BIND_DEPTH_STENCIL)
478
list = depth_supported;
479
else if (tex_usage & PIPE_BIND_RENDER_TARGET)
480
list = render_supported;
481
else if (tex_usage & PIPE_BIND_SAMPLER_VIEW)
482
list = tex_supported;
483
else
484
return true; /* PIPE_BIND_{VERTEX,INDEX}_BUFFER */
485
486
for (i = 0; list[i] != PIPE_FORMAT_NONE; i++) {
487
if (list[i] == format)
488
return true;
489
}
490
491
return false;
492
}
493
494
/*
495
* Fence functions
496
*/
497
498
static void
499
i915_fence_reference(struct pipe_screen *screen, struct pipe_fence_handle **ptr,
500
struct pipe_fence_handle *fence)
501
{
502
struct i915_screen *is = i915_screen(screen);
503
504
is->iws->fence_reference(is->iws, ptr, fence);
505
}
506
507
static bool
508
i915_fence_finish(struct pipe_screen *screen, struct pipe_context *ctx,
509
struct pipe_fence_handle *fence, uint64_t timeout)
510
{
511
struct i915_screen *is = i915_screen(screen);
512
513
if (!timeout)
514
return is->iws->fence_signalled(is->iws, fence) == 1;
515
516
return is->iws->fence_finish(is->iws, fence) == 1;
517
}
518
519
/*
520
* Generic functions
521
*/
522
523
static void
524
i915_flush_frontbuffer(struct pipe_screen *screen, struct pipe_context *pipe,
525
struct pipe_resource *resource, unsigned level,
526
unsigned layer, void *winsys_drawable_handle,
527
struct pipe_box *sub_box)
528
{
529
/* XXX: Dummy right now. */
530
(void)screen;
531
(void)pipe;
532
(void)resource;
533
(void)level;
534
(void)layer;
535
(void)winsys_drawable_handle;
536
(void)sub_box;
537
}
538
539
static void
540
i915_destroy_screen(struct pipe_screen *screen)
541
{
542
struct i915_screen *is = i915_screen(screen);
543
544
if (is->iws)
545
is->iws->destroy(is->iws);
546
547
FREE(is);
548
}
549
550
/**
551
* Create a new i915_screen object
552
*/
553
struct pipe_screen *
554
i915_screen_create(struct i915_winsys *iws)
555
{
556
struct i915_screen *is = CALLOC_STRUCT(i915_screen);
557
558
if (!is)
559
return NULL;
560
561
switch (iws->pci_id) {
562
case PCI_CHIP_I915_G:
563
case PCI_CHIP_I915_GM:
564
is->is_i945 = false;
565
break;
566
567
case PCI_CHIP_I945_G:
568
case PCI_CHIP_I945_GM:
569
case PCI_CHIP_I945_GME:
570
case PCI_CHIP_G33_G:
571
case PCI_CHIP_Q33_G:
572
case PCI_CHIP_Q35_G:
573
case PCI_CHIP_PINEVIEW_G:
574
case PCI_CHIP_PINEVIEW_M:
575
is->is_i945 = true;
576
break;
577
578
default:
579
debug_printf("%s: unknown pci id 0x%x, cannot create screen\n",
580
__FUNCTION__, iws->pci_id);
581
FREE(is);
582
return NULL;
583
}
584
585
is->iws = iws;
586
587
is->base.destroy = i915_destroy_screen;
588
is->base.flush_frontbuffer = i915_flush_frontbuffer;
589
590
is->base.get_name = i915_get_name;
591
is->base.get_vendor = i915_get_vendor;
592
is->base.get_device_vendor = i915_get_device_vendor;
593
is->base.get_param = i915_get_param;
594
is->base.get_shader_param = i915_get_shader_param;
595
is->base.get_paramf = i915_get_paramf;
596
is->base.get_compiler_options = i915_get_compiler_options;
597
is->base.is_format_supported = i915_is_format_supported;
598
599
is->base.context_create = i915_create_context;
600
601
is->base.fence_reference = i915_fence_reference;
602
is->base.fence_finish = i915_fence_finish;
603
604
i915_init_screen_resource_functions(is);
605
606
i915_debug_init(is);
607
608
return &is->base;
609
}
610
611