blob: e25d14e23c457b465ce2a99f60ac207433d5c645 [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
James Benton16f0d702012-12-03 07:00:37 +000040#include "os/os_time.h"
José Fonseca946f4322009-07-26 23:44:38 +010041#include "lp_texture.h"
Brian Paul2876b682009-12-11 17:32:45 -070042#include "lp_fence.h"
José Fonseca08dd41f2009-08-23 05:52:20 +010043#include "lp_jit.h"
José Fonseca946f4322009-07-26 23:44:38 +010044#include "lp_screen.h"
Keith Whitwell7f41f542010-02-08 12:55:59 +000045#include "lp_context.h"
Keith Whitwelldec35d02009-10-09 14:59:35 +010046#include "lp_debug.h"
Keith Whitwell3c57c012010-03-09 15:25:42 +000047#include "lp_public.h"
José Fonseca39be50d2010-04-24 13:20:39 +010048#include "lp_limits.h"
Roland Scheideggeredac7402010-07-13 19:58:58 +020049#include "lp_rast.h"
Keith Whitwelldec35d02009-10-09 14:59:35 +010050
Keith Whitwell23e951d2010-03-04 16:23:05 +000051#include "state_tracker/sw_winsys.h"
52
Keith Whitwelldec35d02009-10-09 14:59:35 +010053#ifdef DEBUG
54int LP_DEBUG = 0;
55
56static const struct debug_named_value lp_debug_flags[] = {
Joakim Sindholt8413b922010-06-01 20:11:30 +020057 { "pipe", DEBUG_PIPE, NULL },
58 { "tgsi", DEBUG_TGSI, NULL },
59 { "tex", DEBUG_TEX, NULL },
60 { "setup", DEBUG_SETUP, NULL },
61 { "rast", DEBUG_RAST, NULL },
62 { "query", DEBUG_QUERY, NULL },
63 { "screen", DEBUG_SCREEN, NULL },
Joakim Sindholt8413b922010-06-01 20:11:30 +020064 { "counters", DEBUG_COUNTERS, NULL },
Keith Whitwellb6e03ea2010-08-20 15:14:19 +010065 { "scene", DEBUG_SCENE, NULL },
66 { "fence", DEBUG_FENCE, NULL },
Keith Whitwellbc759cd2010-09-08 18:37:45 +010067 { "mem", DEBUG_MEM, NULL },
Keith Whitwell09863552010-09-16 15:16:27 +010068 { "fs", DEBUG_FS, NULL },
Joakim Sindholt8413b922010-06-01 20:11:30 +020069 DEBUG_NAMED_VALUE_END
Keith Whitwelldec35d02009-10-09 14:59:35 +010070};
71#endif
José Fonseca946f4322009-07-26 23:44:38 +010072
Keith Whitwell5f008192010-09-16 10:45:52 +010073int LP_PERF = 0;
74static const struct debug_named_value lp_perf_flags[] = {
75 { "texmem", PERF_TEX_MEM, NULL },
76 { "no_mipmap", PERF_NO_MIPMAPS, NULL },
77 { "no_linear", PERF_NO_LINEAR, NULL },
78 { "no_mip_linear", PERF_NO_MIP_LINEAR, NULL },
79 { "no_tex", PERF_NO_TEX, NULL },
80 { "no_blend", PERF_NO_BLEND, NULL },
81 { "no_depth", PERF_NO_DEPTH, NULL },
82 { "no_alphatest", PERF_NO_ALPHATEST, NULL },
83 DEBUG_NAMED_VALUE_END
84};
85
José Fonseca946f4322009-07-26 23:44:38 +010086
87static const char *
88llvmpipe_get_vendor(struct pipe_screen *screen)
89{
José Fonsecae173a9b2009-08-29 20:02:25 +010090 return "VMware, Inc.";
José Fonseca946f4322009-07-26 23:44:38 +010091}
92
93
94static const char *
95llvmpipe_get_name(struct pipe_screen *screen)
96{
Brian Paulb38c26f2011-07-19 08:42:46 -060097 static char buf[100];
José Fonsecaedc0a002012-09-06 10:29:04 +010098 util_snprintf(buf, sizeof(buf), "llvmpipe (LLVM %u.%u, %u bits)",
99 HAVE_LLVM >> 8, HAVE_LLVM & 0xff,
100 lp_native_vector_width );
Brian Paulb38c26f2011-07-19 08:42:46 -0600101 return buf;
José Fonseca946f4322009-07-26 23:44:38 +0100102}
103
104
105static int
José Fonsecae1238b52010-05-11 11:11:03 +0100106llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
José Fonseca946f4322009-07-26 23:44:38 +0100107{
108 switch (param) {
José Fonseca946f4322009-07-26 23:44:38 +0100109 case PIPE_CAP_NPOT_TEXTURES:
Ilia Mirkin12d39b42013-10-04 04:32:15 -0400110 case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
José Fonseca946f4322009-07-26 23:44:38 +0100111 return 1;
112 case PIPE_CAP_TWO_SIDED_STENCIL:
113 return 1;
Jakob Bornecrantzc4e89d12010-04-29 16:18:43 +0100114 case PIPE_CAP_SM3:
115 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600116 case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
Roland Scheidegger8b8bca02013-02-12 03:41:48 +0100117 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600118 case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
Dave Airlie77b26562012-12-05 06:50:07 +1000119 return PIPE_MAX_SO_BUFFERS;
José Fonseca946f4322009-07-26 23:44:38 +0100120 case PIPE_CAP_ANISOTROPIC_FILTER:
121 return 0;
122 case PIPE_CAP_POINT_SPRITE:
123 return 1;
124 case PIPE_CAP_MAX_RENDER_TARGETS:
125 return PIPE_MAX_COLOR_BUFS;
126 case PIPE_CAP_OCCLUSION_QUERY:
127 return 1;
José Fonseca99762162012-12-09 09:50:34 +0000128 case PIPE_CAP_QUERY_TIME_ELAPSED:
José Fonsecaab2f5732012-12-09 10:15:19 +0000129 return 0;
James Benton16f0d702012-12-03 07:00:37 +0000130 case PIPE_CAP_QUERY_TIMESTAMP:
131 return 1;
Christoph Bumillerf35e96d2013-03-29 13:02:49 +0100132 case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
133 return 0;
José Fonseca946f4322009-07-26 23:44:38 +0100134 case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
135 return 1;
José Fonseca946f4322009-07-26 23:44:38 +0100136 case PIPE_CAP_TEXTURE_SHADOW_MAP:
137 return 1;
José Fonseca9881b5c2010-06-05 14:48:39 +0100138 case PIPE_CAP_TEXTURE_SWIZZLE:
139 return 1;
Christoph Bumiller729abfd2013-04-12 13:42:01 +0200140 case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
141 return 0;
José Fonseca946f4322009-07-26 23:44:38 +0100142 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
Brian Pauld73fadf2010-03-08 13:36:34 -0700143 return LP_MAX_TEXTURE_2D_LEVELS;
José Fonseca946f4322009-07-26 23:44:38 +0100144 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
Brian Pauld73fadf2010-03-08 13:36:34 -0700145 return LP_MAX_TEXTURE_3D_LEVELS;
José Fonseca946f4322009-07-26 23:44:38 +0100146 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
Brian Pauldf73be92012-09-16 19:05:51 -0600147 return LP_MAX_TEXTURE_CUBE_LEVELS;
Roland Scheidegger6d501482012-11-29 04:08:32 +0100148 case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
149 return LP_MAX_TEXTURE_ARRAY_LAYERS;
José Fonseca946f4322009-07-26 23:44:38 +0100150 case PIPE_CAP_BLEND_EQUATION_SEPARATE:
151 return 1;
Roland Scheidegger1a9d01d2010-01-26 17:32:57 +0100152 case PIPE_CAP_INDEP_BLEND_ENABLE:
Brian Paul7b937cf2010-05-10 17:03:10 -0600153 return 1;
Roland Scheidegger1a9d01d2010-01-26 17:32:57 +0100154 case PIPE_CAP_INDEP_BLEND_FUNC:
Brian Paul96a2e892011-01-17 16:42:43 -0700155 return 1;
Luca Barbieri6c4037502010-01-21 05:36:14 +0100156 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
157 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
José Fonsecaa9301362013-04-18 11:39:19 +0100158 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
Luca Barbieri6c4037502010-01-21 05:36:14 +0100159 return 1;
160 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
Luca Barbieri6c4037502010-01-21 05:36:14 +0100161 return 0;
Brian Paul6692ed62010-10-21 19:03:38 -0600162 case PIPE_CAP_PRIMITIVE_RESTART:
163 return 1;
Marek Olšákdc4c8212012-01-10 00:19:00 +0100164 case PIPE_CAP_DEPTH_CLIP_DISABLE:
José Fonseca85d7f672013-10-15 18:08:26 -0700165 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600166 case PIPE_CAP_SHADER_STENCIL_EXPORT:
167 return 0;
Marek Olšák95c78812011-03-05 16:06:10 +0100168 case PIPE_CAP_TGSI_INSTANCEID:
169 case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
Brian Paul056e9b42012-06-26 14:11:00 -0600170 return 1;
171 case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
172 return 0;
Marek Olšák4a7f0132011-03-29 18:18:05 +0200173 case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
Brian Paul056e9b42012-06-26 14:11:00 -0600174 return 1;
175 case PIPE_CAP_SEAMLESS_CUBE_MAP:
176 case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
Roland Scheideggerac81b6f2013-10-18 20:54:01 +0200177 return 1;
Roland Scheidegger0b6554b2012-11-27 03:26:49 +0100178 /* this is a lie could support arbitrary large offsets */
Ilia Mirkinc2f9ad52014-04-09 14:58:53 -0400179 case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
Brian Paul056e9b42012-06-26 14:11:00 -0600180 case PIPE_CAP_MIN_TEXEL_OFFSET:
Roland Scheidegger0b6554b2012-11-27 03:26:49 +0100181 return -8;
Ilia Mirkinc2f9ad52014-04-09 14:58:53 -0400182 case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
Brian Paul056e9b42012-06-26 14:11:00 -0600183 case PIPE_CAP_MAX_TEXEL_OFFSET:
Roland Scheidegger0b6554b2012-11-27 03:26:49 +0100184 return 7;
Dave Airlieab149152011-11-07 17:31:49 +0000185 case PIPE_CAP_CONDITIONAL_RENDER:
Brian Pauldcb48e72010-12-08 19:06:22 -0700186 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600187 case PIPE_CAP_TEXTURE_BARRIER:
188 return 0;
189 case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
190 case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
Dave Airlie77b26562012-12-05 06:50:07 +1000191 return 16*4;
Grigori Goronzyd34d5fd2014-02-09 22:56:20 +0100192 case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
193 case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
194 return 1024;
Ilia Mirkin746e5262014-06-26 20:01:50 -0400195 case PIPE_CAP_MAX_VERTEX_STREAMS:
196 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600197 case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
Dave Airlie9e41b0b2012-12-13 20:17:58 +1000198 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600199 case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
200 return 0;
201 case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
202 case PIPE_CAP_VERTEX_COLOR_CLAMPED:
James Benton66fdf622012-09-13 16:05:08 +0100203 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600204 case PIPE_CAP_GLSL_FEATURE_LEVEL:
José Fonseca7380ce92014-04-24 15:00:12 +0100205 return 330;
Christoph Bumiller8b4f7b02012-02-06 16:29:03 +0100206 case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
207 return 0;
Brian Paul056e9b42012-06-26 14:11:00 -0600208 case PIPE_CAP_COMPUTE:
209 return 0;
Marek Olšák978c1aa12012-04-11 15:40:00 +0200210 case PIPE_CAP_USER_VERTEX_BUFFERS:
Marek Olšák437ab1d2012-04-24 15:19:31 +0200211 case PIPE_CAP_USER_INDEX_BUFFERS:
Marek Olšák978c1aa12012-04-11 15:40:00 +0200212 return 1;
Brian Paul2ee0b442012-12-10 12:35:23 -0700213 case PIPE_CAP_USER_CONSTANT_BUFFERS:
214 return 0;
Brian Paul056e9b42012-06-26 14:11:00 -0600215 case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
216 case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
217 case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
Christoph Bumiller8acaf862013-03-15 22:11:31 +0100218 case PIPE_CAP_TGSI_TEXCOORD:
Brian Paul056e9b42012-06-26 14:11:00 -0600219 return 0;
Christoph Bumillerbc198f82013-04-05 14:29:36 +0200220 case PIPE_CAP_DRAW_INDIRECT:
221 return 1;
Brian Paul056e9b42012-06-26 14:11:00 -0600222
Marek Olšák1b749dc2012-04-24 17:31:17 +0200223 case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
224 return 16;
Brian Paul056e9b42012-06-26 14:11:00 -0600225 case PIPE_CAP_START_INSTANCE:
Marek Olšákb9c9dd42012-09-11 22:41:20 +0200226 case PIPE_CAP_TEXTURE_MULTISAMPLE:
Dave Airlieadd3a072012-11-10 06:34:14 +1000227 case PIPE_CAP_CUBE_MAP_ARRAY:
José Fonseca946f4322009-07-26 23:44:38 +0100228 return 0;
Siavash Eliasi809d3a72013-11-28 12:26:30 +0330229 case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
230 return 64;
Roland Scheidegger20183172013-02-25 20:23:18 +0100231 case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
232 return 1;
Marek Olšák52cb3952013-05-02 03:24:33 +0200233 case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
234 return 65536;
Roland Scheidegger20183172013-02-25 20:23:18 +0100235 case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
236 return 1;
Marek Olšák3e10ab62013-03-14 17:18:43 +0100237 case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
238 return 0;
Zack Rusineaabb4e2013-05-24 16:08:39 -0400239 case PIPE_CAP_MAX_VIEWPORTS:
Zack Rusin97b8ae42013-05-24 16:28:19 -0400240 return PIPE_MAX_VIEWPORTS;
Tom Stellard4e90bc92013-07-09 21:21:39 -0700241 case PIPE_CAP_ENDIANNESS:
242 return PIPE_ENDIAN_NATIVE;
Ilia Mirkin32b71242014-07-03 11:15:18 -0400243 case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
Dave Airlie2fcbec42013-09-21 18:45:43 +1000244 case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
245 case PIPE_CAP_TEXTURE_GATHER_SM5:
Marek Olšákdb8886e2014-01-27 21:57:42 +0100246 case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
Dave Airliebe5276a2014-02-11 13:26:08 +1000247 case PIPE_CAP_TEXTURE_QUERY_LOD:
Ilia Mirkin88d8d882014-03-30 18:21:04 -0400248 case PIPE_CAP_SAMPLE_SHADING:
Ilia Mirkind95df4f2014-04-26 23:44:57 -0400249 case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
Christoph Bumiller4b586a22014-05-17 01:20:19 +0200250 case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
Marek Olšák1a02bb72013-11-21 15:25:55 +0100251 return 0;
Dave Airlie76ba50a2013-11-27 19:47:51 +1000252 case PIPE_CAP_FAKE_SW_MSAA:
Giovanni Campagnae57ad3d2014-07-23 19:28:52 +0100253 return 1;
José Fonseca946f4322009-07-26 23:44:38 +0100254 }
Brian Paul056e9b42012-06-26 14:11:00 -0600255 /* should only get here on unhandled cases */
256 debug_printf("Unexpected PIPE_CAP %d query\n", param);
257 return 0;
José Fonseca946f4322009-07-26 23:44:38 +0100258}
259
Luca Barbieria508d2d2010-09-05 20:50:50 +0200260static int
261llvmpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param)
262{
263 switch(shader)
264 {
265 case PIPE_SHADER_FRAGMENT:
Dave Airlie2d80cad2012-01-11 19:48:00 +0000266 switch (param) {
Dave Airlie2d80cad2012-01-11 19:48:00 +0000267 default:
José Fonseca6dddd182012-07-12 20:47:20 +0100268 return gallivm_get_shader_param(param);
Dave Airlie2d80cad2012-01-11 19:48:00 +0000269 }
Luca Barbieria508d2d2010-09-05 20:50:50 +0200270 case PIPE_SHADER_VERTEX:
271 case PIPE_SHADER_GEOMETRY:
Marek Olšákf5bfe542011-09-27 22:22:06 +0200272 switch (param) {
273 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
274 /* At this time, the draw module and llvmpipe driver only
275 * support vertex shader texture lookups when LLVM is enabled in
276 * the draw module.
277 */
278 if (debug_get_bool_option("DRAW_USE_LLVM", TRUE))
Brian Paulcab2fed2012-08-09 20:59:44 -0600279 return PIPE_MAX_SAMPLERS;
Marek Olšákf5bfe542011-09-27 22:22:06 +0200280 else
281 return 0;
Roland Scheidegger2983c032013-11-26 02:30:41 +0100282 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
283 if (debug_get_bool_option("DRAW_USE_LLVM", TRUE))
284 return PIPE_MAX_SHADER_SAMPLER_VIEWS;
285 else
286 return 0;
Marek Olšákf5bfe542011-09-27 22:22:06 +0200287 default:
288 return draw_get_shader_param(shader, param);
289 }
Luca Barbieria508d2d2010-09-05 20:50:50 +0200290 default:
291 return 0;
292 }
293}
José Fonseca946f4322009-07-26 23:44:38 +0100294
295static float
Marek Olšákbb71f922011-11-19 22:38:22 +0100296llvmpipe_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
José Fonseca946f4322009-07-26 23:44:38 +0100297{
298 switch (param) {
Marek Olšákbb71f922011-11-19 22:38:22 +0100299 case PIPE_CAPF_MAX_LINE_WIDTH:
José Fonseca946f4322009-07-26 23:44:38 +0100300 /* fall-through */
Marek Olšákbb71f922011-11-19 22:38:22 +0100301 case PIPE_CAPF_MAX_LINE_WIDTH_AA:
José Fonseca946f4322009-07-26 23:44:38 +0100302 return 255.0; /* arbitrary */
Marek Olšákbb71f922011-11-19 22:38:22 +0100303 case PIPE_CAPF_MAX_POINT_WIDTH:
José Fonseca946f4322009-07-26 23:44:38 +0100304 /* fall-through */
Marek Olšákbb71f922011-11-19 22:38:22 +0100305 case PIPE_CAPF_MAX_POINT_WIDTH_AA:
José Fonseca946f4322009-07-26 23:44:38 +0100306 return 255.0; /* arbitrary */
Marek Olšákbb71f922011-11-19 22:38:22 +0100307 case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
José Fonseca946f4322009-07-26 23:44:38 +0100308 return 16.0; /* not actually signficant at this time */
Marek Olšákbb71f922011-11-19 22:38:22 +0100309 case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
José Fonseca946f4322009-07-26 23:44:38 +0100310 return 16.0; /* arbitrary */
Marek Olšákbb71f922011-11-19 22:38:22 +0100311 case PIPE_CAPF_GUARD_BAND_LEFT:
312 case PIPE_CAPF_GUARD_BAND_TOP:
313 case PIPE_CAPF_GUARD_BAND_RIGHT:
314 case PIPE_CAPF_GUARD_BAND_BOTTOM:
José Fonsecacf9baf62010-05-12 17:25:17 +0100315 return 0.0;
José Fonseca946f4322009-07-26 23:44:38 +0100316 }
Brian Paul056e9b42012-06-26 14:11:00 -0600317 /* should only get here on unhandled cases */
318 debug_printf("Unexpected PIPE_CAP %d query\n", param);
319 return 0.0;
José Fonseca946f4322009-07-26 23:44:38 +0100320}
321
322
323/**
324 * Query format support for creating a texture, drawing surface, etc.
325 * \param format the format to test
326 * \param type one of PIPE_TEXTURE, PIPE_SURFACE
327 */
328static boolean
José Fonsecae173a9b2009-08-29 20:02:25 +0100329llvmpipe_is_format_supported( struct pipe_screen *_screen,
Roland Scheideggere121a732010-05-17 21:23:31 +0200330 enum pipe_format format,
José Fonseca946f4322009-07-26 23:44:38 +0100331 enum pipe_texture_target target,
Roland Scheideggere121a732010-05-17 21:23:31 +0200332 unsigned sample_count,
Marek Olšáke9689752011-03-08 00:01:58 +0100333 unsigned bind)
José Fonseca946f4322009-07-26 23:44:38 +0100334{
José Fonsecae173a9b2009-08-29 20:02:25 +0100335 struct llvmpipe_screen *screen = llvmpipe_screen(_screen);
Keith Whitwell94ce4eb2010-03-04 16:09:33 +0000336 struct sw_winsys *winsys = screen->winsys;
José Fonsecab3755262009-11-10 17:51:06 -0800337 const struct util_format_description *format_desc;
338
339 format_desc = util_format_description(format);
José Fonsecaadc7cd62010-04-25 14:52:27 +0100340 if (!format_desc)
José Fonsecab3755262009-11-10 17:51:06 -0800341 return FALSE;
José Fonsecae173a9b2009-08-29 20:02:25 +0100342
Brian Paule6d8b402010-05-28 13:31:23 -0600343 assert(target == PIPE_BUFFER ||
344 target == PIPE_TEXTURE_1D ||
Roland Scheidegger6d501482012-11-29 04:08:32 +0100345 target == PIPE_TEXTURE_1D_ARRAY ||
José Fonseca946f4322009-07-26 23:44:38 +0100346 target == PIPE_TEXTURE_2D ||
Roland Scheidegger6d501482012-11-29 04:08:32 +0100347 target == PIPE_TEXTURE_2D_ARRAY ||
Luca Barbieriae0ef6f2010-08-18 17:28:08 +0200348 target == PIPE_TEXTURE_RECT ||
José Fonseca946f4322009-07-26 23:44:38 +0100349 target == PIPE_TEXTURE_3D ||
350 target == PIPE_TEXTURE_CUBE);
351
Roland Scheideggere121a732010-05-17 21:23:31 +0200352 if (sample_count > 1)
353 return FALSE;
354
José Fonsecaadc7cd62010-04-25 14:52:27 +0100355 if (bind & PIPE_BIND_RENDER_TARGET) {
Roland Scheideggerdc1cc922013-07-16 01:52:29 +0200356 if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
Roland Scheidegger9477d8c2014-03-20 16:43:36 +0100357 /* this is a lie actually other formats COULD exist where we would fail */
Roland Scheideggerdc1cc922013-07-16 01:52:29 +0200358 if (format_desc->nr_channels < 3)
359 return FALSE;
360 }
361 else if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_RGB)
José Fonsecafe130a72010-04-06 22:49:57 +0100362 return FALSE;
363
Roland Scheideggerb101a092013-03-22 20:09:18 +0100364 if (format_desc->layout != UTIL_FORMAT_LAYOUT_PLAIN &&
365 format != PIPE_FORMAT_R11G11B10_FLOAT)
José Fonsecafe130a72010-04-06 22:49:57 +0100366 return FALSE;
Roland Scheideggerdc1cc922013-07-16 01:52:29 +0200367
José Fonseca69163872012-11-28 19:25:05 +0000368 assert(format_desc->block.width == 1);
369 assert(format_desc->block.height == 1);
José Fonsecafe130a72010-04-06 22:49:57 +0100370
José Fonseca69163872012-11-28 19:25:05 +0000371 if (format_desc->is_mixed)
372 return FALSE;
373
Roland Scheideggerb101a092013-03-22 20:09:18 +0100374 if (!format_desc->is_array && !format_desc->is_bitmask &&
375 format != PIPE_FORMAT_R11G11B10_FLOAT)
José Fonsecab3755262009-11-10 17:51:06 -0800376 return FALSE;
Roland Scheideggerd03d9b62013-01-12 17:28:40 -0800377
378 /*
379 * XXX refuse formats known to crash in generate_unswizzled_blend().
380 * These include all 3-channel 24bit RGB8 variants, plus 48bit
381 * (except those using floats) 3-channel RGB16 variants (the latter
382 * seems to be more of a llvm bug though).
383 * The mesa state tracker only seems to use these for SINT/UINT formats.
384 */
385 if (format_desc->is_array && format_desc->nr_channels == 3) {
386 if (format_desc->block.bits == 24 || (format_desc->block.bits == 48 &&
387 !util_format_is_float(format))) {
388 return FALSE;
389 }
390 }
José Fonsecab3755262009-11-10 17:51:06 -0800391 }
392
José Fonsecaadc7cd62010-04-25 14:52:27 +0100393 if (bind & PIPE_BIND_DISPLAY_TARGET) {
394 if(!winsys->is_displaytarget_format_supported(winsys, bind, format))
José Fonsecab3755262009-11-10 17:51:06 -0800395 return FALSE;
396 }
397
José Fonsecaadc7cd62010-04-25 14:52:27 +0100398 if (bind & PIPE_BIND_DEPTH_STENCIL) {
399 if (format_desc->layout != UTIL_FORMAT_LAYOUT_PLAIN)
400 return FALSE;
401
402 if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
José Fonsecab3755262009-11-10 17:51:06 -0800403 return FALSE;
404
José Fonseca42f762d2013-01-29 13:27:44 +0000405 /* TODO: Support stencil-only formats */
406 if (format_desc->swizzle[0] == UTIL_FORMAT_SWIZZLE_NONE) {
407 return FALSE;
408 }
José Fonsecab3755262009-11-10 17:51:06 -0800409 }
410
José Fonsecaadc7cd62010-04-25 14:52:27 +0100411 if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
José Fonseca510669c2010-04-22 15:12:30 +0100412 return util_format_s3tc_enabled;
José Fonseca510669c2010-04-22 15:12:30 +0100413 }
414
José Fonsecaa1b737d2011-11-01 12:28:47 +0000415 /*
Roland Scheideggerd03d9b62013-01-12 17:28:40 -0800416 * Everything can be supported by u_format
417 * (those without fetch_rgba_float might be not but shouldn't hit that)
José Fonsecaa1b737d2011-11-01 12:28:47 +0000418 */
419
José Fonsecae173a9b2009-08-29 20:02:25 +0100420 return TRUE;
421}
422
423
José Fonsecae173a9b2009-08-29 20:02:25 +0100424
425
426static void
427llvmpipe_flush_frontbuffer(struct pipe_screen *_screen,
Roland Scheidegger4c700142010-12-02 04:33:43 +0100428 struct pipe_resource *resource,
429 unsigned level, unsigned layer,
Dave Airlieba00f2f2013-11-28 11:08:11 +1000430 void *context_private,
431 struct pipe_box *sub_box)
José Fonsecae173a9b2009-08-29 20:02:25 +0100432{
433 struct llvmpipe_screen *screen = llvmpipe_screen(_screen);
Keith Whitwell94ce4eb2010-03-04 16:09:33 +0000434 struct sw_winsys *winsys = screen->winsys;
Roland Scheidegger4c700142010-12-02 04:33:43 +0100435 struct llvmpipe_resource *texture = llvmpipe_resource(resource);
José Fonsecae173a9b2009-08-29 20:02:25 +0100436
437 assert(texture->dt);
438 if (texture->dt)
Dave Airlieba00f2f2013-11-28 11:08:11 +1000439 winsys->displaytarget_display(winsys, texture->dt, context_private, sub_box);
José Fonseca946f4322009-07-26 23:44:38 +0100440}
441
José Fonseca946f4322009-07-26 23:44:38 +0100442static void
José Fonseca2d6b39f2009-08-09 23:10:19 +0100443llvmpipe_destroy_screen( struct pipe_screen *_screen )
José Fonseca946f4322009-07-26 23:44:38 +0100444{
José Fonseca2d6b39f2009-08-09 23:10:19 +0100445 struct llvmpipe_screen *screen = llvmpipe_screen(_screen);
Keith Whitwell94ce4eb2010-03-04 16:09:33 +0000446 struct sw_winsys *winsys = screen->winsys;
José Fonseca2d6b39f2009-08-09 23:10:19 +0100447
Roland Scheideggeredac7402010-07-13 19:58:58 +0200448 if (screen->rast)
449 lp_rast_destroy(screen->rast);
450
José Fonseca08dd41f2009-08-23 05:52:20 +0100451 lp_jit_screen_cleanup(screen);
José Fonseca946f4322009-07-26 23:44:38 +0100452
453 if(winsys->destroy)
454 winsys->destroy(winsys);
455
Roland Scheideggeredac7402010-07-13 19:58:58 +0200456 pipe_mutex_destroy(screen->rast_mutex);
457
José Fonseca946f4322009-07-26 23:44:38 +0100458 FREE(screen);
459}
460
461
462
Keith Whitwell5a45e532010-08-20 15:25:27 +0100463
464/**
465 * Fence reference counting.
466 */
467static void
468llvmpipe_fence_reference(struct pipe_screen *screen,
469 struct pipe_fence_handle **ptr,
470 struct pipe_fence_handle *fence)
471{
472 struct lp_fence **old = (struct lp_fence **) ptr;
473 struct lp_fence *f = (struct lp_fence *) fence;
474
475 lp_fence_reference(old, f);
476}
477
478
479/**
480 * Has the fence been executed/finished?
481 */
Marek Olšákbfe88e62011-03-07 22:57:54 +0100482static boolean
Keith Whitwell5a45e532010-08-20 15:25:27 +0100483llvmpipe_fence_signalled(struct pipe_screen *screen,
Marek Olšákbfe88e62011-03-07 22:57:54 +0100484 struct pipe_fence_handle *fence)
Keith Whitwell5a45e532010-08-20 15:25:27 +0100485{
486 struct lp_fence *f = (struct lp_fence *) fence;
487 return lp_fence_signalled(f);
488}
489
490
491/**
492 * Wait for the fence to finish.
493 */
Marek Olšákbfe88e62011-03-07 22:57:54 +0100494static boolean
Keith Whitwell5a45e532010-08-20 15:25:27 +0100495llvmpipe_fence_finish(struct pipe_screen *screen,
496 struct pipe_fence_handle *fence_handle,
Marek Olšákb39bccb2011-03-05 21:23:54 +0100497 uint64_t timeout)
Keith Whitwell5a45e532010-08-20 15:25:27 +0100498{
499 struct lp_fence *f = (struct lp_fence *) fence_handle;
500
501 lp_fence_wait(f);
Marek Olšákbfe88e62011-03-07 22:57:54 +0100502 return TRUE;
Keith Whitwell5a45e532010-08-20 15:25:27 +0100503}
504
James Benton16f0d702012-12-03 07:00:37 +0000505static uint64_t
506llvmpipe_get_timestamp(struct pipe_screen *_screen)
507{
508 return os_time_get_nano();
509}
Keith Whitwell5a45e532010-08-20 15:25:27 +0100510
José Fonseca946f4322009-07-26 23:44:38 +0100511/**
512 * Create a new pipe_screen object
513 * Note: we're not presently subclassing pipe_screen (no llvmpipe_screen).
514 */
515struct pipe_screen *
Keith Whitwell94ce4eb2010-03-04 16:09:33 +0000516llvmpipe_create_screen(struct sw_winsys *winsys)
José Fonseca946f4322009-07-26 23:44:38 +0100517{
Török Edwin4d52a252010-05-06 22:19:57 +0100518 struct llvmpipe_screen *screen;
519
Török Edwin4d52a252010-05-06 22:19:57 +0100520 util_cpu_detect();
Adam Jacksonca70de92013-04-04 17:16:22 -0400521
522#if defined(PIPE_ARCH_X86) && HAVE_LLVM < 0x0302
523 /* require SSE2 due to LLVM PR6960. */
Török Edwin4d52a252010-05-06 22:19:57 +0100524 if (!util_cpu_caps.has_sse2)
525 return NULL;
526#endif
527
Keith Whitwelldec35d02009-10-09 14:59:35 +0100528#ifdef DEBUG
529 LP_DEBUG = debug_get_flags_option("LP_DEBUG", lp_debug_flags, 0 );
530#endif
531
Keith Whitwell5f008192010-09-16 10:45:52 +0100532 LP_PERF = debug_get_flags_option("LP_PERF", lp_perf_flags, 0 );
533
José Fonsecac88f3e02011-11-09 19:29:37 +0000534 screen = CALLOC_STRUCT(llvmpipe_screen);
José Fonseca946f4322009-07-26 23:44:38 +0100535 if (!screen)
536 return NULL;
537
José Fonsecae173a9b2009-08-29 20:02:25 +0100538 screen->winsys = winsys;
José Fonseca946f4322009-07-26 23:44:38 +0100539
540 screen->base.destroy = llvmpipe_destroy_screen;
541
542 screen->base.get_name = llvmpipe_get_name;
543 screen->base.get_vendor = llvmpipe_get_vendor;
544 screen->base.get_param = llvmpipe_get_param;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200545 screen->base.get_shader_param = llvmpipe_get_shader_param;
José Fonseca946f4322009-07-26 23:44:38 +0100546 screen->base.get_paramf = llvmpipe_get_paramf;
547 screen->base.is_format_supported = llvmpipe_is_format_supported;
548
Keith Whitwell7f41f542010-02-08 12:55:59 +0000549 screen->base.context_create = llvmpipe_create_context;
José Fonsecae173a9b2009-08-29 20:02:25 +0100550 screen->base.flush_frontbuffer = llvmpipe_flush_frontbuffer;
Keith Whitwell5a45e532010-08-20 15:25:27 +0100551 screen->base.fence_reference = llvmpipe_fence_reference;
552 screen->base.fence_signalled = llvmpipe_fence_signalled;
553 screen->base.fence_finish = llvmpipe_fence_finish;
José Fonsecae173a9b2009-08-29 20:02:25 +0100554
James Benton16f0d702012-12-03 07:00:37 +0000555 screen->base.get_timestamp = llvmpipe_get_timestamp;
556
Keith Whitwell287c94e2010-04-10 16:05:54 +0100557 llvmpipe_init_screen_resource_funcs(&screen->base);
José Fonseca946f4322009-07-26 23:44:38 +0100558
José Fonseca08dd41f2009-08-23 05:52:20 +0100559 lp_jit_screen_init(screen);
José Fonseca2d6b39f2009-08-09 23:10:19 +0100560
José Fonseca65822eb2010-09-16 20:27:13 +0100561 screen->num_threads = util_cpu_caps.nr_cpus > 1 ? util_cpu_caps.nr_cpus : 0;
José Fonseca41750102011-06-17 14:48:28 +0100562#ifdef PIPE_SUBSYSTEM_EMBEDDED
José Fonseca39be50d2010-04-24 13:20:39 +0100563 screen->num_threads = 0;
José Fonseca39be50d2010-04-24 13:20:39 +0100564#endif
565 screen->num_threads = debug_get_num_option("LP_NUM_THREADS", screen->num_threads);
566 screen->num_threads = MIN2(screen->num_threads, LP_MAX_THREADS);
José Fonseca39be50d2010-04-24 13:20:39 +0100567
Roland Scheideggeredac7402010-07-13 19:58:58 +0200568 screen->rast = lp_rast_create(screen->num_threads);
569 if (!screen->rast) {
570 lp_jit_screen_cleanup(screen);
571 FREE(screen);
572 return NULL;
573 }
574 pipe_mutex_init(screen->rast_mutex);
575
José Fonseca39be50d2010-04-24 13:20:39 +0100576 util_format_s3tc_init();
577
José Fonseca946f4322009-07-26 23:44:38 +0100578 return &screen->base;
579}