14a49301eSmrg/************************************************************************** 24a49301eSmrg * 3af69d88dSmrg * Copyright 2008 VMware, Inc. 44a49301eSmrg * All Rights Reserved. 54a49301eSmrg * 64a49301eSmrg * Permission is hereby granted, free of charge, to any person obtaining a 74a49301eSmrg * copy of this software and associated documentation files (the 84a49301eSmrg * "Software"), to deal in the Software without restriction, including 94a49301eSmrg * without limitation the rights to use, copy, modify, merge, publish, 104a49301eSmrg * distribute, sub license, and/or sell copies of the Software, and to 114a49301eSmrg * permit persons to whom the Software is furnished to do so, subject to 124a49301eSmrg * the following conditions: 134a49301eSmrg * 144a49301eSmrg * The above copyright notice and this permission notice (including the 154a49301eSmrg * next paragraph) shall be included in all copies or substantial portions 164a49301eSmrg * of the Software. 174a49301eSmrg * 184a49301eSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 194a49301eSmrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 204a49301eSmrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21af69d88dSmrg * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 224a49301eSmrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 234a49301eSmrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 244a49301eSmrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 254a49301eSmrg * 264a49301eSmrg **************************************************************************/ 274a49301eSmrg 284a49301eSmrg 294a49301eSmrg#include "util/u_memory.h" 303464ebd5Sriastradh#include "util/u_math.h" 313464ebd5Sriastradh#include "util/u_cpu_detect.h" 327ec681f3Smrg#include "util/format/u_format.h" 3301e04c3fSmrg#include "util/u_screen.h" 34af69d88dSmrg#include "util/u_string.h" 357ec681f3Smrg#include "util/format/u_format_s3tc.h" 364a49301eSmrg#include "pipe/p_defines.h" 374a49301eSmrg#include "pipe/p_screen.h" 383464ebd5Sriastradh#include "draw/draw_context.h" 39af69d88dSmrg#include "gallivm/lp_bld_type.h" 407ec681f3Smrg#include "gallivm/lp_bld_nir.h" 417ec681f3Smrg#include "util/disk_cache.h" 4201e04c3fSmrg#include "util/os_misc.h" 4301e04c3fSmrg#include "util/os_time.h" 444a49301eSmrg#include "lp_texture.h" 45cdc920a0Smrg#include "lp_fence.h" 464a49301eSmrg#include "lp_jit.h" 474a49301eSmrg#include "lp_screen.h" 48cdc920a0Smrg#include "lp_context.h" 494a49301eSmrg#include "lp_debug.h" 503464ebd5Sriastradh#include "lp_public.h" 513464ebd5Sriastradh#include "lp_limits.h" 523464ebd5Sriastradh#include "lp_rast.h" 537ec681f3Smrg#include "lp_cs_tpool.h" 547ec681f3Smrg 557ec681f3Smrg#include "frontend/sw_winsys.h" 563464ebd5Sriastradh 577ec681f3Smrg#include "nir.h" 584a49301eSmrg 594a49301eSmrg#ifdef DEBUG 604a49301eSmrgint LP_DEBUG = 0; 614a49301eSmrg 624a49301eSmrgstatic const struct debug_named_value lp_debug_flags[] = { 633464ebd5Sriastradh { "pipe", DEBUG_PIPE, NULL }, 643464ebd5Sriastradh { "tgsi", DEBUG_TGSI, NULL }, 653464ebd5Sriastradh { "tex", DEBUG_TEX, NULL }, 663464ebd5Sriastradh { "setup", DEBUG_SETUP, NULL }, 673464ebd5Sriastradh { "rast", DEBUG_RAST, NULL }, 683464ebd5Sriastradh { "query", DEBUG_QUERY, NULL }, 693464ebd5Sriastradh { "screen", DEBUG_SCREEN, NULL }, 703464ebd5Sriastradh { "counters", DEBUG_COUNTERS, NULL }, 713464ebd5Sriastradh { "scene", DEBUG_SCENE, NULL }, 723464ebd5Sriastradh { "fence", DEBUG_FENCE, NULL }, 737ec681f3Smrg { "no_fastpath", DEBUG_NO_FASTPATH, NULL }, 747ec681f3Smrg { "linear", DEBUG_LINEAR, NULL }, 757ec681f3Smrg { "linear2", DEBUG_LINEAR2, NULL }, 763464ebd5Sriastradh { "mem", DEBUG_MEM, NULL }, 773464ebd5Sriastradh { "fs", DEBUG_FS, NULL }, 787ec681f3Smrg { "cs", DEBUG_CS, NULL }, 797ec681f3Smrg { "tgsi_ir", DEBUG_TGSI_IR, NULL }, 807ec681f3Smrg { "cache_stats", DEBUG_CACHE_STATS, NULL }, 817ec681f3Smrg { "accurate_a0", DEBUG_ACCURATE_A0 }, 823464ebd5Sriastradh DEBUG_NAMED_VALUE_END 834a49301eSmrg}; 844a49301eSmrg#endif 854a49301eSmrg 863464ebd5Sriastradhint LP_PERF = 0; 873464ebd5Sriastradhstatic const struct debug_named_value lp_perf_flags[] = { 883464ebd5Sriastradh { "texmem", PERF_TEX_MEM, NULL }, 893464ebd5Sriastradh { "no_mipmap", PERF_NO_MIPMAPS, NULL }, 903464ebd5Sriastradh { "no_linear", PERF_NO_LINEAR, NULL }, 913464ebd5Sriastradh { "no_mip_linear", PERF_NO_MIP_LINEAR, NULL }, 923464ebd5Sriastradh { "no_tex", PERF_NO_TEX, NULL }, 933464ebd5Sriastradh { "no_blend", PERF_NO_BLEND, NULL }, 943464ebd5Sriastradh { "no_depth", PERF_NO_DEPTH, NULL }, 953464ebd5Sriastradh { "no_alphatest", PERF_NO_ALPHATEST, NULL }, 967ec681f3Smrg { "no_rast_linear", PERF_NO_RAST_LINEAR, NULL }, 977ec681f3Smrg { "no_shade", PERF_NO_SHADE, NULL }, 983464ebd5Sriastradh DEBUG_NAMED_VALUE_END 993464ebd5Sriastradh}; 1003464ebd5Sriastradh 1014a49301eSmrg 1024a49301eSmrgstatic const char * 1034a49301eSmrgllvmpipe_get_vendor(struct pipe_screen *screen) 1044a49301eSmrg{ 1057ec681f3Smrg return "Mesa/X.org"; 1064a49301eSmrg} 1074a49301eSmrg 1084a49301eSmrg 1094a49301eSmrgstatic const char * 1104a49301eSmrgllvmpipe_get_name(struct pipe_screen *screen) 1114a49301eSmrg{ 1127ec681f3Smrg struct llvmpipe_screen *lscreen = llvmpipe_screen(screen); 1137ec681f3Smrg return lscreen->renderer_string; 1144a49301eSmrg} 1154a49301eSmrg 1164a49301eSmrg 1174a49301eSmrgstatic int 1183464ebd5Sriastradhllvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param) 1194a49301eSmrg{ 1204a49301eSmrg switch (param) { 1214a49301eSmrg case PIPE_CAP_NPOT_TEXTURES: 122af69d88dSmrg case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES: 12301e04c3fSmrg case PIPE_CAP_MIXED_COLOR_DEPTH_BITS: 1247ec681f3Smrg case PIPE_CAP_ANISOTROPIC_FILTER: 1254a49301eSmrg return 1; 1267ec681f3Smrg case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD: 1277ec681f3Smrg case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES: 1287ec681f3Smrg case PIPE_CAP_VERTEX_SHADER_SATURATE: 1293464ebd5Sriastradh return 1; 130af69d88dSmrg case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: 131af69d88dSmrg return 1; 132af69d88dSmrg case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS: 133af69d88dSmrg return PIPE_MAX_SO_BUFFERS; 1344a49301eSmrg case PIPE_CAP_POINT_SPRITE: 1354a49301eSmrg return 1; 1364a49301eSmrg case PIPE_CAP_MAX_RENDER_TARGETS: 1374a49301eSmrg return PIPE_MAX_COLOR_BUFS; 1384a49301eSmrg case PIPE_CAP_OCCLUSION_QUERY: 139af69d88dSmrg case PIPE_CAP_QUERY_TIMESTAMP: 1407ec681f3Smrg case PIPE_CAP_QUERY_TIME_ELAPSED: 1414a49301eSmrg return 1; 142af69d88dSmrg case PIPE_CAP_QUERY_PIPELINE_STATISTICS: 1434a49301eSmrg return 1; 14401e04c3fSmrg case PIPE_CAP_TEXTURE_MIRROR_CLAMP: 14501e04c3fSmrg case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE: 1464a49301eSmrg return 1; 1473464ebd5Sriastradh case PIPE_CAP_TEXTURE_SWIZZLE: 1487ec681f3Smrg case PIPE_CAP_TEXTURE_SHADOW_LOD: 1493464ebd5Sriastradh return 1; 1507ec681f3Smrg case PIPE_CAP_MAX_TEXTURE_2D_SIZE: 1517ec681f3Smrg return 1 << (LP_MAX_TEXTURE_2D_LEVELS - 1); 1524a49301eSmrg case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: 1533464ebd5Sriastradh return LP_MAX_TEXTURE_3D_LEVELS; 1544a49301eSmrg case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: 155af69d88dSmrg return LP_MAX_TEXTURE_CUBE_LEVELS; 156af69d88dSmrg case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS: 157af69d88dSmrg return LP_MAX_TEXTURE_ARRAY_LAYERS; 1584a49301eSmrg case PIPE_CAP_BLEND_EQUATION_SEPARATE: 1594a49301eSmrg return 1; 160cdc920a0Smrg case PIPE_CAP_INDEP_BLEND_ENABLE: 1613464ebd5Sriastradh return 1; 162cdc920a0Smrg case PIPE_CAP_INDEP_BLEND_FUNC: 1633464ebd5Sriastradh return 1; 164cdc920a0Smrg case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT: 165cdc920a0Smrg case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER: 166af69d88dSmrg case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER: 167cdc920a0Smrg return 1; 1683464ebd5Sriastradh case PIPE_CAP_PRIMITIVE_RESTART: 1697ec681f3Smrg case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX: 1703464ebd5Sriastradh return 1; 171af69d88dSmrg case PIPE_CAP_DEPTH_CLIP_DISABLE: 1723464ebd5Sriastradh return 1; 1737ec681f3Smrg case PIPE_CAP_DEPTH_CLAMP_ENABLE: 1747ec681f3Smrg return 1; 175af69d88dSmrg case PIPE_CAP_SHADER_STENCIL_EXPORT: 17601e04c3fSmrg return 1; 1773464ebd5Sriastradh case PIPE_CAP_TGSI_INSTANCEID: 1783464ebd5Sriastradh case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR: 17901e04c3fSmrg case PIPE_CAP_START_INSTANCE: 1803464ebd5Sriastradh case PIPE_CAP_MIXED_COLORBUFFER_FORMATS: 1813464ebd5Sriastradh return 1; 182af69d88dSmrg case PIPE_CAP_SEAMLESS_CUBE_MAP: 183af69d88dSmrg case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE: 184af69d88dSmrg return 1; 185af69d88dSmrg /* this is a lie could support arbitrary large offsets */ 186af69d88dSmrg case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET: 187af69d88dSmrg case PIPE_CAP_MIN_TEXEL_OFFSET: 18801e04c3fSmrg return -32; 189af69d88dSmrg case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET: 190af69d88dSmrg case PIPE_CAP_MAX_TEXEL_OFFSET: 19101e04c3fSmrg return 31; 192af69d88dSmrg case PIPE_CAP_CONDITIONAL_RENDER: 193af69d88dSmrg case PIPE_CAP_TEXTURE_BARRIER: 1947ec681f3Smrg return 1; 195af69d88dSmrg case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS: 196af69d88dSmrg case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS: 197af69d88dSmrg return 16*4; 198af69d88dSmrg case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES: 199af69d88dSmrg case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: 200af69d88dSmrg return 1024; 2017ec681f3Smrg case PIPE_CAP_MAX_VERTEX_STREAMS: { 2027ec681f3Smrg struct llvmpipe_screen *lscreen = llvmpipe_screen(screen); 2037ec681f3Smrg return lscreen->use_tgsi ? 1 : 4; 2047ec681f3Smrg } 20501e04c3fSmrg case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE: 20601e04c3fSmrg return 2048; 207af69d88dSmrg case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: 20801e04c3fSmrg case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS: 209af69d88dSmrg case PIPE_CAP_VERTEX_COLOR_UNCLAMPED: 210af69d88dSmrg case PIPE_CAP_VERTEX_COLOR_CLAMPED: 211af69d88dSmrg return 1; 21201e04c3fSmrg case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY: 2137ec681f3Smrg case PIPE_CAP_GLSL_FEATURE_LEVEL: { 2147ec681f3Smrg struct llvmpipe_screen *lscreen = llvmpipe_screen(screen); 2157ec681f3Smrg return lscreen->use_tgsi ? 330 : 450; 2167ec681f3Smrg } 217af69d88dSmrg case PIPE_CAP_COMPUTE: 2187ec681f3Smrg return GALLIVM_HAVE_CORO; 219af69d88dSmrg case PIPE_CAP_USER_VERTEX_BUFFERS: 220af69d88dSmrg return 1; 221af69d88dSmrg case PIPE_CAP_TGSI_TEXCOORD: 222af69d88dSmrg case PIPE_CAP_DRAW_INDIRECT: 223af69d88dSmrg return 1; 224af69d88dSmrg 22501e04c3fSmrg case PIPE_CAP_CUBE_MAP_ARRAY: 22601e04c3fSmrg return 1; 227af69d88dSmrg case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT: 228af69d88dSmrg return 16; 229af69d88dSmrg case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: 230af69d88dSmrg return 64; 231af69d88dSmrg case PIPE_CAP_TEXTURE_BUFFER_OBJECTS: 232af69d88dSmrg return 1; 2337ec681f3Smrg /* Adressing that many 64bpp texels fits in an i32 so this is a reasonable value */ 234af69d88dSmrg case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE: 2357ec681f3Smrg return 134217728; 236af69d88dSmrg case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: 2377ec681f3Smrg return 16; 238af69d88dSmrg case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: 239af69d88dSmrg return 0; 240af69d88dSmrg case PIPE_CAP_MAX_VIEWPORTS: 241af69d88dSmrg return PIPE_MAX_VIEWPORTS; 242af69d88dSmrg case PIPE_CAP_ENDIANNESS: 243af69d88dSmrg return PIPE_ENDIAN_NATIVE; 2447ec681f3Smrg case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT: 245af69d88dSmrg case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT: 24601e04c3fSmrg return 1; 24701e04c3fSmrg case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT: 24801e04c3fSmrg return 1; 249af69d88dSmrg case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS: 25001e04c3fSmrg return 4; 251af69d88dSmrg case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION: 25201e04c3fSmrg return 1; 253af69d88dSmrg case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: 2547ec681f3Smrg return 1; 25501e04c3fSmrg case PIPE_CAP_TGSI_TEX_TXF_LZ: 25601e04c3fSmrg case PIPE_CAP_SAMPLER_VIEW_TARGET: 25701e04c3fSmrg return 1; 2587ec681f3Smrg case PIPE_CAP_FAKE_SW_MSAA: { 2597ec681f3Smrg struct llvmpipe_screen *lscreen = llvmpipe_screen(screen); 2607ec681f3Smrg return lscreen->use_tgsi ? 1 : 0; 2617ec681f3Smrg } 26201e04c3fSmrg case PIPE_CAP_TEXTURE_QUERY_LOD: 263af69d88dSmrg case PIPE_CAP_CONDITIONAL_RENDER_INVERTED: 26401e04c3fSmrg case PIPE_CAP_TGSI_ARRAY_COMPONENTS: 26501e04c3fSmrg case PIPE_CAP_DOUBLES: 26601e04c3fSmrg case PIPE_CAP_INT64: 26701e04c3fSmrg case PIPE_CAP_INT64_DIVMOD: 26801e04c3fSmrg case PIPE_CAP_QUERY_SO_OVERFLOW: 2699f464c52Smaya case PIPE_CAP_TGSI_DIV: 270af69d88dSmrg return 1; 271af69d88dSmrg 272af69d88dSmrg case PIPE_CAP_VENDOR_ID: 273af69d88dSmrg return 0xFFFFFFFF; 274af69d88dSmrg case PIPE_CAP_DEVICE_ID: 275af69d88dSmrg return 0xFFFFFFFF; 276af69d88dSmrg case PIPE_CAP_ACCELERATED: 277af69d88dSmrg return 0; 278af69d88dSmrg case PIPE_CAP_VIDEO_MEMORY: { 279af69d88dSmrg /* XXX: Do we want to return the full amount fo system memory ? */ 280af69d88dSmrg uint64_t system_memory; 281af69d88dSmrg 282af69d88dSmrg if (!os_get_total_physical_memory(&system_memory)) 283af69d88dSmrg return 0; 284af69d88dSmrg 28501e04c3fSmrg if (sizeof(void *) == 4) 28601e04c3fSmrg /* Cap to 2 GB on 32 bits system. We do this because llvmpipe does 28701e04c3fSmrg * eat application memory, which is quite limited on 32 bits. App 28801e04c3fSmrg * shouldn't expect too much available memory. */ 28901e04c3fSmrg system_memory = MIN2(system_memory, 2048 << 20); 29001e04c3fSmrg 291af69d88dSmrg return (int)(system_memory >> 20); 2924a49301eSmrg } 293af69d88dSmrg case PIPE_CAP_UMA: 294af69d88dSmrg return 0; 29501e04c3fSmrg case PIPE_CAP_CLIP_HALFZ: 29601e04c3fSmrg return 1; 29701e04c3fSmrg case PIPE_CAP_POLYGON_OFFSET_CLAMP: 29801e04c3fSmrg case PIPE_CAP_TEXTURE_FLOAT_LINEAR: 29901e04c3fSmrg case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR: 30001e04c3fSmrg return 1; 30101e04c3fSmrg case PIPE_CAP_CULL_DISTANCE: 30201e04c3fSmrg return 1; 30301e04c3fSmrg case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS: 30401e04c3fSmrg return 1; 30501e04c3fSmrg case PIPE_CAP_CLEAR_TEXTURE: 30601e04c3fSmrg return 1; 3079f464c52Smaya case PIPE_CAP_MAX_VARYINGS: 3089f464c52Smaya return 32; 3097ec681f3Smrg case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT: 3107ec681f3Smrg return 16; 3117ec681f3Smrg case PIPE_CAP_QUERY_BUFFER_OBJECT: 3127ec681f3Smrg return 1; 31301e04c3fSmrg case PIPE_CAP_DRAW_PARAMETERS: 3147ec681f3Smrg return 1; 3157ec681f3Smrg case PIPE_CAP_FBFETCH: 3167ec681f3Smrg return 8; 3177ec681f3Smrg case PIPE_CAP_FBFETCH_COHERENT: 3187ec681f3Smrg return 0; 31901e04c3fSmrg case PIPE_CAP_MULTI_DRAW_INDIRECT: 32001e04c3fSmrg case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS: 3217ec681f3Smrg return 1; 3227ec681f3Smrg case PIPE_CAP_DEVICE_RESET_STATUS_QUERY: 3237ec681f3Smrg case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR: 3247ec681f3Smrg return 1; 3257ec681f3Smrg case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS: 3267ec681f3Smrg return 32; 3277ec681f3Smrg case PIPE_CAP_RASTERIZER_SUBPIXEL_BITS: 3287ec681f3Smrg return 8; 32901e04c3fSmrg case PIPE_CAP_PCI_GROUP: 33001e04c3fSmrg case PIPE_CAP_PCI_BUS: 33101e04c3fSmrg case PIPE_CAP_PCI_DEVICE: 33201e04c3fSmrg case PIPE_CAP_PCI_FUNCTION: 33301e04c3fSmrg case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: 33401e04c3fSmrg case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION: 33501e04c3fSmrg return 0; 3367ec681f3Smrg 3377ec681f3Smrg case PIPE_CAP_SHAREABLE_SHADERS: 3387ec681f3Smrg /* Can't expose shareable shaders because the draw shaders reference the 3397ec681f3Smrg * draw module's state, which is per-context. 3407ec681f3Smrg */ 3417ec681f3Smrg return 0; 3427ec681f3Smrg 34301e04c3fSmrg case PIPE_CAP_MAX_GS_INVOCATIONS: 34401e04c3fSmrg return 32; 34501e04c3fSmrg case PIPE_CAP_MAX_SHADER_BUFFER_SIZE: 3467ec681f3Smrg return LP_MAX_TGSI_SHADER_BUFFER_SIZE; 3477ec681f3Smrg case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT: 3487ec681f3Smrg case PIPE_CAP_TGSI_TG4_COMPONENT_IN_SWIZZLE: 3497ec681f3Smrg case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL: 3507ec681f3Smrg case PIPE_CAP_RESOURCE_FROM_USER_MEMORY: 3517ec681f3Smrg return 1; 3527ec681f3Smrg#ifdef PIPE_MEMORY_FD 3537ec681f3Smrg case PIPE_CAP_MEMOBJ: 3547ec681f3Smrg return 1; 3557ec681f3Smrg#endif 3567ec681f3Smrg case PIPE_CAP_SAMPLER_REDUCTION_MINMAX: 3577ec681f3Smrg case PIPE_CAP_TGSI_TXQS: 3587ec681f3Smrg case PIPE_CAP_TGSI_VOTE: 3597ec681f3Smrg case PIPE_CAP_LOAD_CONSTBUF: 3607ec681f3Smrg case PIPE_CAP_TEXTURE_MULTISAMPLE: 3617ec681f3Smrg case PIPE_CAP_SAMPLE_SHADING: 3627ec681f3Smrg case PIPE_CAP_GL_SPIRV: 3637ec681f3Smrg case PIPE_CAP_POST_DEPTH_COVERAGE: 3647ec681f3Smrg case PIPE_CAP_PACKED_UNIFORMS: { 3657ec681f3Smrg struct llvmpipe_screen *lscreen = llvmpipe_screen(screen); 3667ec681f3Smrg return !lscreen->use_tgsi; 3677ec681f3Smrg } 36801e04c3fSmrg default: 36901e04c3fSmrg return u_pipe_screen_get_param_defaults(screen, param); 370af69d88dSmrg } 3714a49301eSmrg} 3724a49301eSmrg 3733464ebd5Sriastradhstatic int 37401e04c3fSmrgllvmpipe_get_shader_param(struct pipe_screen *screen, 37501e04c3fSmrg enum pipe_shader_type shader, 37601e04c3fSmrg enum pipe_shader_cap param) 3773464ebd5Sriastradh{ 3787ec681f3Smrg struct llvmpipe_screen *lscreen = llvmpipe_screen(screen); 3793464ebd5Sriastradh switch(shader) 3803464ebd5Sriastradh { 3817ec681f3Smrg case PIPE_SHADER_COMPUTE: 3827ec681f3Smrg if ((lscreen->allow_cl) && param == PIPE_SHADER_CAP_SUPPORTED_IRS) 3837ec681f3Smrg return (1 << PIPE_SHADER_IR_TGSI) | (1 << PIPE_SHADER_IR_NIR) | (1 << PIPE_SHADER_IR_NIR_SERIALIZED); 3847ec681f3Smrg FALLTHROUGH; 3853464ebd5Sriastradh case PIPE_SHADER_FRAGMENT: 3867ec681f3Smrg if (param == PIPE_SHADER_CAP_PREFERRED_IR) { 3877ec681f3Smrg if (lscreen->use_tgsi) 3887ec681f3Smrg return PIPE_SHADER_IR_TGSI; 3897ec681f3Smrg else 3907ec681f3Smrg return PIPE_SHADER_IR_NIR; 391af69d88dSmrg } 3927ec681f3Smrg 3937ec681f3Smrg return gallivm_get_shader_param(param); 3947ec681f3Smrg case PIPE_SHADER_TESS_CTRL: 3957ec681f3Smrg case PIPE_SHADER_TESS_EVAL: 3967ec681f3Smrg /* Tessellation shader needs llvm coroutines support */ 3977ec681f3Smrg if (!GALLIVM_HAVE_CORO || lscreen->use_tgsi) 3987ec681f3Smrg return 0; 3997ec681f3Smrg FALLTHROUGH; 4003464ebd5Sriastradh case PIPE_SHADER_VERTEX: 4013464ebd5Sriastradh case PIPE_SHADER_GEOMETRY: 4027ec681f3Smrg if (param == PIPE_SHADER_CAP_PREFERRED_IR) { 4037ec681f3Smrg if (lscreen->use_tgsi) 4047ec681f3Smrg return PIPE_SHADER_IR_TGSI; 4057ec681f3Smrg else 4067ec681f3Smrg return PIPE_SHADER_IR_NIR; 4077ec681f3Smrg } 4087ec681f3Smrg 409af69d88dSmrg switch (param) { 410af69d88dSmrg case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: 411af69d88dSmrg /* At this time, the draw module and llvmpipe driver only 412af69d88dSmrg * support vertex shader texture lookups when LLVM is enabled in 413af69d88dSmrg * the draw module. 414af69d88dSmrg */ 415af69d88dSmrg if (debug_get_bool_option("DRAW_USE_LLVM", TRUE)) 416af69d88dSmrg return PIPE_MAX_SAMPLERS; 417af69d88dSmrg else 418af69d88dSmrg return 0; 419af69d88dSmrg case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: 420af69d88dSmrg if (debug_get_bool_option("DRAW_USE_LLVM", TRUE)) 421af69d88dSmrg return PIPE_MAX_SHADER_SAMPLER_VIEWS; 422af69d88dSmrg else 423af69d88dSmrg return 0; 424af69d88dSmrg default: 425af69d88dSmrg return draw_get_shader_param(shader, param); 426af69d88dSmrg } 4273464ebd5Sriastradh default: 4283464ebd5Sriastradh return 0; 4293464ebd5Sriastradh } 4303464ebd5Sriastradh} 4314a49301eSmrg 4324a49301eSmrgstatic float 433af69d88dSmrgllvmpipe_get_paramf(struct pipe_screen *screen, enum pipe_capf param) 4344a49301eSmrg{ 4354a49301eSmrg switch (param) { 436af69d88dSmrg case PIPE_CAPF_MAX_LINE_WIDTH: 4377ec681f3Smrg FALLTHROUGH; 438af69d88dSmrg case PIPE_CAPF_MAX_LINE_WIDTH_AA: 4394a49301eSmrg return 255.0; /* arbitrary */ 440af69d88dSmrg case PIPE_CAPF_MAX_POINT_WIDTH: 4417ec681f3Smrg FALLTHROUGH; 442af69d88dSmrg case PIPE_CAPF_MAX_POINT_WIDTH_AA: 4437ec681f3Smrg return LP_MAX_POINT_WIDTH; /* arbitrary */ 444af69d88dSmrg case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY: 4454a49301eSmrg return 16.0; /* not actually signficant at this time */ 446af69d88dSmrg case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS: 4474a49301eSmrg return 16.0; /* arbitrary */ 44801e04c3fSmrg case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE: 44901e04c3fSmrg return 0.0; 45001e04c3fSmrg case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE: 45101e04c3fSmrg return 0.0; 45201e04c3fSmrg case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY: 4533464ebd5Sriastradh return 0.0; 4544a49301eSmrg } 455af69d88dSmrg /* should only get here on unhandled cases */ 456af69d88dSmrg debug_printf("Unexpected PIPE_CAP %d query\n", param); 457af69d88dSmrg return 0.0; 4584a49301eSmrg} 4594a49301eSmrg 4607ec681f3Smrgstatic int 4617ec681f3Smrgllvmpipe_get_compute_param(struct pipe_screen *_screen, 4627ec681f3Smrg enum pipe_shader_ir ir_type, 4637ec681f3Smrg enum pipe_compute_cap param, 4647ec681f3Smrg void *ret) 4657ec681f3Smrg{ 4667ec681f3Smrg switch (param) { 4677ec681f3Smrg case PIPE_COMPUTE_CAP_IR_TARGET: 4687ec681f3Smrg return 0; 4697ec681f3Smrg case PIPE_COMPUTE_CAP_MAX_GRID_SIZE: 4707ec681f3Smrg if (ret) { 4717ec681f3Smrg uint64_t *grid_size = ret; 4727ec681f3Smrg grid_size[0] = 65535; 4737ec681f3Smrg grid_size[1] = 65535; 4747ec681f3Smrg grid_size[2] = 65535; 4757ec681f3Smrg } 4767ec681f3Smrg return 3 * sizeof(uint64_t) ; 4777ec681f3Smrg case PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE: 4787ec681f3Smrg if (ret) { 4797ec681f3Smrg uint64_t *block_size = ret; 4807ec681f3Smrg block_size[0] = 1024; 4817ec681f3Smrg block_size[1] = 1024; 4827ec681f3Smrg block_size[2] = 1024; 4837ec681f3Smrg } 4847ec681f3Smrg return 3 * sizeof(uint64_t); 4857ec681f3Smrg case PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK: 4867ec681f3Smrg if (ret) { 4877ec681f3Smrg uint64_t *max_threads_per_block = ret; 4887ec681f3Smrg *max_threads_per_block = 1024; 4897ec681f3Smrg } 4907ec681f3Smrg return sizeof(uint64_t); 4917ec681f3Smrg case PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE: 4927ec681f3Smrg if (ret) { 4937ec681f3Smrg uint64_t *max_local_size = ret; 4947ec681f3Smrg *max_local_size = 32768; 4957ec681f3Smrg } 4967ec681f3Smrg return sizeof(uint64_t); 4977ec681f3Smrg case PIPE_COMPUTE_CAP_GRID_DIMENSION: 4987ec681f3Smrg if (ret) { 4997ec681f3Smrg uint32_t *grid_dim = ret; 5007ec681f3Smrg *grid_dim = 3; 5017ec681f3Smrg } 5027ec681f3Smrg return sizeof(uint32_t); 5037ec681f3Smrg case PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE: 5047ec681f3Smrg if (ret) { 5057ec681f3Smrg uint64_t *max_global_size = ret; 5067ec681f3Smrg *max_global_size = (1ULL << 31); 5077ec681f3Smrg } 5087ec681f3Smrg return sizeof(uint64_t); 5097ec681f3Smrg case PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE: 5107ec681f3Smrg if (ret) { 5117ec681f3Smrg uint64_t *max_mem_alloc_size = ret; 5127ec681f3Smrg *max_mem_alloc_size = (1ULL << 31); 5137ec681f3Smrg } 5147ec681f3Smrg return sizeof(uint64_t); 5157ec681f3Smrg case PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE: 5167ec681f3Smrg if (ret) { 5177ec681f3Smrg uint64_t *max_private = ret; 5187ec681f3Smrg *max_private = (1UL << 31); 5197ec681f3Smrg } 5207ec681f3Smrg return sizeof(uint64_t); 5217ec681f3Smrg case PIPE_COMPUTE_CAP_MAX_INPUT_SIZE: 5227ec681f3Smrg if (ret) { 5237ec681f3Smrg uint64_t *max_input = ret; 5247ec681f3Smrg *max_input = 1576; 5257ec681f3Smrg } 5267ec681f3Smrg return sizeof(uint64_t); 5277ec681f3Smrg case PIPE_COMPUTE_CAP_IMAGES_SUPPORTED: 5287ec681f3Smrg if (ret) { 5297ec681f3Smrg uint32_t *images = ret; 5307ec681f3Smrg *images = LP_MAX_TGSI_SHADER_IMAGES; 5317ec681f3Smrg } 5327ec681f3Smrg return sizeof(uint32_t); 5337ec681f3Smrg case PIPE_COMPUTE_CAP_MAX_VARIABLE_THREADS_PER_BLOCK: 5347ec681f3Smrg return 0; 5357ec681f3Smrg case PIPE_COMPUTE_CAP_SUBGROUP_SIZE: 5367ec681f3Smrg if (ret) { 5377ec681f3Smrg uint32_t *subgroup_size = ret; 5387ec681f3Smrg *subgroup_size = 32; 5397ec681f3Smrg } 5407ec681f3Smrg return sizeof(uint32_t); 5417ec681f3Smrg case PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS: 5427ec681f3Smrg if (ret) { 5437ec681f3Smrg uint32_t *max_compute_units = ret; 5447ec681f3Smrg *max_compute_units = 8; 5457ec681f3Smrg } 5467ec681f3Smrg return sizeof(uint32_t); 5477ec681f3Smrg case PIPE_COMPUTE_CAP_MAX_CLOCK_FREQUENCY: 5487ec681f3Smrg if (ret) { 5497ec681f3Smrg uint32_t *max_clock_freq = ret; 5507ec681f3Smrg *max_clock_freq = 300; 5517ec681f3Smrg } 5527ec681f3Smrg return sizeof(uint32_t); 5537ec681f3Smrg case PIPE_COMPUTE_CAP_ADDRESS_BITS: 5547ec681f3Smrg if (ret) { 5557ec681f3Smrg uint32_t *address_bits = ret; 5567ec681f3Smrg *address_bits = 64; 5577ec681f3Smrg } 5587ec681f3Smrg return sizeof(uint32_t); 5597ec681f3Smrg } 5607ec681f3Smrg return 0; 5617ec681f3Smrg} 5627ec681f3Smrg 5637ec681f3Smrgstatic void 5647ec681f3Smrgllvmpipe_get_driver_uuid(struct pipe_screen *pscreen, char *uuid) 5657ec681f3Smrg{ 5667ec681f3Smrg memset(uuid, 0, PIPE_UUID_SIZE); 5677ec681f3Smrg} 5687ec681f3Smrg 5697ec681f3Smrgstatic void 5707ec681f3Smrgllvmpipe_get_device_uuid(struct pipe_screen *pscreen, char *uuid) 5717ec681f3Smrg{ 5727ec681f3Smrg memset(uuid, 0, PIPE_UUID_SIZE); 5737ec681f3Smrg} 5747ec681f3Smrg 5757ec681f3Smrgstatic const struct nir_shader_compiler_options gallivm_nir_options = { 5767ec681f3Smrg .lower_scmp = true, 5777ec681f3Smrg .lower_flrp32 = true, 5787ec681f3Smrg .lower_flrp64 = true, 5797ec681f3Smrg .lower_fsat = true, 5807ec681f3Smrg .lower_bitfield_insert_to_shifts = true, 5817ec681f3Smrg .lower_bitfield_extract_to_shifts = true, 5827ec681f3Smrg .lower_fdot = true, 5837ec681f3Smrg .lower_fdph = true, 5847ec681f3Smrg .lower_ffma16 = true, 5857ec681f3Smrg .lower_ffma32 = true, 5867ec681f3Smrg .lower_ffma64 = true, 5877ec681f3Smrg .lower_flrp16 = true, 5887ec681f3Smrg .lower_fmod = true, 5897ec681f3Smrg .lower_hadd = true, 5907ec681f3Smrg .lower_uadd_sat = true, 5917ec681f3Smrg .lower_iadd_sat = true, 5927ec681f3Smrg .lower_ldexp = true, 5937ec681f3Smrg .lower_pack_snorm_2x16 = true, 5947ec681f3Smrg .lower_pack_snorm_4x8 = true, 5957ec681f3Smrg .lower_pack_unorm_2x16 = true, 5967ec681f3Smrg .lower_pack_unorm_4x8 = true, 5977ec681f3Smrg .lower_pack_half_2x16 = true, 5987ec681f3Smrg .lower_pack_split = true, 5997ec681f3Smrg .lower_unpack_snorm_2x16 = true, 6007ec681f3Smrg .lower_unpack_snorm_4x8 = true, 6017ec681f3Smrg .lower_unpack_unorm_2x16 = true, 6027ec681f3Smrg .lower_unpack_unorm_4x8 = true, 6037ec681f3Smrg .lower_unpack_half_2x16 = true, 6047ec681f3Smrg .lower_extract_byte = true, 6057ec681f3Smrg .lower_extract_word = true, 6067ec681f3Smrg .lower_insert_byte = true, 6077ec681f3Smrg .lower_insert_word = true, 6087ec681f3Smrg .lower_rotate = true, 6097ec681f3Smrg .lower_uadd_carry = true, 6107ec681f3Smrg .lower_usub_borrow = true, 6117ec681f3Smrg .lower_mul_2x32_64 = true, 6127ec681f3Smrg .lower_ifind_msb = true, 6137ec681f3Smrg .max_unroll_iterations = 32, 6147ec681f3Smrg .use_interpolated_input_intrinsics = true, 6157ec681f3Smrg .lower_to_scalar = true, 6167ec681f3Smrg .lower_uniforms_to_ubo = true, 6177ec681f3Smrg .lower_vector_cmp = true, 6187ec681f3Smrg .lower_device_index_to_zero = true, 6197ec681f3Smrg .support_16bit_alu = true, 6207ec681f3Smrg .lower_fisnormal = true, 6217ec681f3Smrg}; 6227ec681f3Smrg 6237ec681f3Smrgstatic char * 6247ec681f3Smrgllvmpipe_finalize_nir(struct pipe_screen *screen, 6257ec681f3Smrg void *nirptr) 6267ec681f3Smrg{ 6277ec681f3Smrg struct nir_shader *nir = (struct nir_shader *)nirptr; 6287ec681f3Smrg lp_build_opt_nir(nir); 6297ec681f3Smrg return NULL; 6307ec681f3Smrg} 6317ec681f3Smrg 6327ec681f3Smrgstatic inline const void * 6337ec681f3Smrgllvmpipe_get_compiler_options(struct pipe_screen *screen, 6347ec681f3Smrg enum pipe_shader_ir ir, 6357ec681f3Smrg enum pipe_shader_type shader) 6367ec681f3Smrg{ 6377ec681f3Smrg assert(ir == PIPE_SHADER_IR_NIR); 6387ec681f3Smrg return &gallivm_nir_options; 6397ec681f3Smrg} 6404a49301eSmrg 6414a49301eSmrg/** 6424a49301eSmrg * Query format support for creating a texture, drawing surface, etc. 6434a49301eSmrg * \param format the format to test 6444a49301eSmrg * \param type one of PIPE_TEXTURE, PIPE_SURFACE 6454a49301eSmrg */ 6467ec681f3Smrgstatic bool 6474a49301eSmrgllvmpipe_is_format_supported( struct pipe_screen *_screen, 6483464ebd5Sriastradh enum pipe_format format, 6494a49301eSmrg enum pipe_texture_target target, 6503464ebd5Sriastradh unsigned sample_count, 65101e04c3fSmrg unsigned storage_sample_count, 6523464ebd5Sriastradh unsigned bind) 6534a49301eSmrg{ 6544a49301eSmrg struct llvmpipe_screen *screen = llvmpipe_screen(_screen); 6553464ebd5Sriastradh struct sw_winsys *winsys = screen->winsys; 6564a49301eSmrg const struct util_format_description *format_desc; 6574a49301eSmrg 6584a49301eSmrg format_desc = util_format_description(format); 6593464ebd5Sriastradh if (!format_desc) 6607ec681f3Smrg return false; 6614a49301eSmrg 6623464ebd5Sriastradh assert(target == PIPE_BUFFER || 6633464ebd5Sriastradh target == PIPE_TEXTURE_1D || 664af69d88dSmrg target == PIPE_TEXTURE_1D_ARRAY || 6654a49301eSmrg target == PIPE_TEXTURE_2D || 666af69d88dSmrg target == PIPE_TEXTURE_2D_ARRAY || 6673464ebd5Sriastradh target == PIPE_TEXTURE_RECT || 6684a49301eSmrg target == PIPE_TEXTURE_3D || 669af69d88dSmrg target == PIPE_TEXTURE_CUBE || 670af69d88dSmrg target == PIPE_TEXTURE_CUBE_ARRAY); 6714a49301eSmrg 6727ec681f3Smrg if (sample_count != 0 && sample_count != 1 && sample_count != 4) 6737ec681f3Smrg return false; 6744a49301eSmrg 67501e04c3fSmrg if (MAX2(1, sample_count) != MAX2(1, storage_sample_count)) 67601e04c3fSmrg return false; 67701e04c3fSmrg 6787ec681f3Smrg if (bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_SHADER_IMAGE)) { 679af69d88dSmrg if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 680af69d88dSmrg /* this is a lie actually other formats COULD exist where we would fail */ 681af69d88dSmrg if (format_desc->nr_channels < 3) 6827ec681f3Smrg return false; 683af69d88dSmrg } 684af69d88dSmrg else if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_RGB) 6857ec681f3Smrg return false; 6864a49301eSmrg 687af69d88dSmrg if (format_desc->layout != UTIL_FORMAT_LAYOUT_PLAIN && 688af69d88dSmrg format != PIPE_FORMAT_R11G11B10_FLOAT) 6897ec681f3Smrg return false; 690af69d88dSmrg 691af69d88dSmrg assert(format_desc->block.width == 1); 692af69d88dSmrg assert(format_desc->block.height == 1); 693af69d88dSmrg 694af69d88dSmrg if (format_desc->is_mixed) 6957ec681f3Smrg return false; 6964a49301eSmrg 697af69d88dSmrg if (!format_desc->is_array && !format_desc->is_bitmask && 698af69d88dSmrg format != PIPE_FORMAT_R11G11B10_FLOAT) 6997ec681f3Smrg return false; 7007ec681f3Smrg } 7017ec681f3Smrg 7027ec681f3Smrg if (bind & PIPE_BIND_SHADER_IMAGE) { 7037ec681f3Smrg switch (format) { 7047ec681f3Smrg case PIPE_FORMAT_R32G32B32A32_FLOAT: 7057ec681f3Smrg case PIPE_FORMAT_R16G16B16A16_FLOAT: 7067ec681f3Smrg case PIPE_FORMAT_R32G32_FLOAT: 7077ec681f3Smrg case PIPE_FORMAT_R16G16_FLOAT: 7087ec681f3Smrg case PIPE_FORMAT_R11G11B10_FLOAT: 7097ec681f3Smrg case PIPE_FORMAT_R32_FLOAT: 7107ec681f3Smrg case PIPE_FORMAT_R16_FLOAT: 7117ec681f3Smrg case PIPE_FORMAT_R32G32B32A32_UINT: 7127ec681f3Smrg case PIPE_FORMAT_R16G16B16A16_UINT: 7137ec681f3Smrg case PIPE_FORMAT_R10G10B10A2_UINT: 7147ec681f3Smrg case PIPE_FORMAT_R8G8B8A8_UINT: 7157ec681f3Smrg case PIPE_FORMAT_R32G32_UINT: 7167ec681f3Smrg case PIPE_FORMAT_R16G16_UINT: 7177ec681f3Smrg case PIPE_FORMAT_R8G8_UINT: 7187ec681f3Smrg case PIPE_FORMAT_R32_UINT: 7197ec681f3Smrg case PIPE_FORMAT_R16_UINT: 7207ec681f3Smrg case PIPE_FORMAT_R8_UINT: 7217ec681f3Smrg case PIPE_FORMAT_R32G32B32A32_SINT: 7227ec681f3Smrg case PIPE_FORMAT_R16G16B16A16_SINT: 7237ec681f3Smrg case PIPE_FORMAT_R8G8B8A8_SINT: 7247ec681f3Smrg case PIPE_FORMAT_R32G32_SINT: 7257ec681f3Smrg case PIPE_FORMAT_R16G16_SINT: 7267ec681f3Smrg case PIPE_FORMAT_R8G8_SINT: 7277ec681f3Smrg case PIPE_FORMAT_R32_SINT: 7287ec681f3Smrg case PIPE_FORMAT_R16_SINT: 7297ec681f3Smrg case PIPE_FORMAT_R8_SINT: 7307ec681f3Smrg case PIPE_FORMAT_R16G16B16A16_UNORM: 7317ec681f3Smrg case PIPE_FORMAT_R10G10B10A2_UNORM: 7327ec681f3Smrg case PIPE_FORMAT_R8G8B8A8_UNORM: 7337ec681f3Smrg case PIPE_FORMAT_R16G16_UNORM: 7347ec681f3Smrg case PIPE_FORMAT_R8G8_UNORM: 7357ec681f3Smrg case PIPE_FORMAT_R16_UNORM: 7367ec681f3Smrg case PIPE_FORMAT_R8_UNORM: 7377ec681f3Smrg case PIPE_FORMAT_R16G16B16A16_SNORM: 7387ec681f3Smrg case PIPE_FORMAT_R8G8B8A8_SNORM: 7397ec681f3Smrg case PIPE_FORMAT_R16G16_SNORM: 7407ec681f3Smrg case PIPE_FORMAT_R8G8_SNORM: 7417ec681f3Smrg case PIPE_FORMAT_R16_SNORM: 7427ec681f3Smrg case PIPE_FORMAT_R8_SNORM: 7437ec681f3Smrg break; 7447ec681f3Smrg 7457ec681f3Smrg default: 7467ec681f3Smrg return false; 7477ec681f3Smrg } 74801e04c3fSmrg } 749af69d88dSmrg 75001e04c3fSmrg if ((bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW)) && 75101e04c3fSmrg ((bind & PIPE_BIND_DISPLAY_TARGET) == 0)) { 75201e04c3fSmrg /* Disable all 3-channel formats, where channel size != 32 bits. 75301e04c3fSmrg * In some cases we run into crashes (in generate_unswizzled_blend()), 75401e04c3fSmrg * for 3-channel RGB16 variants, there was an apparent LLVM bug. 75501e04c3fSmrg * In any case, disabling the shallower 3-channel formats avoids a 75601e04c3fSmrg * number of issues with GL_ARB_copy_image support. 757af69d88dSmrg */ 75801e04c3fSmrg if (format_desc->is_array && 75901e04c3fSmrg format_desc->nr_channels == 3 && 76001e04c3fSmrg format_desc->block.bits != 96) { 7617ec681f3Smrg return false; 7627ec681f3Smrg } 7637ec681f3Smrg 7647ec681f3Smrg /* Disable 64-bit integer formats for RT/samplers. 7657ec681f3Smrg * VK CTS crashes with these and they don't make much sense. 7667ec681f3Smrg */ 7677ec681f3Smrg int c = util_format_get_first_non_void_channel(format_desc->format); 7687ec681f3Smrg if (c >= 0) { 7697ec681f3Smrg if (format_desc->channel[c].pure_integer && format_desc->channel[c].size == 64) 7707ec681f3Smrg return false; 771af69d88dSmrg } 7727ec681f3Smrg 7734a49301eSmrg } 7744a49301eSmrg 7757ec681f3Smrg if (!(bind & PIPE_BIND_VERTEX_BUFFER) && 7767ec681f3Smrg util_format_is_scaled(format)) 7777ec681f3Smrg return false; 7787ec681f3Smrg 7793464ebd5Sriastradh if (bind & PIPE_BIND_DISPLAY_TARGET) { 7803464ebd5Sriastradh if(!winsys->is_displaytarget_format_supported(winsys, bind, format)) 7817ec681f3Smrg return false; 7824a49301eSmrg } 7834a49301eSmrg 7843464ebd5Sriastradh if (bind & PIPE_BIND_DEPTH_STENCIL) { 7853464ebd5Sriastradh if (format_desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) 7867ec681f3Smrg return false; 7874a49301eSmrg 7883464ebd5Sriastradh if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) 7897ec681f3Smrg return false; 7903464ebd5Sriastradh } 7914a49301eSmrg 7929f464c52Smaya if (format_desc->layout == UTIL_FORMAT_LAYOUT_ASTC || 7939f464c52Smaya format_desc->layout == UTIL_FORMAT_LAYOUT_ATC) { 794af69d88dSmrg /* Software decoding is not hooked up. */ 7957ec681f3Smrg return false; 7963464ebd5Sriastradh } 797cdc920a0Smrg 79801e04c3fSmrg if (format_desc->layout == UTIL_FORMAT_LAYOUT_ETC && 79901e04c3fSmrg format != PIPE_FORMAT_ETC1_RGB8) 8007ec681f3Smrg return false; 8014a49301eSmrg 8023464ebd5Sriastradh /* 803af69d88dSmrg * Everything can be supported by u_format 804af69d88dSmrg * (those without fetch_rgba_float might be not but shouldn't hit that) 8053464ebd5Sriastradh */ 806af69d88dSmrg 8077ec681f3Smrg return true; 8084a49301eSmrg} 8094a49301eSmrg 8104a49301eSmrg 8114a49301eSmrg 8124a49301eSmrg 8134a49301eSmrgstatic void 8144a49301eSmrgllvmpipe_flush_frontbuffer(struct pipe_screen *_screen, 8157ec681f3Smrg struct pipe_context *_pipe, 8163464ebd5Sriastradh struct pipe_resource *resource, 8173464ebd5Sriastradh unsigned level, unsigned layer, 818af69d88dSmrg void *context_private, 819af69d88dSmrg struct pipe_box *sub_box) 8204a49301eSmrg{ 8214a49301eSmrg struct llvmpipe_screen *screen = llvmpipe_screen(_screen); 8223464ebd5Sriastradh struct sw_winsys *winsys = screen->winsys; 8233464ebd5Sriastradh struct llvmpipe_resource *texture = llvmpipe_resource(resource); 8244a49301eSmrg 8254a49301eSmrg assert(texture->dt); 8264a49301eSmrg if (texture->dt) 827af69d88dSmrg winsys->displaytarget_display(winsys, texture->dt, context_private, sub_box); 8284a49301eSmrg} 8294a49301eSmrg 8304a49301eSmrgstatic void 8314a49301eSmrgllvmpipe_destroy_screen( struct pipe_screen *_screen ) 8324a49301eSmrg{ 8334a49301eSmrg struct llvmpipe_screen *screen = llvmpipe_screen(_screen); 8343464ebd5Sriastradh struct sw_winsys *winsys = screen->winsys; 8353464ebd5Sriastradh 8367ec681f3Smrg if (screen->cs_tpool) 8377ec681f3Smrg lp_cs_tpool_destroy(screen->cs_tpool); 8387ec681f3Smrg 8393464ebd5Sriastradh if (screen->rast) 8403464ebd5Sriastradh lp_rast_destroy(screen->rast); 8414a49301eSmrg 8424a49301eSmrg lp_jit_screen_cleanup(screen); 8434a49301eSmrg 8447ec681f3Smrg if (LP_DEBUG & DEBUG_CACHE_STATS) 8457ec681f3Smrg printf("disk shader cache: hits = %u, misses = %u\n", screen->num_disk_shader_cache_hits, 8467ec681f3Smrg screen->num_disk_shader_cache_misses); 8477ec681f3Smrg disk_cache_destroy(screen->disk_shader_cache); 8484a49301eSmrg if(winsys->destroy) 8494a49301eSmrg winsys->destroy(winsys); 8504a49301eSmrg 8517ec681f3Smrg glsl_type_singleton_decref(); 8523464ebd5Sriastradh 8537ec681f3Smrg mtx_destroy(&screen->rast_mutex); 8547ec681f3Smrg mtx_destroy(&screen->cs_mutex); 8554a49301eSmrg FREE(screen); 8564a49301eSmrg} 8574a49301eSmrg 8584a49301eSmrg 8594a49301eSmrg 8603464ebd5Sriastradh 8613464ebd5Sriastradh/** 8623464ebd5Sriastradh * Fence reference counting. 8633464ebd5Sriastradh */ 8643464ebd5Sriastradhstatic void 8653464ebd5Sriastradhllvmpipe_fence_reference(struct pipe_screen *screen, 8663464ebd5Sriastradh struct pipe_fence_handle **ptr, 8673464ebd5Sriastradh struct pipe_fence_handle *fence) 8683464ebd5Sriastradh{ 8693464ebd5Sriastradh struct lp_fence **old = (struct lp_fence **) ptr; 8703464ebd5Sriastradh struct lp_fence *f = (struct lp_fence *) fence; 8713464ebd5Sriastradh 8723464ebd5Sriastradh lp_fence_reference(old, f); 8733464ebd5Sriastradh} 8743464ebd5Sriastradh 8753464ebd5Sriastradh 8763464ebd5Sriastradh/** 8773464ebd5Sriastradh * Wait for the fence to finish. 8783464ebd5Sriastradh */ 8797ec681f3Smrgstatic bool 8803464ebd5Sriastradhllvmpipe_fence_finish(struct pipe_screen *screen, 88101e04c3fSmrg struct pipe_context *ctx, 8823464ebd5Sriastradh struct pipe_fence_handle *fence_handle, 8833464ebd5Sriastradh uint64_t timeout) 8843464ebd5Sriastradh{ 8853464ebd5Sriastradh struct lp_fence *f = (struct lp_fence *) fence_handle; 8863464ebd5Sriastradh 88701e04c3fSmrg if (!timeout) 88801e04c3fSmrg return lp_fence_signalled(f); 88901e04c3fSmrg 8909f464c52Smaya if (!lp_fence_signalled(f)) { 8919f464c52Smaya if (timeout != PIPE_TIMEOUT_INFINITE) 8929f464c52Smaya return lp_fence_timedwait(f, timeout); 8939f464c52Smaya 8949f464c52Smaya lp_fence_wait(f); 8959f464c52Smaya } 8967ec681f3Smrg return true; 8973464ebd5Sriastradh} 8983464ebd5Sriastradh 899af69d88dSmrgstatic uint64_t 900af69d88dSmrgllvmpipe_get_timestamp(struct pipe_screen *_screen) 901af69d88dSmrg{ 902af69d88dSmrg return os_time_get_nano(); 903af69d88dSmrg} 9043464ebd5Sriastradh 9057ec681f3Smrgstatic void update_cache_sha1_cpu(struct mesa_sha1 *ctx) 9067ec681f3Smrg{ 9077ec681f3Smrg const struct util_cpu_caps_t *cpu_caps = util_get_cpu_caps(); 9087ec681f3Smrg /* 9097ec681f3Smrg * Don't need the cpu cache affinity stuff. The rest 9107ec681f3Smrg * is contained in first 5 dwords. 9117ec681f3Smrg */ 9127ec681f3Smrg STATIC_ASSERT(offsetof(struct util_cpu_caps_t, num_L3_caches) == 5 * sizeof(uint32_t)); 9137ec681f3Smrg _mesa_sha1_update(ctx, cpu_caps, 5 * sizeof(uint32_t)); 9147ec681f3Smrg} 9157ec681f3Smrg 9167ec681f3Smrgstatic void lp_disk_cache_create(struct llvmpipe_screen *screen) 9177ec681f3Smrg{ 9187ec681f3Smrg struct mesa_sha1 ctx; 9197ec681f3Smrg unsigned gallivm_perf = gallivm_get_perf_flags(); 9207ec681f3Smrg unsigned char sha1[20]; 9217ec681f3Smrg char cache_id[20 * 2 + 1]; 9227ec681f3Smrg _mesa_sha1_init(&ctx); 9237ec681f3Smrg 9247ec681f3Smrg if (!disk_cache_get_function_identifier(lp_disk_cache_create, &ctx) || 9257ec681f3Smrg !disk_cache_get_function_identifier(LLVMLinkInMCJIT, &ctx)) 9267ec681f3Smrg return; 9277ec681f3Smrg 9287ec681f3Smrg _mesa_sha1_update(&ctx, &gallivm_perf, sizeof(gallivm_perf)); 9297ec681f3Smrg update_cache_sha1_cpu(&ctx); 9307ec681f3Smrg _mesa_sha1_final(&ctx, sha1); 9317ec681f3Smrg disk_cache_format_hex_id(cache_id, sha1, 20 * 2); 9327ec681f3Smrg 9337ec681f3Smrg screen->disk_shader_cache = disk_cache_create("llvmpipe", cache_id, 0); 9347ec681f3Smrg} 9357ec681f3Smrg 9367ec681f3Smrgstatic struct disk_cache *lp_get_disk_shader_cache(struct pipe_screen *_screen) 9377ec681f3Smrg{ 9387ec681f3Smrg struct llvmpipe_screen *screen = llvmpipe_screen(_screen); 9397ec681f3Smrg 9407ec681f3Smrg return screen->disk_shader_cache; 9417ec681f3Smrg} 9427ec681f3Smrg 9437ec681f3Smrgvoid lp_disk_cache_find_shader(struct llvmpipe_screen *screen, 9447ec681f3Smrg struct lp_cached_code *cache, 9457ec681f3Smrg unsigned char ir_sha1_cache_key[20]) 9467ec681f3Smrg{ 9477ec681f3Smrg unsigned char sha1[CACHE_KEY_SIZE]; 9487ec681f3Smrg 9497ec681f3Smrg if (!screen->disk_shader_cache) 9507ec681f3Smrg return; 9517ec681f3Smrg disk_cache_compute_key(screen->disk_shader_cache, ir_sha1_cache_key, 20, sha1); 9527ec681f3Smrg 9537ec681f3Smrg size_t binary_size; 9547ec681f3Smrg uint8_t *buffer = disk_cache_get(screen->disk_shader_cache, sha1, &binary_size); 9557ec681f3Smrg if (!buffer) { 9567ec681f3Smrg cache->data_size = 0; 9577ec681f3Smrg p_atomic_inc(&screen->num_disk_shader_cache_misses); 9587ec681f3Smrg return; 9597ec681f3Smrg } 9607ec681f3Smrg cache->data_size = binary_size; 9617ec681f3Smrg cache->data = buffer; 9627ec681f3Smrg p_atomic_inc(&screen->num_disk_shader_cache_hits); 9637ec681f3Smrg} 9647ec681f3Smrg 9657ec681f3Smrgvoid lp_disk_cache_insert_shader(struct llvmpipe_screen *screen, 9667ec681f3Smrg struct lp_cached_code *cache, 9677ec681f3Smrg unsigned char ir_sha1_cache_key[20]) 9687ec681f3Smrg{ 9697ec681f3Smrg unsigned char sha1[CACHE_KEY_SIZE]; 9707ec681f3Smrg 9717ec681f3Smrg if (!screen->disk_shader_cache || !cache->data_size || cache->dont_cache) 9727ec681f3Smrg return; 9737ec681f3Smrg disk_cache_compute_key(screen->disk_shader_cache, ir_sha1_cache_key, 20, sha1); 9747ec681f3Smrg disk_cache_put(screen->disk_shader_cache, sha1, cache->data, cache->data_size, NULL); 9757ec681f3Smrg} 9767ec681f3Smrg 9777ec681f3Smrgbool 9787ec681f3Smrgllvmpipe_screen_late_init(struct llvmpipe_screen *screen) 9797ec681f3Smrg{ 9807ec681f3Smrg bool ret = true; 9817ec681f3Smrg mtx_lock(&screen->late_mutex); 9827ec681f3Smrg 9837ec681f3Smrg if (screen->late_init_done) 9847ec681f3Smrg goto out; 9857ec681f3Smrg 9867ec681f3Smrg screen->rast = lp_rast_create(screen->num_threads); 9877ec681f3Smrg if (!screen->rast) { 9887ec681f3Smrg ret = false; 9897ec681f3Smrg goto out; 9907ec681f3Smrg } 9917ec681f3Smrg 9927ec681f3Smrg screen->cs_tpool = lp_cs_tpool_create(screen->num_threads); 9937ec681f3Smrg if (!screen->cs_tpool) { 9947ec681f3Smrg lp_rast_destroy(screen->rast); 9957ec681f3Smrg ret = false; 9967ec681f3Smrg goto out; 9977ec681f3Smrg } 9987ec681f3Smrg 9997ec681f3Smrg lp_disk_cache_create(screen); 10007ec681f3Smrg screen->late_init_done = true; 10017ec681f3Smrgout: 10027ec681f3Smrg mtx_unlock(&screen->late_mutex); 10037ec681f3Smrg return ret; 10047ec681f3Smrg} 10057ec681f3Smrg 10064a49301eSmrg/** 10074a49301eSmrg * Create a new pipe_screen object 10084a49301eSmrg * Note: we're not presently subclassing pipe_screen (no llvmpipe_screen). 10094a49301eSmrg */ 10104a49301eSmrgstruct pipe_screen * 10113464ebd5Sriastradhllvmpipe_create_screen(struct sw_winsys *winsys) 10124a49301eSmrg{ 10133464ebd5Sriastradh struct llvmpipe_screen *screen; 10143464ebd5Sriastradh 10153464ebd5Sriastradh util_cpu_detect(); 1016af69d88dSmrg 10177ec681f3Smrg glsl_type_singleton_init_or_ref(); 10187ec681f3Smrg 10194a49301eSmrg#ifdef DEBUG 10204a49301eSmrg LP_DEBUG = debug_get_flags_option("LP_DEBUG", lp_debug_flags, 0 ); 10214a49301eSmrg#endif 10224a49301eSmrg 10233464ebd5Sriastradh LP_PERF = debug_get_flags_option("LP_PERF", lp_perf_flags, 0 ); 10243464ebd5Sriastradh 1025af69d88dSmrg screen = CALLOC_STRUCT(llvmpipe_screen); 10264a49301eSmrg if (!screen) 10274a49301eSmrg return NULL; 10284a49301eSmrg 102901e04c3fSmrg if (!lp_jit_screen_init(screen)) { 103001e04c3fSmrg FREE(screen); 103101e04c3fSmrg return NULL; 103201e04c3fSmrg } 103301e04c3fSmrg 10344a49301eSmrg screen->winsys = winsys; 10354a49301eSmrg 10364a49301eSmrg screen->base.destroy = llvmpipe_destroy_screen; 10374a49301eSmrg 10384a49301eSmrg screen->base.get_name = llvmpipe_get_name; 10394a49301eSmrg screen->base.get_vendor = llvmpipe_get_vendor; 104001e04c3fSmrg screen->base.get_device_vendor = llvmpipe_get_vendor; // TODO should be the CPU vendor 10414a49301eSmrg screen->base.get_param = llvmpipe_get_param; 10423464ebd5Sriastradh screen->base.get_shader_param = llvmpipe_get_shader_param; 10437ec681f3Smrg screen->base.get_compute_param = llvmpipe_get_compute_param; 10444a49301eSmrg screen->base.get_paramf = llvmpipe_get_paramf; 10457ec681f3Smrg screen->base.get_compiler_options = llvmpipe_get_compiler_options; 10464a49301eSmrg screen->base.is_format_supported = llvmpipe_is_format_supported; 10474a49301eSmrg 1048cdc920a0Smrg screen->base.context_create = llvmpipe_create_context; 10494a49301eSmrg screen->base.flush_frontbuffer = llvmpipe_flush_frontbuffer; 10503464ebd5Sriastradh screen->base.fence_reference = llvmpipe_fence_reference; 10513464ebd5Sriastradh screen->base.fence_finish = llvmpipe_fence_finish; 10524a49301eSmrg 1053af69d88dSmrg screen->base.get_timestamp = llvmpipe_get_timestamp; 1054af69d88dSmrg 10557ec681f3Smrg screen->base.get_driver_uuid = llvmpipe_get_driver_uuid; 10567ec681f3Smrg screen->base.get_device_uuid = llvmpipe_get_device_uuid; 10577ec681f3Smrg 10587ec681f3Smrg screen->base.finalize_nir = llvmpipe_finalize_nir; 10597ec681f3Smrg 10607ec681f3Smrg screen->base.get_disk_shader_cache = lp_get_disk_shader_cache; 10613464ebd5Sriastradh llvmpipe_init_screen_resource_funcs(&screen->base); 10624a49301eSmrg 10637ec681f3Smrg screen->allow_cl = !!getenv("LP_CL"); 10647ec681f3Smrg screen->use_tgsi = (LP_DEBUG & DEBUG_TGSI_IR); 10657ec681f3Smrg screen->num_threads = util_get_cpu_caps()->nr_cpus > 1 ? util_get_cpu_caps()->nr_cpus : 0; 10667ec681f3Smrg#ifdef EMBEDDED_DEVICE 10677ec681f3Smrg screen->num_threads = MIN2(screen->num_threads, 2); 10683464ebd5Sriastradh#endif 10693464ebd5Sriastradh screen->num_threads = debug_get_num_option("LP_NUM_THREADS", screen->num_threads); 10703464ebd5Sriastradh screen->num_threads = MIN2(screen->num_threads, LP_MAX_THREADS); 10713464ebd5Sriastradh 10727ec681f3Smrg lp_build_init(); /* get lp_native_vector_width initialised */ 10737ec681f3Smrg 10747ec681f3Smrg snprintf(screen->renderer_string, sizeof(screen->renderer_string), "llvmpipe (LLVM " MESA_LLVM_VERSION_STRING ", %u bits)", lp_native_vector_width ); 10757ec681f3Smrg 10767ec681f3Smrg (void) mtx_init(&screen->cs_mutex, mtx_plain); 107701e04c3fSmrg (void) mtx_init(&screen->rast_mutex, mtx_plain); 10783464ebd5Sriastradh 10797ec681f3Smrg (void) mtx_init(&screen->late_mutex, mtx_plain); 10807ec681f3Smrg 10814a49301eSmrg return &screen->base; 10824a49301eSmrg} 1083