Corbin Simpson | 3b37cb4 | 2009-01-08 15:47:23 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> |
Marek Olšák | 4012219 | 2010-02-06 03:11:50 +0100 | [diff] [blame] | 3 | * Copyright 2010 Marek Olšák <maraeo@gmail.com> |
Corbin Simpson | 3b37cb4 | 2009-01-08 15:47:23 -0800 | [diff] [blame] | 4 | * |
| 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 Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 23 | |
Michal Krol | b1ed72e | 2009-12-17 23:41:57 +0100 | [diff] [blame] | 24 | #include "util/u_format.h" |
Marek Olšák | 95bfc8f | 2010-04-29 03:18:39 +0200 | [diff] [blame] | 25 | #include "util/u_format_s3tc.h" |
Corbin Simpson | 6a448a5 | 2009-10-21 06:31:36 -0700 | [diff] [blame] | 26 | #include "util/u_memory.h" |
Marek Olšák | ac8821f | 2011-03-05 21:46:06 +0100 | [diff] [blame] | 27 | #include "os/os_time.h" |
Christian König | efc7fda | 2011-07-12 00:12:12 +0200 | [diff] [blame] | 28 | #include "vl/vl_decoder.h" |
Christian König | 7eca769 | 2011-07-08 11:20:39 +0200 | [diff] [blame] | 29 | #include "vl/vl_video_buffer.h" |
Corbin Simpson | 6a448a5 | 2009-10-21 06:31:36 -0700 | [diff] [blame] | 30 | |
| 31 | #include "r300_context.h" |
Corbin Simpson | 6a448a5 | 2009-10-21 06:31:36 -0700 | [diff] [blame] | 32 | #include "r300_texture.h" |
Dave Airlie | 68e58a9 | 2010-02-12 15:39:51 +1000 | [diff] [blame] | 33 | #include "r300_screen_buffer.h" |
Marek Olšák | ebe2b54 | 2010-05-28 02:53:47 +0200 | [diff] [blame] | 34 | #include "r300_state_inlines.h" |
Jakob Bornecrantz | 6e3fc2d | 2010-06-06 11:56:23 +0100 | [diff] [blame] | 35 | #include "r300_public.h" |
Dave Airlie | 68e58a9 | 2010-02-12 15:39:51 +1000 | [diff] [blame] | 36 | |
Marek Olšák | 9cf25b3 | 2010-11-14 22:32:46 +0100 | [diff] [blame] | 37 | #include "draw/draw_context.h" |
| 38 | |
Corbin Simpson | 902b1be | 2009-01-24 03:34:17 -0800 | [diff] [blame] | 39 | /* 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 Simpson | 54d137e | 2009-01-20 15:27:46 -0800 | [diff] [blame] | 45 | static const char* r300_get_vendor(struct pipe_screen* pscreen) |
| 46 | { |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 47 | return "X.Org R300 Project"; |
| 48 | } |
| 49 | |
Giuseppe Bilotta | 76039b3 | 2015-03-22 07:21:01 +0100 | [diff] [blame] | 50 | static const char* r300_get_device_vendor(struct pipe_screen* pscreen) |
| 51 | { |
| 52 | return "ATI"; |
| 53 | } |
| 54 | |
Corbin Simpson | 902b1be | 2009-01-24 03:34:17 -0800 | [diff] [blame] | 55 | static const char* chip_families[] = { |
Marek Olšák | 1385c35 | 2013-01-09 16:26:24 +0100 | [diff] [blame] | 56 | "unknown", |
Marek Olšák | 88ddfc5 | 2010-11-09 14:53:42 +0100 | [diff] [blame] | 57 | "ATI R300", |
| 58 | "ATI R350", |
Marek Olšák | 88ddfc5 | 2010-11-09 14:53:42 +0100 | [diff] [blame] | 59 | "ATI RV350", |
| 60 | "ATI RV370", |
| 61 | "ATI RV380", |
Marek Olšák | d711135 | 2011-06-07 20:59:56 +0200 | [diff] [blame] | 62 | "ATI RS400", |
| 63 | "ATI RC410", |
| 64 | "ATI RS480", |
Marek Olšák | 88ddfc5 | 2010-11-09 14:53:42 +0100 | [diff] [blame] | 65 | "ATI R420", |
| 66 | "ATI R423", |
| 67 | "ATI R430", |
| 68 | "ATI R480", |
| 69 | "ATI R481", |
| 70 | "ATI RV410", |
Marek Olšák | 88ddfc5 | 2010-11-09 14:53:42 +0100 | [diff] [blame] | 71 | "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 Simpson | 902b1be | 2009-01-24 03:34:17 -0800 | [diff] [blame] | 80 | }; |
| 81 | |
Corbin Simpson | 54d137e | 2009-01-20 15:27:46 -0800 | [diff] [blame] | 82 | static const char* r300_get_name(struct pipe_screen* pscreen) |
| 83 | { |
Corbin Simpson | 43f2035 | 2009-01-20 01:11:08 -0800 | [diff] [blame] | 84 | struct r300_screen* r300screen = r300_screen(pscreen); |
| 85 | |
Marek Olšák | b71bfc4 | 2010-04-05 03:19:08 +0200 | [diff] [blame] | 86 | return chip_families[r300screen->caps.family]; |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 87 | } |
| 88 | |
José Fonseca | e1238b5 | 2010-05-11 11:11:03 +0100 | [diff] [blame] | 89 | static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param) |
Corbin Simpson | 54d137e | 2009-01-20 15:27:46 -0800 | [diff] [blame] | 90 | { |
Corbin Simpson | 3b37cb4 | 2009-01-08 15:47:23 -0800 | [diff] [blame] | 91 | struct r300_screen* r300screen = r300_screen(pscreen); |
Marek Olšák | dca2a9f | 2010-05-13 01:45:57 +0200 | [diff] [blame] | 92 | boolean is_r500 = r300screen->caps.is_r500; |
| 93 | |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 94 | switch (param) { |
Marek Olšák | 0ccc136 | 2010-05-13 02:28:49 +0200 | [diff] [blame] | 95 | /* Supported features (boolean caps). */ |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 96 | case PIPE_CAP_NPOT_TEXTURES: |
Ilia Mirkin | 12d39b4 | 2013-10-04 04:32:15 -0400 | [diff] [blame] | 97 | case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES: |
Ilia Mirkin | 9515d65 | 2016-08-20 22:40:33 -0400 | [diff] [blame] | 98 | case PIPE_CAP_MIXED_COLOR_DEPTH_BITS: |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 99 | case PIPE_CAP_TWO_SIDED_STENCIL: |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 100 | case PIPE_CAP_ANISOTROPIC_FILTER: |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 101 | case PIPE_CAP_POINT_SPRITE: |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 102 | case PIPE_CAP_OCCLUSION_QUERY: |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 103 | case PIPE_CAP_TEXTURE_SHADOW_MAP: |
Marek Olšák | 0ccc136 | 2010-05-13 02:28:49 +0200 | [diff] [blame] | 104 | case PIPE_CAP_TEXTURE_MIRROR_CLAMP: |
Marek Olšák | 0ccc136 | 2010-05-13 02:28:49 +0200 | [diff] [blame] | 105 | case PIPE_CAP_BLEND_EQUATION_SEPARATE: |
Marek Olšák | 65482f2 | 2011-03-05 15:53:46 +0100 | [diff] [blame] | 106 | case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR: |
Marek Olšák | 0b3122c | 2011-04-24 11:59:16 +0200 | [diff] [blame] | 107 | case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT: |
| 108 | case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER: |
Marek Olšák | 3d13b08 | 2011-09-27 23:08:04 +0200 | [diff] [blame] | 109 | case PIPE_CAP_CONDITIONAL_RENDER: |
Marek Olšák | ba89086 | 2011-09-27 23:18:17 +0200 | [diff] [blame] | 110 | case PIPE_CAP_TEXTURE_BARRIER: |
Marek Olšák | df809ae | 2011-12-10 04:14:46 +0100 | [diff] [blame] | 111 | case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS: |
Marek Olšák | 437ab1d | 2012-04-24 15:19:31 +0200 | [diff] [blame] | 112 | case PIPE_CAP_USER_CONSTANT_BUFFERS: |
Marek Olšák | 3e10ab6 | 2013-03-14 17:18:43 +0100 | [diff] [blame] | 113 | case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: |
Marek Olšák | 6381dd7 | 2014-01-27 21:46:21 +0100 | [diff] [blame] | 114 | case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT: |
Mathias Fröhlich | 5608813 | 2014-09-14 15:17:07 +0200 | [diff] [blame] | 115 | case PIPE_CAP_CLIP_HALFZ: |
Marek Olšák | 5018937 | 2017-05-15 16:30:30 +0200 | [diff] [blame] | 116 | case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION: |
Marek Olšák | 0c71da1 | 2011-04-24 11:48:46 +0200 | [diff] [blame] | 117 | return 1; |
Marek Olšák | 0b3122c | 2011-04-24 11:59:16 +0200 | [diff] [blame] | 118 | |
Marek Olšák | c9f2af3 | 2012-10-28 17:52:48 +0100 | [diff] [blame] | 119 | case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: |
Marek Olšák | 224d0e4 | 2012-11-30 15:23:41 +0100 | [diff] [blame] | 120 | return R300_BUFFER_ALIGNMENT; |
Marek Olšák | c9f2af3 | 2012-10-28 17:52:48 +0100 | [diff] [blame] | 121 | |
Marek Olšák | 1b749dc | 2012-04-24 17:31:17 +0200 | [diff] [blame] | 122 | case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT: |
| 123 | return 16; |
| 124 | |
Marek Olšák | 171be75 | 2012-01-24 22:23:01 +0100 | [diff] [blame] | 125 | case PIPE_CAP_GLSL_FEATURE_LEVEL: |
| 126 | return 120; |
| 127 | |
Marek Olšák | 0b3122c | 2011-04-24 11:59:16 +0200 | [diff] [blame] | 128 | /* r300 cannot do swizzling of compressed textures. Supported otherwise. */ |
Marek Olšák | fcf6b35 | 2010-12-01 22:49:02 +0100 | [diff] [blame] | 129 | case PIPE_CAP_TEXTURE_SWIZZLE: |
| 130 | return util_format_s3tc_enabled ? r300screen->caps.dxtc_swizzle : 1; |
Marek Olšák | 0b3122c | 2011-04-24 11:59:16 +0200 | [diff] [blame] | 131 | |
Marek Olšák | 85efb2f | 2013-02-02 06:20:25 +0100 | [diff] [blame] | 132 | /* 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šák | 0b3122c | 2011-04-24 11:59:16 +0200 | [diff] [blame] | 137 | /* Supported on r500 only. */ |
Marek Olšák | bc1c836 | 2012-01-23 03:11:17 +0100 | [diff] [blame] | 138 | case PIPE_CAP_VERTEX_COLOR_UNCLAMPED: |
Marek Olšák | 4a7f013 | 2011-03-29 18:18:05 +0200 | [diff] [blame] | 139 | case PIPE_CAP_MIXED_COLORBUFFER_FORMATS: |
Marek Olšák | 0b3122c | 2011-04-24 11:59:16 +0200 | [diff] [blame] | 140 | case PIPE_CAP_SM3: |
Marek Olšák | 4a7f013 | 2011-03-29 18:18:05 +0200 | [diff] [blame] | 141 | return is_r500 ? 1 : 0; |
Marek Olšák | 0ccc136 | 2010-05-13 02:28:49 +0200 | [diff] [blame] | 142 | |
Marek Olšák | 0b3122c | 2011-04-24 11:59:16 +0200 | [diff] [blame] | 143 | /* Unsupported features. */ |
José Fonseca | 9976216 | 2012-12-09 09:50:34 +0000 | [diff] [blame] | 144 | case PIPE_CAP_QUERY_TIME_ELAPSED: |
Christoph Bumiller | f35e96d | 2013-03-29 13:02:49 +0100 | [diff] [blame] | 145 | case PIPE_CAP_QUERY_PIPELINE_STATISTICS: |
Dave Airlie | 0d29fb0 | 2012-03-24 13:34:45 +0000 | [diff] [blame] | 146 | case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: |
Marek Olšák | 0ccc136 | 2010-05-13 02:28:49 +0200 | [diff] [blame] | 147 | case PIPE_CAP_INDEP_BLEND_ENABLE: |
| 148 | case PIPE_CAP_INDEP_BLEND_FUNC: |
Marek Olšák | 4dfe1a0 | 2013-07-30 22:29:00 +0200 | [diff] [blame] | 149 | case PIPE_CAP_DEPTH_CLIP_DISABLE: |
Dave Airlie | 510c503 | 2010-10-15 08:46:16 +1000 | [diff] [blame] | 150 | case PIPE_CAP_SHADER_STENCIL_EXPORT: |
Marek Olšák | 3794291 | 2011-09-05 22:52:21 +0200 | [diff] [blame] | 151 | case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS: |
Marek Olšák | 3f32efa | 2011-04-18 00:43:19 +0200 | [diff] [blame] | 152 | case PIPE_CAP_TGSI_INSTANCEID: |
Marek Olšák | 0b3122c | 2011-04-24 11:59:16 +0200 | [diff] [blame] | 153 | case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT: |
| 154 | case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER: |
Marek Olšák | d8e222d | 2011-05-06 21:57:52 +0200 | [diff] [blame] | 155 | case PIPE_CAP_SEAMLESS_CUBE_MAP: |
| 156 | case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE: |
Marek Olšák | 2154c67 | 2011-09-11 15:46:47 +0200 | [diff] [blame] | 157 | case PIPE_CAP_MIN_TEXEL_OFFSET: |
| 158 | case PIPE_CAP_MAX_TEXEL_OFFSET: |
Ilia Mirkin | c2f9ad5 | 2014-04-09 14:58:53 -0400 | [diff] [blame] | 159 | case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET: |
| 160 | case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET: |
Marek Olšák | 861a029 | 2011-12-15 18:42:21 +0100 | [diff] [blame] | 161 | case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS: |
Marek Olšák | f47da7f | 2011-12-17 15:12:59 +0100 | [diff] [blame] | 162 | case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS: |
| 163 | case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS: |
Grigori Goronzy | d34d5fd | 2014-02-09 22:56:20 +0100 | [diff] [blame] | 164 | case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES: |
| 165 | case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: |
Ilia Mirkin | 746e526 | 2014-06-26 20:01:50 -0400 | [diff] [blame] | 166 | case PIPE_CAP_MAX_VERTEX_STREAMS: |
Marek Olšák | f47da7f | 2011-12-17 15:12:59 +0100 | [diff] [blame] | 167 | case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: |
Ilia Mirkin | 3fdeb7c | 2016-10-14 00:03:12 -0400 | [diff] [blame] | 168 | case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS: |
Marek Olšák | bc1c836 | 2012-01-23 03:11:17 +0100 | [diff] [blame] | 169 | case PIPE_CAP_FRAGMENT_COLOR_CLAMPED: |
Christoph Bumiller | 8b4f7b0 | 2012-02-06 16:29:03 +0100 | [diff] [blame] | 170 | case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: |
Francisco Jerez | 4065639 | 2012-05-12 19:17:13 +0200 | [diff] [blame] | 171 | case PIPE_CAP_COMPUTE: |
Fredrik Höglund | af37212 | 2012-06-18 22:50:02 +0200 | [diff] [blame] | 172 | case PIPE_CAP_START_INSTANCE: |
Marek Olšák | bcc735a | 2012-07-05 20:04:02 +0200 | [diff] [blame] | 173 | case PIPE_CAP_QUERY_TIMESTAMP: |
Marek Olšák | b9c9dd4 | 2012-09-11 22:41:20 +0200 | [diff] [blame] | 174 | case PIPE_CAP_TEXTURE_MULTISAMPLE: |
Dave Airlie | add3a07 | 2012-11-10 06:34:14 +1000 | [diff] [blame] | 175 | case PIPE_CAP_CUBE_MAP_ARRAY: |
Dave Airlie | 3392f2f | 2012-12-12 07:15:31 +1000 | [diff] [blame] | 176 | case PIPE_CAP_TEXTURE_BUFFER_OBJECTS: |
Andreas Boll | 38d65a9 | 2013-01-31 09:35:14 +0100 | [diff] [blame] | 177 | case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: |
Christoph Bumiller | 729abfd | 2013-04-12 13:42:01 +0200 | [diff] [blame] | 178 | case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK: |
Marek Olšák | 52cb395 | 2013-05-02 03:24:33 +0200 | [diff] [blame] | 179 | case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE: |
Ilia Mirkin | 32b7124 | 2014-07-03 11:15:18 -0400 | [diff] [blame] | 180 | case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT: |
Dave Airlie | 2fcbec4 | 2013-09-21 18:45:43 +1000 | [diff] [blame] | 181 | case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS: |
| 182 | case PIPE_CAP_TEXTURE_GATHER_SM5: |
Dave Airlie | be5276a | 2014-02-11 13:26:08 +1000 | [diff] [blame] | 183 | case PIPE_CAP_TEXTURE_QUERY_LOD: |
Marek Olšák | 5f7faff | 2014-04-04 19:36:30 +0200 | [diff] [blame] | 184 | case PIPE_CAP_FAKE_SW_MSAA: |
Ilia Mirkin | 88d8d88 | 2014-03-30 18:21:04 -0400 | [diff] [blame] | 185 | case PIPE_CAP_SAMPLE_SHADING: |
Ilia Mirkin | d95df4f | 2014-04-26 23:44:57 -0400 | [diff] [blame] | 186 | case PIPE_CAP_TEXTURE_GATHER_OFFSETS: |
Christoph Bumiller | bc198f8 | 2013-04-05 14:29:36 +0200 | [diff] [blame] | 187 | case PIPE_CAP_DRAW_INDIRECT: |
Ilia Mirkin | d67b9ba | 2015-12-31 13:30:13 -0500 | [diff] [blame] | 188 | case PIPE_CAP_MULTI_DRAW_INDIRECT: |
| 189 | case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS: |
Ilia Mirkin | 8ee74ce | 2014-08-14 00:04:41 -0400 | [diff] [blame] | 190 | case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: |
Tobias Klausmann | fd5edee | 2014-08-17 03:37:19 +0200 | [diff] [blame] | 191 | case PIPE_CAP_CONDITIONAL_RENDER_INVERTED: |
Ilia Mirkin | c113095 | 2014-08-20 19:45:10 -0400 | [diff] [blame] | 192 | case PIPE_CAP_SAMPLER_VIEW_TARGET: |
Roland Scheidegger | ade8b26 | 2014-12-12 04:13:43 +0100 | [diff] [blame] | 193 | case PIPE_CAP_VERTEXID_NOBASE: |
Ilia Mirkin | 7c211a1 | 2015-02-01 09:01:50 -0500 | [diff] [blame] | 194 | case PIPE_CAP_POLYGON_OFFSET_CLAMP: |
Axel Davy | eb1c12d | 2015-01-17 14:30:17 +0100 | [diff] [blame] | 195 | case PIPE_CAP_MULTISAMPLE_Z_RESOLVE: |
Marek Olšák | 8b587ee | 2015-02-10 14:00:57 +0100 | [diff] [blame] | 196 | case PIPE_CAP_RESOURCE_FROM_USER_MEMORY: |
Marek Olšák | 79ffc08a | 2015-04-29 15:44:55 +0200 | [diff] [blame] | 197 | case PIPE_CAP_DEVICE_RESET_STATUS_QUERY: |
Marek Olšák | 2622293 | 2015-06-12 14:24:17 +0200 | [diff] [blame] | 198 | case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS: |
Marek Olšák | 44dc1d3 | 2015-08-10 19:37:01 +0200 | [diff] [blame] | 199 | case PIPE_CAP_TEXTURE_FLOAT_LINEAR: |
| 200 | case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR: |
Marek Olšák | 3b7800e | 2015-08-10 02:11:48 +0200 | [diff] [blame] | 201 | case PIPE_CAP_DEPTH_BOUNDS_TEST: |
Ilia Mirkin | f46a53f | 2015-09-11 17:29:49 -0400 | [diff] [blame] | 202 | case PIPE_CAP_TGSI_TXQS: |
Marek Olšák | f3b37e3 | 2015-09-27 19:32:07 +0200 | [diff] [blame] | 203 | case PIPE_CAP_FORCE_PERSAMPLE_INTERP: |
Marek Olšák | d74e7b6 | 2015-09-27 21:02:15 +0200 | [diff] [blame] | 204 | case PIPE_CAP_SHAREABLE_SHADERS: |
Marek Olšák | ce9db16 | 2015-08-24 01:19:35 +0200 | [diff] [blame] | 205 | case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS: |
Ilia Mirkin | 3695b25 | 2015-11-09 13:27:07 -0500 | [diff] [blame] | 206 | case PIPE_CAP_CLEAR_TEXTURE: |
Ilia Mirkin | 87b4e4e | 2015-12-29 16:49:32 -0500 | [diff] [blame] | 207 | case PIPE_CAP_DRAW_PARAMETERS: |
Ilia Mirkin | e9f43d6 | 2016-01-02 18:55:48 -0500 | [diff] [blame] | 208 | case PIPE_CAP_TGSI_PACK_HALF_FLOAT: |
Marek Olšák | 34738a9 | 2016-01-02 20:45:00 +0100 | [diff] [blame] | 209 | case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL: |
| 210 | case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL: |
Ilia Mirkin | ebfb544 | 2016-01-02 21:56:45 -0500 | [diff] [blame] | 211 | case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT: |
Nicolai Hähnle | 654670b | 2016-01-11 17:38:08 -0500 | [diff] [blame] | 212 | case PIPE_CAP_INVALIDATE_BUFFER: |
Charmaine Lee | 3038e89 | 2016-01-14 10:22:17 -0700 | [diff] [blame] | 213 | case PIPE_CAP_GENERATE_MIPMAP: |
Rob Clark | d640837 | 2015-08-10 11:41:29 -0400 | [diff] [blame] | 214 | case PIPE_CAP_STRING_MARKER: |
Nicolai Hähnle | 3abb548 | 2016-01-26 10:26:30 -0500 | [diff] [blame] | 215 | case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY: |
Nicolai Hähnle | 6af6d7b | 2016-01-26 10:27:58 -0500 | [diff] [blame] | 216 | case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS: |
Ilia Mirkin | f9e6f46 | 2016-01-09 23:30:16 -0500 | [diff] [blame] | 217 | case PIPE_CAP_QUERY_BUFFER_OBJECT: |
Marek Olšák | d2e4c9e | 2016-02-01 21:56:50 +0100 | [diff] [blame] | 218 | case PIPE_CAP_QUERY_MEMORY_INFO: |
Edward O'Callaghan | 4bc9130 | 2016-02-17 20:59:52 +1100 | [diff] [blame] | 219 | case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT: |
Lyude | a1ce8a3 | 2017-03-22 20:51:07 -0400 | [diff] [blame] | 220 | case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR: |
Tobias Klausmann | 2be258e | 2016-05-08 22:44:07 +0200 | [diff] [blame] | 221 | case PIPE_CAP_CULL_DISTANCE: |
Kenneth Graunke | 70048eb | 2016-05-20 21:05:34 -0700 | [diff] [blame] | 222 | case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES: |
Ilia Mirkin | edfa7a4 | 2016-05-29 11:39:52 -0400 | [diff] [blame] | 223 | case PIPE_CAP_TGSI_VOTE: |
Ilia Mirkin | 07fcb06 | 2016-06-11 15:26:45 -0400 | [diff] [blame] | 224 | case PIPE_CAP_MAX_WINDOW_RECTANGLES: |
Axel Davy | 59a6929 | 2016-06-13 22:28:32 +0200 | [diff] [blame] | 225 | case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED: |
Józef Kucia | 3cd28fe | 2016-07-19 13:07:24 +0200 | [diff] [blame] | 226 | case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS: |
Nicolai Hähnle | 700a571 | 2016-10-07 09:42:55 +0200 | [diff] [blame] | 227 | case PIPE_CAP_TGSI_ARRAY_COMPONENTS: |
Nicolai Hähnle | 611166b | 2016-11-18 20:49:54 +0100 | [diff] [blame] | 228 | case PIPE_CAP_TGSI_CAN_READ_OUTPUTS: |
Rob Clark | 026a722 | 2016-04-01 16:10:42 -0400 | [diff] [blame] | 229 | case PIPE_CAP_NATIVE_FENCE_FD: |
Marek Olšák | e51baeb | 2016-12-31 13:34:11 +0100 | [diff] [blame] | 230 | case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: |
Ilia Mirkin | ee3ebe6 | 2017-01-01 23:10:00 -0500 | [diff] [blame] | 231 | case PIPE_CAP_TGSI_FS_FBFETCH: |
Ilia Mirkin | 6e40938 | 2017-01-16 22:14:38 -0500 | [diff] [blame] | 232 | case PIPE_CAP_TGSI_MUL_ZERO_WINS: |
Nicolai Hähnle | a020cb3 | 2017-01-27 10:35:13 +0100 | [diff] [blame] | 233 | case PIPE_CAP_DOUBLES: |
Dave Airlie | f804506 | 2016-06-09 10:13:03 +1000 | [diff] [blame] | 234 | case PIPE_CAP_INT64: |
Ilia Mirkin | b090033 | 2017-02-04 22:31:29 -0500 | [diff] [blame] | 235 | case PIPE_CAP_INT64_DIVMOD: |
Marek Olšák | bf3cdf0 | 2017-03-07 02:09:03 +0100 | [diff] [blame] | 236 | case PIPE_CAP_TGSI_TEX_TXF_LZ: |
Nicolai Hähnle | d0c7f92 | 2017-03-29 20:44:57 +0200 | [diff] [blame] | 237 | case PIPE_CAP_TGSI_CLOCK: |
Lyude | ffe2bd6 | 2017-03-16 18:00:05 -0400 | [diff] [blame] | 238 | case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE: |
Nicolai Hähnle | d6e6fa0 | 2017-02-02 21:10:44 +0100 | [diff] [blame] | 239 | case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE: |
Nicolai Hähnle | d3e6f6d | 2017-03-30 11:16:09 +0200 | [diff] [blame] | 240 | case PIPE_CAP_TGSI_BALLOT: |
Nicolai Hähnle | 17f24a9 | 2017-04-13 21:54:54 +0200 | [diff] [blame] | 241 | case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT: |
Marek Olšák | 70dcb73 | 2017-04-30 01:18:43 +0200 | [diff] [blame] | 242 | case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX: |
Lyude | 467af44 | 2017-05-24 15:42:39 -0400 | [diff] [blame] | 243 | case PIPE_CAP_POST_DEPTH_COVERAGE: |
Samuel Pitoiset | 973822b | 2017-02-16 13:43:16 +0100 | [diff] [blame] | 244 | case PIPE_CAP_BINDLESS_TEXTURE: |
Nicolai Hähnle | 01f1598 | 2017-06-25 18:31:11 +0200 | [diff] [blame] | 245 | case PIPE_CAP_NIR_SAMPLERS_AS_DEREF: |
Nicolai Hähnle | a677799 | 2017-07-26 19:16:14 +0200 | [diff] [blame] | 246 | case PIPE_CAP_QUERY_SO_OVERFLOW: |
Timothy Arceri | 4e4042d | 2017-08-03 13:54:45 +1000 | [diff] [blame^] | 247 | case PIPE_CAP_MEMOBJ: |
Marek Olšák | b6a9675 | 2011-03-05 17:37:15 +0100 | [diff] [blame] | 248 | return 0; |
| 249 | |
| 250 | /* SWTCL-only features. */ |
Marek Olšák | 469907d | 2010-10-22 20:33:25 +0200 | [diff] [blame] | 251 | case PIPE_CAP_PRIMITIVE_RESTART: |
Marek Olšák | bdba35b | 2012-05-11 22:25:03 +0200 | [diff] [blame] | 252 | case PIPE_CAP_USER_VERTEX_BUFFERS: |
Marek Olšák | 65ef78e | 2014-11-17 22:30:31 +0100 | [diff] [blame] | 253 | case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION: |
Marek Olšák | b6a9675 | 2011-03-05 17:37:15 +0100 | [diff] [blame] | 254 | return !r300screen->caps.has_tcl; |
Marek Olšák | 0ccc136 | 2010-05-13 02:28:49 +0200 | [diff] [blame] | 255 | |
Marek Olšák | bdba35b | 2012-05-11 22:25:03 +0200 | [diff] [blame] | 256 | /* 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; |
Lyude | a1ce8a3 | 2017-03-22 20:51:07 -0400 | [diff] [blame] | 261 | case PIPE_CAP_TGSI_TEXCOORD: |
Christoph Bumiller | 8acaf86 | 2013-03-15 22:11:31 +0100 | [diff] [blame] | 262 | return 0; |
Marek Olšák | bdba35b | 2012-05-11 22:25:03 +0200 | [diff] [blame] | 263 | |
Marek Olšák | 0ccc136 | 2010-05-13 02:28:49 +0200 | [diff] [blame] | 264 | /* Texturing. */ |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 265 | case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 266 | case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 267 | case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: |
Marek Olšák | 0ccc136 | 2010-05-13 02:28:49 +0200 | [diff] [blame] | 268 | /* 13 == 4096, 12 == 2048 */ |
| 269 | return is_r500 ? 13 : 12; |
| 270 | |
| 271 | /* Render targets. */ |
| 272 | case PIPE_CAP_MAX_RENDER_TARGETS: |
| 273 | return 4; |
Lyude | a1ce8a3 | 2017-03-22 20:51:07 -0400 | [diff] [blame] | 274 | case PIPE_CAP_ENDIANNESS: |
Tom Stellard | 4e90bc9 | 2013-07-09 21:21:39 -0700 | [diff] [blame] | 275 | return PIPE_ENDIAN_LITTLE; |
Marek Olšák | a62cd69 | 2013-09-21 19:45:08 +0200 | [diff] [blame] | 276 | |
| 277 | case PIPE_CAP_MAX_VIEWPORTS: |
| 278 | return 1; |
Emil Velikov | de01443 | 2014-08-14 20:57:29 +0100 | [diff] [blame] | 279 | |
Timothy Arceri | 89e6806 | 2014-08-19 21:09:58 -1000 | [diff] [blame] | 280 | case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE: |
| 281 | return 2048; |
| 282 | |
Emil Velikov | de01443 | 2014-08-14 20:57:29 +0100 | [diff] [blame] | 283 | 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šák | dcb2b77 | 2016-02-29 20:22:37 +0100 | [diff] [blame] | 293 | 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 Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 301 | } |
Marek Olšák | 684d74e | 2011-11-22 20:44:14 +0100 | [diff] [blame] | 302 | return 0; |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 303 | } |
Marek Olšák | dca2a9f | 2010-05-13 01:45:57 +0200 | [diff] [blame] | 304 | |
Brian Paul | 637e571 | 2017-03-05 12:13:02 -0700 | [diff] [blame] | 305 | static int r300_get_shader_param(struct pipe_screen *pscreen, |
| 306 | enum pipe_shader_type shader, |
| 307 | enum pipe_shader_cap param) |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 308 | { |
| 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šák | 684d74e | 2011-11-22 20:44:14 +0100 | [diff] [blame] | 313 | switch (shader) { |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 314 | case PIPE_SHADER_FRAGMENT: |
| 315 | switch (param) |
| 316 | { |
| 317 | case PIPE_SHADER_CAP_MAX_INSTRUCTIONS: |
Marek Olšák | dca2a9f | 2010-05-13 01:45:57 +0200 | [diff] [blame] | 318 | return is_r500 || is_r400 ? 512 : 96; |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 319 | case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS: |
Marek Olšák | dca2a9f | 2010-05-13 01:45:57 +0200 | [diff] [blame] | 320 | return is_r500 || is_r400 ? 512 : 64; |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 321 | case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS: |
Marek Olšák | dca2a9f | 2010-05-13 01:45:57 +0200 | [diff] [blame] | 322 | return is_r500 || is_r400 ? 512 : 32; |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 323 | case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS: |
Marek Olšák | 13ef7a4 | 2010-05-14 00:20:58 +0200 | [diff] [blame] | 324 | return is_r500 ? 511 : 4; |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 325 | case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH: |
Marek Olšák | dca2a9f | 2010-05-13 01:45:57 +0200 | [diff] [blame] | 326 | return is_r500 ? 64 : 0; /* Actually unlimited on r500. */ |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 327 | /* Fragment shader limits. */ |
| 328 | case PIPE_SHADER_CAP_MAX_INPUTS: |
Marek Olšák | dca2a9f | 2010-05-13 01:45:57 +0200 | [diff] [blame] | 329 | /* 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šák | 5f5b83c | 2014-10-01 20:28:17 +0200 | [diff] [blame] | 336 | case PIPE_SHADER_CAP_MAX_OUTPUTS: |
| 337 | return 4; |
Marek Olšák | 04f2c88 | 2014-07-24 20:32:08 +0200 | [diff] [blame] | 338 | case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: |
| 339 | return (is_r500 ? 256 : 32) * sizeof(float[4]); |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 340 | case PIPE_SHADER_CAP_MAX_CONST_BUFFERS: |
Marek Olšák | b6ebe7e | 2015-05-25 19:30:44 +0200 | [diff] [blame] | 341 | case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 342 | return 1; |
| 343 | case PIPE_SHADER_CAP_MAX_TEMPS: |
Marek Olšák | dca2a9f | 2010-05-13 01:45:57 +0200 | [diff] [blame] | 344 | return is_r500 ? 128 : is_r400 ? 64 : 32; |
Marek Olšák | 650f6a6 | 2011-11-22 20:47:14 +0100 | [diff] [blame] | 345 | case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: |
Roland Scheidegger | 2983c03 | 2013-11-26 02:30:41 +0100 | [diff] [blame] | 346 | case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: |
Marek Olšák | 650f6a6 | 2011-11-22 20:47:14 +0100 | [diff] [blame] | 347 | return r300screen->caps.num_tex_units; |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 348 | case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED: |
Brian Paul | 13f3ae5 | 2013-02-01 11:16:54 -0700 | [diff] [blame] | 349 | case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED: |
Marek Olšák | d279902 | 2010-11-12 03:05:37 +0100 | [diff] [blame] | 350 | 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šák | 9aa089e | 2010-11-14 15:34:59 +0100 | [diff] [blame] | 354 | case PIPE_SHADER_CAP_SUBROUTINES: |
Marek Olšák | d99c8e1 | 2011-08-05 06:04:05 +0200 | [diff] [blame] | 355 | case PIPE_SHADER_CAP_INTEGERS: |
Ilia Mirkin | c85a686 | 2015-02-19 23:30:36 -0500 | [diff] [blame] | 356 | case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED: |
| 357 | case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: |
Marek Olšák | 216543e | 2015-02-28 00:26:31 +0100 | [diff] [blame] | 358 | case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: |
Ilia Mirkin | 266d001 | 2015-09-26 20:27:42 -0400 | [diff] [blame] | 359 | case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS: |
Ilia Mirkin | 9fbfa1a | 2016-01-08 22:56:23 -0500 | [diff] [blame] | 360 | case PIPE_SHADER_CAP_MAX_SHADER_IMAGES: |
Marek Olšák | 72217d4 | 2016-10-28 22:34:20 +0200 | [diff] [blame] | 361 | case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD: |
Samuel Pitoiset | 3a927e0 | 2017-04-25 00:31:46 +0200 | [diff] [blame] | 362 | case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS: |
Marek Olšák | 9aa089e | 2010-11-14 15:34:59 +0100 | [diff] [blame] | 363 | return 0; |
Marek Olšák | 814f314 | 2015-10-20 18:26:02 +0200 | [diff] [blame] | 364 | case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: |
| 365 | return 32; |
Francisco Jerez | 4065639 | 2012-05-12 19:17:13 +0200 | [diff] [blame] | 366 | case PIPE_SHADER_CAP_PREFERRED_IR: |
| 367 | return PIPE_SHADER_IR_TGSI; |
Samuel Pitoiset | 5e09ac7 | 2016-02-03 18:57:58 +0100 | [diff] [blame] | 368 | case PIPE_SHADER_CAP_SUPPORTED_IRS: |
| 369 | return 0; |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 370 | } |
| 371 | break; |
| 372 | case PIPE_SHADER_VERTEX: |
Marek Olšák | ae272a9 | 2011-10-14 14:59:15 +0200 | [diff] [blame] | 373 | switch (param) |
| 374 | { |
| 375 | case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: |
Roland Scheidegger | 2983c03 | 2013-11-26 02:30:41 +0100 | [diff] [blame] | 376 | case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: |
Marek Olšák | 3b8fe06 | 2012-04-03 23:00:18 +0200 | [diff] [blame] | 377 | case PIPE_SHADER_CAP_SUBROUTINES: |
Marek Olšák | ae272a9 | 2011-10-14 14:59:15 +0200 | [diff] [blame] | 378 | return 0; |
| 379 | default:; |
| 380 | } |
| 381 | |
Marek Olšák | 9cf25b3 | 2010-11-14 22:32:46 +0100 | [diff] [blame] | 382 | if (!r300screen->caps.has_tcl) { |
| 383 | return draw_get_shader_param(shader, param); |
| 384 | } |
| 385 | |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 386 | switch (param) |
| 387 | { |
| 388 | case PIPE_SHADER_CAP_MAX_INSTRUCTIONS: |
| 389 | case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS: |
Marek Olšák | dca2a9f | 2010-05-13 01:45:57 +0200 | [diff] [blame] | 390 | return is_r500 ? 1024 : 256; |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 391 | case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH: |
Marek Olšák | dca2a9f | 2010-05-13 01:45:57 +0200 | [diff] [blame] | 392 | return is_r500 ? 4 : 0; /* For loops; not sure about conditionals. */ |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 393 | case PIPE_SHADER_CAP_MAX_INPUTS: |
Marek Olšák | dca2a9f | 2010-05-13 01:45:57 +0200 | [diff] [blame] | 394 | return 16; |
Marek Olšák | 5f5b83c | 2014-10-01 20:28:17 +0200 | [diff] [blame] | 395 | case PIPE_SHADER_CAP_MAX_OUTPUTS: |
| 396 | return 10; |
Marek Olšák | 04f2c88 | 2014-07-24 20:32:08 +0200 | [diff] [blame] | 397 | case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: |
| 398 | return 256 * sizeof(float[4]); |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 399 | case PIPE_SHADER_CAP_MAX_CONST_BUFFERS: |
| 400 | return 1; |
| 401 | case PIPE_SHADER_CAP_MAX_TEMPS: |
Marek Olšák | dca2a9f | 2010-05-13 01:45:57 +0200 | [diff] [blame] | 402 | return 32; |
Marek Olšák | d99c8e1 | 2011-08-05 06:04:05 +0200 | [diff] [blame] | 403 | case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR: |
Marek Olšák | b6ebe7e | 2015-05-25 19:30:44 +0200 | [diff] [blame] | 404 | case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: |
Marek Olšák | d99c8e1 | 2011-08-05 06:04:05 +0200 | [diff] [blame] | 405 | return 1; |
Marek Olšák | 650f6a6 | 2011-11-22 20:47:14 +0100 | [diff] [blame] | 406 | case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS: |
| 407 | case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS: |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 408 | case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED: |
Brian Paul | 13f3ae5 | 2013-02-01 11:16:54 -0700 | [diff] [blame] | 409 | case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED: |
Marek Olšák | d279902 | 2010-11-12 03:05:37 +0100 | [diff] [blame] | 410 | 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šák | 9aa089e | 2010-11-14 15:34:59 +0100 | [diff] [blame] | 413 | case PIPE_SHADER_CAP_SUBROUTINES: |
Bryan Cain | 17b695e | 2011-05-05 21:10:28 -0500 | [diff] [blame] | 414 | case PIPE_SHADER_CAP_INTEGERS: |
Marek Olšák | 650f6a6 | 2011-11-22 20:47:14 +0100 | [diff] [blame] | 415 | case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: |
Roland Scheidegger | 2983c03 | 2013-11-26 02:30:41 +0100 | [diff] [blame] | 416 | case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: |
Ilia Mirkin | c85a686 | 2015-02-19 23:30:36 -0500 | [diff] [blame] | 417 | case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED: |
| 418 | case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: |
Marek Olšák | 216543e | 2015-02-28 00:26:31 +0100 | [diff] [blame] | 419 | case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: |
Ilia Mirkin | 266d001 | 2015-09-26 20:27:42 -0400 | [diff] [blame] | 420 | case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS: |
Ilia Mirkin | 9fbfa1a | 2016-01-08 22:56:23 -0500 | [diff] [blame] | 421 | case PIPE_SHADER_CAP_MAX_SHADER_IMAGES: |
Marek Olšák | 72217d4 | 2016-10-28 22:34:20 +0200 | [diff] [blame] | 422 | case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD: |
Samuel Pitoiset | 3a927e0 | 2017-04-25 00:31:46 +0200 | [diff] [blame] | 423 | case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS: |
Bryan Cain | 17b695e | 2011-05-05 21:10:28 -0500 | [diff] [blame] | 424 | return 0; |
Marek Olšák | 814f314 | 2015-10-20 18:26:02 +0200 | [diff] [blame] | 425 | case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: |
| 426 | return 32; |
Francisco Jerez | 4065639 | 2012-05-12 19:17:13 +0200 | [diff] [blame] | 427 | case PIPE_SHADER_CAP_PREFERRED_IR: |
| 428 | return PIPE_SHADER_IR_TGSI; |
Samuel Pitoiset | 5e09ac7 | 2016-02-03 18:57:58 +0100 | [diff] [blame] | 429 | case PIPE_SHADER_CAP_SUPPORTED_IRS: |
| 430 | return 0; |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 431 | } |
| 432 | break; |
Brian Paul | 637e571 | 2017-03-05 12:13:02 -0700 | [diff] [blame] | 433 | default: |
| 434 | ; /* nothing */ |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 435 | } |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 436 | return 0; |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 437 | } |
| 438 | |
Marek Olšák | bb71f92 | 2011-11-19 22:38:22 +0100 | [diff] [blame] | 439 | static float r300_get_paramf(struct pipe_screen* pscreen, |
| 440 | enum pipe_capf param) |
Corbin Simpson | 54d137e | 2009-01-20 15:27:46 -0800 | [diff] [blame] | 441 | { |
Corbin Simpson | 17b3956 | 2009-05-16 10:56:17 -0700 | [diff] [blame] | 442 | struct r300_screen* r300screen = r300_screen(pscreen); |
| 443 | |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 444 | switch (param) { |
Marek Olšák | bb71f92 | 2011-11-19 22:38:22 +0100 | [diff] [blame] | 445 | 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 Simpson | 17b3956 | 2009-05-16 10:56:17 -0700 | [diff] [blame] | 449 | /* The maximum dimensions of the colorbuffer are our practical |
| 450 | * rendering limits. 2048 pixels should be enough for anybody. */ |
Marek Olšák | b71bfc4 | 2010-04-05 03:19:08 +0200 | [diff] [blame] | 451 | if (r300screen->caps.is_r500) { |
Corbin Simpson | 17b3956 | 2009-05-16 10:56:17 -0700 | [diff] [blame] | 452 | return 4096.0f; |
Marek Olšák | b71bfc4 | 2010-04-05 03:19:08 +0200 | [diff] [blame] | 453 | } else if (r300screen->caps.is_r400) { |
Corbin Simpson | 67b60b9 | 2010-02-09 13:50:54 -0800 | [diff] [blame] | 454 | return 4021.0f; |
Corbin Simpson | 17b3956 | 2009-05-16 10:56:17 -0700 | [diff] [blame] | 455 | } else { |
Corbin Simpson | 67b60b9 | 2010-02-09 13:50:54 -0800 | [diff] [blame] | 456 | return 2560.0f; |
Corbin Simpson | 17b3956 | 2009-05-16 10:56:17 -0700 | [diff] [blame] | 457 | } |
Marek Olšák | bb71f92 | 2011-11-19 22:38:22 +0100 | [diff] [blame] | 458 | case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY: |
Corbin Simpson | 8d1f386 | 2009-01-20 15:38:43 -0800 | [diff] [blame] | 459 | return 16.0f; |
Marek Olšák | bb71f92 | 2011-11-19 22:38:22 +0100 | [diff] [blame] | 460 | case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS: |
Corbin Simpson | 8d1f386 | 2009-01-20 15:38:43 -0800 | [diff] [blame] | 461 | return 16.0f; |
Marek Olšák | bb71f92 | 2011-11-19 22:38:22 +0100 | [diff] [blame] | 462 | 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 Sindholt | bf10055 | 2010-11-21 13:24:03 +0100 | [diff] [blame] | 466 | return 0.0f; |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 467 | default: |
Marek Olšák | 1d96ad6 | 2010-10-22 19:45:05 +0200 | [diff] [blame] | 468 | debug_printf("r300: Warning: Unknown CAP %d in get_paramf.\n", |
| 469 | param); |
Corbin Simpson | 8d1f386 | 2009-01-20 15:38:43 -0800 | [diff] [blame] | 470 | return 0.0f; |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 471 | } |
| 472 | } |
| 473 | |
Christian König | f265a19 | 2011-07-07 22:51:45 +0200 | [diff] [blame] | 474 | static int r300_get_video_param(struct pipe_screen *screen, |
| 475 | enum pipe_video_profile profile, |
Christian König | a15cbab | 2013-07-15 08:31:25 -0600 | [diff] [blame] | 476 | enum pipe_video_entrypoint entrypoint, |
Christian König | f265a19 | 2011-07-07 22:51:45 +0200 | [diff] [blame] | 477 | enum pipe_video_cap param) |
| 478 | { |
Christian König | efc7fda | 2011-07-12 00:12:12 +0200 | [diff] [blame] | 479 | switch (param) { |
| 480 | case PIPE_VIDEO_CAP_SUPPORTED: |
Christian König | a15cbab | 2013-07-15 08:31:25 -0600 | [diff] [blame] | 481 | return vl_profile_supported(screen, profile, entrypoint); |
Christian König | efc7fda | 2011-07-12 00:12:12 +0200 | [diff] [blame] | 482 | 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önig | 9d9afcb | 2012-01-10 14:03:28 +0100 | [diff] [blame] | 487 | case PIPE_VIDEO_CAP_PREFERED_FORMAT: |
| 488 | return PIPE_FORMAT_NV12; |
Christian König | f3f03c6 | 2012-02-01 23:38:45 +0100 | [diff] [blame] | 489 | 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üller | d1ba105 | 2013-08-14 13:17:22 +0200 | [diff] [blame] | 495 | case PIPE_VIDEO_CAP_MAX_LEVEL: |
| 496 | return vl_level_supported(screen, profile); |
Christian König | efc7fda | 2011-07-12 00:12:12 +0200 | [diff] [blame] | 497 | default: |
| 498 | return 0; |
| 499 | } |
Christian König | f265a19 | 2011-07-07 22:51:45 +0200 | [diff] [blame] | 500 | } |
| 501 | |
Marek Olšák | e102b66 | 2013-01-12 04:44:37 +0100 | [diff] [blame] | 502 | /** |
| 503 | * Whether the format matches: |
| 504 | * PIPE_FORMAT_?10?10?10?2_UNORM |
| 505 | */ |
Ilia Mirkin | a2a1a58 | 2015-07-20 19:58:43 -0400 | [diff] [blame] | 506 | static inline boolean |
Marek Olšák | e102b66 | 2013-01-12 04:44:37 +0100 | [diff] [blame] | 507 | util_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šák | bc0ae40 | 2014-08-22 19:49:00 +0200 | [diff] [blame] | 528 | static 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šák | c4a2f13 | 2010-01-17 02:25:50 +0100 | [diff] [blame] | 566 | static boolean r300_is_format_supported(struct pipe_screen* screen, |
| 567 | enum pipe_format format, |
| 568 | enum pipe_texture_target target, |
Roland Scheidegger | 39b4bf7 | 2010-05-17 21:29:17 +0200 | [diff] [blame] | 569 | unsigned sample_count, |
Marek Olšák | e968975 | 2011-03-08 00:01:58 +0100 | [diff] [blame] | 570 | unsigned usage) |
Corbin Simpson | 0648bc9 | 2009-01-22 16:51:34 -0800 | [diff] [blame] | 571 | { |
Corbin Simpson | 36ccdf0 | 2009-10-06 16:00:27 -0700 | [diff] [blame] | 572 | uint32_t retval = 0; |
Marek Olšák | b71bfc4 | 2010-04-05 03:19:08 +0200 | [diff] [blame] | 573 | boolean is_r500 = r300_screen(screen)->caps.is_r500; |
| 574 | boolean is_r400 = r300_screen(screen)->caps.is_r400; |
Marek Olšák | 26a54ed | 2010-04-10 19:59:17 +0200 | [diff] [blame] | 575 | boolean is_color2101010 = format == PIPE_FORMAT_R10G10B10A2_UNORM || |
| 576 | format == PIPE_FORMAT_R10G10B10X2_SNORM || |
| 577 | format == PIPE_FORMAT_B10G10R10A2_UNORM || |
David Heidelberger | 8658fe3 | 2014-06-18 22:52:41 +0200 | [diff] [blame] | 578 | format == PIPE_FORMAT_B10G10R10X2_UNORM || |
Marek Olšák | 26a54ed | 2010-04-10 19:59:17 +0200 | [diff] [blame] | 579 | format == PIPE_FORMAT_R10SG10SB10SA2U_NORM; |
Marek Olšák | 3252651 | 2010-04-01 02:14:52 +0200 | [diff] [blame] | 580 | boolean is_ati1n = format == PIPE_FORMAT_RGTC1_UNORM || |
Marek Olšák | 5ef807c | 2011-03-07 02:25:22 +0100 | [diff] [blame] | 581 | format == PIPE_FORMAT_RGTC1_SNORM || |
| 582 | format == PIPE_FORMAT_LATC1_UNORM || |
| 583 | format == PIPE_FORMAT_LATC1_SNORM; |
Marek Olšák | 3252651 | 2010-04-01 02:14:52 +0200 | [diff] [blame] | 584 | boolean is_ati2n = format == PIPE_FORMAT_RGTC2_UNORM || |
Marek Olšák | 5ef807c | 2011-03-07 02:25:22 +0100 | [diff] [blame] | 585 | format == PIPE_FORMAT_RGTC2_SNORM || |
| 586 | format == PIPE_FORMAT_LATC2_UNORM || |
| 587 | format == PIPE_FORMAT_LATC2_SNORM; |
Marek Olšák | 673cec4 | 2011-04-22 16:17:18 +0200 | [diff] [blame] | 588 | boolean is_half_float = format == PIPE_FORMAT_R16_FLOAT || |
| 589 | format == PIPE_FORMAT_R16G16_FLOAT || |
Marek Olšák | ebe2b54 | 2010-05-28 02:53:47 +0200 | [diff] [blame] | 590 | format == PIPE_FORMAT_R16G16B16_FLOAT || |
Marek Olšák | 4dc142d | 2013-02-01 21:45:15 +0100 | [diff] [blame] | 591 | format == PIPE_FORMAT_R16G16B16A16_FLOAT || |
| 592 | format == PIPE_FORMAT_R16G16B16X16_FLOAT; |
Marek Olšák | e102b66 | 2013-01-12 04:44:37 +0100 | [diff] [blame] | 593 | const struct util_format_description *desc; |
Corbin Simpson | 36ccdf0 | 2009-10-06 16:00:27 -0700 | [diff] [blame] | 594 | |
Marek Olšák | 75fa5c9 | 2011-04-11 06:23:00 +0200 | [diff] [blame] | 595 | if (!util_format_is_supported(format, usage)) |
| 596 | return FALSE; |
| 597 | |
Marek Olšák | 2470750 | 2010-07-13 04:29:53 +0200 | [diff] [blame] | 598 | /* Check multisampling support. */ |
Corbin Simpson | a91fea6 | 2010-05-25 22:33:21 -0700 | [diff] [blame] | 599 | switch (sample_count) { |
| 600 | case 0: |
| 601 | case 1: |
Corbin Simpson | 8ecca39 | 2010-06-16 10:51:04 -0700 | [diff] [blame] | 602 | break; |
Corbin Simpson | a91fea6 | 2010-05-25 22:33:21 -0700 | [diff] [blame] | 603 | case 2: |
Corbin Simpson | a91fea6 | 2010-05-25 22:33:21 -0700 | [diff] [blame] | 604 | case 4: |
| 605 | case 6: |
Marek Olšák | 8ed6b14 | 2013-01-05 06:21:49 +0100 | [diff] [blame] | 606 | /* 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šák | e102b66 | 2013-01-12 04:44:37 +0100 | [diff] [blame] | 612 | |
| 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šák | 4dc142d | 2013-02-01 21:45:15 +0100 | [diff] [blame] | 620 | format != PIPE_FORMAT_R16G16B16A16_FLOAT && |
| 621 | format != PIPE_FORMAT_R16G16B16X16_FLOAT) { |
Marek Olšák | e102b66 | 2013-01-12 04:44:37 +0100 | [diff] [blame] | 622 | 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šák | 8ed6b14 | 2013-01-05 06:21:49 +0100 | [diff] [blame] | 630 | } |
Corbin Simpson | a91fea6 | 2010-05-25 22:33:21 -0700 | [diff] [blame] | 631 | break; |
| 632 | default: |
| 633 | return FALSE; |
| 634 | } |
Roland Scheidegger | 39b4bf7 | 2010-05-17 21:29:17 +0200 | [diff] [blame] | 635 | |
Marek Olšák | ca0e88c | 2010-02-18 00:18:23 +0100 | [diff] [blame] | 636 | /* Check sampler format support. */ |
Keith Whitwell | 287c94e | 2010-04-10 16:05:54 +0100 | [diff] [blame] | 637 | if ((usage & PIPE_BIND_SAMPLER_VIEW) && |
Marek Olšák | 27e216a | 2013-01-26 00:27:27 +0100 | [diff] [blame] | 638 | /* these two are broken for an unknown reason */ |
| 639 | format != PIPE_FORMAT_R8G8B8X8_SNORM && |
| 640 | format != PIPE_FORMAT_R16G16B16X16_SNORM && |
Marek Olšák | 3252651 | 2010-04-01 02:14:52 +0200 | [diff] [blame] | 641 | /* 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šák | 5c14fd1 | 2010-02-20 21:33:53 +0100 | [diff] [blame] | 645 | r300_is_sampler_format_supported(format)) { |
Keith Whitwell | 287c94e | 2010-04-10 16:05:54 +0100 | [diff] [blame] | 646 | retval |= PIPE_BIND_SAMPLER_VIEW; |
Marek Olšák | ca0e88c | 2010-02-18 00:18:23 +0100 | [diff] [blame] | 647 | } |
| 648 | |
Marek Olšák | 7a087e1 | 2010-02-21 00:17:04 +0100 | [diff] [blame] | 649 | /* Check colorbuffer format support. */ |
Keith Whitwell | 287c94e | 2010-04-10 16:05:54 +0100 | [diff] [blame] | 650 | if ((usage & (PIPE_BIND_RENDER_TARGET | |
| 651 | PIPE_BIND_DISPLAY_TARGET | |
| 652 | PIPE_BIND_SCANOUT | |
Marek Olšák | bc0ae40 | 2014-08-22 19:49:00 +0200 | [diff] [blame] | 653 | PIPE_BIND_SHARED | |
| 654 | PIPE_BIND_BLENDABLE)) && |
Marek Olšák | 7a087e1 | 2010-02-21 00:17:04 +0100 | [diff] [blame] | 655 | /* 2101010 cannot be rendered to on non-r5xx. */ |
Marek Olšák | b7da8fa | 2016-02-23 23:32:44 +0100 | [diff] [blame] | 656 | (!is_color2101010 || is_r500) && |
Marek Olšák | 7a087e1 | 2010-02-21 00:17:04 +0100 | [diff] [blame] | 657 | r300_is_colorbuffer_format_supported(format)) { |
| 658 | retval |= usage & |
Keith Whitwell | 287c94e | 2010-04-10 16:05:54 +0100 | [diff] [blame] | 659 | (PIPE_BIND_RENDER_TARGET | |
| 660 | PIPE_BIND_DISPLAY_TARGET | |
| 661 | PIPE_BIND_SCANOUT | |
| 662 | PIPE_BIND_SHARED); |
Marek Olšák | bc0ae40 | 2014-08-22 19:49:00 +0200 | [diff] [blame] | 663 | |
| 664 | if (r300_is_blending_supported(r300_screen(screen), format)) { |
| 665 | retval |= usage & PIPE_BIND_BLENDABLE; |
| 666 | } |
Corbin Simpson | 0648bc9 | 2009-01-22 16:51:34 -0800 | [diff] [blame] | 667 | } |
| 668 | |
Marek Olšák | 7a087e1 | 2010-02-21 00:17:04 +0100 | [diff] [blame] | 669 | /* Check depth-stencil format support. */ |
Keith Whitwell | 287c94e | 2010-04-10 16:05:54 +0100 | [diff] [blame] | 670 | if (usage & PIPE_BIND_DEPTH_STENCIL && |
Marek Olšák | 7a087e1 | 2010-02-21 00:17:04 +0100 | [diff] [blame] | 671 | r300_is_zs_format_supported(format)) { |
Keith Whitwell | 287c94e | 2010-04-10 16:05:54 +0100 | [diff] [blame] | 672 | retval |= PIPE_BIND_DEPTH_STENCIL; |
Marek Olšák | 7a087e1 | 2010-02-21 00:17:04 +0100 | [diff] [blame] | 673 | } |
| 674 | |
Marek Olšák | ebe2b54 | 2010-05-28 02:53:47 +0200 | [diff] [blame] | 675 | /* Check vertex buffer format support. */ |
Marek Olšák | bdba35b | 2012-05-11 22:25:03 +0200 | [diff] [blame] | 676 | 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šák | ebe2b54 | 2010-05-28 02:53:47 +0200 | [diff] [blame] | 689 | } |
| 690 | |
Marek Olšák | 7a087e1 | 2010-02-21 00:17:04 +0100 | [diff] [blame] | 691 | return retval == usage; |
Corbin Simpson | 0648bc9 | 2009-01-22 16:51:34 -0800 | [diff] [blame] | 692 | } |
| 693 | |
Corbin Simpson | 54d137e | 2009-01-20 15:27:46 -0800 | [diff] [blame] | 694 | static void r300_destroy_screen(struct pipe_screen* pscreen) |
| 695 | { |
Corbin Simpson | 2b9ecaa | 2009-01-20 15:26:41 -0800 | [diff] [blame] | 696 | struct r300_screen* r300screen = r300_screen(pscreen); |
Marek Olšák | d35aeff | 2011-04-18 02:39:50 +0200 | [diff] [blame] | 697 | struct radeon_winsys *rws = radeon_winsys(pscreen); |
Dave Airlie | 68e58a9 | 2010-02-12 15:39:51 +1000 | [diff] [blame] | 698 | |
Marek Olšák | ac330d4 | 2014-04-09 00:26:32 +0200 | [diff] [blame] | 699 | if (rws && !rws->unref(rws)) |
Christian König | 4871128 | 2013-09-25 13:59:56 +0200 | [diff] [blame] | 700 | return; |
| 701 | |
Timothy Arceri | be18828 | 2017-03-05 12:32:04 +1100 | [diff] [blame] | 702 | mtx_destroy(&r300screen->cmask_mutex); |
Nicolai Hähnle | 616e366 | 2016-09-27 18:59:56 +0200 | [diff] [blame] | 703 | slab_destroy_parent(&r300screen->pool_transfers); |
Marek Olšák | ca2c288 | 2013-01-12 03:29:40 +0100 | [diff] [blame] | 704 | |
Dave Airlie | 68e58a9 | 2010-02-12 15:39:51 +1000 | [diff] [blame] | 705 | if (rws) |
| 706 | rws->destroy(rws); |
Corbin Simpson | 2b9ecaa | 2009-01-20 15:26:41 -0800 | [diff] [blame] | 707 | |
Corbin Simpson | 2b9ecaa | 2009-01-20 15:26:41 -0800 | [diff] [blame] | 708 | FREE(r300screen); |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 709 | } |
| 710 | |
Corbin Simpson | d2cf1e8 | 2010-04-09 03:37:53 -0700 | [diff] [blame] | 711 | static void r300_fence_reference(struct pipe_screen *screen, |
| 712 | struct pipe_fence_handle **ptr, |
| 713 | struct pipe_fence_handle *fence) |
| 714 | { |
Marek Olšák | 6067a30 | 2013-10-08 21:26:34 +0200 | [diff] [blame] | 715 | struct radeon_winsys *rws = r300_screen(screen)->rws; |
| 716 | |
| 717 | rws->fence_reference(ptr, fence); |
Corbin Simpson | d2cf1e8 | 2010-04-09 03:37:53 -0700 | [diff] [blame] | 718 | } |
| 719 | |
Marek Olšák | bfe88e6 | 2011-03-07 22:57:54 +0100 | [diff] [blame] | 720 | static boolean r300_fence_finish(struct pipe_screen *screen, |
Marek Olšák | 54272e1 | 2016-08-06 16:41:42 +0200 | [diff] [blame] | 721 | struct pipe_context *ctx, |
Marek Olšák | bfe88e6 | 2011-03-07 22:57:54 +0100 | [diff] [blame] | 722 | struct pipe_fence_handle *fence, |
| 723 | uint64_t timeout) |
Corbin Simpson | d2cf1e8 | 2010-04-09 03:37:53 -0700 | [diff] [blame] | 724 | { |
Marek Olšák | d35aeff | 2011-04-18 02:39:50 +0200 | [diff] [blame] | 725 | struct radeon_winsys *rws = r300_screen(screen)->rws; |
Marek Olšák | 2c072c8 | 2010-05-26 01:23:07 +0200 | [diff] [blame] | 726 | |
Marek Olšák | 6067a30 | 2013-10-08 21:26:34 +0200 | [diff] [blame] | 727 | return rws->fence_wait(rws, fence, timeout); |
Corbin Simpson | d2cf1e8 | 2010-04-09 03:37:53 -0700 | [diff] [blame] | 728 | } |
| 729 | |
Nicolai Hähnle | bc7f41e | 2017-06-28 14:47:32 +0200 | [diff] [blame] | 730 | struct pipe_screen* r300_screen_create(struct radeon_winsys *rws, |
| 731 | const struct pipe_screen_config *config) |
Corbin Simpson | 538a814 | 2009-01-20 00:31:43 -0800 | [diff] [blame] | 732 | { |
Dave Airlie | 68e58a9 | 2010-02-12 15:39:51 +1000 | [diff] [blame] | 733 | struct r300_screen *r300screen = CALLOC_STRUCT(r300_screen); |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 734 | |
Marek Olšák | b71bfc4 | 2010-04-05 03:19:08 +0200 | [diff] [blame] | 735 | if (!r300screen) { |
Vinson Lee | 2de590e | 2010-01-31 22:38:25 -0800 | [diff] [blame] | 736 | FREE(r300screen); |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 737 | return NULL; |
Vinson Lee | 2de590e | 2010-01-31 22:38:25 -0800 | [diff] [blame] | 738 | } |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 739 | |
Marek Olšák | 28a336d | 2011-07-22 18:58:30 +0200 | [diff] [blame] | 740 | rws->query_info(rws, &r300screen->info); |
Corbin Simpson | ecb7f29 | 2009-01-22 13:34:21 -0800 | [diff] [blame] | 741 | |
Marek Olšák | 08edbe9 | 2010-01-09 18:38:54 +0100 | [diff] [blame] | 742 | r300_init_debug(r300screen); |
Marek Olšák | 28a336d | 2011-07-22 18:58:30 +0200 | [diff] [blame] | 743 | r300_parse_chipset(r300screen->info.pci_id, &r300screen->caps); |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 744 | |
Marek Olšák | 9ad9a68 | 2011-02-12 23:37:14 +0100 | [diff] [blame] | 745 | 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 Airlie | 68e58a9 | 2010-02-12 15:39:51 +1000 | [diff] [blame] | 750 | r300screen->rws = rws; |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 751 | r300screen->screen.destroy = r300_destroy_screen; |
| 752 | r300screen->screen.get_name = r300_get_name; |
| 753 | r300screen->screen.get_vendor = r300_get_vendor; |
Giuseppe Bilotta | 76039b3 | 2015-03-22 07:21:01 +0100 | [diff] [blame] | 754 | r300screen->screen.get_device_vendor = r300_get_device_vendor; |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 755 | r300screen->screen.get_param = r300_get_param; |
Luca Barbieri | a508d2d | 2010-09-05 20:50:50 +0200 | [diff] [blame] | 756 | r300screen->screen.get_shader_param = r300_get_shader_param; |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 757 | r300screen->screen.get_paramf = r300_get_paramf; |
Christian König | f265a19 | 2011-07-07 22:51:45 +0200 | [diff] [blame] | 758 | r300screen->screen.get_video_param = r300_get_video_param; |
Corbin Simpson | da1928d | 2009-01-05 23:55:00 -0800 | [diff] [blame] | 759 | r300screen->screen.is_format_supported = r300_is_format_supported; |
Christian König | 7eca769 | 2011-07-08 11:20:39 +0200 | [diff] [blame] | 760 | r300screen->screen.is_video_format_supported = vl_video_buffer_is_format_supported; |
Keith Whitwell | 7f41f54 | 2010-02-08 12:55:59 +0000 | [diff] [blame] | 761 | r300screen->screen.context_create = r300_create_context; |
Corbin Simpson | d2cf1e8 | 2010-04-09 03:37:53 -0700 | [diff] [blame] | 762 | r300screen->screen.fence_reference = r300_fence_reference; |
Corbin Simpson | d2cf1e8 | 2010-04-09 03:37:53 -0700 | [diff] [blame] | 763 | r300screen->screen.fence_finish = r300_fence_finish; |
| 764 | |
Keith Whitwell | 287c94e | 2010-04-10 16:05:54 +0100 | [diff] [blame] | 765 | r300_init_screen_resource_functions(r300screen); |
Dave Airlie | fff5be8 | 2010-02-12 15:39:51 +1000 | [diff] [blame] | 766 | |
Nicolai Hähnle | 616e366 | 2016-09-27 18:59:56 +0200 | [diff] [blame] | 767 | slab_create_parent(&r300screen->pool_transfers, sizeof(struct pipe_transfer), 64); |
| 768 | |
Marek Olšák | 95bfc8f | 2010-04-29 03:18:39 +0200 | [diff] [blame] | 769 | util_format_s3tc_init(); |
Timothy Arceri | 75b47dd | 2017-03-05 12:00:15 +1100 | [diff] [blame] | 770 | (void) mtx_init(&r300screen->cmask_mutex, mtx_plain); |
Marek Olšák | 95bfc8f | 2010-04-29 03:18:39 +0200 | [diff] [blame] | 771 | |
Dave Airlie | b14548e | 2010-02-22 17:26:30 +1000 | [diff] [blame] | 772 | return &r300screen->screen; |
Dave Airlie | fff5be8 | 2010-02-12 15:39:51 +1000 | [diff] [blame] | 773 | } |