Path: blob/21.2-virgl/src/gallium/drivers/iris/iris_screen.c
4565 views
/*1* Copyright © 2017 Intel Corporation2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice shall be included11* in all copies or substantial portions of the Software.12*13* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS14* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,15* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL16* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER17* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING18* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER19* DEALINGS IN THE SOFTWARE.20*/2122/**23* @file iris_screen.c24*25* Screen related driver hooks and capability lists.26*27* A program may use multiple rendering contexts (iris_context), but28* they all share a common screen (iris_screen). Global driver state29* can be stored in the screen; it may be accessed by multiple threads.30*/3132#include <stdio.h>33#include <errno.h>34#include <sys/ioctl.h>35#include "pipe/p_defines.h"36#include "pipe/p_state.h"37#include "pipe/p_context.h"38#include "pipe/p_screen.h"39#include "util/debug.h"40#include "util/u_inlines.h"41#include "util/format/u_format.h"42#include "util/u_transfer_helper.h"43#include "util/u_upload_mgr.h"44#include "util/ralloc.h"45#include "util/xmlconfig.h"46#include "drm-uapi/i915_drm.h"47#include "iris_context.h"48#include "iris_defines.h"49#include "iris_fence.h"50#include "iris_pipe.h"51#include "iris_resource.h"52#include "iris_screen.h"53#include "compiler/glsl_types.h"54#include "intel/compiler/brw_compiler.h"55#include "intel/common/intel_gem.h"56#include "intel/common/intel_l3_config.h"57#include "intel/common/intel_uuid.h"58#include "iris_monitor.h"5960#define genX_call(devinfo, func, ...) \61switch ((devinfo)->verx10) { \62case 125: \63gfx125_##func(__VA_ARGS__); \64break; \65case 120: \66gfx12_##func(__VA_ARGS__); \67break; \68case 110: \69gfx11_##func(__VA_ARGS__); \70break; \71case 90: \72gfx9_##func(__VA_ARGS__); \73break; \74case 80: \75gfx8_##func(__VA_ARGS__); \76break; \77default: \78unreachable("Unknown hardware generation"); \79}8081static void82iris_flush_frontbuffer(struct pipe_screen *_screen,83struct pipe_context *_pipe,84struct pipe_resource *resource,85unsigned level, unsigned layer,86void *context_private, struct pipe_box *box)87{88}8990static const char *91iris_get_vendor(struct pipe_screen *pscreen)92{93return "Intel";94}9596static const char *97iris_get_device_vendor(struct pipe_screen *pscreen)98{99return "Intel";100}101102static void103iris_get_device_uuid(struct pipe_screen *pscreen, char *uuid)104{105struct iris_screen *screen = (struct iris_screen *)pscreen;106const struct isl_device *isldev = &screen->isl_dev;107108intel_uuid_compute_device_id((uint8_t *)uuid, isldev, PIPE_UUID_SIZE);109}110111static void112iris_get_driver_uuid(struct pipe_screen *pscreen, char *uuid)113{114struct iris_screen *screen = (struct iris_screen *)pscreen;115const struct intel_device_info *devinfo = &screen->devinfo;116117intel_uuid_compute_driver_id((uint8_t *)uuid, devinfo, PIPE_UUID_SIZE);118}119120static bool121iris_enable_clover()122{123static int enable = -1;124if (enable < 0)125enable = env_var_as_boolean("IRIS_ENABLE_CLOVER", false);126return enable;127}128129static void130iris_warn_clover()131{132static bool warned = false;133if (warned)134return;135136warned = true;137fprintf(stderr, "WARNING: OpenCL support via iris+clover is incomplete.\n"138"For a complete and conformant OpenCL implementation, use\n"139"https://github.com/intel/compute-runtime instead\n");140}141142static const char *143iris_get_name(struct pipe_screen *pscreen)144{145struct iris_screen *screen = (struct iris_screen *)pscreen;146static char buf[128];147const char *name = intel_get_device_name(screen->pci_id);148149if (!name)150name = "Intel Unknown";151152snprintf(buf, sizeof(buf), "Mesa %s", name);153return buf;154}155156static int157iris_get_param(struct pipe_screen *pscreen, enum pipe_cap param)158{159struct iris_screen *screen = (struct iris_screen *)pscreen;160const struct intel_device_info *devinfo = &screen->devinfo;161162switch (param) {163case PIPE_CAP_NPOT_TEXTURES:164case PIPE_CAP_ANISOTROPIC_FILTER:165case PIPE_CAP_POINT_SPRITE:166case PIPE_CAP_OCCLUSION_QUERY:167case PIPE_CAP_QUERY_TIME_ELAPSED:168case PIPE_CAP_TEXTURE_SWIZZLE:169case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE:170case PIPE_CAP_BLEND_EQUATION_SEPARATE:171case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD:172case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES:173case PIPE_CAP_VERTEX_SHADER_SATURATE:174case PIPE_CAP_PRIMITIVE_RESTART:175case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX:176case PIPE_CAP_INDEP_BLEND_ENABLE:177case PIPE_CAP_INDEP_BLEND_FUNC:178case PIPE_CAP_RGB_OVERRIDE_DST_ALPHA_BLEND:179case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:180case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:181case PIPE_CAP_DEPTH_CLIP_DISABLE:182case PIPE_CAP_TGSI_INSTANCEID:183case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:184case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:185case PIPE_CAP_SEAMLESS_CUBE_MAP:186case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:187case PIPE_CAP_CONDITIONAL_RENDER:188case PIPE_CAP_TEXTURE_BARRIER:189case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:190case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:191case PIPE_CAP_COMPUTE:192case PIPE_CAP_START_INSTANCE:193case PIPE_CAP_QUERY_TIMESTAMP:194case PIPE_CAP_TEXTURE_MULTISAMPLE:195case PIPE_CAP_CUBE_MAP_ARRAY:196case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:197case PIPE_CAP_QUERY_PIPELINE_STATISTICS_SINGLE:198case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:199case PIPE_CAP_TEXTURE_QUERY_LOD:200case PIPE_CAP_SAMPLE_SHADING:201case PIPE_CAP_FORCE_PERSAMPLE_INTERP:202case PIPE_CAP_DRAW_INDIRECT:203case PIPE_CAP_MULTI_DRAW_INDIRECT:204case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:205case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:206case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:207case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:208case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:209case PIPE_CAP_TGSI_PACK_HALF_FLOAT:210case PIPE_CAP_ACCELERATED:211case PIPE_CAP_UMA:212case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:213case PIPE_CAP_CLIP_HALFZ:214case PIPE_CAP_TGSI_TEXCOORD:215case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:216case PIPE_CAP_DOUBLES:217case PIPE_CAP_INT64:218case PIPE_CAP_INT64_DIVMOD:219case PIPE_CAP_SAMPLER_VIEW_TARGET:220case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:221case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:222case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:223case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:224case PIPE_CAP_CULL_DISTANCE:225case PIPE_CAP_PACKED_UNIFORMS:226case PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET:227case PIPE_CAP_TEXTURE_FLOAT_LINEAR:228case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:229case PIPE_CAP_POLYGON_OFFSET_CLAMP:230case PIPE_CAP_QUERY_SO_OVERFLOW:231case PIPE_CAP_QUERY_BUFFER_OBJECT:232case PIPE_CAP_TGSI_TEX_TXF_LZ:233case PIPE_CAP_TGSI_TXQS:234case PIPE_CAP_TGSI_CLOCK:235case PIPE_CAP_TGSI_BALLOT:236case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:237case PIPE_CAP_CLEAR_TEXTURE:238case PIPE_CAP_CLEAR_SCISSORED:239case PIPE_CAP_TGSI_VOTE:240case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:241case PIPE_CAP_TEXTURE_GATHER_SM5:242case PIPE_CAP_TGSI_ARRAY_COMPONENTS:243case PIPE_CAP_GLSL_TESS_LEVELS_AS_INPUTS:244case PIPE_CAP_LOAD_CONSTBUF:245case PIPE_CAP_NIR_COMPACT_ARRAYS:246case PIPE_CAP_DRAW_PARAMETERS:247case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:248case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:249case PIPE_CAP_COMPUTE_SHADER_DERIVATIVES:250case PIPE_CAP_INVALIDATE_BUFFER:251case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:252case PIPE_CAP_CS_DERIVED_SYSTEM_VALUES_SUPPORTED:253case PIPE_CAP_TEXTURE_SHADOW_LOD:254case PIPE_CAP_SHADER_SAMPLES_IDENTICAL:255case PIPE_CAP_GL_SPIRV:256case PIPE_CAP_GL_SPIRV_VARIABLE_POINTERS:257case PIPE_CAP_DEMOTE_TO_HELPER_INVOCATION:258case PIPE_CAP_NATIVE_FENCE_FD:259case PIPE_CAP_MEMOBJ:260case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:261case PIPE_CAP_FENCE_SIGNAL:262return true;263case PIPE_CAP_FBFETCH:264return BRW_MAX_DRAW_BUFFERS;265case PIPE_CAP_FBFETCH_COHERENT:266case PIPE_CAP_CONSERVATIVE_RASTER_INNER_COVERAGE:267case PIPE_CAP_POST_DEPTH_COVERAGE:268case PIPE_CAP_SHADER_STENCIL_EXPORT:269case PIPE_CAP_DEPTH_CLIP_DISABLE_SEPARATE:270case PIPE_CAP_FRAGMENT_SHADER_INTERLOCK:271case PIPE_CAP_ATOMIC_FLOAT_MINMAX:272return devinfo->ver >= 9;273case PIPE_CAP_DEPTH_BOUNDS_TEST:274return devinfo->ver >= 12;275case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:276return 1;277case PIPE_CAP_MAX_RENDER_TARGETS:278return BRW_MAX_DRAW_BUFFERS;279case PIPE_CAP_MAX_TEXTURE_2D_SIZE:280return 16384;281case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:282return IRIS_MAX_MIPLEVELS; /* 16384x16384 */283case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:284return 12; /* 2048x2048 */285case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:286return 4;287case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:288return 2048;289case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:290return BRW_MAX_SOL_BINDINGS / IRIS_MAX_SOL_BUFFERS;291case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:292return BRW_MAX_SOL_BINDINGS;293case PIPE_CAP_GLSL_FEATURE_LEVEL:294case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY:295return 460;296case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:297/* 3DSTATE_CONSTANT_XS requires the start of UBOs to be 32B aligned */298return 32;299case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:300return IRIS_MAP_BUFFER_ALIGNMENT;301case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:302return 4;303case PIPE_CAP_MAX_SHADER_BUFFER_SIZE:304return 1 << 27;305case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:306return 16; // XXX: u_screen says 256 is the minimum value...307case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:308return true;309case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:310return IRIS_MAX_TEXTURE_BUFFER_SIZE;311case PIPE_CAP_MAX_VIEWPORTS:312return 16;313case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:314return 256;315case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:316return 1024;317case PIPE_CAP_MAX_GS_INVOCATIONS:318return 32;319case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:320return 4;321case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:322return -32;323case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:324return 31;325case PIPE_CAP_MAX_VERTEX_STREAMS:326return 4;327case PIPE_CAP_VENDOR_ID:328return 0x8086;329case PIPE_CAP_DEVICE_ID:330return screen->pci_id;331case PIPE_CAP_VIDEO_MEMORY: {332/* Once a batch uses more than 75% of the maximum mappable size, we333* assume that there's some fragmentation, and we start doing extra334* flushing, etc. That's the big cliff apps will care about.335*/336const unsigned gpu_mappable_megabytes =337(devinfo->aperture_bytes * 3 / 4) / (1024 * 1024);338339const long system_memory_pages = sysconf(_SC_PHYS_PAGES);340const long system_page_size = sysconf(_SC_PAGE_SIZE);341342if (system_memory_pages <= 0 || system_page_size <= 0)343return -1;344345const uint64_t system_memory_bytes =346(uint64_t) system_memory_pages * (uint64_t) system_page_size;347348const unsigned system_memory_megabytes =349(unsigned) (system_memory_bytes / (1024 * 1024));350351return MIN2(system_memory_megabytes, gpu_mappable_megabytes);352}353case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:354case PIPE_CAP_MAX_VARYINGS:355return 32;356case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:357/* AMD_pinned_memory assumes the flexibility of using client memory358* for any buffer (incl. vertex buffers) which rules out the prospect359* of using snooped buffers, as using snooped buffers without360* cogniscience is likely to be detrimental to performance and require361* extensive checking in the driver for correctness, e.g. to prevent362* illegal snoop <-> snoop transfers.363*/364return devinfo->has_llc;365case PIPE_CAP_THROTTLE:366return screen->driconf.disable_throttling ? 0 : 1;367368case PIPE_CAP_CONTEXT_PRIORITY_MASK:369return PIPE_CONTEXT_PRIORITY_LOW |370PIPE_CONTEXT_PRIORITY_MEDIUM |371PIPE_CONTEXT_PRIORITY_HIGH;372373case PIPE_CAP_FRONTEND_NOOP:374return true;375376// XXX: don't hardcode 00:00:02.0 PCI here377case PIPE_CAP_PCI_GROUP:378return 0;379case PIPE_CAP_PCI_BUS:380return 0;381case PIPE_CAP_PCI_DEVICE:382return 2;383case PIPE_CAP_PCI_FUNCTION:384return 0;385386case PIPE_CAP_OPENCL_INTEGER_FUNCTIONS:387case PIPE_CAP_INTEGER_MULTIPLY_32X16:388return true;389390case PIPE_CAP_ALLOW_DYNAMIC_VAO_FASTPATH:391/* Internal details of VF cache make this optimization harmful on GFX392* version 8 and 9, because generated VERTEX_BUFFER_STATEs are cached393* separately.394*/395return devinfo->ver >= 11;396397default:398return u_pipe_screen_get_param_defaults(pscreen, param);399}400return 0;401}402403static float404iris_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)405{406switch (param) {407case PIPE_CAPF_MAX_LINE_WIDTH:408case PIPE_CAPF_MAX_LINE_WIDTH_AA:409return 7.375f;410411case PIPE_CAPF_MAX_POINT_WIDTH:412case PIPE_CAPF_MAX_POINT_WIDTH_AA:413return 255.0f;414415case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:416return 16.0f;417case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:418return 15.0f;419case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:420case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:421case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:422return 0.0f;423default:424unreachable("unknown param");425}426}427428static int429iris_get_shader_param(struct pipe_screen *pscreen,430enum pipe_shader_type p_stage,431enum pipe_shader_cap param)432{433gl_shader_stage stage = stage_from_pipe(p_stage);434435/* this is probably not totally correct.. but it's a start: */436switch (param) {437case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:438return stage == MESA_SHADER_FRAGMENT ? 1024 : 16384;439case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:440case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:441case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:442return stage == MESA_SHADER_FRAGMENT ? 1024 : 0;443444case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:445return UINT_MAX;446447case PIPE_SHADER_CAP_MAX_INPUTS:448return stage == MESA_SHADER_VERTEX ? 16 : 32;449case PIPE_SHADER_CAP_MAX_OUTPUTS:450return 32;451case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:452return 16 * 1024 * sizeof(float);453case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:454return 16;455case PIPE_SHADER_CAP_MAX_TEMPS:456return 256; /* GL_MAX_PROGRAM_TEMPORARIES_ARB */457case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:458return 0;459case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:460case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:461case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:462case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:463/* Lie about these to avoid st/mesa's GLSL IR lowering of indirects,464* which we don't want. Our compiler backend will check brw_compiler's465* options and call nir_lower_indirect_derefs appropriately anyway.466*/467return true;468case PIPE_SHADER_CAP_SUBROUTINES:469return 0;470case PIPE_SHADER_CAP_INTEGERS:471return 1;472case PIPE_SHADER_CAP_INT64_ATOMICS:473case PIPE_SHADER_CAP_FP16:474case PIPE_SHADER_CAP_FP16_DERIVATIVES:475case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:476case PIPE_SHADER_CAP_INT16:477case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:478return 0;479case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:480case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:481case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:482return IRIS_MAX_TEXTURE_SAMPLERS;483case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:484return IRIS_MAX_ABOS + IRIS_MAX_SSBOS;485case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:486case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:487return 0;488case PIPE_SHADER_CAP_PREFERRED_IR:489return PIPE_SHADER_IR_NIR;490case PIPE_SHADER_CAP_SUPPORTED_IRS: {491int irs = 1 << PIPE_SHADER_IR_NIR;492if (iris_enable_clover())493irs |= 1 << PIPE_SHADER_IR_NIR_SERIALIZED;494return irs;495}496case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:497case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:498return 1;499case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:500case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:501case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:502case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:503case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:504case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:505case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:506return 0;507default:508unreachable("unknown shader param");509}510}511512static int513iris_get_compute_param(struct pipe_screen *pscreen,514enum pipe_shader_ir ir_type,515enum pipe_compute_cap param,516void *ret)517{518struct iris_screen *screen = (struct iris_screen *)pscreen;519const struct intel_device_info *devinfo = &screen->devinfo;520521/* Limit max_threads to 64 for the GPGPU_WALKER command. */522const unsigned max_threads = MIN2(64, devinfo->max_cs_threads);523const uint32_t max_invocations = 32 * max_threads;524525#define RET(x) do { \526if (ret) \527memcpy(ret, x, sizeof(x)); \528return sizeof(x); \529} while (0)530531switch (param) {532case PIPE_COMPUTE_CAP_ADDRESS_BITS:533/* This gets queried on clover device init and is never queried by the534* OpenGL state tracker.535*/536iris_warn_clover();537RET((uint32_t []){ 64 });538539case PIPE_COMPUTE_CAP_IR_TARGET:540if (ret)541strcpy(ret, "gen");542return 4;543544case PIPE_COMPUTE_CAP_GRID_DIMENSION:545RET((uint64_t []) { 3 });546547case PIPE_COMPUTE_CAP_MAX_GRID_SIZE:548RET(((uint64_t []) { 65535, 65535, 65535 }));549550case PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE:551/* MaxComputeWorkGroupSize[0..2] */552RET(((uint64_t []) {max_invocations, max_invocations, max_invocations}));553554case PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK:555/* MaxComputeWorkGroupInvocations */556case PIPE_COMPUTE_CAP_MAX_VARIABLE_THREADS_PER_BLOCK:557/* MaxComputeVariableGroupInvocations */558RET((uint64_t []) { max_invocations });559560case PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE:561/* MaxComputeSharedMemorySize */562RET((uint64_t []) { 64 * 1024 });563564case PIPE_COMPUTE_CAP_IMAGES_SUPPORTED:565RET((uint32_t []) { 0 });566567case PIPE_COMPUTE_CAP_SUBGROUP_SIZE:568RET((uint32_t []) { BRW_SUBGROUP_SIZE });569570case PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE:571case PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE:572RET((uint64_t []) { 1 << 30 }); /* TODO */573574case PIPE_COMPUTE_CAP_MAX_CLOCK_FREQUENCY:575RET((uint32_t []) { 400 }); /* TODO */576577case PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS: {578unsigned total_num_subslices = 0;579for (unsigned i = 0; i < devinfo->num_slices; i++)580total_num_subslices += devinfo->num_subslices[i];581RET((uint32_t []) { total_num_subslices });582}583584case PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE:585/* MaxComputeSharedMemorySize */586RET((uint64_t []) { 64 * 1024 });587588case PIPE_COMPUTE_CAP_MAX_INPUT_SIZE:589/* We could probably allow more; this is the OpenCL minimum */590RET((uint64_t []) { 1024 });591592default:593unreachable("unknown compute param");594}595}596597static uint64_t598iris_get_timestamp(struct pipe_screen *pscreen)599{600struct iris_screen *screen = (struct iris_screen *) pscreen;601const unsigned TIMESTAMP = 0x2358;602uint64_t result;603604iris_reg_read(screen->bufmgr, TIMESTAMP | 1, &result);605606result = intel_device_info_timebase_scale(&screen->devinfo, result);607result &= (1ull << TIMESTAMP_BITS) - 1;608609return result;610}611612void613iris_screen_destroy(struct iris_screen *screen)614{615iris_destroy_screen_measure(screen);616glsl_type_singleton_decref();617iris_bo_unreference(screen->workaround_bo);618u_transfer_helper_destroy(screen->base.transfer_helper);619iris_bufmgr_unref(screen->bufmgr);620disk_cache_destroy(screen->disk_cache);621close(screen->winsys_fd);622ralloc_free(screen);623}624625static void626iris_screen_unref(struct pipe_screen *pscreen)627{628iris_pscreen_unref(pscreen);629}630631static void632iris_query_memory_info(struct pipe_screen *pscreen,633struct pipe_memory_info *info)634{635}636637static const void *638iris_get_compiler_options(struct pipe_screen *pscreen,639enum pipe_shader_ir ir,640enum pipe_shader_type pstage)641{642struct iris_screen *screen = (struct iris_screen *) pscreen;643gl_shader_stage stage = stage_from_pipe(pstage);644assert(ir == PIPE_SHADER_IR_NIR);645646return screen->compiler->glsl_compiler_options[stage].NirOptions;647}648649static struct disk_cache *650iris_get_disk_shader_cache(struct pipe_screen *pscreen)651{652struct iris_screen *screen = (struct iris_screen *) pscreen;653return screen->disk_cache;654}655656static int657iris_getparam(int fd, int param, int *value)658{659struct drm_i915_getparam gp = { .param = param, .value = value };660661if (ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp) == -1)662return -errno;663664return 0;665}666667static int668iris_getparam_integer(int fd, int param)669{670int value = -1;671672if (iris_getparam(fd, param, &value) == 0)673return value;674675return -1;676}677678static const struct intel_l3_config *679iris_get_default_l3_config(const struct intel_device_info *devinfo,680bool compute)681{682bool wants_dc_cache = true;683bool has_slm = compute;684const struct intel_l3_weights w =685intel_get_default_l3_weights(devinfo, wants_dc_cache, has_slm);686return intel_get_l3_config(devinfo, w);687}688689static void690iris_shader_debug_log(void *data, const char *fmt, ...)691{692struct pipe_debug_callback *dbg = data;693unsigned id = 0;694va_list args;695696if (!dbg->debug_message)697return;698699va_start(args, fmt);700dbg->debug_message(dbg->data, &id, PIPE_DEBUG_TYPE_SHADER_INFO, fmt, args);701va_end(args);702}703704static void705iris_shader_perf_log(void *data, const char *fmt, ...)706{707struct pipe_debug_callback *dbg = data;708unsigned id = 0;709va_list args;710va_start(args, fmt);711712if (INTEL_DEBUG & DEBUG_PERF) {713va_list args_copy;714va_copy(args_copy, args);715vfprintf(stderr, fmt, args_copy);716va_end(args_copy);717}718719if (dbg->debug_message) {720dbg->debug_message(dbg->data, &id, PIPE_DEBUG_TYPE_PERF_INFO, fmt, args);721}722723va_end(args);724}725726static void727iris_detect_kernel_features(struct iris_screen *screen)728{729/* Kernel 5.2+ */730if (intel_gem_supports_syncobj_wait(screen->fd))731screen->kernel_features |= KERNEL_HAS_WAIT_FOR_SUBMIT;732}733734static bool735iris_init_identifier_bo(struct iris_screen *screen)736{737void *bo_map;738739bo_map = iris_bo_map(NULL, screen->workaround_bo, MAP_READ | MAP_WRITE);740if (!bo_map)741return false;742743screen->workaround_bo->kflags |= EXEC_OBJECT_CAPTURE;744screen->workaround_address = (struct iris_address) {745.bo = screen->workaround_bo,746.offset = ALIGN(747intel_debug_write_identifiers(bo_map, 4096, "Iris") + 8, 8),748};749750iris_bo_unmap(screen->workaround_bo);751752return true;753}754755struct pipe_screen *756iris_screen_create(int fd, const struct pipe_screen_config *config)757{758/* Here are the i915 features we need for Iris (in chronological order) :759* - I915_PARAM_HAS_EXEC_NO_RELOC (3.10)760* - I915_PARAM_HAS_EXEC_HANDLE_LUT (3.10)761* - I915_PARAM_HAS_EXEC_BATCH_FIRST (4.13)762* - I915_PARAM_HAS_EXEC_FENCE_ARRAY (4.14)763* - I915_PARAM_HAS_CONTEXT_ISOLATION (4.16)764*765* Checking the last feature availability will include all previous ones.766*/767if (iris_getparam_integer(fd, I915_PARAM_HAS_CONTEXT_ISOLATION) <= 0) {768debug_error("Kernel is too old for Iris. Consider upgrading to kernel v4.16.\n");769return NULL;770}771772struct iris_screen *screen = rzalloc(NULL, struct iris_screen);773if (!screen)774return NULL;775776if (!intel_get_device_info_from_fd(fd, &screen->devinfo))777return NULL;778screen->pci_id = screen->devinfo.chipset_id;779screen->no_hw = screen->devinfo.no_hw;780781p_atomic_set(&screen->refcount, 1);782783if (screen->devinfo.ver < 8 || screen->devinfo.is_cherryview)784return NULL;785786bool bo_reuse = false;787int bo_reuse_mode = driQueryOptioni(config->options, "bo_reuse");788switch (bo_reuse_mode) {789case DRI_CONF_BO_REUSE_DISABLED:790break;791case DRI_CONF_BO_REUSE_ALL:792bo_reuse = true;793break;794}795796screen->bufmgr = iris_bufmgr_get_for_fd(&screen->devinfo, fd, bo_reuse);797if (!screen->bufmgr)798return NULL;799800screen->fd = iris_bufmgr_get_fd(screen->bufmgr);801screen->winsys_fd = fd;802803if (getenv("INTEL_NO_HW") != NULL)804screen->no_hw = true;805806screen->workaround_bo =807iris_bo_alloc(screen->bufmgr, "workaround", 4096, 1,808IRIS_MEMZONE_OTHER, 0);809if (!screen->workaround_bo)810return NULL;811812if (!iris_init_identifier_bo(screen))813return NULL;814815brw_process_intel_debug_variable();816817screen->driconf.dual_color_blend_by_location =818driQueryOptionb(config->options, "dual_color_blend_by_location");819screen->driconf.disable_throttling =820driQueryOptionb(config->options, "disable_throttling");821screen->driconf.always_flush_cache =822driQueryOptionb(config->options, "always_flush_cache");823824screen->precompile = env_var_as_boolean("shader_precompile", true);825826isl_device_init(&screen->isl_dev, &screen->devinfo, false);827828screen->compiler = brw_compiler_create(screen, &screen->devinfo);829screen->compiler->shader_debug_log = iris_shader_debug_log;830screen->compiler->shader_perf_log = iris_shader_perf_log;831screen->compiler->supports_pull_constants = false;832screen->compiler->supports_shader_constants = true;833screen->compiler->compact_params = false;834screen->compiler->indirect_ubos_use_sampler = screen->devinfo.ver < 12;835836screen->l3_config_3d = iris_get_default_l3_config(&screen->devinfo, false);837screen->l3_config_cs = iris_get_default_l3_config(&screen->devinfo, true);838839iris_disk_cache_init(screen);840841slab_create_parent(&screen->transfer_pool,842sizeof(struct iris_transfer), 64);843844screen->subslice_total = intel_device_info_subslice_total(&screen->devinfo);845assert(screen->subslice_total >= 1);846847iris_detect_kernel_features(screen);848849struct pipe_screen *pscreen = &screen->base;850851iris_init_screen_fence_functions(pscreen);852iris_init_screen_resource_functions(pscreen);853iris_init_screen_measure(screen);854855pscreen->destroy = iris_screen_unref;856pscreen->get_name = iris_get_name;857pscreen->get_vendor = iris_get_vendor;858pscreen->get_device_vendor = iris_get_device_vendor;859pscreen->get_param = iris_get_param;860pscreen->get_shader_param = iris_get_shader_param;861pscreen->get_compute_param = iris_get_compute_param;862pscreen->get_paramf = iris_get_paramf;863pscreen->get_compiler_options = iris_get_compiler_options;864pscreen->get_device_uuid = iris_get_device_uuid;865pscreen->get_driver_uuid = iris_get_driver_uuid;866pscreen->get_disk_shader_cache = iris_get_disk_shader_cache;867pscreen->is_format_supported = iris_is_format_supported;868pscreen->context_create = iris_create_context;869pscreen->flush_frontbuffer = iris_flush_frontbuffer;870pscreen->get_timestamp = iris_get_timestamp;871pscreen->query_memory_info = iris_query_memory_info;872pscreen->get_driver_query_group_info = iris_get_monitor_group_info;873pscreen->get_driver_query_info = iris_get_monitor_info;874875genX_call(&screen->devinfo, init_screen_state, screen);876877glsl_type_singleton_init_or_ref();878879return pscreen;880}881882883