blob: 6c64133b90c4a6bf4587d25658b02f57262df00e [file] [log] [blame]
José Fonseca946f4322009-07-26 23:44:38 +01001/**************************************************************************
2 *
José Fonseca87712852014-01-17 16:27:50 +00003 * Copyright 2008 VMware, Inc.
José Fonseca946f4322009-07-26 23:44:38 +01004 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
José Fonseca87712852014-01-17 16:27:50 +000021 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
José Fonseca946f4322009-07-26 23:44:38 +010022 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28
29#include "util/u_memory.h"
José Fonseca39be50d2010-04-24 13:20:39 +010030#include "util/u_math.h"
31#include "util/u_cpu_detect.h"
José Fonsecab3755262009-11-10 17:51:06 -080032#include "util/u_format.h"
José Fonsecaa7f67b12011-08-18 17:58:02 +010033#include "util/u_string.h"
José Fonsecafe130a72010-04-06 22:49:57 +010034#include "util/u_format_s3tc.h"
José Fonseca946f4322009-07-26 23:44:38 +010035#include "pipe/p_defines.h"
36#include "pipe/p_screen.h"
Luca Barbieria508d2d2010-09-05 20:50:50 +020037#include "draw/draw_context.h"
José Fonsecaedc0a002012-09-06 10:29:04 +010038#include "gallivm/lp_bld_type.h"
José Fonseca946f4322009-07-26 23:44:38 +010039
Emil Velikov89f80c22014-08-14 21:15:06 +010040#include "os/os_misc.h"
James Benton16f0d702012-12-03 07:00:37 +000041#include "os/os_time.h"
José Fonseca946f4322009-07-26 23:44:38 +010042#include "lp_texture.h"
Brian Paul2876b682009-12-11 17:32:45 -070043#include "lp_fence.h"
José Fonseca08dd41f2009-08-23 05:52:20 +010044#include "lp_jit.h"
José Fonseca946f4322009-07-26 23:44:38 +010045#include "lp_screen.h"
Keith Whitwell7f41f542010-02-08 12:55:59 +000046#include "lp_context.h"
Keith Whitwelldec35d02009-10-09 14:59:35 +010047#include "lp_debug.h"
Keith Whitwell3c57c012010-03-09 15:25:42 +000048#include "lp_public.h"
José Fonseca39be50d2010-04-24 13:20:39 +010049#include "lp_limits.h"
Roland Scheideggeredac7402010-07-13 19:58:58 +020050#include "lp_rast.h"
Keith Whitwelldec35d02009-10-09 14:59:35 +010051
Keith Whitwell23e951d2010-03-04 16:23:05 +000052#include "state_tracker/sw_winsys.h"
53
Keith Whitwelldec35d02009-10-09 14:59:35 +010054#ifdef DEBUG
55int LP_DEBUG = 0;
56
57static const struct debug_named_value lp_debug_flags[] = {
Joakim Sindholt8413b922010-06-01 20:11:30 +020058 { "pipe", DEBUG_PIPE, NULL },
59 { "tgsi", DEBUG_TGSI, NULL },
60 { "tex", DEBUG_TEX, NULL },
61 { "setup", DEBUG_SETUP, NULL },
62 { "rast", DEBUG_RAST, NULL },
63 { "query", DEBUG_QUERY, NULL },
64 { "screen", DEBUG_SCREEN, NULL },
Joakim Sindholt8413b922010-06-01 20:11:30 +020065 { "counters", DEBUG_COUNTERS, NULL },
Keith Whitwellb6e03ea2010-08-20 15:14:19 +010066 { "scene", DEBUG_SCENE, NULL },
67 { "fence", DEBUG_FENCE, NULL },
Keith Whitwellbc759cd2010-09-08 18:37:45 +010068 { "mem", DEBUG_MEM, NULL },
Keith Whitwell09863552010-09-16 15:16:27 +010069 { "fs", DEBUG_FS, NULL },
Joakim Sindholt8413b922010-06-01 20:11:30 +020070 DEBUG_NAMED_VALUE_END
Keith Whitwelldec35d02009-10-09 14:59:35 +010071};
72#endif
José Fonseca946f4322009-07-26 23:44:38 +010073
Keith Whitwell5f008192010-09-16 10:45:52 +010074int LP_PERF = 0;
75static const struct debug_named_value lp_perf_flags[] = {
76 { "texmem", PERF_TEX_MEM, NULL },
77 { "no_mipmap", PERF_NO_MIPMAPS, NULL },
78 { "no_linear", PERF_NO_LINEAR, NULL },
79 { "no_mip_linear", PERF_NO_MIP_LINEAR, NULL },
80 { "no_tex", PERF_NO_TEX, NULL },
81 { "no_blend", PERF_NO_BLEND, NULL },
82 { "no_depth", PERF_NO_DEPTH, NULL },
83 { "no_alphatest", PERF_NO_ALPHATEST, NULL },
84 DEBUG_NAMED_VALUE_END
85};
86
José Fonseca946f4322009-07-26 23:44:38 +010087
88static const char *
89llvmpipe_get_vendor(struct pipe_screen *screen)
90{
José Fonsecae173a9b2009-08-29 20:02:25 +010091 return "VMware, Inc.";
José Fonseca946f4322009-07-26 23:44:38 +010092}
93
94
95static const char *
96llvmpipe_get_name(struct pipe_screen *screen)
97{
Brian Paulb38c26f2011-07-19 08:42:46 -060098 static char buf[100];
José Fonsecaedc0a002012-09-06 10:29:04 +010099 util_snprintf(buf, sizeof(buf), "llvmpipe (LLVM %u.%u, %u bits)",
100 HAVE_LLVM >> 8, HAVE_LLVM & 0xff,
101 lp_native_vector_width );
Brian Paulb38c26f2011-07-19 08:42:46 -0600102 return buf;
José Fonseca946f4322009-07-26 23:44:38 +0100103}
104
105
106static int
José Fonsecae1238b52010-05-11 11:11:03 +0100107llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
José Fonseca946f4322009-07-26 23:44:38 +0100108{
109 switch (param) {
José Fonseca946f4322009-07-26 23:44:38 +0100110 case PIPE_CAP_NPOT_TEXTURES:
Ilia Mirkin12d39b42013-10-04 04:32:15 -0400111 case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
Ilia Mirkin9515d652016-08-20 22:40:33 -0400112 case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
José Fonseca946f4322009-07-26 23:44:38 +0100113 return 1;
114 case PIPE_CAP_TWO_SIDED_STENCIL:
115 return 1;
Jakob Bornecrantzc4e89d12010-04-29 16:18:43 +0100116 case PIPE_CAP_SM3:
117 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600118 case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
Roland Scheidegger8b8bca02013-02-12 03:41:48 +0100119 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600120 case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
Dave Airlie77b26562012-12-05 06:50:07 +1000121 return PIPE_MAX_SO_BUFFERS;
José Fonseca946f4322009-07-26 23:44:38 +0100122 case PIPE_CAP_ANISOTROPIC_FILTER:
123 return 0;
124 case PIPE_CAP_POINT_SPRITE:
125 return 1;
126 case PIPE_CAP_MAX_RENDER_TARGETS:
127 return PIPE_MAX_COLOR_BUFS;
128 case PIPE_CAP_OCCLUSION_QUERY:
129 return 1;
José Fonseca99762162012-12-09 09:50:34 +0000130 case PIPE_CAP_QUERY_TIME_ELAPSED:
José Fonsecaab2f5732012-12-09 10:15:19 +0000131 return 0;
James Benton16f0d702012-12-03 07:00:37 +0000132 case PIPE_CAP_QUERY_TIMESTAMP:
133 return 1;
Christoph Bumillerf35e96d2013-03-29 13:02:49 +0100134 case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
135 return 0;
José Fonseca946f4322009-07-26 23:44:38 +0100136 case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
137 return 1;
José Fonseca946f4322009-07-26 23:44:38 +0100138 case PIPE_CAP_TEXTURE_SHADOW_MAP:
139 return 1;
José Fonseca9881b5c2010-06-05 14:48:39 +0100140 case PIPE_CAP_TEXTURE_SWIZZLE:
141 return 1;
Christoph Bumiller729abfd2013-04-12 13:42:01 +0200142 case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
143 return 0;
José Fonseca946f4322009-07-26 23:44:38 +0100144 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
Brian Pauld73fadf2010-03-08 13:36:34 -0700145 return LP_MAX_TEXTURE_2D_LEVELS;
José Fonseca946f4322009-07-26 23:44:38 +0100146 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
Brian Pauld73fadf2010-03-08 13:36:34 -0700147 return LP_MAX_TEXTURE_3D_LEVELS;
José Fonseca946f4322009-07-26 23:44:38 +0100148 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
Brian Pauldf73be92012-09-16 19:05:51 -0600149 return LP_MAX_TEXTURE_CUBE_LEVELS;
Roland Scheidegger6d501482012-11-29 04:08:32 +0100150 case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
151 return LP_MAX_TEXTURE_ARRAY_LAYERS;
José Fonseca946f4322009-07-26 23:44:38 +0100152 case PIPE_CAP_BLEND_EQUATION_SEPARATE:
153 return 1;
Roland Scheidegger1a9d01d2010-01-26 17:32:57 +0100154 case PIPE_CAP_INDEP_BLEND_ENABLE:
Brian Paul7b937cf2010-05-10 17:03:10 -0600155 return 1;
Roland Scheidegger1a9d01d2010-01-26 17:32:57 +0100156 case PIPE_CAP_INDEP_BLEND_FUNC:
Brian Paul96a2e892011-01-17 16:42:43 -0700157 return 1;
Luca Barbieri6c4037502010-01-21 05:36:14 +0100158 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
159 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
José Fonsecaa9301362013-04-18 11:39:19 +0100160 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
Luca Barbieri6c4037502010-01-21 05:36:14 +0100161 return 1;
162 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
Luca Barbieri6c4037502010-01-21 05:36:14 +0100163 return 0;
Brian Paul6692ed62010-10-21 19:03:38 -0600164 case PIPE_CAP_PRIMITIVE_RESTART:
165 return 1;
Marek Olšákdc4c8212012-01-10 00:19:00 +0100166 case PIPE_CAP_DEPTH_CLIP_DISABLE:
José Fonseca85d7f672013-10-15 18:08:26 -0700167 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600168 case PIPE_CAP_SHADER_STENCIL_EXPORT:
Roland Scheidegger4fd42a72015-06-03 01:34:06 +0200169 return 1;
Marek Olšák95c78812011-03-05 16:06:10 +0100170 case PIPE_CAP_TGSI_INSTANCEID:
171 case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
Roland Scheideggereee9f6a2014-08-25 22:05:16 +0200172 case PIPE_CAP_START_INSTANCE:
Brian Paul056e9b42012-06-26 14:11:00 -0600173 return 1;
174 case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
175 return 0;
Marek Olšák4a7f0132011-03-29 18:18:05 +0200176 case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
Brian Paul056e9b42012-06-26 14:11:00 -0600177 return 1;
178 case PIPE_CAP_SEAMLESS_CUBE_MAP:
179 case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
Roland Scheideggerac81b6f2013-10-18 20:54:01 +0200180 return 1;
Roland Scheidegger0b6554b2012-11-27 03:26:49 +0100181 /* this is a lie could support arbitrary large offsets */
Ilia Mirkinc2f9ad52014-04-09 14:58:53 -0400182 case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
Brian Paul056e9b42012-06-26 14:11:00 -0600183 case PIPE_CAP_MIN_TEXEL_OFFSET:
Roland Scheidegger48986692015-03-31 17:23:17 +0200184 return -32;
Ilia Mirkinc2f9ad52014-04-09 14:58:53 -0400185 case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
Brian Paul056e9b42012-06-26 14:11:00 -0600186 case PIPE_CAP_MAX_TEXEL_OFFSET:
Roland Scheidegger48986692015-03-31 17:23:17 +0200187 return 31;
Dave Airlieab149152011-11-07 17:31:49 +0000188 case PIPE_CAP_CONDITIONAL_RENDER:
Brian Pauldcb48e72010-12-08 19:06:22 -0700189 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600190 case PIPE_CAP_TEXTURE_BARRIER:
191 return 0;
192 case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
193 case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
Dave Airlie77b26562012-12-05 06:50:07 +1000194 return 16*4;
Grigori Goronzyd34d5fd2014-02-09 22:56:20 +0100195 case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
196 case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
197 return 1024;
Ilia Mirkin746e5262014-06-26 20:01:50 -0400198 case PIPE_CAP_MAX_VERTEX_STREAMS:
199 return 1;
Timothy Arceri89e68062014-08-19 21:09:58 -1000200 case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
201 return 2048;
Brian Paul056e9b42012-06-26 14:11:00 -0600202 case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
Ilia Mirkin3fdeb7c2016-10-14 00:03:12 -0400203 case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
Dave Airlie9e41b0b2012-12-13 20:17:58 +1000204 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600205 case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
206 return 0;
207 case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
208 case PIPE_CAP_VERTEX_COLOR_CLAMPED:
James Benton66fdf622012-09-13 16:05:08 +0100209 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600210 case PIPE_CAP_GLSL_FEATURE_LEVEL:
José Fonseca7380ce92014-04-24 15:00:12 +0100211 return 330;
Christoph Bumiller8b4f7b02012-02-06 16:29:03 +0100212 case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
213 return 0;
Brian Paul056e9b42012-06-26 14:11:00 -0600214 case PIPE_CAP_COMPUTE:
215 return 0;
Marek Olšák978c1aa12012-04-11 15:40:00 +0200216 case PIPE_CAP_USER_VERTEX_BUFFERS:
217 return 1;
Brian Paul2ee0b442012-12-10 12:35:23 -0700218 case PIPE_CAP_USER_CONSTANT_BUFFERS:
219 return 0;
Brian Paul056e9b42012-06-26 14:11:00 -0600220 case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
221 case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
222 case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
Christoph Bumiller8acaf862013-03-15 22:11:31 +0100223 case PIPE_CAP_TGSI_TEXCOORD:
Brian Paul056e9b42012-06-26 14:11:00 -0600224 return 0;
Christoph Bumillerbc198f82013-04-05 14:29:36 +0200225 case PIPE_CAP_DRAW_INDIRECT:
226 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600227
Roland Scheidegger62fd8712014-08-28 03:38:55 +0200228 case PIPE_CAP_CUBE_MAP_ARRAY:
229 return 1;
Marek Olšák1b749dc2012-04-24 17:31:17 +0200230 case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
231 return 16;
Marek Olšákb9c9dd42012-09-11 22:41:20 +0200232 case PIPE_CAP_TEXTURE_MULTISAMPLE:
José Fonseca946f4322009-07-26 23:44:38 +0100233 return 0;
Siavash Eliasi809d3a72013-11-28 12:26:30 +0330234 case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
235 return 64;
Roland Scheidegger20183172013-02-25 20:23:18 +0100236 case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
237 return 1;
Marek Olšák52cb3952013-05-02 03:24:33 +0200238 case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
239 return 65536;
Roland Scheidegger20183172013-02-25 20:23:18 +0100240 case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
241 return 1;
Marek Olšák3e10ab62013-03-14 17:18:43 +0100242 case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
243 return 0;
Zack Rusineaabb4e2013-05-24 16:08:39 -0400244 case PIPE_CAP_MAX_VIEWPORTS:
Zack Rusin97b8ae42013-05-24 16:28:19 -0400245 return PIPE_MAX_VIEWPORTS;
Tom Stellard4e90bc92013-07-09 21:21:39 -0700246 case PIPE_CAP_ENDIANNESS:
247 return PIPE_ENDIAN_NATIVE;
Ilia Mirkin32b71242014-07-03 11:15:18 -0400248 case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
Roland Scheidegger763fc522014-11-18 23:04:36 +0100249 return 1;
Jose Fonseca08efcc02015-02-05 14:33:06 +0000250 case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
251 return 1;
Dave Airlie2fcbec42013-09-21 18:45:43 +1000252 case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
Roland Scheidegger48986692015-03-31 17:23:17 +0200253 return 4;
Dave Airlie2fcbec42013-09-21 18:45:43 +1000254 case PIPE_CAP_TEXTURE_GATHER_SM5:
Dave Airliebe5276a2014-02-11 13:26:08 +1000255 case PIPE_CAP_TEXTURE_QUERY_LOD:
Ilia Mirkin88d8d882014-03-30 18:21:04 -0400256 case PIPE_CAP_SAMPLE_SHADING:
Ilia Mirkind95df4f2014-04-26 23:44:57 -0400257 case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
Marek Olšák65ef78e2014-11-17 22:30:31 +0100258 return 0;
Christoph Bumiller4b586a22014-05-17 01:20:19 +0200259 case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
Marek Olšák65ef78e2014-11-17 22:30:31 +0100260 return 1;
Ilia Mirkin8ee74ce2014-08-14 00:04:41 -0400261 case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
Marek Olšákbf3cdf02017-03-07 02:09:03 +0100262 case PIPE_CAP_TGSI_TEX_TXF_LZ:
Marek Olšák1a02bb72013-11-21 15:25:55 +0100263 return 0;
Roland Scheideggere6c66f42015-05-13 22:16:44 +0200264 case PIPE_CAP_SAMPLER_VIEW_TARGET:
265 return 1;
Dave Airlie76ba50a2013-11-27 19:47:51 +1000266 case PIPE_CAP_FAKE_SW_MSAA:
Giovanni Campagnae57ad3d2014-07-23 19:28:52 +0100267 return 1;
Tobias Klausmann544c5412014-08-17 17:16:08 +0200268 case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
Nicolai Hähnle789119d2016-10-06 23:10:22 +0200269 case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
Nicolai Hähnlea020cb32017-01-27 10:35:13 +0100270 case PIPE_CAP_DOUBLES:
Nicolai Hähnlec5e76a22017-01-24 21:22:32 +0100271 case PIPE_CAP_INT64:
Ilia Mirkinb0900332017-02-04 22:31:29 -0500272 case PIPE_CAP_INT64_DIVMOD:
Tobias Klausmann544c5412014-08-17 17:16:08 +0200273 return 1;
Emil Velikov89f80c22014-08-14 21:15:06 +0100274
275 case PIPE_CAP_VENDOR_ID:
276 return 0xFFFFFFFF;
277 case PIPE_CAP_DEVICE_ID:
278 return 0xFFFFFFFF;
279 case PIPE_CAP_ACCELERATED:
280 return 0;
281 case PIPE_CAP_VIDEO_MEMORY: {
282 /* XXX: Do we want to return the full amount fo system memory ? */
283 uint64_t system_memory;
284
285 if (!os_get_total_physical_memory(&system_memory))
286 return 0;
287
Axel Davy814ca962016-03-28 22:34:35 +0200288 if (sizeof(void *) == 4)
289 /* Cap to 2 GB on 32 bits system. We do this because llvmpipe does
290 * eat application memory, which is quite limited on 32 bits. App
291 * shouldn't expect too much available memory. */
292 system_memory = MIN2(system_memory, 2048 << 20);
293
Emil Velikov89f80c22014-08-14 21:15:06 +0100294 return (int)(system_memory >> 20);
295 }
296 case PIPE_CAP_UMA:
297 return 0;
Mathias Fröhlich56088132014-09-14 15:17:07 +0200298 case PIPE_CAP_CLIP_HALFZ:
299 return 1;
Roland Scheideggerade8b262014-12-12 04:13:43 +0100300 case PIPE_CAP_VERTEXID_NOBASE:
301 return 0;
Ilia Mirkin7c211a12015-02-01 09:01:50 -0500302 case PIPE_CAP_POLYGON_OFFSET_CLAMP:
Marek Olšák44dc1d32015-08-10 19:37:01 +0200303 case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
304 case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:
Ilia Mirkin7c211a12015-02-01 09:01:50 -0500305 return 1;
Tobias Klausmann96f390f2016-05-08 22:44:10 +0200306 case PIPE_CAP_CULL_DISTANCE:
307 return 1;
Brian Paule9b86bb2016-06-03 14:55:47 -0600308 case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:
309 return 1;
Lars Hamre12f20582017-02-22 10:56:42 -0500310 case PIPE_CAP_CLEAR_TEXTURE:
311 return 1;
Axel Davyeb1c12d2015-01-17 14:30:17 +0100312 case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
Marek Olšák8b587ee2015-02-10 14:00:57 +0100313 case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
Marek Olšák79ffc08a2015-04-29 15:44:55 +0200314 case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
Marek Olšák26222932015-06-12 14:24:17 +0200315 case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
Marek Olšák3b7800e2015-08-10 02:11:48 +0200316 case PIPE_CAP_DEPTH_BOUNDS_TEST:
Ilia Mirkinf46a53f2015-09-11 17:29:49 -0400317 case PIPE_CAP_TGSI_TXQS:
Marek Olšákf3b37e32015-09-27 19:32:07 +0200318 case PIPE_CAP_FORCE_PERSAMPLE_INTERP:
Marek Olšákd74e7b62015-09-27 21:02:15 +0200319 case PIPE_CAP_SHAREABLE_SHADERS:
Ilia Mirkin87b4e4e2015-12-29 16:49:32 -0500320 case PIPE_CAP_DRAW_PARAMETERS:
Ilia Mirkine9f43d62016-01-02 18:55:48 -0500321 case PIPE_CAP_TGSI_PACK_HALF_FLOAT:
Ilia Mirkind67b9ba2015-12-31 13:30:13 -0500322 case PIPE_CAP_MULTI_DRAW_INDIRECT:
323 case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
Marek Olšák34738a92016-01-02 20:45:00 +0100324 case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
325 case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
Ilia Mirkinebfb5442016-01-02 21:56:45 -0500326 case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
Nicolai Hähnle654670b2016-01-11 17:38:08 -0500327 case PIPE_CAP_INVALIDATE_BUFFER:
Charmaine Lee3038e892016-01-14 10:22:17 -0700328 case PIPE_CAP_GENERATE_MIPMAP:
Rob Clarkd6408372015-08-10 11:41:29 -0400329 case PIPE_CAP_STRING_MARKER:
Nicolai Hähnle3abb5482016-01-26 10:26:30 -0500330 case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:
Nicolai Hähnle6af6d7b2016-01-26 10:27:58 -0500331 case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
Ilia Mirkinf9e6f462016-01-09 23:30:16 -0500332 case PIPE_CAP_QUERY_BUFFER_OBJECT:
Marek Olšákd2e4c9e2016-02-01 21:56:50 +0100333 case PIPE_CAP_QUERY_MEMORY_INFO:
Marek Olšákdcb2b772016-02-29 20:22:37 +0100334 case PIPE_CAP_PCI_GROUP:
335 case PIPE_CAP_PCI_BUS:
336 case PIPE_CAP_PCI_DEVICE:
337 case PIPE_CAP_PCI_FUNCTION:
Edward O'Callaghan4bc91302016-02-17 20:59:52 +1100338 case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
Bas Nieuwenhuizen70dcd842016-04-12 15:00:31 +0200339 case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
Kenneth Graunke70048eb2016-05-20 21:05:34 -0700340 case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
Ilia Mirkinedfa7a42016-05-29 11:39:52 -0400341 case PIPE_CAP_TGSI_VOTE:
Ilia Mirkin07fcb062016-06-11 15:26:45 -0400342 case PIPE_CAP_MAX_WINDOW_RECTANGLES:
Axel Davy59a69292016-06-13 22:28:32 +0200343 case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED:
Józef Kucia3cd28fe2016-07-19 13:07:24 +0200344 case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
Nicolai Hähnle611166b2016-11-18 20:49:54 +0100345 case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
Rob Clark026a7222016-04-01 16:10:42 -0400346 case PIPE_CAP_NATIVE_FENCE_FD:
Marek Olšáke51baeb2016-12-31 13:34:11 +0100347 case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
Ilia Mirkinee3ebe62017-01-01 23:10:00 -0500348 case PIPE_CAP_TGSI_FS_FBFETCH:
Ilia Mirkin6e409382017-01-16 22:14:38 -0500349 case PIPE_CAP_TGSI_MUL_ZERO_WINS:
Nicolai Hähnled0c7f922017-03-29 20:44:57 +0200350 case PIPE_CAP_TGSI_CLOCK:
Lyudeffe2bd62017-03-16 18:00:05 -0400351 case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
Nicolai Hähnled6e6fa02017-02-02 21:10:44 +0100352 case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
Nicolai Hähnled3e6f6d2017-03-30 11:16:09 +0200353 case PIPE_CAP_TGSI_BALLOT:
Nicolai Hähnle17f24a92017-04-13 21:54:54 +0200354 case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
Marek Olšák70dcb732017-04-30 01:18:43 +0200355 case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
Marek Olšák50189372017-05-15 16:30:30 +0200356 case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
Lyude467af442017-05-24 15:42:39 -0400357 case PIPE_CAP_POST_DEPTH_COVERAGE:
Samuel Pitoiset973822b2017-02-16 13:43:16 +0100358 case PIPE_CAP_BINDLESS_TEXTURE:
Nicolai Hähnle01f15982017-06-25 18:31:11 +0200359 case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
Nicolai Hähnlea6777992017-07-26 19:16:14 +0200360 case PIPE_CAP_QUERY_SO_OVERFLOW:
Timothy Arceri4e4042d2017-08-03 13:54:45 +1000361 case PIPE_CAP_MEMOBJ:
Axel Davyeb1c12d2015-01-17 14:30:17 +0100362 return 0;
José Fonseca946f4322009-07-26 23:44:38 +0100363 }
Brian Paul056e9b42012-06-26 14:11:00 -0600364 /* should only get here on unhandled cases */
365 debug_printf("Unexpected PIPE_CAP %d query\n", param);
366 return 0;
José Fonseca946f4322009-07-26 23:44:38 +0100367}
368
Luca Barbieria508d2d2010-09-05 20:50:50 +0200369static int
Brian Paul637e5712017-03-05 12:13:02 -0700370llvmpipe_get_shader_param(struct pipe_screen *screen,
371 enum pipe_shader_type shader,
372 enum pipe_shader_cap param)
Luca Barbieria508d2d2010-09-05 20:50:50 +0200373{
374 switch(shader)
375 {
376 case PIPE_SHADER_FRAGMENT:
Dave Airlie2d80cad2012-01-11 19:48:00 +0000377 switch (param) {
Dave Airlie2d80cad2012-01-11 19:48:00 +0000378 default:
José Fonseca6dddd182012-07-12 20:47:20 +0100379 return gallivm_get_shader_param(param);
Dave Airlie2d80cad2012-01-11 19:48:00 +0000380 }
Luca Barbieria508d2d2010-09-05 20:50:50 +0200381 case PIPE_SHADER_VERTEX:
382 case PIPE_SHADER_GEOMETRY:
Marek Olšákf5bfe542011-09-27 22:22:06 +0200383 switch (param) {
384 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
385 /* At this time, the draw module and llvmpipe driver only
386 * support vertex shader texture lookups when LLVM is enabled in
387 * the draw module.
388 */
389 if (debug_get_bool_option("DRAW_USE_LLVM", TRUE))
Brian Paulcab2fed2012-08-09 20:59:44 -0600390 return PIPE_MAX_SAMPLERS;
Marek Olšákf5bfe542011-09-27 22:22:06 +0200391 else
392 return 0;
Roland Scheidegger2983c032013-11-26 02:30:41 +0100393 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
394 if (debug_get_bool_option("DRAW_USE_LLVM", TRUE))
395 return PIPE_MAX_SHADER_SAMPLER_VIEWS;
396 else
397 return 0;
Marek Olšákf5bfe542011-09-27 22:22:06 +0200398 default:
399 return draw_get_shader_param(shader, param);
400 }
Luca Barbieria508d2d2010-09-05 20:50:50 +0200401 default:
402 return 0;
403 }
404}
José Fonseca946f4322009-07-26 23:44:38 +0100405
406static float
Marek Olšákbb71f922011-11-19 22:38:22 +0100407llvmpipe_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
José Fonseca946f4322009-07-26 23:44:38 +0100408{
409 switch (param) {
Marek Olšákbb71f922011-11-19 22:38:22 +0100410 case PIPE_CAPF_MAX_LINE_WIDTH:
José Fonseca946f4322009-07-26 23:44:38 +0100411 /* fall-through */
Marek Olšákbb71f922011-11-19 22:38:22 +0100412 case PIPE_CAPF_MAX_LINE_WIDTH_AA:
José Fonseca946f4322009-07-26 23:44:38 +0100413 return 255.0; /* arbitrary */
Marek Olšákbb71f922011-11-19 22:38:22 +0100414 case PIPE_CAPF_MAX_POINT_WIDTH:
José Fonseca946f4322009-07-26 23:44:38 +0100415 /* fall-through */
Marek Olšákbb71f922011-11-19 22:38:22 +0100416 case PIPE_CAPF_MAX_POINT_WIDTH_AA:
José Fonseca946f4322009-07-26 23:44:38 +0100417 return 255.0; /* arbitrary */
Marek Olšákbb71f922011-11-19 22:38:22 +0100418 case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
José Fonseca946f4322009-07-26 23:44:38 +0100419 return 16.0; /* not actually signficant at this time */
Marek Olšákbb71f922011-11-19 22:38:22 +0100420 case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
José Fonseca946f4322009-07-26 23:44:38 +0100421 return 16.0; /* arbitrary */
Marek Olšákbb71f922011-11-19 22:38:22 +0100422 case PIPE_CAPF_GUARD_BAND_LEFT:
423 case PIPE_CAPF_GUARD_BAND_TOP:
424 case PIPE_CAPF_GUARD_BAND_RIGHT:
425 case PIPE_CAPF_GUARD_BAND_BOTTOM:
José Fonsecacf9baf62010-05-12 17:25:17 +0100426 return 0.0;
José Fonseca946f4322009-07-26 23:44:38 +0100427 }
Brian Paul056e9b42012-06-26 14:11:00 -0600428 /* should only get here on unhandled cases */
429 debug_printf("Unexpected PIPE_CAP %d query\n", param);
430 return 0.0;
José Fonseca946f4322009-07-26 23:44:38 +0100431}
432
433
434/**
435 * Query format support for creating a texture, drawing surface, etc.
436 * \param format the format to test
437 * \param type one of PIPE_TEXTURE, PIPE_SURFACE
438 */
439static boolean
José Fonsecae173a9b2009-08-29 20:02:25 +0100440llvmpipe_is_format_supported( struct pipe_screen *_screen,
Roland Scheideggere121a732010-05-17 21:23:31 +0200441 enum pipe_format format,
José Fonseca946f4322009-07-26 23:44:38 +0100442 enum pipe_texture_target target,
Roland Scheideggere121a732010-05-17 21:23:31 +0200443 unsigned sample_count,
Marek Olšáke9689752011-03-08 00:01:58 +0100444 unsigned bind)
José Fonseca946f4322009-07-26 23:44:38 +0100445{
José Fonsecae173a9b2009-08-29 20:02:25 +0100446 struct llvmpipe_screen *screen = llvmpipe_screen(_screen);
Keith Whitwell94ce4eb2010-03-04 16:09:33 +0000447 struct sw_winsys *winsys = screen->winsys;
José Fonsecab3755262009-11-10 17:51:06 -0800448 const struct util_format_description *format_desc;
449
450 format_desc = util_format_description(format);
José Fonsecaadc7cd62010-04-25 14:52:27 +0100451 if (!format_desc)
José Fonsecab3755262009-11-10 17:51:06 -0800452 return FALSE;
José Fonsecae173a9b2009-08-29 20:02:25 +0100453
Brian Paule6d8b402010-05-28 13:31:23 -0600454 assert(target == PIPE_BUFFER ||
455 target == PIPE_TEXTURE_1D ||
Roland Scheidegger6d501482012-11-29 04:08:32 +0100456 target == PIPE_TEXTURE_1D_ARRAY ||
José Fonseca946f4322009-07-26 23:44:38 +0100457 target == PIPE_TEXTURE_2D ||
Roland Scheidegger6d501482012-11-29 04:08:32 +0100458 target == PIPE_TEXTURE_2D_ARRAY ||
Luca Barbieriae0ef6f2010-08-18 17:28:08 +0200459 target == PIPE_TEXTURE_RECT ||
José Fonseca946f4322009-07-26 23:44:38 +0100460 target == PIPE_TEXTURE_3D ||
Roland Scheideggerea05cfa2014-08-01 23:50:35 +0200461 target == PIPE_TEXTURE_CUBE ||
462 target == PIPE_TEXTURE_CUBE_ARRAY);
José Fonseca946f4322009-07-26 23:44:38 +0100463
Roland Scheideggere121a732010-05-17 21:23:31 +0200464 if (sample_count > 1)
465 return FALSE;
466
José Fonsecaadc7cd62010-04-25 14:52:27 +0100467 if (bind & PIPE_BIND_RENDER_TARGET) {
Roland Scheideggerdc1cc922013-07-16 01:52:29 +0200468 if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
Roland Scheidegger9477d8c2014-03-20 16:43:36 +0100469 /* this is a lie actually other formats COULD exist where we would fail */
Roland Scheideggerdc1cc922013-07-16 01:52:29 +0200470 if (format_desc->nr_channels < 3)
471 return FALSE;
472 }
473 else if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_RGB)
José Fonsecafe130a72010-04-06 22:49:57 +0100474 return FALSE;
475
Roland Scheideggerb101a092013-03-22 20:09:18 +0100476 if (format_desc->layout != UTIL_FORMAT_LAYOUT_PLAIN &&
477 format != PIPE_FORMAT_R11G11B10_FLOAT)
José Fonsecafe130a72010-04-06 22:49:57 +0100478 return FALSE;
Roland Scheideggerdc1cc922013-07-16 01:52:29 +0200479
José Fonseca69163872012-11-28 19:25:05 +0000480 assert(format_desc->block.width == 1);
481 assert(format_desc->block.height == 1);
José Fonsecafe130a72010-04-06 22:49:57 +0100482
José Fonseca69163872012-11-28 19:25:05 +0000483 if (format_desc->is_mixed)
484 return FALSE;
485
Roland Scheideggerb101a092013-03-22 20:09:18 +0100486 if (!format_desc->is_array && !format_desc->is_bitmask &&
487 format != PIPE_FORMAT_R11G11B10_FLOAT)
José Fonsecab3755262009-11-10 17:51:06 -0800488 return FALSE;
Brian Paul2db747c2016-06-03 15:06:28 -0600489 }
Roland Scheideggerd03d9b62013-01-12 17:28:40 -0800490
Brian Paul2db747c2016-06-03 15:06:28 -0600491 if ((bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW)) &&
492 ((bind & PIPE_BIND_DISPLAY_TARGET) == 0)) {
493 /* Disable all 3-channel formats, where channel size != 32 bits.
494 * In some cases we run into crashes (in generate_unswizzled_blend()),
495 * for 3-channel RGB16 variants, there was an apparent LLVM bug.
496 * In any case, disabling the shallower 3-channel formats avoids a
497 * number of issues with GL_ARB_copy_image support.
Roland Scheideggerd03d9b62013-01-12 17:28:40 -0800498 */
Brian Paul2db747c2016-06-03 15:06:28 -0600499 if (format_desc->is_array &&
500 format_desc->nr_channels == 3 &&
501 format_desc->block.bits != 96) {
502 return FALSE;
Roland Scheideggerd03d9b62013-01-12 17:28:40 -0800503 }
José Fonsecab3755262009-11-10 17:51:06 -0800504 }
505
José Fonsecaadc7cd62010-04-25 14:52:27 +0100506 if (bind & PIPE_BIND_DISPLAY_TARGET) {
507 if(!winsys->is_displaytarget_format_supported(winsys, bind, format))
José Fonsecab3755262009-11-10 17:51:06 -0800508 return FALSE;
509 }
510
José Fonsecaadc7cd62010-04-25 14:52:27 +0100511 if (bind & PIPE_BIND_DEPTH_STENCIL) {
512 if (format_desc->layout != UTIL_FORMAT_LAYOUT_PLAIN)
513 return FALSE;
514
515 if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
José Fonsecab3755262009-11-10 17:51:06 -0800516 return FALSE;
517
José Fonseca42f762d2013-01-29 13:27:44 +0000518 /* TODO: Support stencil-only formats */
Marek Olšákfb523cb2016-04-16 14:05:47 +0200519 if (format_desc->swizzle[0] == PIPE_SWIZZLE_NONE) {
José Fonseca42f762d2013-01-29 13:27:44 +0000520 return FALSE;
521 }
José Fonsecab3755262009-11-10 17:51:06 -0800522 }
523
Roland Scheidegger6c6a4392015-11-24 18:25:06 +0100524 if (format_desc->layout == UTIL_FORMAT_LAYOUT_BPTC ||
525 format_desc->layout == UTIL_FORMAT_LAYOUT_ASTC) {
Ilia Mirkin19563f02014-07-22 21:08:14 -0400526 /* Software decoding is not hooked up. */
527 return FALSE;
528 }
529
Ilia Mirkin845b9e42015-02-18 22:23:12 -0500530 if (format_desc->layout == UTIL_FORMAT_LAYOUT_ETC &&
531 format != PIPE_FORMAT_ETC1_RGB8)
532 return FALSE;
533
José Fonsecaadc7cd62010-04-25 14:52:27 +0100534 if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
José Fonseca510669c2010-04-22 15:12:30 +0100535 return util_format_s3tc_enabled;
José Fonseca510669c2010-04-22 15:12:30 +0100536 }
537
José Fonsecaa1b737d2011-11-01 12:28:47 +0000538 /*
Roland Scheideggerd03d9b62013-01-12 17:28:40 -0800539 * Everything can be supported by u_format
540 * (those without fetch_rgba_float might be not but shouldn't hit that)
José Fonsecaa1b737d2011-11-01 12:28:47 +0000541 */
542
José Fonsecae173a9b2009-08-29 20:02:25 +0100543 return TRUE;
544}
545
546
José Fonsecae173a9b2009-08-29 20:02:25 +0100547
548
549static void
550llvmpipe_flush_frontbuffer(struct pipe_screen *_screen,
Roland Scheidegger4c700142010-12-02 04:33:43 +0100551 struct pipe_resource *resource,
552 unsigned level, unsigned layer,
Dave Airlieba00f2f2013-11-28 11:08:11 +1000553 void *context_private,
554 struct pipe_box *sub_box)
José Fonsecae173a9b2009-08-29 20:02:25 +0100555{
556 struct llvmpipe_screen *screen = llvmpipe_screen(_screen);
Keith Whitwell94ce4eb2010-03-04 16:09:33 +0000557 struct sw_winsys *winsys = screen->winsys;
Roland Scheidegger4c700142010-12-02 04:33:43 +0100558 struct llvmpipe_resource *texture = llvmpipe_resource(resource);
José Fonsecae173a9b2009-08-29 20:02:25 +0100559
560 assert(texture->dt);
561 if (texture->dt)
Dave Airlieba00f2f2013-11-28 11:08:11 +1000562 winsys->displaytarget_display(winsys, texture->dt, context_private, sub_box);
José Fonseca946f4322009-07-26 23:44:38 +0100563}
564
José Fonseca946f4322009-07-26 23:44:38 +0100565static void
José Fonseca2d6b39f2009-08-09 23:10:19 +0100566llvmpipe_destroy_screen( struct pipe_screen *_screen )
José Fonseca946f4322009-07-26 23:44:38 +0100567{
José Fonseca2d6b39f2009-08-09 23:10:19 +0100568 struct llvmpipe_screen *screen = llvmpipe_screen(_screen);
Keith Whitwell94ce4eb2010-03-04 16:09:33 +0000569 struct sw_winsys *winsys = screen->winsys;
José Fonseca2d6b39f2009-08-09 23:10:19 +0100570
Roland Scheideggeredac7402010-07-13 19:58:58 +0200571 if (screen->rast)
572 lp_rast_destroy(screen->rast);
573
José Fonseca08dd41f2009-08-23 05:52:20 +0100574 lp_jit_screen_cleanup(screen);
José Fonseca946f4322009-07-26 23:44:38 +0100575
576 if(winsys->destroy)
577 winsys->destroy(winsys);
578
Timothy Arceribe188282017-03-05 12:32:04 +1100579 mtx_destroy(&screen->rast_mutex);
Roland Scheideggeredac7402010-07-13 19:58:58 +0200580
José Fonseca946f4322009-07-26 23:44:38 +0100581 FREE(screen);
582}
583
584
585
Keith Whitwell5a45e532010-08-20 15:25:27 +0100586
587/**
588 * Fence reference counting.
589 */
590static void
591llvmpipe_fence_reference(struct pipe_screen *screen,
592 struct pipe_fence_handle **ptr,
593 struct pipe_fence_handle *fence)
594{
595 struct lp_fence **old = (struct lp_fence **) ptr;
596 struct lp_fence *f = (struct lp_fence *) fence;
597
598 lp_fence_reference(old, f);
599}
600
601
602/**
Keith Whitwell5a45e532010-08-20 15:25:27 +0100603 * Wait for the fence to finish.
604 */
Marek Olšákbfe88e62011-03-07 22:57:54 +0100605static boolean
Keith Whitwell5a45e532010-08-20 15:25:27 +0100606llvmpipe_fence_finish(struct pipe_screen *screen,
Marek Olšák54272e12016-08-06 16:41:42 +0200607 struct pipe_context *ctx,
Keith Whitwell5a45e532010-08-20 15:25:27 +0100608 struct pipe_fence_handle *fence_handle,
Marek Olšákb39bccb2011-03-05 21:23:54 +0100609 uint64_t timeout)
Keith Whitwell5a45e532010-08-20 15:25:27 +0100610{
611 struct lp_fence *f = (struct lp_fence *) fence_handle;
612
Marek Olšák3da1c792015-06-26 13:13:16 +0200613 if (!timeout)
614 return lp_fence_signalled(f);
615
Keith Whitwell5a45e532010-08-20 15:25:27 +0100616 lp_fence_wait(f);
Marek Olšákbfe88e62011-03-07 22:57:54 +0100617 return TRUE;
Keith Whitwell5a45e532010-08-20 15:25:27 +0100618}
619
James Benton16f0d702012-12-03 07:00:37 +0000620static uint64_t
621llvmpipe_get_timestamp(struct pipe_screen *_screen)
622{
623 return os_time_get_nano();
624}
Keith Whitwell5a45e532010-08-20 15:25:27 +0100625
José Fonseca946f4322009-07-26 23:44:38 +0100626/**
627 * Create a new pipe_screen object
628 * Note: we're not presently subclassing pipe_screen (no llvmpipe_screen).
629 */
630struct pipe_screen *
Keith Whitwell94ce4eb2010-03-04 16:09:33 +0000631llvmpipe_create_screen(struct sw_winsys *winsys)
José Fonseca946f4322009-07-26 23:44:38 +0100632{
Török Edwin4d52a252010-05-06 22:19:57 +0100633 struct llvmpipe_screen *screen;
634
Török Edwin4d52a252010-05-06 22:19:57 +0100635 util_cpu_detect();
Adam Jacksonca70de92013-04-04 17:16:22 -0400636
Keith Whitwelldec35d02009-10-09 14:59:35 +0100637#ifdef DEBUG
638 LP_DEBUG = debug_get_flags_option("LP_DEBUG", lp_debug_flags, 0 );
639#endif
640
Keith Whitwell5f008192010-09-16 10:45:52 +0100641 LP_PERF = debug_get_flags_option("LP_PERF", lp_perf_flags, 0 );
642
José Fonsecac88f3e02011-11-09 19:29:37 +0000643 screen = CALLOC_STRUCT(llvmpipe_screen);
José Fonseca946f4322009-07-26 23:44:38 +0100644 if (!screen)
645 return NULL;
646
Brian Paul6b658472014-09-29 16:08:55 -0600647 if (!lp_jit_screen_init(screen)) {
648 FREE(screen);
649 return NULL;
650 }
651
José Fonsecae173a9b2009-08-29 20:02:25 +0100652 screen->winsys = winsys;
José Fonseca946f4322009-07-26 23:44:38 +0100653
654 screen->base.destroy = llvmpipe_destroy_screen;
655
656 screen->base.get_name = llvmpipe_get_name;
657 screen->base.get_vendor = llvmpipe_get_vendor;
Giuseppe Bilotta76039b32015-03-22 07:21:01 +0100658 screen->base.get_device_vendor = llvmpipe_get_vendor; // TODO should be the CPU vendor
José Fonseca946f4322009-07-26 23:44:38 +0100659 screen->base.get_param = llvmpipe_get_param;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200660 screen->base.get_shader_param = llvmpipe_get_shader_param;
José Fonseca946f4322009-07-26 23:44:38 +0100661 screen->base.get_paramf = llvmpipe_get_paramf;
662 screen->base.is_format_supported = llvmpipe_is_format_supported;
663
Keith Whitwell7f41f542010-02-08 12:55:59 +0000664 screen->base.context_create = llvmpipe_create_context;
José Fonsecae173a9b2009-08-29 20:02:25 +0100665 screen->base.flush_frontbuffer = llvmpipe_flush_frontbuffer;
Keith Whitwell5a45e532010-08-20 15:25:27 +0100666 screen->base.fence_reference = llvmpipe_fence_reference;
Keith Whitwell5a45e532010-08-20 15:25:27 +0100667 screen->base.fence_finish = llvmpipe_fence_finish;
José Fonsecae173a9b2009-08-29 20:02:25 +0100668
James Benton16f0d702012-12-03 07:00:37 +0000669 screen->base.get_timestamp = llvmpipe_get_timestamp;
670
Keith Whitwell287c94e2010-04-10 16:05:54 +0100671 llvmpipe_init_screen_resource_funcs(&screen->base);
José Fonseca946f4322009-07-26 23:44:38 +0100672
José Fonseca65822eb2010-09-16 20:27:13 +0100673 screen->num_threads = util_cpu_caps.nr_cpus > 1 ? util_cpu_caps.nr_cpus : 0;
José Fonseca41750102011-06-17 14:48:28 +0100674#ifdef PIPE_SUBSYSTEM_EMBEDDED
José Fonseca39be50d2010-04-24 13:20:39 +0100675 screen->num_threads = 0;
José Fonseca39be50d2010-04-24 13:20:39 +0100676#endif
677 screen->num_threads = debug_get_num_option("LP_NUM_THREADS", screen->num_threads);
678 screen->num_threads = MIN2(screen->num_threads, LP_MAX_THREADS);
José Fonseca39be50d2010-04-24 13:20:39 +0100679
Roland Scheideggeredac7402010-07-13 19:58:58 +0200680 screen->rast = lp_rast_create(screen->num_threads);
681 if (!screen->rast) {
682 lp_jit_screen_cleanup(screen);
683 FREE(screen);
684 return NULL;
685 }
Timothy Arceri75b47dd2017-03-05 12:00:15 +1100686 (void) mtx_init(&screen->rast_mutex, mtx_plain);
Roland Scheideggeredac7402010-07-13 19:58:58 +0200687
José Fonseca39be50d2010-04-24 13:20:39 +0100688 util_format_s3tc_init();
689
José Fonseca946f4322009-07-26 23:44:38 +0100690 return &screen->base;
691}