blob: ff68ffd7bc6550079c2d4158a6779e5db905b72d [file] [log] [blame]
Corbin Simpson3b37cb42009-01-08 15:47:23 -08001/*
2 * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
Marek Olšák40122192010-02-06 03:11:50 +01003 * Copyright 2010 Marek Olšák <maraeo@gmail.com>
Corbin Simpson3b37cb42009-01-08 15:47:23 -08004 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * on the rights to use, copy, modify, merge, publish, distribute, sub
9 * license, and/or sell copies of the Software, and to permit persons to whom
10 * the Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22 * USE OR OTHER DEALINGS IN THE SOFTWARE. */
Corbin Simpsonda1928d2009-01-05 23:55:00 -080023
Michal Krolb1ed72e2009-12-17 23:41:57 +010024#include "util/u_format.h"
Marek Olšák95bfc8f2010-04-29 03:18:39 +020025#include "util/u_format_s3tc.h"
Corbin Simpson6a448a52009-10-21 06:31:36 -070026#include "util/u_memory.h"
Marek Olšákac8821f2011-03-05 21:46:06 +010027#include "os/os_time.h"
Christian Königefc7fda2011-07-12 00:12:12 +020028#include "vl/vl_decoder.h"
Christian König7eca7692011-07-08 11:20:39 +020029#include "vl/vl_video_buffer.h"
Corbin Simpson6a448a52009-10-21 06:31:36 -070030
31#include "r300_context.h"
Corbin Simpson6a448a52009-10-21 06:31:36 -070032#include "r300_texture.h"
Dave Airlie68e58a92010-02-12 15:39:51 +100033#include "r300_screen_buffer.h"
Marek Olšákebe2b542010-05-28 02:53:47 +020034#include "r300_state_inlines.h"
Jakob Bornecrantz6e3fc2d2010-06-06 11:56:23 +010035#include "r300_public.h"
Dave Airlie68e58a92010-02-12 15:39:51 +100036
Marek Olšák9cf25b32010-11-14 22:32:46 +010037#include "draw/draw_context.h"
38
Corbin Simpson902b1be2009-01-24 03:34:17 -080039/* Return the identifier behind whom the brave coders responsible for this
40 * amalgamation of code, sweat, and duct tape, routinely obscure their names.
41 *
42 * ...I should have just put "Corbin Simpson", but I'm not that cool.
43 *
44 * (Or egotistical. Yet.) */
Corbin Simpson54d137e2009-01-20 15:27:46 -080045static const char* r300_get_vendor(struct pipe_screen* pscreen)
46{
Corbin Simpsonda1928d2009-01-05 23:55:00 -080047 return "X.Org R300 Project";
48}
49
Giuseppe Bilotta76039b32015-03-22 07:21:01 +010050static const char* r300_get_device_vendor(struct pipe_screen* pscreen)
51{
52 return "ATI";
53}
54
Corbin Simpson902b1be2009-01-24 03:34:17 -080055static const char* chip_families[] = {
Marek Olšák1385c352013-01-09 16:26:24 +010056 "unknown",
Marek Olšák88ddfc52010-11-09 14:53:42 +010057 "ATI R300",
58 "ATI R350",
Marek Olšák88ddfc52010-11-09 14:53:42 +010059 "ATI RV350",
60 "ATI RV370",
61 "ATI RV380",
Marek Olšákd7111352011-06-07 20:59:56 +020062 "ATI RS400",
63 "ATI RC410",
64 "ATI RS480",
Marek Olšák88ddfc52010-11-09 14:53:42 +010065 "ATI R420",
66 "ATI R423",
67 "ATI R430",
68 "ATI R480",
69 "ATI R481",
70 "ATI RV410",
Marek Olšák88ddfc52010-11-09 14:53:42 +010071 "ATI RS600",
72 "ATI RS690",
73 "ATI RS740",
74 "ATI RV515",
75 "ATI R520",
76 "ATI RV530",
77 "ATI R580",
78 "ATI RV560",
79 "ATI RV570"
Corbin Simpson902b1be2009-01-24 03:34:17 -080080};
81
Corbin Simpson54d137e2009-01-20 15:27:46 -080082static const char* r300_get_name(struct pipe_screen* pscreen)
83{
Corbin Simpson43f20352009-01-20 01:11:08 -080084 struct r300_screen* r300screen = r300_screen(pscreen);
85
Marek Olšákb71bfc42010-04-05 03:19:08 +020086 return chip_families[r300screen->caps.family];
Corbin Simpsonda1928d2009-01-05 23:55:00 -080087}
88
José Fonsecae1238b52010-05-11 11:11:03 +010089static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
Corbin Simpson54d137e2009-01-20 15:27:46 -080090{
Corbin Simpson3b37cb42009-01-08 15:47:23 -080091 struct r300_screen* r300screen = r300_screen(pscreen);
Marek Olšákdca2a9f2010-05-13 01:45:57 +020092 boolean is_r500 = r300screen->caps.is_r500;
93
Corbin Simpsonda1928d2009-01-05 23:55:00 -080094 switch (param) {
Marek Olšák0ccc1362010-05-13 02:28:49 +020095 /* Supported features (boolean caps). */
Corbin Simpsonda1928d2009-01-05 23:55:00 -080096 case PIPE_CAP_NPOT_TEXTURES:
Ilia Mirkin12d39b42013-10-04 04:32:15 -040097 case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
Ilia Mirkin9515d652016-08-20 22:40:33 -040098 case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
Corbin Simpsonda1928d2009-01-05 23:55:00 -080099 case PIPE_CAP_TWO_SIDED_STENCIL:
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800100 case PIPE_CAP_ANISOTROPIC_FILTER:
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800101 case PIPE_CAP_POINT_SPRITE:
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800102 case PIPE_CAP_OCCLUSION_QUERY:
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800103 case PIPE_CAP_TEXTURE_SHADOW_MAP:
Marek Olšák0ccc1362010-05-13 02:28:49 +0200104 case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
Marek Olšák0ccc1362010-05-13 02:28:49 +0200105 case PIPE_CAP_BLEND_EQUATION_SEPARATE:
Marek Olšák65482f22011-03-05 15:53:46 +0100106 case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
Marek Olšák0b3122c2011-04-24 11:59:16 +0200107 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
108 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
Marek Olšák3d13b082011-09-27 23:08:04 +0200109 case PIPE_CAP_CONDITIONAL_RENDER:
Marek Olšákba890862011-09-27 23:18:17 +0200110 case PIPE_CAP_TEXTURE_BARRIER:
Marek Olšákdf809ae2011-12-10 04:14:46 +0100111 case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
Marek Olšák437ab1d2012-04-24 15:19:31 +0200112 case PIPE_CAP_USER_CONSTANT_BUFFERS:
Marek Olšák3e10ab62013-03-14 17:18:43 +0100113 case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
Marek Olšák6381dd72014-01-27 21:46:21 +0100114 case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
Mathias Fröhlich56088132014-09-14 15:17:07 +0200115 case PIPE_CAP_CLIP_HALFZ:
Marek Olšák50189372017-05-15 16:30:30 +0200116 case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
Marek Olšák0c71da12011-04-24 11:48:46 +0200117 return 1;
Marek Olšák0b3122c2011-04-24 11:59:16 +0200118
Marek Olšákc9f2af32012-10-28 17:52:48 +0100119 case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
Marek Olšák224d0e42012-11-30 15:23:41 +0100120 return R300_BUFFER_ALIGNMENT;
Marek Olšákc9f2af32012-10-28 17:52:48 +0100121
Marek Olšák1b749dc2012-04-24 17:31:17 +0200122 case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
123 return 16;
124
Marek Olšák171be752012-01-24 22:23:01 +0100125 case PIPE_CAP_GLSL_FEATURE_LEVEL:
126 return 120;
127
Marek Olšák0b3122c2011-04-24 11:59:16 +0200128 /* r300 cannot do swizzling of compressed textures. Supported otherwise. */
Marek Olšákfcf6b352010-12-01 22:49:02 +0100129 case PIPE_CAP_TEXTURE_SWIZZLE:
130 return util_format_s3tc_enabled ? r300screen->caps.dxtc_swizzle : 1;
Marek Olšák0b3122c2011-04-24 11:59:16 +0200131
Marek Olšák85efb2f2013-02-02 06:20:25 +0100132 /* We don't support color clamping on r500, so that we can use color
133 * intepolators for generic varyings. */
134 case PIPE_CAP_VERTEX_COLOR_CLAMPED:
135 return !is_r500;
136
Marek Olšák0b3122c2011-04-24 11:59:16 +0200137 /* Supported on r500 only. */
Marek Olšákbc1c8362012-01-23 03:11:17 +0100138 case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
Marek Olšák4a7f0132011-03-29 18:18:05 +0200139 case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
Marek Olšák0b3122c2011-04-24 11:59:16 +0200140 case PIPE_CAP_SM3:
Marek Olšák4a7f0132011-03-29 18:18:05 +0200141 return is_r500 ? 1 : 0;
Marek Olšák0ccc1362010-05-13 02:28:49 +0200142
Marek Olšák0b3122c2011-04-24 11:59:16 +0200143 /* Unsupported features. */
José Fonseca99762162012-12-09 09:50:34 +0000144 case PIPE_CAP_QUERY_TIME_ELAPSED:
Christoph Bumillerf35e96d2013-03-29 13:02:49 +0100145 case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
Dave Airlie0d29fb02012-03-24 13:34:45 +0000146 case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
Marek Olšák0ccc1362010-05-13 02:28:49 +0200147 case PIPE_CAP_INDEP_BLEND_ENABLE:
148 case PIPE_CAP_INDEP_BLEND_FUNC:
Marek Olšák4dfe1a02013-07-30 22:29:00 +0200149 case PIPE_CAP_DEPTH_CLIP_DISABLE:
Dave Airlie510c5032010-10-15 08:46:16 +1000150 case PIPE_CAP_SHADER_STENCIL_EXPORT:
Marek Olšák37942912011-09-05 22:52:21 +0200151 case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
Marek Olšák3f32efa2011-04-18 00:43:19 +0200152 case PIPE_CAP_TGSI_INSTANCEID:
Marek Olšák0b3122c2011-04-24 11:59:16 +0200153 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
154 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
Marek Olšákd8e222d2011-05-06 21:57:52 +0200155 case PIPE_CAP_SEAMLESS_CUBE_MAP:
156 case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
Marek Olšák2154c672011-09-11 15:46:47 +0200157 case PIPE_CAP_MIN_TEXEL_OFFSET:
158 case PIPE_CAP_MAX_TEXEL_OFFSET:
Ilia Mirkinc2f9ad52014-04-09 14:58:53 -0400159 case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
160 case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
Marek Olšák861a0292011-12-15 18:42:21 +0100161 case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
Marek Olšákf47da7f2011-12-17 15:12:59 +0100162 case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
163 case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
Grigori Goronzyd34d5fd2014-02-09 22:56:20 +0100164 case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
165 case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
Ilia Mirkin746e5262014-06-26 20:01:50 -0400166 case PIPE_CAP_MAX_VERTEX_STREAMS:
Marek Olšákf47da7f2011-12-17 15:12:59 +0100167 case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
Ilia Mirkin3fdeb7c2016-10-14 00:03:12 -0400168 case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
Marek Olšákbc1c8362012-01-23 03:11:17 +0100169 case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
Christoph Bumiller8b4f7b02012-02-06 16:29:03 +0100170 case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
Francisco Jerez40656392012-05-12 19:17:13 +0200171 case PIPE_CAP_COMPUTE:
Fredrik Höglundaf372122012-06-18 22:50:02 +0200172 case PIPE_CAP_START_INSTANCE:
Marek Olšákbcc735a2012-07-05 20:04:02 +0200173 case PIPE_CAP_QUERY_TIMESTAMP:
Marek Olšákb9c9dd42012-09-11 22:41:20 +0200174 case PIPE_CAP_TEXTURE_MULTISAMPLE:
Dave Airlieadd3a072012-11-10 06:34:14 +1000175 case PIPE_CAP_CUBE_MAP_ARRAY:
Dave Airlie3392f2f2012-12-12 07:15:31 +1000176 case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
Andreas Boll38d65a92013-01-31 09:35:14 +0100177 case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
Christoph Bumiller729abfd2013-04-12 13:42:01 +0200178 case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
Marek Olšák52cb3952013-05-02 03:24:33 +0200179 case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
Ilia Mirkin32b71242014-07-03 11:15:18 -0400180 case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
Dave Airlie2fcbec42013-09-21 18:45:43 +1000181 case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
182 case PIPE_CAP_TEXTURE_GATHER_SM5:
Dave Airliebe5276a2014-02-11 13:26:08 +1000183 case PIPE_CAP_TEXTURE_QUERY_LOD:
Marek Olšák5f7faff2014-04-04 19:36:30 +0200184 case PIPE_CAP_FAKE_SW_MSAA:
Ilia Mirkin88d8d882014-03-30 18:21:04 -0400185 case PIPE_CAP_SAMPLE_SHADING:
Ilia Mirkind95df4f2014-04-26 23:44:57 -0400186 case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
Christoph Bumillerbc198f82013-04-05 14:29:36 +0200187 case PIPE_CAP_DRAW_INDIRECT:
Ilia Mirkind67b9ba2015-12-31 13:30:13 -0500188 case PIPE_CAP_MULTI_DRAW_INDIRECT:
189 case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
Ilia Mirkin8ee74ce2014-08-14 00:04:41 -0400190 case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
Tobias Klausmannfd5edee2014-08-17 03:37:19 +0200191 case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
Ilia Mirkinc1130952014-08-20 19:45:10 -0400192 case PIPE_CAP_SAMPLER_VIEW_TARGET:
Roland Scheideggerade8b262014-12-12 04:13:43 +0100193 case PIPE_CAP_VERTEXID_NOBASE:
Ilia Mirkin7c211a12015-02-01 09:01:50 -0500194 case PIPE_CAP_POLYGON_OFFSET_CLAMP:
Axel Davyeb1c12d2015-01-17 14:30:17 +0100195 case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
Marek Olšák8b587ee2015-02-10 14:00:57 +0100196 case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
Marek Olšák79ffc08a2015-04-29 15:44:55 +0200197 case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
Marek Olšák26222932015-06-12 14:24:17 +0200198 case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
Marek Olšák44dc1d32015-08-10 19:37:01 +0200199 case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
200 case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:
Marek Olšák3b7800e2015-08-10 02:11:48 +0200201 case PIPE_CAP_DEPTH_BOUNDS_TEST:
Ilia Mirkinf46a53f2015-09-11 17:29:49 -0400202 case PIPE_CAP_TGSI_TXQS:
Marek Olšákf3b37e32015-09-27 19:32:07 +0200203 case PIPE_CAP_FORCE_PERSAMPLE_INTERP:
Marek Olšákd74e7b62015-09-27 21:02:15 +0200204 case PIPE_CAP_SHAREABLE_SHADERS:
Marek Olšákce9db162015-08-24 01:19:35 +0200205 case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:
Ilia Mirkin3695b252015-11-09 13:27:07 -0500206 case PIPE_CAP_CLEAR_TEXTURE:
Ilia Mirkin87b4e4e2015-12-29 16:49:32 -0500207 case PIPE_CAP_DRAW_PARAMETERS:
Ilia Mirkine9f43d62016-01-02 18:55:48 -0500208 case PIPE_CAP_TGSI_PACK_HALF_FLOAT:
Marek Olšák34738a92016-01-02 20:45:00 +0100209 case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
210 case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
Ilia Mirkinebfb5442016-01-02 21:56:45 -0500211 case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
Nicolai Hähnle654670b2016-01-11 17:38:08 -0500212 case PIPE_CAP_INVALIDATE_BUFFER:
Charmaine Lee3038e892016-01-14 10:22:17 -0700213 case PIPE_CAP_GENERATE_MIPMAP:
Rob Clarkd6408372015-08-10 11:41:29 -0400214 case PIPE_CAP_STRING_MARKER:
Nicolai Hähnle3abb5482016-01-26 10:26:30 -0500215 case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:
Nicolai Hähnle6af6d7b2016-01-26 10:27:58 -0500216 case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
Ilia Mirkinf9e6f462016-01-09 23:30:16 -0500217 case PIPE_CAP_QUERY_BUFFER_OBJECT:
Marek Olšákd2e4c9e2016-02-01 21:56:50 +0100218 case PIPE_CAP_QUERY_MEMORY_INFO:
Edward O'Callaghan4bc91302016-02-17 20:59:52 +1100219 case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
Lyudea1ce8a32017-03-22 20:51:07 -0400220 case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
Tobias Klausmann2be258e2016-05-08 22:44:07 +0200221 case PIPE_CAP_CULL_DISTANCE:
Kenneth Graunke70048eb2016-05-20 21:05:34 -0700222 case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
Ilia Mirkinedfa7a42016-05-29 11:39:52 -0400223 case PIPE_CAP_TGSI_VOTE:
Ilia Mirkin07fcb062016-06-11 15:26:45 -0400224 case PIPE_CAP_MAX_WINDOW_RECTANGLES:
Axel Davy59a69292016-06-13 22:28:32 +0200225 case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED:
Józef Kucia3cd28fe2016-07-19 13:07:24 +0200226 case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
Nicolai Hähnle700a5712016-10-07 09:42:55 +0200227 case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
Nicolai Hähnle611166b2016-11-18 20:49:54 +0100228 case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
Rob Clark026a7222016-04-01 16:10:42 -0400229 case PIPE_CAP_NATIVE_FENCE_FD:
Marek Olšáke51baeb2016-12-31 13:34:11 +0100230 case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
Ilia Mirkinee3ebe62017-01-01 23:10:00 -0500231 case PIPE_CAP_TGSI_FS_FBFETCH:
Ilia Mirkin6e409382017-01-16 22:14:38 -0500232 case PIPE_CAP_TGSI_MUL_ZERO_WINS:
Nicolai Hähnlea020cb32017-01-27 10:35:13 +0100233 case PIPE_CAP_DOUBLES:
Dave Airlief8045062016-06-09 10:13:03 +1000234 case PIPE_CAP_INT64:
Ilia Mirkinb0900332017-02-04 22:31:29 -0500235 case PIPE_CAP_INT64_DIVMOD:
Marek Olšákbf3cdf02017-03-07 02:09:03 +0100236 case PIPE_CAP_TGSI_TEX_TXF_LZ:
Nicolai Hähnled0c7f922017-03-29 20:44:57 +0200237 case PIPE_CAP_TGSI_CLOCK:
Lyudeffe2bd62017-03-16 18:00:05 -0400238 case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
Nicolai Hähnled6e6fa02017-02-02 21:10:44 +0100239 case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
Nicolai Hähnled3e6f6d2017-03-30 11:16:09 +0200240 case PIPE_CAP_TGSI_BALLOT:
Nicolai Hähnle17f24a92017-04-13 21:54:54 +0200241 case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
Marek Olšák70dcb732017-04-30 01:18:43 +0200242 case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
Lyude467af442017-05-24 15:42:39 -0400243 case PIPE_CAP_POST_DEPTH_COVERAGE:
Samuel Pitoiset973822b2017-02-16 13:43:16 +0100244 case PIPE_CAP_BINDLESS_TEXTURE:
Nicolai Hähnle01f15982017-06-25 18:31:11 +0200245 case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
Nicolai Hähnlea6777992017-07-26 19:16:14 +0200246 case PIPE_CAP_QUERY_SO_OVERFLOW:
Timothy Arceri4e4042d2017-08-03 13:54:45 +1000247 case PIPE_CAP_MEMOBJ:
Marek Olšákb6a96752011-03-05 17:37:15 +0100248 return 0;
249
250 /* SWTCL-only features. */
Marek Olšák469907d2010-10-22 20:33:25 +0200251 case PIPE_CAP_PRIMITIVE_RESTART:
Marek Olšákbdba35b2012-05-11 22:25:03 +0200252 case PIPE_CAP_USER_VERTEX_BUFFERS:
Marek Olšák65ef78e2014-11-17 22:30:31 +0100253 case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
Marek Olšákb6a96752011-03-05 17:37:15 +0100254 return !r300screen->caps.has_tcl;
Marek Olšák0ccc1362010-05-13 02:28:49 +0200255
Marek Olšákbdba35b2012-05-11 22:25:03 +0200256 /* HWTCL-only features / limitations. */
257 case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
258 case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
259 case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
260 return r300screen->caps.has_tcl;
Lyudea1ce8a32017-03-22 20:51:07 -0400261 case PIPE_CAP_TGSI_TEXCOORD:
Christoph Bumiller8acaf862013-03-15 22:11:31 +0100262 return 0;
Marek Olšákbdba35b2012-05-11 22:25:03 +0200263
Marek Olšák0ccc1362010-05-13 02:28:49 +0200264 /* Texturing. */
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800265 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800266 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800267 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
Marek Olšák0ccc1362010-05-13 02:28:49 +0200268 /* 13 == 4096, 12 == 2048 */
269 return is_r500 ? 13 : 12;
270
271 /* Render targets. */
272 case PIPE_CAP_MAX_RENDER_TARGETS:
273 return 4;
Lyudea1ce8a32017-03-22 20:51:07 -0400274 case PIPE_CAP_ENDIANNESS:
Tom Stellard4e90bc92013-07-09 21:21:39 -0700275 return PIPE_ENDIAN_LITTLE;
Marek Olšáka62cd692013-09-21 19:45:08 +0200276
277 case PIPE_CAP_MAX_VIEWPORTS:
278 return 1;
Emil Velikovde014432014-08-14 20:57:29 +0100279
Timothy Arceri89e68062014-08-19 21:09:58 -1000280 case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
281 return 2048;
282
Emil Velikovde014432014-08-14 20:57:29 +0100283 case PIPE_CAP_VENDOR_ID:
284 return 0x1002;
285 case PIPE_CAP_DEVICE_ID:
286 return r300screen->info.pci_id;
287 case PIPE_CAP_ACCELERATED:
288 return 1;
289 case PIPE_CAP_VIDEO_MEMORY:
290 return r300screen->info.vram_size >> 20;
291 case PIPE_CAP_UMA:
292 return 0;
Marek Olšákdcb2b772016-02-29 20:22:37 +0100293 case PIPE_CAP_PCI_GROUP:
294 return r300screen->info.pci_domain;
295 case PIPE_CAP_PCI_BUS:
296 return r300screen->info.pci_bus;
297 case PIPE_CAP_PCI_DEVICE:
298 return r300screen->info.pci_dev;
299 case PIPE_CAP_PCI_FUNCTION:
300 return r300screen->info.pci_func;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200301 }
Marek Olšák684d74e2011-11-22 20:44:14 +0100302 return 0;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200303}
Marek Olšákdca2a9f2010-05-13 01:45:57 +0200304
Brian Paul637e5712017-03-05 12:13:02 -0700305static int r300_get_shader_param(struct pipe_screen *pscreen,
306 enum pipe_shader_type shader,
307 enum pipe_shader_cap param)
Luca Barbieria508d2d2010-09-05 20:50:50 +0200308{
309 struct r300_screen* r300screen = r300_screen(pscreen);
310 boolean is_r400 = r300screen->caps.is_r400;
311 boolean is_r500 = r300screen->caps.is_r500;
312
Marek Olšák684d74e2011-11-22 20:44:14 +0100313 switch (shader) {
Luca Barbieria508d2d2010-09-05 20:50:50 +0200314 case PIPE_SHADER_FRAGMENT:
315 switch (param)
316 {
317 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
Marek Olšákdca2a9f2010-05-13 01:45:57 +0200318 return is_r500 || is_r400 ? 512 : 96;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200319 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
Marek Olšákdca2a9f2010-05-13 01:45:57 +0200320 return is_r500 || is_r400 ? 512 : 64;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200321 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
Marek Olšákdca2a9f2010-05-13 01:45:57 +0200322 return is_r500 || is_r400 ? 512 : 32;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200323 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
Marek Olšák13ef7a42010-05-14 00:20:58 +0200324 return is_r500 ? 511 : 4;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200325 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
Marek Olšákdca2a9f2010-05-13 01:45:57 +0200326 return is_r500 ? 64 : 0; /* Actually unlimited on r500. */
Luca Barbieria508d2d2010-09-05 20:50:50 +0200327 /* Fragment shader limits. */
328 case PIPE_SHADER_CAP_MAX_INPUTS:
Marek Olšákdca2a9f2010-05-13 01:45:57 +0200329 /* 2 colors + 8 texcoords are always supported
330 * (minus fog and wpos).
331 *
332 * R500 has the ability to turn 3rd and 4th color into
333 * additional texcoords but there is no two-sided color
334 * selection then. However the facing bit can be used instead. */
335 return 10;
Marek Olšák5f5b83c2014-10-01 20:28:17 +0200336 case PIPE_SHADER_CAP_MAX_OUTPUTS:
337 return 4;
Marek Olšák04f2c882014-07-24 20:32:08 +0200338 case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
339 return (is_r500 ? 256 : 32) * sizeof(float[4]);
Luca Barbieria508d2d2010-09-05 20:50:50 +0200340 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
Marek Olšákb6ebe7e2015-05-25 19:30:44 +0200341 case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
Luca Barbieria508d2d2010-09-05 20:50:50 +0200342 return 1;
343 case PIPE_SHADER_CAP_MAX_TEMPS:
Marek Olšákdca2a9f2010-05-13 01:45:57 +0200344 return is_r500 ? 128 : is_r400 ? 64 : 32;
Marek Olšák650f6a62011-11-22 20:47:14 +0100345 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
Roland Scheidegger2983c032013-11-26 02:30:41 +0100346 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
Marek Olšák650f6a62011-11-22 20:47:14 +0100347 return r300screen->caps.num_tex_units;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200348 case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
Brian Paul13f3ae52013-02-01 11:16:54 -0700349 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
Marek Olšákd2799022010-11-12 03:05:37 +0100350 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
351 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
352 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
353 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
Marek Olšák9aa089e2010-11-14 15:34:59 +0100354 case PIPE_SHADER_CAP_SUBROUTINES:
Marek Olšákd99c8e12011-08-05 06:04:05 +0200355 case PIPE_SHADER_CAP_INTEGERS:
Ilia Mirkinc85a6862015-02-19 23:30:36 -0500356 case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
357 case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
Marek Olšák216543e2015-02-28 00:26:31 +0100358 case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
Ilia Mirkin266d0012015-09-26 20:27:42 -0400359 case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
Ilia Mirkin9fbfa1a2016-01-08 22:56:23 -0500360 case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
Marek Olšák72217d42016-10-28 22:34:20 +0200361 case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
Samuel Pitoiset3a927e02017-04-25 00:31:46 +0200362 case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:
Marek Olšák9aa089e2010-11-14 15:34:59 +0100363 return 0;
Marek Olšák814f3142015-10-20 18:26:02 +0200364 case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
365 return 32;
Francisco Jerez40656392012-05-12 19:17:13 +0200366 case PIPE_SHADER_CAP_PREFERRED_IR:
367 return PIPE_SHADER_IR_TGSI;
Samuel Pitoiset5e09ac72016-02-03 18:57:58 +0100368 case PIPE_SHADER_CAP_SUPPORTED_IRS:
369 return 0;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200370 }
371 break;
372 case PIPE_SHADER_VERTEX:
Marek Olšákae272a92011-10-14 14:59:15 +0200373 switch (param)
374 {
375 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
Roland Scheidegger2983c032013-11-26 02:30:41 +0100376 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
Marek Olšák3b8fe062012-04-03 23:00:18 +0200377 case PIPE_SHADER_CAP_SUBROUTINES:
Marek Olšákae272a92011-10-14 14:59:15 +0200378 return 0;
379 default:;
380 }
381
Marek Olšák9cf25b32010-11-14 22:32:46 +0100382 if (!r300screen->caps.has_tcl) {
383 return draw_get_shader_param(shader, param);
384 }
385
Luca Barbieria508d2d2010-09-05 20:50:50 +0200386 switch (param)
387 {
388 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
389 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
Marek Olšákdca2a9f2010-05-13 01:45:57 +0200390 return is_r500 ? 1024 : 256;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200391 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
Marek Olšákdca2a9f2010-05-13 01:45:57 +0200392 return is_r500 ? 4 : 0; /* For loops; not sure about conditionals. */
Luca Barbieria508d2d2010-09-05 20:50:50 +0200393 case PIPE_SHADER_CAP_MAX_INPUTS:
Marek Olšákdca2a9f2010-05-13 01:45:57 +0200394 return 16;
Marek Olšák5f5b83c2014-10-01 20:28:17 +0200395 case PIPE_SHADER_CAP_MAX_OUTPUTS:
396 return 10;
Marek Olšák04f2c882014-07-24 20:32:08 +0200397 case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
398 return 256 * sizeof(float[4]);
Luca Barbieria508d2d2010-09-05 20:50:50 +0200399 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
400 return 1;
401 case PIPE_SHADER_CAP_MAX_TEMPS:
Marek Olšákdca2a9f2010-05-13 01:45:57 +0200402 return 32;
Marek Olšákd99c8e12011-08-05 06:04:05 +0200403 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
Marek Olšákb6ebe7e2015-05-25 19:30:44 +0200404 case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
Marek Olšákd99c8e12011-08-05 06:04:05 +0200405 return 1;
Marek Olšák650f6a62011-11-22 20:47:14 +0100406 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
407 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
Luca Barbieria508d2d2010-09-05 20:50:50 +0200408 case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
Brian Paul13f3ae52013-02-01 11:16:54 -0700409 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
Marek Olšákd2799022010-11-12 03:05:37 +0100410 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
411 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
412 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
Marek Olšák9aa089e2010-11-14 15:34:59 +0100413 case PIPE_SHADER_CAP_SUBROUTINES:
Bryan Cain17b695e2011-05-05 21:10:28 -0500414 case PIPE_SHADER_CAP_INTEGERS:
Marek Olšák650f6a62011-11-22 20:47:14 +0100415 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
Roland Scheidegger2983c032013-11-26 02:30:41 +0100416 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
Ilia Mirkinc85a6862015-02-19 23:30:36 -0500417 case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
418 case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
Marek Olšák216543e2015-02-28 00:26:31 +0100419 case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
Ilia Mirkin266d0012015-09-26 20:27:42 -0400420 case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
Ilia Mirkin9fbfa1a2016-01-08 22:56:23 -0500421 case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
Marek Olšák72217d42016-10-28 22:34:20 +0200422 case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
Samuel Pitoiset3a927e02017-04-25 00:31:46 +0200423 case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:
Bryan Cain17b695e2011-05-05 21:10:28 -0500424 return 0;
Marek Olšák814f3142015-10-20 18:26:02 +0200425 case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
426 return 32;
Francisco Jerez40656392012-05-12 19:17:13 +0200427 case PIPE_SHADER_CAP_PREFERRED_IR:
428 return PIPE_SHADER_IR_TGSI;
Samuel Pitoiset5e09ac72016-02-03 18:57:58 +0100429 case PIPE_SHADER_CAP_SUPPORTED_IRS:
430 return 0;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200431 }
432 break;
Brian Paul637e5712017-03-05 12:13:02 -0700433 default:
434 ; /* nothing */
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800435 }
Luca Barbieria508d2d2010-09-05 20:50:50 +0200436 return 0;
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800437}
438
Marek Olšákbb71f922011-11-19 22:38:22 +0100439static float r300_get_paramf(struct pipe_screen* pscreen,
440 enum pipe_capf param)
Corbin Simpson54d137e2009-01-20 15:27:46 -0800441{
Corbin Simpson17b39562009-05-16 10:56:17 -0700442 struct r300_screen* r300screen = r300_screen(pscreen);
443
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800444 switch (param) {
Marek Olšákbb71f922011-11-19 22:38:22 +0100445 case PIPE_CAPF_MAX_LINE_WIDTH:
446 case PIPE_CAPF_MAX_LINE_WIDTH_AA:
447 case PIPE_CAPF_MAX_POINT_WIDTH:
448 case PIPE_CAPF_MAX_POINT_WIDTH_AA:
Corbin Simpson17b39562009-05-16 10:56:17 -0700449 /* The maximum dimensions of the colorbuffer are our practical
450 * rendering limits. 2048 pixels should be enough for anybody. */
Marek Olšákb71bfc42010-04-05 03:19:08 +0200451 if (r300screen->caps.is_r500) {
Corbin Simpson17b39562009-05-16 10:56:17 -0700452 return 4096.0f;
Marek Olšákb71bfc42010-04-05 03:19:08 +0200453 } else if (r300screen->caps.is_r400) {
Corbin Simpson67b60b92010-02-09 13:50:54 -0800454 return 4021.0f;
Corbin Simpson17b39562009-05-16 10:56:17 -0700455 } else {
Corbin Simpson67b60b92010-02-09 13:50:54 -0800456 return 2560.0f;
Corbin Simpson17b39562009-05-16 10:56:17 -0700457 }
Marek Olšákbb71f922011-11-19 22:38:22 +0100458 case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
Corbin Simpson8d1f3862009-01-20 15:38:43 -0800459 return 16.0f;
Marek Olšákbb71f922011-11-19 22:38:22 +0100460 case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
Corbin Simpson8d1f3862009-01-20 15:38:43 -0800461 return 16.0f;
Marek Olšákbb71f922011-11-19 22:38:22 +0100462 case PIPE_CAPF_GUARD_BAND_LEFT:
463 case PIPE_CAPF_GUARD_BAND_TOP:
464 case PIPE_CAPF_GUARD_BAND_RIGHT:
465 case PIPE_CAPF_GUARD_BAND_BOTTOM:
Joakim Sindholtbf100552010-11-21 13:24:03 +0100466 return 0.0f;
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800467 default:
Marek Olšák1d96ad62010-10-22 19:45:05 +0200468 debug_printf("r300: Warning: Unknown CAP %d in get_paramf.\n",
469 param);
Corbin Simpson8d1f3862009-01-20 15:38:43 -0800470 return 0.0f;
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800471 }
472}
473
Christian Königf265a192011-07-07 22:51:45 +0200474static int r300_get_video_param(struct pipe_screen *screen,
475 enum pipe_video_profile profile,
Christian Königa15cbab2013-07-15 08:31:25 -0600476 enum pipe_video_entrypoint entrypoint,
Christian Königf265a192011-07-07 22:51:45 +0200477 enum pipe_video_cap param)
478{
Christian Königefc7fda2011-07-12 00:12:12 +0200479 switch (param) {
480 case PIPE_VIDEO_CAP_SUPPORTED:
Christian Königa15cbab2013-07-15 08:31:25 -0600481 return vl_profile_supported(screen, profile, entrypoint);
Christian Königefc7fda2011-07-12 00:12:12 +0200482 case PIPE_VIDEO_CAP_NPOT_TEXTURES:
483 return 0;
484 case PIPE_VIDEO_CAP_MAX_WIDTH:
485 case PIPE_VIDEO_CAP_MAX_HEIGHT:
486 return vl_video_buffer_max_size(screen);
Christian König9d9afcb2012-01-10 14:03:28 +0100487 case PIPE_VIDEO_CAP_PREFERED_FORMAT:
488 return PIPE_FORMAT_NV12;
Christian Königf3f03c62012-02-01 23:38:45 +0100489 case PIPE_VIDEO_CAP_PREFERS_INTERLACED:
490 return false;
491 case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED:
492 return false;
493 case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE:
494 return true;
Rico Schüllerd1ba1052013-08-14 13:17:22 +0200495 case PIPE_VIDEO_CAP_MAX_LEVEL:
496 return vl_level_supported(screen, profile);
Christian Königefc7fda2011-07-12 00:12:12 +0200497 default:
498 return 0;
499 }
Christian Königf265a192011-07-07 22:51:45 +0200500}
501
Marek Olšáke102b662013-01-12 04:44:37 +0100502/**
503 * Whether the format matches:
504 * PIPE_FORMAT_?10?10?10?2_UNORM
505 */
Ilia Mirkina2a1a582015-07-20 19:58:43 -0400506static inline boolean
Marek Olšáke102b662013-01-12 04:44:37 +0100507util_format_is_rgba1010102_variant(const struct util_format_description *desc)
508{
509 static const unsigned size[4] = {10, 10, 10, 2};
510 unsigned chan;
511
512 if (desc->block.width != 1 ||
513 desc->block.height != 1 ||
514 desc->block.bits != 32)
515 return FALSE;
516
517 for (chan = 0; chan < 4; ++chan) {
518 if(desc->channel[chan].type != UTIL_FORMAT_TYPE_UNSIGNED &&
519 desc->channel[chan].type != UTIL_FORMAT_TYPE_VOID)
520 return FALSE;
521 if (desc->channel[chan].size != size[chan])
522 return FALSE;
523 }
524
525 return TRUE;
526}
527
Marek Olšákbc0ae402014-08-22 19:49:00 +0200528static bool r300_is_blending_supported(struct r300_screen *rscreen,
529 enum pipe_format format)
530{
531 int c;
532 const struct util_format_description *desc =
533 util_format_description(format);
534
535 if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN)
536 return false;
537
538 c = util_format_get_first_non_void_channel(format);
539
540 /* RGBA16F */
541 if (rscreen->caps.is_r500 &&
542 desc->nr_channels == 4 &&
543 desc->channel[c].size == 16 &&
544 desc->channel[c].type == UTIL_FORMAT_TYPE_FLOAT)
545 return true;
546
547 if (desc->channel[c].normalized &&
548 desc->channel[c].type == UTIL_FORMAT_TYPE_UNSIGNED &&
549 desc->channel[c].size >= 4 &&
550 desc->channel[c].size <= 10) {
551 /* RGB10_A2, RGBA8, RGB5_A1, RGBA4, RGB565 */
552 if (desc->nr_channels >= 3)
553 return true;
554
555 if (format == PIPE_FORMAT_R8G8_UNORM)
556 return true;
557
558 /* R8, I8, L8, A8 */
559 if (desc->nr_channels == 1)
560 return true;
561 }
562
563 return false;
564}
565
Marek Olšákc4a2f132010-01-17 02:25:50 +0100566static boolean r300_is_format_supported(struct pipe_screen* screen,
567 enum pipe_format format,
568 enum pipe_texture_target target,
Roland Scheidegger39b4bf72010-05-17 21:29:17 +0200569 unsigned sample_count,
Marek Olšáke9689752011-03-08 00:01:58 +0100570 unsigned usage)
Corbin Simpson0648bc92009-01-22 16:51:34 -0800571{
Corbin Simpson36ccdf02009-10-06 16:00:27 -0700572 uint32_t retval = 0;
Marek Olšákb71bfc42010-04-05 03:19:08 +0200573 boolean is_r500 = r300_screen(screen)->caps.is_r500;
574 boolean is_r400 = r300_screen(screen)->caps.is_r400;
Marek Olšák26a54ed2010-04-10 19:59:17 +0200575 boolean is_color2101010 = format == PIPE_FORMAT_R10G10B10A2_UNORM ||
576 format == PIPE_FORMAT_R10G10B10X2_SNORM ||
577 format == PIPE_FORMAT_B10G10R10A2_UNORM ||
David Heidelberger8658fe32014-06-18 22:52:41 +0200578 format == PIPE_FORMAT_B10G10R10X2_UNORM ||
Marek Olšák26a54ed2010-04-10 19:59:17 +0200579 format == PIPE_FORMAT_R10SG10SB10SA2U_NORM;
Marek Olšák32526512010-04-01 02:14:52 +0200580 boolean is_ati1n = format == PIPE_FORMAT_RGTC1_UNORM ||
Marek Olšák5ef807c2011-03-07 02:25:22 +0100581 format == PIPE_FORMAT_RGTC1_SNORM ||
582 format == PIPE_FORMAT_LATC1_UNORM ||
583 format == PIPE_FORMAT_LATC1_SNORM;
Marek Olšák32526512010-04-01 02:14:52 +0200584 boolean is_ati2n = format == PIPE_FORMAT_RGTC2_UNORM ||
Marek Olšák5ef807c2011-03-07 02:25:22 +0100585 format == PIPE_FORMAT_RGTC2_SNORM ||
586 format == PIPE_FORMAT_LATC2_UNORM ||
587 format == PIPE_FORMAT_LATC2_SNORM;
Marek Olšák673cec42011-04-22 16:17:18 +0200588 boolean is_half_float = format == PIPE_FORMAT_R16_FLOAT ||
589 format == PIPE_FORMAT_R16G16_FLOAT ||
Marek Olšákebe2b542010-05-28 02:53:47 +0200590 format == PIPE_FORMAT_R16G16B16_FLOAT ||
Marek Olšák4dc142d2013-02-01 21:45:15 +0100591 format == PIPE_FORMAT_R16G16B16A16_FLOAT ||
592 format == PIPE_FORMAT_R16G16B16X16_FLOAT;
Marek Olšáke102b662013-01-12 04:44:37 +0100593 const struct util_format_description *desc;
Corbin Simpson36ccdf02009-10-06 16:00:27 -0700594
Marek Olšák75fa5c92011-04-11 06:23:00 +0200595 if (!util_format_is_supported(format, usage))
596 return FALSE;
597
Marek Olšák24707502010-07-13 04:29:53 +0200598 /* Check multisampling support. */
Corbin Simpsona91fea62010-05-25 22:33:21 -0700599 switch (sample_count) {
600 case 0:
601 case 1:
Corbin Simpson8ecca392010-06-16 10:51:04 -0700602 break;
Corbin Simpsona91fea62010-05-25 22:33:21 -0700603 case 2:
Corbin Simpsona91fea62010-05-25 22:33:21 -0700604 case 4:
605 case 6:
Marek Olšák8ed6b142013-01-05 06:21:49 +0100606 /* No texturing and scanout. */
607 if (usage & (PIPE_BIND_SAMPLER_VIEW |
608 PIPE_BIND_DISPLAY_TARGET |
609 PIPE_BIND_SCANOUT)) {
610 return FALSE;
611 }
Marek Olšáke102b662013-01-12 04:44:37 +0100612
613 desc = util_format_description(format);
614
615 if (is_r500) {
616 /* Only allow depth/stencil, RGBA8, RGBA1010102, RGBA16F. */
617 if (!util_format_is_depth_or_stencil(format) &&
618 !util_format_is_rgba8_variant(desc) &&
619 !util_format_is_rgba1010102_variant(desc) &&
Marek Olšák4dc142d2013-02-01 21:45:15 +0100620 format != PIPE_FORMAT_R16G16B16A16_FLOAT &&
621 format != PIPE_FORMAT_R16G16B16X16_FLOAT) {
Marek Olšáke102b662013-01-12 04:44:37 +0100622 return FALSE;
623 }
624 } else {
625 /* Only allow depth/stencil, RGBA8. */
626 if (!util_format_is_depth_or_stencil(format) &&
627 !util_format_is_rgba8_variant(desc)) {
628 return FALSE;
629 }
Marek Olšák8ed6b142013-01-05 06:21:49 +0100630 }
Corbin Simpsona91fea62010-05-25 22:33:21 -0700631 break;
632 default:
633 return FALSE;
634 }
Roland Scheidegger39b4bf72010-05-17 21:29:17 +0200635
Marek Olšákca0e88c2010-02-18 00:18:23 +0100636 /* Check sampler format support. */
Keith Whitwell287c94e2010-04-10 16:05:54 +0100637 if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
Marek Olšák27e216a2013-01-26 00:27:27 +0100638 /* these two are broken for an unknown reason */
639 format != PIPE_FORMAT_R8G8B8X8_SNORM &&
640 format != PIPE_FORMAT_R16G16B16X16_SNORM &&
Marek Olšák32526512010-04-01 02:14:52 +0200641 /* ATI1N is r5xx-only. */
642 (is_r500 || !is_ati1n) &&
643 /* ATI2N is supported on r4xx-r5xx. */
644 (is_r400 || is_r500 || !is_ati2n) &&
Marek Olšák5c14fd12010-02-20 21:33:53 +0100645 r300_is_sampler_format_supported(format)) {
Keith Whitwell287c94e2010-04-10 16:05:54 +0100646 retval |= PIPE_BIND_SAMPLER_VIEW;
Marek Olšákca0e88c2010-02-18 00:18:23 +0100647 }
648
Marek Olšák7a087e12010-02-21 00:17:04 +0100649 /* Check colorbuffer format support. */
Keith Whitwell287c94e2010-04-10 16:05:54 +0100650 if ((usage & (PIPE_BIND_RENDER_TARGET |
651 PIPE_BIND_DISPLAY_TARGET |
652 PIPE_BIND_SCANOUT |
Marek Olšákbc0ae402014-08-22 19:49:00 +0200653 PIPE_BIND_SHARED |
654 PIPE_BIND_BLENDABLE)) &&
Marek Olšák7a087e12010-02-21 00:17:04 +0100655 /* 2101010 cannot be rendered to on non-r5xx. */
Marek Olšákb7da8fa2016-02-23 23:32:44 +0100656 (!is_color2101010 || is_r500) &&
Marek Olšák7a087e12010-02-21 00:17:04 +0100657 r300_is_colorbuffer_format_supported(format)) {
658 retval |= usage &
Keith Whitwell287c94e2010-04-10 16:05:54 +0100659 (PIPE_BIND_RENDER_TARGET |
660 PIPE_BIND_DISPLAY_TARGET |
661 PIPE_BIND_SCANOUT |
662 PIPE_BIND_SHARED);
Marek Olšákbc0ae402014-08-22 19:49:00 +0200663
664 if (r300_is_blending_supported(r300_screen(screen), format)) {
665 retval |= usage & PIPE_BIND_BLENDABLE;
666 }
Corbin Simpson0648bc92009-01-22 16:51:34 -0800667 }
668
Marek Olšák7a087e12010-02-21 00:17:04 +0100669 /* Check depth-stencil format support. */
Keith Whitwell287c94e2010-04-10 16:05:54 +0100670 if (usage & PIPE_BIND_DEPTH_STENCIL &&
Marek Olšák7a087e12010-02-21 00:17:04 +0100671 r300_is_zs_format_supported(format)) {
Keith Whitwell287c94e2010-04-10 16:05:54 +0100672 retval |= PIPE_BIND_DEPTH_STENCIL;
Marek Olšák7a087e12010-02-21 00:17:04 +0100673 }
674
Marek Olšákebe2b542010-05-28 02:53:47 +0200675 /* Check vertex buffer format support. */
Marek Olšákbdba35b2012-05-11 22:25:03 +0200676 if (usage & PIPE_BIND_VERTEX_BUFFER) {
677 if (r300_screen(screen)->caps.has_tcl) {
678 /* Half float is supported on >= R400. */
679 if ((is_r400 || is_r500 || !is_half_float) &&
680 r300_translate_vertex_data_type(format) != R300_INVALID_FORMAT) {
681 retval |= PIPE_BIND_VERTEX_BUFFER;
682 }
683 } else {
684 /* SW TCL */
685 if (!util_format_is_pure_integer(format)) {
686 retval |= PIPE_BIND_VERTEX_BUFFER;
687 }
688 }
Marek Olšákebe2b542010-05-28 02:53:47 +0200689 }
690
Marek Olšák7a087e12010-02-21 00:17:04 +0100691 return retval == usage;
Corbin Simpson0648bc92009-01-22 16:51:34 -0800692}
693
Corbin Simpson54d137e2009-01-20 15:27:46 -0800694static void r300_destroy_screen(struct pipe_screen* pscreen)
695{
Corbin Simpson2b9ecaa2009-01-20 15:26:41 -0800696 struct r300_screen* r300screen = r300_screen(pscreen);
Marek Olšákd35aeff2011-04-18 02:39:50 +0200697 struct radeon_winsys *rws = radeon_winsys(pscreen);
Dave Airlie68e58a92010-02-12 15:39:51 +1000698
Marek Olšákac330d42014-04-09 00:26:32 +0200699 if (rws && !rws->unref(rws))
Christian König48711282013-09-25 13:59:56 +0200700 return;
701
Timothy Arceribe188282017-03-05 12:32:04 +1100702 mtx_destroy(&r300screen->cmask_mutex);
Nicolai Hähnle616e3662016-09-27 18:59:56 +0200703 slab_destroy_parent(&r300screen->pool_transfers);
Marek Olšákca2c2882013-01-12 03:29:40 +0100704
Dave Airlie68e58a92010-02-12 15:39:51 +1000705 if (rws)
706 rws->destroy(rws);
Corbin Simpson2b9ecaa2009-01-20 15:26:41 -0800707
Corbin Simpson2b9ecaa2009-01-20 15:26:41 -0800708 FREE(r300screen);
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800709}
710
Corbin Simpsond2cf1e82010-04-09 03:37:53 -0700711static void r300_fence_reference(struct pipe_screen *screen,
712 struct pipe_fence_handle **ptr,
713 struct pipe_fence_handle *fence)
714{
Marek Olšák6067a302013-10-08 21:26:34 +0200715 struct radeon_winsys *rws = r300_screen(screen)->rws;
716
717 rws->fence_reference(ptr, fence);
Corbin Simpsond2cf1e82010-04-09 03:37:53 -0700718}
719
Marek Olšákbfe88e62011-03-07 22:57:54 +0100720static boolean r300_fence_finish(struct pipe_screen *screen,
Marek Olšák54272e12016-08-06 16:41:42 +0200721 struct pipe_context *ctx,
Marek Olšákbfe88e62011-03-07 22:57:54 +0100722 struct pipe_fence_handle *fence,
723 uint64_t timeout)
Corbin Simpsond2cf1e82010-04-09 03:37:53 -0700724{
Marek Olšákd35aeff2011-04-18 02:39:50 +0200725 struct radeon_winsys *rws = r300_screen(screen)->rws;
Marek Olšák2c072c82010-05-26 01:23:07 +0200726
Marek Olšák6067a302013-10-08 21:26:34 +0200727 return rws->fence_wait(rws, fence, timeout);
Corbin Simpsond2cf1e82010-04-09 03:37:53 -0700728}
729
Nicolai Hähnlebc7f41e2017-06-28 14:47:32 +0200730struct pipe_screen* r300_screen_create(struct radeon_winsys *rws,
731 const struct pipe_screen_config *config)
Corbin Simpson538a8142009-01-20 00:31:43 -0800732{
Dave Airlie68e58a92010-02-12 15:39:51 +1000733 struct r300_screen *r300screen = CALLOC_STRUCT(r300_screen);
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800734
Marek Olšákb71bfc42010-04-05 03:19:08 +0200735 if (!r300screen) {
Vinson Lee2de590e2010-01-31 22:38:25 -0800736 FREE(r300screen);
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800737 return NULL;
Vinson Lee2de590e2010-01-31 22:38:25 -0800738 }
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800739
Marek Olšák28a336d2011-07-22 18:58:30 +0200740 rws->query_info(rws, &r300screen->info);
Corbin Simpsonecb7f292009-01-22 13:34:21 -0800741
Marek Olšák08edbe92010-01-09 18:38:54 +0100742 r300_init_debug(r300screen);
Marek Olšák28a336d2011-07-22 18:58:30 +0200743 r300_parse_chipset(r300screen->info.pci_id, &r300screen->caps);
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800744
Marek Olšák9ad9a682011-02-12 23:37:14 +0100745 if (SCREEN_DBG_ON(r300screen, DBG_NO_ZMASK))
746 r300screen->caps.zmask_ram = 0;
747 if (SCREEN_DBG_ON(r300screen, DBG_NO_HIZ))
748 r300screen->caps.hiz_ram = 0;
749
Dave Airlie68e58a92010-02-12 15:39:51 +1000750 r300screen->rws = rws;
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800751 r300screen->screen.destroy = r300_destroy_screen;
752 r300screen->screen.get_name = r300_get_name;
753 r300screen->screen.get_vendor = r300_get_vendor;
Giuseppe Bilotta76039b32015-03-22 07:21:01 +0100754 r300screen->screen.get_device_vendor = r300_get_device_vendor;
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800755 r300screen->screen.get_param = r300_get_param;
Luca Barbieria508d2d2010-09-05 20:50:50 +0200756 r300screen->screen.get_shader_param = r300_get_shader_param;
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800757 r300screen->screen.get_paramf = r300_get_paramf;
Christian Königf265a192011-07-07 22:51:45 +0200758 r300screen->screen.get_video_param = r300_get_video_param;
Corbin Simpsonda1928d2009-01-05 23:55:00 -0800759 r300screen->screen.is_format_supported = r300_is_format_supported;
Christian König7eca7692011-07-08 11:20:39 +0200760 r300screen->screen.is_video_format_supported = vl_video_buffer_is_format_supported;
Keith Whitwell7f41f542010-02-08 12:55:59 +0000761 r300screen->screen.context_create = r300_create_context;
Corbin Simpsond2cf1e82010-04-09 03:37:53 -0700762 r300screen->screen.fence_reference = r300_fence_reference;
Corbin Simpsond2cf1e82010-04-09 03:37:53 -0700763 r300screen->screen.fence_finish = r300_fence_finish;
764
Keith Whitwell287c94e2010-04-10 16:05:54 +0100765 r300_init_screen_resource_functions(r300screen);
Dave Airliefff5be82010-02-12 15:39:51 +1000766
Nicolai Hähnle616e3662016-09-27 18:59:56 +0200767 slab_create_parent(&r300screen->pool_transfers, sizeof(struct pipe_transfer), 64);
768
Marek Olšák95bfc8f2010-04-29 03:18:39 +0200769 util_format_s3tc_init();
Timothy Arceri75b47dd2017-03-05 12:00:15 +1100770 (void) mtx_init(&r300screen->cmask_mutex, mtx_plain);
Marek Olšák95bfc8f2010-04-29 03:18:39 +0200771
Dave Airlieb14548e2010-02-22 17:26:30 +1000772 return &r300screen->screen;
Dave Airliefff5be82010-02-12 15:39:51 +1000773}