blob: 7d01e6458f7b48aa22a42615381472750b5bb257 [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:
José Fonseca946f4322009-07-26 23:44:38 +0100112 return 1;
113 case PIPE_CAP_TWO_SIDED_STENCIL:
114 return 1;
Jakob Bornecrantzc4e89d12010-04-29 16:18:43 +0100115 case PIPE_CAP_SM3:
116 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600117 case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
Roland Scheidegger8b8bca02013-02-12 03:41:48 +0100118 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600119 case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
Dave Airlie77b26562012-12-05 06:50:07 +1000120 return PIPE_MAX_SO_BUFFERS;
José Fonseca946f4322009-07-26 23:44:38 +0100121 case PIPE_CAP_ANISOTROPIC_FILTER:
122 return 0;
123 case PIPE_CAP_POINT_SPRITE:
124 return 1;
125 case PIPE_CAP_MAX_RENDER_TARGETS:
126 return PIPE_MAX_COLOR_BUFS;
127 case PIPE_CAP_OCCLUSION_QUERY:
128 return 1;
José Fonseca99762162012-12-09 09:50:34 +0000129 case PIPE_CAP_QUERY_TIME_ELAPSED:
José Fonsecaab2f5732012-12-09 10:15:19 +0000130 return 0;
James Benton16f0d702012-12-03 07:00:37 +0000131 case PIPE_CAP_QUERY_TIMESTAMP:
132 return 1;
Christoph Bumillerf35e96d2013-03-29 13:02:49 +0100133 case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
134 return 0;
José Fonseca946f4322009-07-26 23:44:38 +0100135 case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
136 return 1;
José Fonseca946f4322009-07-26 23:44:38 +0100137 case PIPE_CAP_TEXTURE_SHADOW_MAP:
138 return 1;
José Fonseca9881b5c2010-06-05 14:48:39 +0100139 case PIPE_CAP_TEXTURE_SWIZZLE:
140 return 1;
Christoph Bumiller729abfd2013-04-12 13:42:01 +0200141 case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
142 return 0;
José Fonseca946f4322009-07-26 23:44:38 +0100143 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
Brian Pauld73fadf2010-03-08 13:36:34 -0700144 return LP_MAX_TEXTURE_2D_LEVELS;
José Fonseca946f4322009-07-26 23:44:38 +0100145 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
Brian Pauld73fadf2010-03-08 13:36:34 -0700146 return LP_MAX_TEXTURE_3D_LEVELS;
José Fonseca946f4322009-07-26 23:44:38 +0100147 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
Brian Pauldf73be92012-09-16 19:05:51 -0600148 return LP_MAX_TEXTURE_CUBE_LEVELS;
Roland Scheidegger6d501482012-11-29 04:08:32 +0100149 case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
150 return LP_MAX_TEXTURE_ARRAY_LAYERS;
José Fonseca946f4322009-07-26 23:44:38 +0100151 case PIPE_CAP_BLEND_EQUATION_SEPARATE:
152 return 1;
Roland Scheidegger1a9d01d2010-01-26 17:32:57 +0100153 case PIPE_CAP_INDEP_BLEND_ENABLE:
Brian Paul7b937cf2010-05-10 17:03:10 -0600154 return 1;
Roland Scheidegger1a9d01d2010-01-26 17:32:57 +0100155 case PIPE_CAP_INDEP_BLEND_FUNC:
Brian Paul96a2e892011-01-17 16:42:43 -0700156 return 1;
Luca Barbieri6c4037502010-01-21 05:36:14 +0100157 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
158 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
José Fonsecaa9301362013-04-18 11:39:19 +0100159 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
Luca Barbieri6c4037502010-01-21 05:36:14 +0100160 return 1;
161 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
Luca Barbieri6c4037502010-01-21 05:36:14 +0100162 return 0;
Brian Paul6692ed62010-10-21 19:03:38 -0600163 case PIPE_CAP_PRIMITIVE_RESTART:
164 return 1;
Marek Olšákdc4c8212012-01-10 00:19:00 +0100165 case PIPE_CAP_DEPTH_CLIP_DISABLE:
José Fonseca85d7f672013-10-15 18:08:26 -0700166 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600167 case PIPE_CAP_SHADER_STENCIL_EXPORT:
Roland Scheidegger4fd42a72015-06-03 01:34:06 +0200168 return 1;
Marek Olšák95c78812011-03-05 16:06:10 +0100169 case PIPE_CAP_TGSI_INSTANCEID:
170 case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
Roland Scheideggereee9f6a2014-08-25 22:05:16 +0200171 case PIPE_CAP_START_INSTANCE:
Brian Paul056e9b42012-06-26 14:11:00 -0600172 return 1;
173 case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
174 return 0;
Marek Olšák4a7f0132011-03-29 18:18:05 +0200175 case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
Brian Paul056e9b42012-06-26 14:11:00 -0600176 return 1;
177 case PIPE_CAP_SEAMLESS_CUBE_MAP:
178 case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
Roland Scheideggerac81b6f2013-10-18 20:54:01 +0200179 return 1;
Roland Scheidegger0b6554b2012-11-27 03:26:49 +0100180 /* this is a lie could support arbitrary large offsets */
Ilia Mirkinc2f9ad52014-04-09 14:58:53 -0400181 case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
Brian Paul056e9b42012-06-26 14:11:00 -0600182 case PIPE_CAP_MIN_TEXEL_OFFSET:
Roland Scheidegger48986692015-03-31 17:23:17 +0200183 return -32;
Ilia Mirkinc2f9ad52014-04-09 14:58:53 -0400184 case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
Brian Paul056e9b42012-06-26 14:11:00 -0600185 case PIPE_CAP_MAX_TEXEL_OFFSET:
Roland Scheidegger48986692015-03-31 17:23:17 +0200186 return 31;
Dave Airlieab149152011-11-07 17:31:49 +0000187 case PIPE_CAP_CONDITIONAL_RENDER:
Brian Pauldcb48e72010-12-08 19:06:22 -0700188 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600189 case PIPE_CAP_TEXTURE_BARRIER:
190 return 0;
191 case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
192 case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
Dave Airlie77b26562012-12-05 06:50:07 +1000193 return 16*4;
Grigori Goronzyd34d5fd2014-02-09 22:56:20 +0100194 case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
195 case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
196 return 1024;
Ilia Mirkin746e5262014-06-26 20:01:50 -0400197 case PIPE_CAP_MAX_VERTEX_STREAMS:
198 return 1;
Timothy Arceri89e68062014-08-19 21:09:58 -1000199 case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
200 return 2048;
Brian Paul056e9b42012-06-26 14:11:00 -0600201 case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
Dave Airlie9e41b0b2012-12-13 20:17:58 +1000202 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600203 case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
204 return 0;
205 case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
206 case PIPE_CAP_VERTEX_COLOR_CLAMPED:
James Benton66fdf622012-09-13 16:05:08 +0100207 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600208 case PIPE_CAP_GLSL_FEATURE_LEVEL:
José Fonseca7380ce92014-04-24 15:00:12 +0100209 return 330;
Christoph Bumiller8b4f7b02012-02-06 16:29:03 +0100210 case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
211 return 0;
Brian Paul056e9b42012-06-26 14:11:00 -0600212 case PIPE_CAP_COMPUTE:
213 return 0;
Marek Olšák978c1aa12012-04-11 15:40:00 +0200214 case PIPE_CAP_USER_VERTEX_BUFFERS:
Marek Olšák437ab1d2012-04-24 15:19:31 +0200215 case PIPE_CAP_USER_INDEX_BUFFERS:
Marek Olšák978c1aa12012-04-11 15:40:00 +0200216 return 1;
Brian Paul2ee0b442012-12-10 12:35:23 -0700217 case PIPE_CAP_USER_CONSTANT_BUFFERS:
218 return 0;
Brian Paul056e9b42012-06-26 14:11:00 -0600219 case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
220 case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
221 case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
Christoph Bumiller8acaf862013-03-15 22:11:31 +0100222 case PIPE_CAP_TGSI_TEXCOORD:
Brian Paul056e9b42012-06-26 14:11:00 -0600223 return 0;
Christoph Bumillerbc198f82013-04-05 14:29:36 +0200224 case PIPE_CAP_DRAW_INDIRECT:
225 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600226
Roland Scheidegger62fd8712014-08-28 03:38:55 +0200227 case PIPE_CAP_CUBE_MAP_ARRAY:
228 return 1;
Marek Olšák1b749dc2012-04-24 17:31:17 +0200229 case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
230 return 16;
Marek Olšákb9c9dd42012-09-11 22:41:20 +0200231 case PIPE_CAP_TEXTURE_MULTISAMPLE:
José Fonseca946f4322009-07-26 23:44:38 +0100232 return 0;
Siavash Eliasi809d3a72013-11-28 12:26:30 +0330233 case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
234 return 64;
Roland Scheidegger20183172013-02-25 20:23:18 +0100235 case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
236 return 1;
Marek Olšák52cb3952013-05-02 03:24:33 +0200237 case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
238 return 65536;
Roland Scheidegger20183172013-02-25 20:23:18 +0100239 case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
240 return 1;
Marek Olšák3e10ab62013-03-14 17:18:43 +0100241 case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
242 return 0;
Zack Rusineaabb4e2013-05-24 16:08:39 -0400243 case PIPE_CAP_MAX_VIEWPORTS:
Zack Rusin97b8ae42013-05-24 16:28:19 -0400244 return PIPE_MAX_VIEWPORTS;
Tom Stellard4e90bc92013-07-09 21:21:39 -0700245 case PIPE_CAP_ENDIANNESS:
246 return PIPE_ENDIAN_NATIVE;
Ilia Mirkin32b71242014-07-03 11:15:18 -0400247 case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
Roland Scheidegger763fc522014-11-18 23:04:36 +0100248 return 1;
Jose Fonseca08efcc02015-02-05 14:33:06 +0000249 case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
250 return 1;
Dave Airlie2fcbec42013-09-21 18:45:43 +1000251 case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
Roland Scheidegger48986692015-03-31 17:23:17 +0200252 return 4;
Dave Airlie2fcbec42013-09-21 18:45:43 +1000253 case PIPE_CAP_TEXTURE_GATHER_SM5:
Dave Airliebe5276a2014-02-11 13:26:08 +1000254 case PIPE_CAP_TEXTURE_QUERY_LOD:
Ilia Mirkin88d8d882014-03-30 18:21:04 -0400255 case PIPE_CAP_SAMPLE_SHADING:
Ilia Mirkind95df4f2014-04-26 23:44:57 -0400256 case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
Marek Olšák65ef78e2014-11-17 22:30:31 +0100257 return 0;
Christoph Bumiller4b586a22014-05-17 01:20:19 +0200258 case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
Marek Olšák65ef78e2014-11-17 22:30:31 +0100259 return 1;
Ilia Mirkin8ee74ce2014-08-14 00:04:41 -0400260 case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
Marek Olšák1a02bb72013-11-21 15:25:55 +0100261 return 0;
Roland Scheideggere6c66f42015-05-13 22:16:44 +0200262 case PIPE_CAP_SAMPLER_VIEW_TARGET:
263 return 1;
Dave Airlie76ba50a2013-11-27 19:47:51 +1000264 case PIPE_CAP_FAKE_SW_MSAA:
Giovanni Campagnae57ad3d2014-07-23 19:28:52 +0100265 return 1;
Tobias Klausmann544c5412014-08-17 17:16:08 +0200266 case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
267 return 1;
Emil Velikov89f80c22014-08-14 21:15:06 +0100268
269 case PIPE_CAP_VENDOR_ID:
270 return 0xFFFFFFFF;
271 case PIPE_CAP_DEVICE_ID:
272 return 0xFFFFFFFF;
273 case PIPE_CAP_ACCELERATED:
274 return 0;
275 case PIPE_CAP_VIDEO_MEMORY: {
276 /* XXX: Do we want to return the full amount fo system memory ? */
277 uint64_t system_memory;
278
279 if (!os_get_total_physical_memory(&system_memory))
280 return 0;
281
282 return (int)(system_memory >> 20);
283 }
284 case PIPE_CAP_UMA:
285 return 0;
Mathias Fröhlich56088132014-09-14 15:17:07 +0200286 case PIPE_CAP_CLIP_HALFZ:
287 return 1;
Roland Scheideggerade8b262014-12-12 04:13:43 +0100288 case PIPE_CAP_VERTEXID_NOBASE:
289 return 0;
Ilia Mirkin7c211a12015-02-01 09:01:50 -0500290 case PIPE_CAP_POLYGON_OFFSET_CLAMP:
Marek Olšák44dc1d32015-08-10 19:37:01 +0200291 case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
292 case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:
Ilia Mirkin7c211a12015-02-01 09:01:50 -0500293 return 1;
Tobias Klausmann96f390f2016-05-08 22:44:10 +0200294 case PIPE_CAP_CULL_DISTANCE:
295 return 1;
Brian Paule9b86bb2016-06-03 14:55:47 -0600296 case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:
297 return 1;
Axel Davyeb1c12d2015-01-17 14:30:17 +0100298 case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
Marek Olšák8b587ee2015-02-10 14:00:57 +0100299 case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
Marek Olšák79ffc08a2015-04-29 15:44:55 +0200300 case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
Marek Olšák26222932015-06-12 14:24:17 +0200301 case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
Marek Olšák3b7800e2015-08-10 02:11:48 +0200302 case PIPE_CAP_DEPTH_BOUNDS_TEST:
Ilia Mirkinf46a53f2015-09-11 17:29:49 -0400303 case PIPE_CAP_TGSI_TXQS:
Marek Olšákf3b37e32015-09-27 19:32:07 +0200304 case PIPE_CAP_FORCE_PERSAMPLE_INTERP:
Marek Olšákd74e7b62015-09-27 21:02:15 +0200305 case PIPE_CAP_SHAREABLE_SHADERS:
Ilia Mirkin3695b252015-11-09 13:27:07 -0500306 case PIPE_CAP_CLEAR_TEXTURE:
Ilia Mirkin87b4e4e2015-12-29 16:49:32 -0500307 case PIPE_CAP_DRAW_PARAMETERS:
Ilia Mirkine9f43d62016-01-02 18:55:48 -0500308 case PIPE_CAP_TGSI_PACK_HALF_FLOAT:
Ilia Mirkind67b9ba2015-12-31 13:30:13 -0500309 case PIPE_CAP_MULTI_DRAW_INDIRECT:
310 case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
Marek Olšák34738a92016-01-02 20:45:00 +0100311 case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
312 case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
Ilia Mirkinebfb5442016-01-02 21:56:45 -0500313 case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
Nicolai Hähnle654670b2016-01-11 17:38:08 -0500314 case PIPE_CAP_INVALIDATE_BUFFER:
Charmaine Lee3038e892016-01-14 10:22:17 -0700315 case PIPE_CAP_GENERATE_MIPMAP:
Rob Clarkd6408372015-08-10 11:41:29 -0400316 case PIPE_CAP_STRING_MARKER:
Nicolai Hähnle3abb5482016-01-26 10:26:30 -0500317 case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:
Nicolai Hähnle6af6d7b2016-01-26 10:27:58 -0500318 case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
Ilia Mirkinf9e6f462016-01-09 23:30:16 -0500319 case PIPE_CAP_QUERY_BUFFER_OBJECT:
Marek Olšákd2e4c9e2016-02-01 21:56:50 +0100320 case PIPE_CAP_QUERY_MEMORY_INFO:
Marek Olšákdcb2b772016-02-29 20:22:37 +0100321 case PIPE_CAP_PCI_GROUP:
322 case PIPE_CAP_PCI_BUS:
323 case PIPE_CAP_PCI_DEVICE:
324 case PIPE_CAP_PCI_FUNCTION:
Edward O'Callaghan4bc91302016-02-17 20:59:52 +1100325 case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
Bas Nieuwenhuizen70dcd842016-04-12 15:00:31 +0200326 case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
Kenneth Graunke70048eb2016-05-20 21:05:34 -0700327 case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
Ilia Mirkinedfa7a42016-05-29 11:39:52 -0400328 case PIPE_CAP_TGSI_VOTE:
Ilia Mirkin07fcb062016-06-11 15:26:45 -0400329 case PIPE_CAP_MAX_WINDOW_RECTANGLES:
Axel Davyeb1c12d2015-01-17 14:30:17 +0100330 return 0;
José Fonseca946f4322009-07-26 23:44:38 +0100331 }
Brian Paul056e9b42012-06-26 14:11:00 -0600332 /* should only get here on unhandled cases */
333 debug_printf("Unexpected PIPE_CAP %d query\n", param);
334 return 0;
José Fonseca946f4322009-07-26 23:44:38 +0100335}
336
Luca Barbieria508d2d2010-09-05 20:50:50 +0200337static int
338llvmpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param)
339{
340 switch(shader)
341 {
342 case PIPE_SHADER_FRAGMENT:
Dave Airlie2d80cad2012-01-11 19:48:00 +0000343 switch (param) {
Dave Airlie2d80cad2012-01-11 19:48:00 +0000344 default:
José Fonseca6dddd182012-07-12 20:47:20 +0100345 return gallivm_get_shader_param(param);
Dave Airlie2d80cad2012-01-11 19:48:00 +0000346 }
Luca Barbieria508d2d2010-09-05 20:50:50 +0200347 case PIPE_SHADER_VERTEX:
348 case PIPE_SHADER_GEOMETRY:
Marek Olšákf5bfe542011-09-27 22:22:06 +0200349 switch (param) {
350 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
351 /* At this time, the draw module and llvmpipe driver only
352 * support vertex shader texture lookups when LLVM is enabled in
353 * the draw module.
354 */
355 if (debug_get_bool_option("DRAW_USE_LLVM", TRUE))
Brian Paulcab2fed2012-08-09 20:59:44 -0600356 return PIPE_MAX_SAMPLERS;
Marek Olšákf5bfe542011-09-27 22:22:06 +0200357 else
358 return 0;
Roland Scheidegger2983c032013-11-26 02:30:41 +0100359 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
360 if (debug_get_bool_option("DRAW_USE_LLVM", TRUE))
361 return PIPE_MAX_SHADER_SAMPLER_VIEWS;
362 else
363 return 0;
Marek Olšákf5bfe542011-09-27 22:22:06 +0200364 default:
365 return draw_get_shader_param(shader, param);
366 }
Luca Barbieria508d2d2010-09-05 20:50:50 +0200367 default:
368 return 0;
369 }
370}
José Fonseca946f4322009-07-26 23:44:38 +0100371
372static float
Marek Olšákbb71f922011-11-19 22:38:22 +0100373llvmpipe_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
José Fonseca946f4322009-07-26 23:44:38 +0100374{
375 switch (param) {
Marek Olšákbb71f922011-11-19 22:38:22 +0100376 case PIPE_CAPF_MAX_LINE_WIDTH:
José Fonseca946f4322009-07-26 23:44:38 +0100377 /* fall-through */
Marek Olšákbb71f922011-11-19 22:38:22 +0100378 case PIPE_CAPF_MAX_LINE_WIDTH_AA:
José Fonseca946f4322009-07-26 23:44:38 +0100379 return 255.0; /* arbitrary */
Marek Olšákbb71f922011-11-19 22:38:22 +0100380 case PIPE_CAPF_MAX_POINT_WIDTH:
José Fonseca946f4322009-07-26 23:44:38 +0100381 /* fall-through */
Marek Olšákbb71f922011-11-19 22:38:22 +0100382 case PIPE_CAPF_MAX_POINT_WIDTH_AA:
José Fonseca946f4322009-07-26 23:44:38 +0100383 return 255.0; /* arbitrary */
Marek Olšákbb71f922011-11-19 22:38:22 +0100384 case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
José Fonseca946f4322009-07-26 23:44:38 +0100385 return 16.0; /* not actually signficant at this time */
Marek Olšákbb71f922011-11-19 22:38:22 +0100386 case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
José Fonseca946f4322009-07-26 23:44:38 +0100387 return 16.0; /* arbitrary */
Marek Olšákbb71f922011-11-19 22:38:22 +0100388 case PIPE_CAPF_GUARD_BAND_LEFT:
389 case PIPE_CAPF_GUARD_BAND_TOP:
390 case PIPE_CAPF_GUARD_BAND_RIGHT:
391 case PIPE_CAPF_GUARD_BAND_BOTTOM:
José Fonsecacf9baf62010-05-12 17:25:17 +0100392 return 0.0;
José Fonseca946f4322009-07-26 23:44:38 +0100393 }
Brian Paul056e9b42012-06-26 14:11:00 -0600394 /* should only get here on unhandled cases */
395 debug_printf("Unexpected PIPE_CAP %d query\n", param);
396 return 0.0;
José Fonseca946f4322009-07-26 23:44:38 +0100397}
398
399
400/**
401 * Query format support for creating a texture, drawing surface, etc.
402 * \param format the format to test
403 * \param type one of PIPE_TEXTURE, PIPE_SURFACE
404 */
405static boolean
José Fonsecae173a9b2009-08-29 20:02:25 +0100406llvmpipe_is_format_supported( struct pipe_screen *_screen,
Roland Scheideggere121a732010-05-17 21:23:31 +0200407 enum pipe_format format,
José Fonseca946f4322009-07-26 23:44:38 +0100408 enum pipe_texture_target target,
Roland Scheideggere121a732010-05-17 21:23:31 +0200409 unsigned sample_count,
Marek Olšáke9689752011-03-08 00:01:58 +0100410 unsigned bind)
José Fonseca946f4322009-07-26 23:44:38 +0100411{
José Fonsecae173a9b2009-08-29 20:02:25 +0100412 struct llvmpipe_screen *screen = llvmpipe_screen(_screen);
Keith Whitwell94ce4eb2010-03-04 16:09:33 +0000413 struct sw_winsys *winsys = screen->winsys;
José Fonsecab3755262009-11-10 17:51:06 -0800414 const struct util_format_description *format_desc;
415
416 format_desc = util_format_description(format);
José Fonsecaadc7cd62010-04-25 14:52:27 +0100417 if (!format_desc)
José Fonsecab3755262009-11-10 17:51:06 -0800418 return FALSE;
José Fonsecae173a9b2009-08-29 20:02:25 +0100419
Brian Paule6d8b402010-05-28 13:31:23 -0600420 assert(target == PIPE_BUFFER ||
421 target == PIPE_TEXTURE_1D ||
Roland Scheidegger6d501482012-11-29 04:08:32 +0100422 target == PIPE_TEXTURE_1D_ARRAY ||
José Fonseca946f4322009-07-26 23:44:38 +0100423 target == PIPE_TEXTURE_2D ||
Roland Scheidegger6d501482012-11-29 04:08:32 +0100424 target == PIPE_TEXTURE_2D_ARRAY ||
Luca Barbieriae0ef6f2010-08-18 17:28:08 +0200425 target == PIPE_TEXTURE_RECT ||
José Fonseca946f4322009-07-26 23:44:38 +0100426 target == PIPE_TEXTURE_3D ||
Roland Scheideggerea05cfa2014-08-01 23:50:35 +0200427 target == PIPE_TEXTURE_CUBE ||
428 target == PIPE_TEXTURE_CUBE_ARRAY);
José Fonseca946f4322009-07-26 23:44:38 +0100429
Roland Scheideggere121a732010-05-17 21:23:31 +0200430 if (sample_count > 1)
431 return FALSE;
432
José Fonsecaadc7cd62010-04-25 14:52:27 +0100433 if (bind & PIPE_BIND_RENDER_TARGET) {
Roland Scheideggerdc1cc922013-07-16 01:52:29 +0200434 if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
Roland Scheidegger9477d8c2014-03-20 16:43:36 +0100435 /* this is a lie actually other formats COULD exist where we would fail */
Roland Scheideggerdc1cc922013-07-16 01:52:29 +0200436 if (format_desc->nr_channels < 3)
437 return FALSE;
438 }
439 else if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_RGB)
José Fonsecafe130a72010-04-06 22:49:57 +0100440 return FALSE;
441
Roland Scheideggerb101a092013-03-22 20:09:18 +0100442 if (format_desc->layout != UTIL_FORMAT_LAYOUT_PLAIN &&
443 format != PIPE_FORMAT_R11G11B10_FLOAT)
José Fonsecafe130a72010-04-06 22:49:57 +0100444 return FALSE;
Roland Scheideggerdc1cc922013-07-16 01:52:29 +0200445
José Fonseca69163872012-11-28 19:25:05 +0000446 assert(format_desc->block.width == 1);
447 assert(format_desc->block.height == 1);
José Fonsecafe130a72010-04-06 22:49:57 +0100448
José Fonseca69163872012-11-28 19:25:05 +0000449 if (format_desc->is_mixed)
450 return FALSE;
451
Roland Scheideggerb101a092013-03-22 20:09:18 +0100452 if (!format_desc->is_array && !format_desc->is_bitmask &&
453 format != PIPE_FORMAT_R11G11B10_FLOAT)
José Fonsecab3755262009-11-10 17:51:06 -0800454 return FALSE;
Brian Paul2db747c2016-06-03 15:06:28 -0600455 }
Roland Scheideggerd03d9b62013-01-12 17:28:40 -0800456
Brian Paul2db747c2016-06-03 15:06:28 -0600457 if ((bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW)) &&
458 ((bind & PIPE_BIND_DISPLAY_TARGET) == 0)) {
459 /* Disable all 3-channel formats, where channel size != 32 bits.
460 * In some cases we run into crashes (in generate_unswizzled_blend()),
461 * for 3-channel RGB16 variants, there was an apparent LLVM bug.
462 * In any case, disabling the shallower 3-channel formats avoids a
463 * number of issues with GL_ARB_copy_image support.
Roland Scheideggerd03d9b62013-01-12 17:28:40 -0800464 */
Brian Paul2db747c2016-06-03 15:06:28 -0600465 if (format_desc->is_array &&
466 format_desc->nr_channels == 3 &&
467 format_desc->block.bits != 96) {
468 return FALSE;
Roland Scheideggerd03d9b62013-01-12 17:28:40 -0800469 }
José Fonsecab3755262009-11-10 17:51:06 -0800470 }
471
José Fonsecaadc7cd62010-04-25 14:52:27 +0100472 if (bind & PIPE_BIND_DISPLAY_TARGET) {
473 if(!winsys->is_displaytarget_format_supported(winsys, bind, format))
José Fonsecab3755262009-11-10 17:51:06 -0800474 return FALSE;
475 }
476
José Fonsecaadc7cd62010-04-25 14:52:27 +0100477 if (bind & PIPE_BIND_DEPTH_STENCIL) {
478 if (format_desc->layout != UTIL_FORMAT_LAYOUT_PLAIN)
479 return FALSE;
480
481 if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
José Fonsecab3755262009-11-10 17:51:06 -0800482 return FALSE;
483
José Fonseca42f762d2013-01-29 13:27:44 +0000484 /* TODO: Support stencil-only formats */
Marek Olšákfb523cb2016-04-16 14:05:47 +0200485 if (format_desc->swizzle[0] == PIPE_SWIZZLE_NONE) {
José Fonseca42f762d2013-01-29 13:27:44 +0000486 return FALSE;
487 }
José Fonsecab3755262009-11-10 17:51:06 -0800488 }
489
Roland Scheidegger6c6a4392015-11-24 18:25:06 +0100490 if (format_desc->layout == UTIL_FORMAT_LAYOUT_BPTC ||
491 format_desc->layout == UTIL_FORMAT_LAYOUT_ASTC) {
Ilia Mirkin19563f02014-07-22 21:08:14 -0400492 /* Software decoding is not hooked up. */
493 return FALSE;
494 }
495
Ilia Mirkin845b9e42015-02-18 22:23:12 -0500496 if (format_desc->layout == UTIL_FORMAT_LAYOUT_ETC &&
497 format != PIPE_FORMAT_ETC1_RGB8)
498 return FALSE;
499
José Fonsecaadc7cd62010-04-25 14:52:27 +0100500 if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
José Fonseca510669c2010-04-22 15:12:30 +0100501 return util_format_s3tc_enabled;
José Fonseca510669c2010-04-22 15:12:30 +0100502 }
503
José Fonsecaa1b737d2011-11-01 12:28:47 +0000504 /*
Roland Scheideggerd03d9b62013-01-12 17:28:40 -0800505 * Everything can be supported by u_format
506 * (those without fetch_rgba_float might be not but shouldn't hit that)
José Fonsecaa1b737d2011-11-01 12:28:47 +0000507 */
508
José Fonsecae173a9b2009-08-29 20:02:25 +0100509 return TRUE;
510}
511
512
José Fonsecae173a9b2009-08-29 20:02:25 +0100513
514
515static void
516llvmpipe_flush_frontbuffer(struct pipe_screen *_screen,
Roland Scheidegger4c700142010-12-02 04:33:43 +0100517 struct pipe_resource *resource,
518 unsigned level, unsigned layer,
Dave Airlieba00f2f2013-11-28 11:08:11 +1000519 void *context_private,
520 struct pipe_box *sub_box)
José Fonsecae173a9b2009-08-29 20:02:25 +0100521{
522 struct llvmpipe_screen *screen = llvmpipe_screen(_screen);
Keith Whitwell94ce4eb2010-03-04 16:09:33 +0000523 struct sw_winsys *winsys = screen->winsys;
Roland Scheidegger4c700142010-12-02 04:33:43 +0100524 struct llvmpipe_resource *texture = llvmpipe_resource(resource);
José Fonsecae173a9b2009-08-29 20:02:25 +0100525
526 assert(texture->dt);
527 if (texture->dt)
Dave Airlieba00f2f2013-11-28 11:08:11 +1000528 winsys->displaytarget_display(winsys, texture->dt, context_private, sub_box);
José Fonseca946f4322009-07-26 23:44:38 +0100529}
530
José Fonseca946f4322009-07-26 23:44:38 +0100531static void
José Fonseca2d6b39f2009-08-09 23:10:19 +0100532llvmpipe_destroy_screen( struct pipe_screen *_screen )
José Fonseca946f4322009-07-26 23:44:38 +0100533{
José Fonseca2d6b39f2009-08-09 23:10:19 +0100534 struct llvmpipe_screen *screen = llvmpipe_screen(_screen);
Keith Whitwell94ce4eb2010-03-04 16:09:33 +0000535 struct sw_winsys *winsys = screen->winsys;
José Fonseca2d6b39f2009-08-09 23:10:19 +0100536
Roland Scheideggeredac7402010-07-13 19:58:58 +0200537 if (screen->rast)
538 lp_rast_destroy(screen->rast);
539
José Fonseca08dd41f2009-08-23 05:52:20 +0100540 lp_jit_screen_cleanup(screen);
José Fonseca946f4322009-07-26 23:44:38 +0100541
542 if(winsys->destroy)
543 winsys->destroy(winsys);
544
Roland Scheideggeredac7402010-07-13 19:58:58 +0200545 pipe_mutex_destroy(screen->rast_mutex);
546
José Fonseca946f4322009-07-26 23:44:38 +0100547 FREE(screen);
548}
549
550
551
Keith Whitwell5a45e532010-08-20 15:25:27 +0100552
553/**
554 * Fence reference counting.
555 */
556static void
557llvmpipe_fence_reference(struct pipe_screen *screen,
558 struct pipe_fence_handle **ptr,
559 struct pipe_fence_handle *fence)
560{
561 struct lp_fence **old = (struct lp_fence **) ptr;
562 struct lp_fence *f = (struct lp_fence *) fence;
563
564 lp_fence_reference(old, f);
565}
566
567
568/**
Keith Whitwell5a45e532010-08-20 15:25:27 +0100569 * Wait for the fence to finish.
570 */
Marek Olšákbfe88e62011-03-07 22:57:54 +0100571static boolean
Keith Whitwell5a45e532010-08-20 15:25:27 +0100572llvmpipe_fence_finish(struct pipe_screen *screen,
573 struct pipe_fence_handle *fence_handle,
Marek Olšákb39bccb2011-03-05 21:23:54 +0100574 uint64_t timeout)
Keith Whitwell5a45e532010-08-20 15:25:27 +0100575{
576 struct lp_fence *f = (struct lp_fence *) fence_handle;
577
Marek Olšák3da1c792015-06-26 13:13:16 +0200578 if (!timeout)
579 return lp_fence_signalled(f);
580
Keith Whitwell5a45e532010-08-20 15:25:27 +0100581 lp_fence_wait(f);
Marek Olšákbfe88e62011-03-07 22:57:54 +0100582 return TRUE;
Keith Whitwell5a45e532010-08-20 15:25:27 +0100583}
584
James Benton16f0d702012-12-03 07:00:37 +0000585static uint64_t
586llvmpipe_get_timestamp(struct pipe_screen *_screen)
587{
588 return os_time_get_nano();
589}
Keith Whitwell5a45e532010-08-20 15:25:27 +0100590
José Fonseca946f4322009-07-26 23:44:38 +0100591/**
592 * Create a new pipe_screen object
593 * Note: we're not presently subclassing pipe_screen (no llvmpipe_screen).
594 */
595struct pipe_screen *
Keith Whitwell94ce4eb2010-03-04 16:09:33 +0000596llvmpipe_create_screen(struct sw_winsys *winsys)
José Fonseca946f4322009-07-26 23:44:38 +0100597{
Török Edwin4d52a252010-05-06 22:19:57 +0100598 struct llvmpipe_screen *screen;
599
Török Edwin4d52a252010-05-06 22:19:57 +0100600 util_cpu_detect();
Adam Jacksonca70de92013-04-04 17:16:22 -0400601
Keith Whitwelldec35d02009-10-09 14:59:35 +0100602#ifdef DEBUG
603 LP_DEBUG = debug_get_flags_option("LP_DEBUG", lp_debug_flags, 0 );
604#endif
605
Keith Whitwell5f008192010-09-16 10:45:52 +0100606 LP_PERF = debug_get_flags_option("LP_PERF", lp_perf_flags, 0 );
607
José Fonsecac88f3e02011-11-09 19:29:37 +0000608 screen = CALLOC_STRUCT(llvmpipe_screen);
José Fonseca946f4322009-07-26 23:44:38 +0100609 if (!screen)
610 return NULL;
611
Brian Paul6b658472014-09-29 16:08:55 -0600612 if (!lp_jit_screen_init(screen)) {
613 FREE(screen);
614 return NULL;
615 }
616
José Fonsecae173a9b2009-08-29 20:02:25 +0100617 screen->winsys = winsys;
José Fonseca946f4322009-07-26 23:44:38 +0100618
619 screen->base.destroy = llvmpipe_destroy_screen;
620
621 screen->base.get_name = llvmpipe_get_name;
622 screen->base.get_vendor = llvmpipe_get_vendor;
Giuseppe Bilotta76039b32015-03-22 07:21:01 +0100623 screen->base.get_device_vendor = llvmpipe_get_vendor; // TODO should be the CPU vendor
José Fonseca946f4322009-07-26 23:44:38 +0100624 screen->base.get_param = llvmpipe_get_param;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200625 screen->base.get_shader_param = llvmpipe_get_shader_param;
José Fonseca946f4322009-07-26 23:44:38 +0100626 screen->base.get_paramf = llvmpipe_get_paramf;
627 screen->base.is_format_supported = llvmpipe_is_format_supported;
628
Keith Whitwell7f41f542010-02-08 12:55:59 +0000629 screen->base.context_create = llvmpipe_create_context;
José Fonsecae173a9b2009-08-29 20:02:25 +0100630 screen->base.flush_frontbuffer = llvmpipe_flush_frontbuffer;
Keith Whitwell5a45e532010-08-20 15:25:27 +0100631 screen->base.fence_reference = llvmpipe_fence_reference;
Keith Whitwell5a45e532010-08-20 15:25:27 +0100632 screen->base.fence_finish = llvmpipe_fence_finish;
José Fonsecae173a9b2009-08-29 20:02:25 +0100633
James Benton16f0d702012-12-03 07:00:37 +0000634 screen->base.get_timestamp = llvmpipe_get_timestamp;
635
Keith Whitwell287c94e2010-04-10 16:05:54 +0100636 llvmpipe_init_screen_resource_funcs(&screen->base);
José Fonseca946f4322009-07-26 23:44:38 +0100637
José Fonseca65822eb2010-09-16 20:27:13 +0100638 screen->num_threads = util_cpu_caps.nr_cpus > 1 ? util_cpu_caps.nr_cpus : 0;
José Fonseca41750102011-06-17 14:48:28 +0100639#ifdef PIPE_SUBSYSTEM_EMBEDDED
José Fonseca39be50d2010-04-24 13:20:39 +0100640 screen->num_threads = 0;
José Fonseca39be50d2010-04-24 13:20:39 +0100641#endif
642 screen->num_threads = debug_get_num_option("LP_NUM_THREADS", screen->num_threads);
643 screen->num_threads = MIN2(screen->num_threads, LP_MAX_THREADS);
José Fonseca39be50d2010-04-24 13:20:39 +0100644
Roland Scheideggeredac7402010-07-13 19:58:58 +0200645 screen->rast = lp_rast_create(screen->num_threads);
646 if (!screen->rast) {
647 lp_jit_screen_cleanup(screen);
648 FREE(screen);
649 return NULL;
650 }
651 pipe_mutex_init(screen->rast_mutex);
652
José Fonseca39be50d2010-04-24 13:20:39 +0100653 util_format_s3tc_init();
654
José Fonseca946f4322009-07-26 23:44:38 +0100655 return &screen->base;
656}