Path: blob/21.2-virgl/src/gallium/drivers/v3d/v3d_screen.c
4570 views
/*1* Copyright © 2014-2017 Broadcom2* Copyright (C) 2012 Rob Clark <[email protected]>3*4* Permission is hereby granted, free of charge, to any person obtaining a5* copy of this software and associated documentation files (the "Software"),6* to deal in the Software without restriction, including without limitation7* the rights to use, copy, modify, merge, publish, distribute, sublicense,8* and/or sell copies of the Software, and to permit persons to whom the9* Software is furnished to do so, subject to the following conditions:10*11* The above copyright notice and this permission notice (including the next12* paragraph) shall be included in all copies or substantial portions of the13* Software.14*15* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR16* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,17* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL18* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER19* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING20* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS21* IN THE SOFTWARE.22*/2324#include <sys/sysinfo.h>2526#include "common/v3d_device_info.h"27#include "common/v3d_limits.h"28#include "util/os_misc.h"29#include "pipe/p_defines.h"30#include "pipe/p_screen.h"31#include "pipe/p_state.h"3233#include "util/u_debug.h"34#include "util/u_memory.h"35#include "util/format/u_format.h"36#include "util/u_hash_table.h"37#include "util/u_screen.h"38#include "util/u_transfer_helper.h"39#include "util/ralloc.h"40#include "util/xmlconfig.h"4142#include <xf86drm.h>43#include "v3d_screen.h"44#include "v3d_context.h"45#include "v3d_resource.h"46#include "compiler/v3d_compiler.h"47#include "drm-uapi/drm_fourcc.h"4849static const char *50v3d_screen_get_name(struct pipe_screen *pscreen)51{52struct v3d_screen *screen = v3d_screen(pscreen);5354if (!screen->name) {55screen->name = ralloc_asprintf(screen,56"V3D %d.%d",57screen->devinfo.ver / 10,58screen->devinfo.ver % 10);59}6061return screen->name;62}6364static const char *65v3d_screen_get_vendor(struct pipe_screen *pscreen)66{67return "Broadcom";68}6970static void71v3d_screen_destroy(struct pipe_screen *pscreen)72{73struct v3d_screen *screen = v3d_screen(pscreen);7475_mesa_hash_table_destroy(screen->bo_handles, NULL);76v3d_bufmgr_destroy(pscreen);77slab_destroy_parent(&screen->transfer_pool);78if (screen->ro)79screen->ro->destroy(screen->ro);8081if (using_v3d_simulator)82v3d_simulator_destroy(screen->sim_file);8384v3d_compiler_free(screen->compiler);85u_transfer_helper_destroy(pscreen->transfer_helper);8687close(screen->fd);88ralloc_free(pscreen);89}9091static bool92v3d_has_feature(struct v3d_screen *screen, enum drm_v3d_param feature)93{94struct drm_v3d_get_param p = {95.param = feature,96};97int ret = v3d_ioctl(screen->fd, DRM_IOCTL_V3D_GET_PARAM, &p);9899if (ret != 0)100return false;101102return p.value;103}104105static int106v3d_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)107{108struct v3d_screen *screen = v3d_screen(pscreen);109110switch (param) {111/* Supported features (boolean caps). */112case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:113case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:114case PIPE_CAP_NPOT_TEXTURES:115case PIPE_CAP_BLEND_EQUATION_SEPARATE:116case PIPE_CAP_TEXTURE_MULTISAMPLE:117case PIPE_CAP_TEXTURE_SWIZZLE:118case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:119case PIPE_CAP_START_INSTANCE:120case PIPE_CAP_TGSI_INSTANCEID:121case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD:122case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES:123case PIPE_CAP_VERTEX_SHADER_SATURATE:124case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX:125case PIPE_CAP_OCCLUSION_QUERY:126case PIPE_CAP_POINT_SPRITE:127case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:128case PIPE_CAP_DRAW_INDIRECT:129case PIPE_CAP_MULTI_DRAW_INDIRECT:130case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:131case PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET:132case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:133case PIPE_CAP_TGSI_PACK_HALF_FLOAT:134case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:135case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:136case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:137case PIPE_CAP_TGSI_TEXCOORD:138return 1;139140case PIPE_CAP_TEXTURE_QUERY_LOD:141return screen->devinfo.ver >= 42;142break;143144case PIPE_CAP_PACKED_UNIFORMS:145/* We can't enable this flag, because it results in load_ubo146* intrinsics across a 16b boundary, but v3d's TMU general147* memory accesses wrap on 16b boundaries.148*/149return 0;150151case PIPE_CAP_NIR_IMAGES_AS_DEREF:152return 0;153154case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:155/* XXX perf: we don't want to emit these extra blits for156* glReadPixels(), since we still have to do an uncached read157* from the GPU of the result after waiting for the TFU blit158* to happen. However, disabling this introduces instability159* in160* dEQP-GLES31.functional.image_load_store.early_fragment_tests.*161* and corruption in chromium's rendering.162*/163return 1;164165case PIPE_CAP_COMPUTE:166return screen->has_csd && screen->devinfo.ver >= 41;167168case PIPE_CAP_GENERATE_MIPMAP:169return v3d_has_feature(screen, DRM_V3D_PARAM_SUPPORTS_TFU);170171case PIPE_CAP_INDEP_BLEND_ENABLE:172return screen->devinfo.ver >= 40;173174case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:175return 256;176177case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:178if (screen->devinfo.ver < 40)179return 0;180return 4;181182case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:183if (screen->has_cache_flush)184return 4;185else186return 0; /* Disables shader storage */187188case PIPE_CAP_GLSL_FEATURE_LEVEL:189return 330;190191case PIPE_CAP_ESSL_FEATURE_LEVEL:192return 310;193194case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY:195return 140;196197case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:198return 1;199case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:200return 0;201case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:202if (screen->devinfo.ver >= 40)203return 0;204else205return 1;206case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:207if (screen->devinfo.ver >= 40)208return 1;209else210return 0;211212case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:213case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:214case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:215return 1;216217case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:218return 4;219220case PIPE_CAP_MAX_VARYINGS:221return V3D_MAX_FS_INPUTS / 4;222223/* Texturing. */224case PIPE_CAP_MAX_TEXTURE_2D_SIZE:225if (screen->devinfo.ver < 40)226return 2048;227else if (screen->nonmsaa_texture_size_limit)228return 7680;229else230return 4096;231case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:232case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:233if (screen->devinfo.ver < 40)234return 12;235else236return V3D_MAX_MIP_LEVELS;237case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:238return 2048;239240/* Render targets. */241case PIPE_CAP_MAX_RENDER_TARGETS:242return 4;243244case PIPE_CAP_VENDOR_ID:245return 0x14E4;246case PIPE_CAP_ACCELERATED:247return 1;248case PIPE_CAP_VIDEO_MEMORY: {249uint64_t system_memory;250251if (!os_get_total_physical_memory(&system_memory))252return 0;253254return (int)(system_memory >> 20);255}256case PIPE_CAP_UMA:257return 1;258259case PIPE_CAP_ALPHA_TEST:260case PIPE_CAP_FLATSHADE:261case PIPE_CAP_TWO_SIDED_COLOR:262case PIPE_CAP_VERTEX_COLOR_CLAMPED:263case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:264case PIPE_CAP_GL_CLAMP:265return 0;266267/* Geometry shaders */268case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:269/* Minimum required by GLES 3.2 */270return 1024;271case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:272/* MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS / 4 */273return 256;274case PIPE_CAP_MAX_GS_INVOCATIONS:275return 32;276277default:278return u_pipe_screen_get_param_defaults(pscreen, param);279}280}281282static float283v3d_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)284{285switch (param) {286case PIPE_CAPF_MAX_LINE_WIDTH:287case PIPE_CAPF_MAX_LINE_WIDTH_AA:288return V3D_MAX_LINE_WIDTH;289290case PIPE_CAPF_MAX_POINT_WIDTH:291case PIPE_CAPF_MAX_POINT_WIDTH_AA:292return V3D_MAX_POINT_SIZE;293294case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:295return 0.0f;296case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:297return 16.0f;298299case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:300case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:301case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:302return 0.0f;303default:304fprintf(stderr, "unknown paramf %d\n", param);305return 0;306}307}308309static int310v3d_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,311enum pipe_shader_cap param)312{313struct v3d_screen *screen = v3d_screen(pscreen);314315switch (shader) {316case PIPE_SHADER_VERTEX:317case PIPE_SHADER_FRAGMENT:318break;319case PIPE_SHADER_COMPUTE:320if (!screen->has_csd)321return 0;322break;323case PIPE_SHADER_GEOMETRY:324if (screen->devinfo.ver < 41)325return 0;326break;327default:328return 0;329}330331/* this is probably not totally correct.. but it's a start: */332switch (param) {333case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:334case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:335case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:336case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:337return 16384;338339case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:340return UINT_MAX;341342case PIPE_SHADER_CAP_MAX_INPUTS:343switch (shader) {344case PIPE_SHADER_VERTEX:345return V3D_MAX_VS_INPUTS / 4;346case PIPE_SHADER_GEOMETRY:347return V3D_MAX_GS_INPUTS / 4;348case PIPE_SHADER_FRAGMENT:349return V3D_MAX_FS_INPUTS / 4;350default:351return 0;352};353case PIPE_SHADER_CAP_MAX_OUTPUTS:354if (shader == PIPE_SHADER_FRAGMENT)355return 4;356else357return V3D_MAX_FS_INPUTS / 4;358case PIPE_SHADER_CAP_MAX_TEMPS:359return 256; /* GL_MAX_PROGRAM_TEMPORARIES_ARB */360case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:361/* Note: Limited by the offset size in362* v3d_unit_data_create().363*/364return 16 * 1024 * sizeof(float);365case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:366return 16;367case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:368return 0;369case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:370/* We don't currently support this in the backend, but that is371* okay because our NIR compiler sets the option372* lower_all_io_to_temps, which will eliminate indirect373* indexing on all input/output variables by translating it to374* indirect indexing on temporary variables instead, which we375* will then lower to scratch. We prefer this over setting this376* to 0, which would cause if-ladder injection to eliminate377* indirect indexing on inputs.378*/379return 1;380case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:381return 1;382case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:383return 1;384case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:385return 1;386case PIPE_SHADER_CAP_SUBROUTINES:387return 0;388case PIPE_SHADER_CAP_INTEGERS:389return 1;390case PIPE_SHADER_CAP_FP16:391case PIPE_SHADER_CAP_FP16_DERIVATIVES:392case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:393case PIPE_SHADER_CAP_INT16:394case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:395case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:396case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:397case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:398case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:399case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:400case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:401case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:402case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:403return 0;404case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:405case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:406return V3D_OPENGL_MAX_TEXTURE_SAMPLERS;407408case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:409if (screen->has_cache_flush) {410if (shader == PIPE_SHADER_VERTEX ||411shader == PIPE_SHADER_GEOMETRY) {412return 0;413}414return PIPE_MAX_SHADER_BUFFERS;415} else {416return 0;417}418419case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:420if (screen->has_cache_flush) {421if (screen->devinfo.ver < 41)422return 0;423else424return PIPE_MAX_SHADER_IMAGES;425} else {426return 0;427}428429case PIPE_SHADER_CAP_PREFERRED_IR:430return PIPE_SHADER_IR_NIR;431case PIPE_SHADER_CAP_SUPPORTED_IRS:432return 1 << PIPE_SHADER_IR_NIR;433case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:434/* We use NIR's loop unrolling */435return 0;436case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:437case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:438return 0;439default:440fprintf(stderr, "unknown shader param %d\n", param);441return 0;442}443return 0;444}445446static int447v3d_get_compute_param(struct pipe_screen *pscreen, enum pipe_shader_ir ir_type,448enum pipe_compute_cap param, void *ret)449{450struct v3d_screen *screen = v3d_screen(pscreen);451452if (!screen->has_csd)453return 0;454455#define RET(x) do { \456if (ret) \457memcpy(ret, x, sizeof(x)); \458return sizeof(x); \459} while (0)460461switch (param) {462case PIPE_COMPUTE_CAP_ADDRESS_BITS:463RET((uint32_t []) { 32 });464break;465466case PIPE_COMPUTE_CAP_IR_TARGET:467sprintf(ret, "v3d");468return strlen(ret);469470case PIPE_COMPUTE_CAP_GRID_DIMENSION:471RET((uint64_t []) { 3 });472473case PIPE_COMPUTE_CAP_MAX_GRID_SIZE:474/* GL_MAX_COMPUTE_SHADER_WORK_GROUP_COUNT: The CSD has a475* 16-bit field for the number of workgroups in each476* dimension.477*/478RET(((uint64_t []) { 65535, 65535, 65535 }));479480case PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE:481/* GL_MAX_COMPUTE_WORK_GROUP_SIZE */482RET(((uint64_t []) { 256, 256, 256 }));483484case PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK:485case PIPE_COMPUTE_CAP_MAX_VARIABLE_THREADS_PER_BLOCK:486/* GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS: This is487* limited by WG_SIZE in the CSD.488*/489RET((uint64_t []) { 256 });490491case PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE:492RET((uint64_t []) { 1024 * 1024 * 1024 });493494case PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE:495/* GL_MAX_COMPUTE_SHARED_MEMORY_SIZE */496RET((uint64_t []) { 32768 });497498case PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE:499case PIPE_COMPUTE_CAP_MAX_INPUT_SIZE:500RET((uint64_t []) { 4096 });501502case PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE: {503struct sysinfo si;504sysinfo(&si);505RET((uint64_t []) { si.totalram });506}507508case PIPE_COMPUTE_CAP_MAX_CLOCK_FREQUENCY:509/* OpenCL only */510RET((uint32_t []) { 0 });511512case PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS:513RET((uint32_t []) { 1 });514515case PIPE_COMPUTE_CAP_IMAGES_SUPPORTED:516RET((uint32_t []) { 1 });517518case PIPE_COMPUTE_CAP_SUBGROUP_SIZE:519RET((uint32_t []) { 16 });520521}522523return 0;524}525526static bool527v3d_screen_is_format_supported(struct pipe_screen *pscreen,528enum pipe_format format,529enum pipe_texture_target target,530unsigned sample_count,531unsigned storage_sample_count,532unsigned usage)533{534struct v3d_screen *screen = v3d_screen(pscreen);535536if (MAX2(1, sample_count) != MAX2(1, storage_sample_count))537return false;538539if (sample_count > 1 && sample_count != V3D_MAX_SAMPLES)540return false;541542if (target >= PIPE_MAX_TEXTURE_TYPES) {543return false;544}545546if (usage & PIPE_BIND_VERTEX_BUFFER) {547switch (format) {548case PIPE_FORMAT_R32G32B32A32_FLOAT:549case PIPE_FORMAT_R32G32B32_FLOAT:550case PIPE_FORMAT_R32G32_FLOAT:551case PIPE_FORMAT_R32_FLOAT:552case PIPE_FORMAT_R32G32B32A32_SNORM:553case PIPE_FORMAT_R32G32B32_SNORM:554case PIPE_FORMAT_R32G32_SNORM:555case PIPE_FORMAT_R32_SNORM:556case PIPE_FORMAT_R32G32B32A32_SSCALED:557case PIPE_FORMAT_R32G32B32_SSCALED:558case PIPE_FORMAT_R32G32_SSCALED:559case PIPE_FORMAT_R32_SSCALED:560case PIPE_FORMAT_R16G16B16A16_UNORM:561case PIPE_FORMAT_R16G16B16_UNORM:562case PIPE_FORMAT_R16G16_UNORM:563case PIPE_FORMAT_R16_UNORM:564case PIPE_FORMAT_R16G16B16A16_SNORM:565case PIPE_FORMAT_R16G16B16_SNORM:566case PIPE_FORMAT_R16G16_SNORM:567case PIPE_FORMAT_R16_SNORM:568case PIPE_FORMAT_R16G16B16A16_USCALED:569case PIPE_FORMAT_R16G16B16_USCALED:570case PIPE_FORMAT_R16G16_USCALED:571case PIPE_FORMAT_R16_USCALED:572case PIPE_FORMAT_R16G16B16A16_SSCALED:573case PIPE_FORMAT_R16G16B16_SSCALED:574case PIPE_FORMAT_R16G16_SSCALED:575case PIPE_FORMAT_R16_SSCALED:576case PIPE_FORMAT_B8G8R8A8_UNORM:577case PIPE_FORMAT_R8G8B8A8_UNORM:578case PIPE_FORMAT_R8G8B8_UNORM:579case PIPE_FORMAT_R8G8_UNORM:580case PIPE_FORMAT_R8_UNORM:581case PIPE_FORMAT_R8G8B8A8_SNORM:582case PIPE_FORMAT_R8G8B8_SNORM:583case PIPE_FORMAT_R8G8_SNORM:584case PIPE_FORMAT_R8_SNORM:585case PIPE_FORMAT_R8G8B8A8_USCALED:586case PIPE_FORMAT_R8G8B8_USCALED:587case PIPE_FORMAT_R8G8_USCALED:588case PIPE_FORMAT_R8_USCALED:589case PIPE_FORMAT_R8G8B8A8_SSCALED:590case PIPE_FORMAT_R8G8B8_SSCALED:591case PIPE_FORMAT_R8G8_SSCALED:592case PIPE_FORMAT_R8_SSCALED:593case PIPE_FORMAT_R10G10B10A2_UNORM:594case PIPE_FORMAT_B10G10R10A2_UNORM:595case PIPE_FORMAT_R10G10B10A2_SNORM:596case PIPE_FORMAT_B10G10R10A2_SNORM:597case PIPE_FORMAT_R10G10B10A2_USCALED:598case PIPE_FORMAT_B10G10R10A2_USCALED:599case PIPE_FORMAT_R10G10B10A2_SSCALED:600case PIPE_FORMAT_B10G10R10A2_SSCALED:601break;602default:603return false;604}605}606607/* FORMAT_NONE gets allowed for ARB_framebuffer_no_attachments's probe608* of FRAMEBUFFER_MAX_SAMPLES609*/610if ((usage & PIPE_BIND_RENDER_TARGET) &&611format != PIPE_FORMAT_NONE &&612!v3d_rt_format_supported(&screen->devinfo, format)) {613return false;614}615616if ((usage & PIPE_BIND_SAMPLER_VIEW) &&617!v3d_tex_format_supported(&screen->devinfo, format)) {618return false;619}620621if ((usage & PIPE_BIND_DEPTH_STENCIL) &&622!(format == PIPE_FORMAT_S8_UINT_Z24_UNORM ||623format == PIPE_FORMAT_X8Z24_UNORM ||624format == PIPE_FORMAT_Z16_UNORM ||625format == PIPE_FORMAT_Z32_FLOAT ||626format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT)) {627return false;628}629630if ((usage & PIPE_BIND_INDEX_BUFFER) &&631!(format == PIPE_FORMAT_R8_UINT ||632format == PIPE_FORMAT_R16_UINT ||633format == PIPE_FORMAT_R32_UINT)) {634return false;635}636637return true;638}639640static const nir_shader_compiler_options v3d_nir_options = {641.lower_add_sat = true,642.lower_all_io_to_temps = true,643.lower_extract_byte = true,644.lower_extract_word = true,645.lower_insert_byte = true,646.lower_insert_word = true,647.lower_bitfield_insert_to_shifts = true,648.lower_bitfield_extract_to_shifts = true,649.lower_bitfield_reverse = true,650.lower_bit_count = true,651.lower_cs_local_id_from_index = true,652.lower_ffract = true,653.lower_fmod = true,654.lower_pack_unorm_2x16 = true,655.lower_pack_snorm_2x16 = true,656.lower_pack_unorm_4x8 = true,657.lower_pack_snorm_4x8 = true,658.lower_unpack_unorm_4x8 = true,659.lower_unpack_snorm_4x8 = true,660.lower_pack_half_2x16 = true,661.lower_unpack_half_2x16 = true,662.lower_fdiv = true,663.lower_find_lsb = true,664.lower_ffma16 = true,665.lower_ffma32 = true,666.lower_ffma64 = true,667.lower_flrp32 = true,668.lower_fpow = true,669.lower_fsat = true,670.lower_fsqrt = true,671.lower_ifind_msb = true,672.lower_isign = true,673.lower_ldexp = true,674.lower_mul_high = true,675.lower_wpos_pntc = true,676.lower_rotate = true,677.lower_to_scalar = true,678.has_fsub = true,679.has_isub = true,680.divergence_analysis_options =681nir_divergence_multiple_workgroup_per_compute_subgroup,682/* This will enable loop unrolling in the state tracker so we won't683* be able to selectively disable it in backend if it leads to684* lower thread counts or TMU spills. Choose a conservative maximum to685* limit register pressure impact.686*/687.max_unroll_iterations = 16,688};689690static const void *691v3d_screen_get_compiler_options(struct pipe_screen *pscreen,692enum pipe_shader_ir ir, unsigned shader)693{694return &v3d_nir_options;695}696697static const uint64_t v3d_available_modifiers[] = {698DRM_FORMAT_MOD_BROADCOM_UIF,699DRM_FORMAT_MOD_LINEAR,700DRM_FORMAT_MOD_BROADCOM_SAND128,701};702703static void704v3d_screen_query_dmabuf_modifiers(struct pipe_screen *pscreen,705enum pipe_format format, int max,706uint64_t *modifiers,707unsigned int *external_only,708int *count)709{710int i;711int num_modifiers = ARRAY_SIZE(v3d_available_modifiers);712713/* Expose DRM_FORMAT_MOD_BROADCOM_SAND128 only for PIPE_FORMAT_NV12 */714if (format != PIPE_FORMAT_NV12)715num_modifiers--;716717if (!modifiers) {718*count = num_modifiers;719return;720}721722*count = MIN2(max, num_modifiers);723for (i = 0; i < *count; i++) {724modifiers[i] = v3d_available_modifiers[i];725if (external_only)726external_only[i] = util_format_is_yuv(format);727}728}729730static bool731v3d_screen_is_dmabuf_modifier_supported(struct pipe_screen *pscreen,732uint64_t modifier,733enum pipe_format format,734bool *external_only)735{736int i;737bool is_sand_col128 = (format == PIPE_FORMAT_NV12) &&738(fourcc_mod_broadcom_mod(modifier) == DRM_FORMAT_MOD_BROADCOM_SAND128);739740if (is_sand_col128) {741if (external_only)742*external_only = true;743return true;744}745746/* We don't want to generally allow DRM_FORMAT_MOD_BROADCOM_SAND128747* modifier, that is the last v3d_available_modifiers. We only accept748* it in the case of having a PIPE_FORMAT_NV12.749*/750assert(v3d_available_modifiers[ARRAY_SIZE(v3d_available_modifiers) - 1] ==751DRM_FORMAT_MOD_BROADCOM_SAND128);752for (i = 0; i < ARRAY_SIZE(v3d_available_modifiers) - 1; i++) {753if (v3d_available_modifiers[i] == modifier) {754if (external_only)755*external_only = util_format_is_yuv(format);756757return true;758}759}760761return false;762}763764struct pipe_screen *765v3d_screen_create(int fd, const struct pipe_screen_config *config,766struct renderonly *ro)767{768struct v3d_screen *screen = rzalloc(NULL, struct v3d_screen);769struct pipe_screen *pscreen;770771pscreen = &screen->base;772773pscreen->destroy = v3d_screen_destroy;774pscreen->get_param = v3d_screen_get_param;775pscreen->get_paramf = v3d_screen_get_paramf;776pscreen->get_shader_param = v3d_screen_get_shader_param;777pscreen->get_compute_param = v3d_get_compute_param;778pscreen->context_create = v3d_context_create;779pscreen->is_format_supported = v3d_screen_is_format_supported;780781screen->fd = fd;782screen->ro = ro;783784list_inithead(&screen->bo_cache.time_list);785(void)mtx_init(&screen->bo_handles_mutex, mtx_plain);786screen->bo_handles = util_hash_table_create_ptr_keys();787788#if defined(USE_V3D_SIMULATOR)789screen->sim_file = v3d_simulator_init(screen->fd);790#endif791792if (!v3d_get_device_info(screen->fd, &screen->devinfo, &v3d_ioctl))793goto fail;794795/* We have to driCheckOption for the simulator mode to not assertion796* fail on not having our XML config.797*/798const char *nonmsaa_name = "v3d_nonmsaa_texture_size_limit";799screen->nonmsaa_texture_size_limit =800driCheckOption(config->options, nonmsaa_name, DRI_BOOL) &&801driQueryOptionb(config->options, nonmsaa_name);802803slab_create_parent(&screen->transfer_pool, sizeof(struct v3d_transfer), 16);804805screen->has_csd = v3d_has_feature(screen, DRM_V3D_PARAM_SUPPORTS_CSD);806screen->has_cache_flush =807v3d_has_feature(screen, DRM_V3D_PARAM_SUPPORTS_CACHE_FLUSH);808809v3d_fence_init(screen);810811v3d_process_debug_variable();812813v3d_resource_screen_init(pscreen);814815screen->compiler = v3d_compiler_init(&screen->devinfo);816817pscreen->get_name = v3d_screen_get_name;818pscreen->get_vendor = v3d_screen_get_vendor;819pscreen->get_device_vendor = v3d_screen_get_vendor;820pscreen->get_compiler_options = v3d_screen_get_compiler_options;821pscreen->query_dmabuf_modifiers = v3d_screen_query_dmabuf_modifiers;822pscreen->is_dmabuf_modifier_supported =823v3d_screen_is_dmabuf_modifier_supported;824825return pscreen;826827fail:828close(fd);829ralloc_free(pscreen);830return NULL;831}832833834