Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 1 | /************************************************************************** |
| 2 | * |
José Fonseca | 8771285 | 2014-01-17 16:27:50 +0000 | [diff] [blame] | 3 | * Copyright 2007 VMware, Inc. |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 4 | * All Rights Reserved. |
Brian Paul | 3ffd529 | 2008-12-17 18:59:58 -0700 | [diff] [blame] | 5 | * Copyright 2008 VMware, Inc. All rights reserved. |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 6 | * |
| 7 | * Permission is hereby granted, free of charge, to any person obtaining a |
| 8 | * copy of this software and associated documentation files (the |
| 9 | * "Software"), to deal in the Software without restriction, including |
| 10 | * without limitation the rights to use, copy, modify, merge, publish, |
| 11 | * distribute, sub license, and/or sell copies of the Software, and to |
| 12 | * permit persons to whom the Software is furnished to do so, subject to |
| 13 | * the following conditions: |
| 14 | * |
| 15 | * The above copyright notice and this permission notice (including the |
| 16 | * next paragraph) shall be included in all copies or substantial portions |
| 17 | * of the Software. |
| 18 | * |
| 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| 20 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| 21 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
José Fonseca | 8771285 | 2014-01-17 16:27:50 +0000 | [diff] [blame] | 22 | * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 23 | * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
| 24 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
| 25 | * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| 26 | * |
| 27 | **************************************************************************/ |
| 28 | |
| 29 | /* Author: |
José Fonseca | 8771285 | 2014-01-17 16:27:50 +0000 | [diff] [blame] | 30 | * Keith Whitwell <keithw@vmware.com> |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 31 | */ |
| 32 | |
| 33 | #include "draw/draw_context.h" |
Keith Whitwell | 4fe0fc3 | 2009-08-23 11:22:41 +0100 | [diff] [blame] | 34 | #include "draw/draw_vbuf.h" |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 35 | #include "pipe/p_defines.h" |
Brian Paul | 1a46dcc | 2008-08-22 15:25:21 -0600 | [diff] [blame] | 36 | #include "util/u_math.h" |
Brian Paul | 4f25420 | 2008-08-24 17:48:55 -0600 | [diff] [blame] | 37 | #include "util/u_memory.h" |
Brian Paul | 57aa597 | 2011-07-21 09:55:22 -0600 | [diff] [blame] | 38 | #include "util/u_pstipple.h" |
José Fonseca | 2848688 | 2010-02-02 14:42:17 +0000 | [diff] [blame] | 39 | #include "util/u_inlines.h" |
Brian Paul | 1fce9d5 | 2010-05-06 15:10:51 -0600 | [diff] [blame] | 40 | #include "tgsi/tgsi_exec.h" |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 41 | #include "sp_clear.h" |
| 42 | #include "sp_context.h" |
| 43 | #include "sp_flush.h" |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 44 | #include "sp_prim_vbuf.h" |
| 45 | #include "sp_state.h" |
| 46 | #include "sp_surface.h" |
| 47 | #include "sp_tile_cache.h" |
Keith Whitwell | 47800c5 | 2009-08-23 11:13:20 +0100 | [diff] [blame] | 48 | #include "sp_tex_tile_cache.h" |
Keith Whitwell | b43c182 | 2010-03-11 15:23:16 +0000 | [diff] [blame] | 49 | #include "sp_texture.h" |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 50 | #include "sp_query.h" |
Dave Airlie | 02932f3 | 2012-01-05 14:25:04 +0000 | [diff] [blame] | 51 | #include "sp_screen.h" |
Roland Scheidegger | 6b35c2b | 2013-02-27 19:07:18 +0100 | [diff] [blame] | 52 | #include "sp_tex_sample.h" |
Dave Airlie | eb9ad9f | 2016-03-22 07:59:35 +1000 | [diff] [blame^] | 53 | #include "sp_image.h" |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 54 | |
Brian Paul | afcaa45 | 2009-09-10 16:42:47 -0600 | [diff] [blame] | 55 | static void |
| 56 | softpipe_destroy( struct pipe_context *pipe ) |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 57 | { |
| 58 | struct softpipe_context *softpipe = softpipe_context( pipe ); |
Brian Paul | 0a14e9f | 2012-08-04 08:46:41 -0600 | [diff] [blame] | 59 | uint i, sh; |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 60 | |
Brian Paul | 57aa597 | 2011-07-21 09:55:22 -0600 | [diff] [blame] | 61 | #if DO_PSTIPPLE_IN_HELPER_MODULE |
| 62 | if (softpipe->pstipple.sampler) |
| 63 | pipe->delete_sampler_state(pipe, softpipe->pstipple.sampler); |
| 64 | |
| 65 | pipe_resource_reference(&softpipe->pstipple.texture, NULL); |
| 66 | pipe_sampler_view_reference(&softpipe->pstipple.sampler_view, NULL); |
| 67 | #endif |
| 68 | |
Marek Olšák | 3d9d4b1 | 2012-09-13 00:48:58 +0200 | [diff] [blame] | 69 | if (softpipe->blitter) { |
| 70 | util_blitter_destroy(softpipe->blitter); |
| 71 | } |
| 72 | |
Keith Whitwell | de81883 | 2008-05-12 14:10:03 +0100 | [diff] [blame] | 73 | if (softpipe->draw) |
| 74 | draw_destroy( softpipe->draw ); |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 75 | |
Brian Paul | 37233f1 | 2011-01-20 13:46:53 -0700 | [diff] [blame] | 76 | if (softpipe->quad.shade) |
| 77 | softpipe->quad.shade->destroy( softpipe->quad.shade ); |
| 78 | |
| 79 | if (softpipe->quad.depth_test) |
| 80 | softpipe->quad.depth_test->destroy( softpipe->quad.depth_test ); |
| 81 | |
| 82 | if (softpipe->quad.blend) |
| 83 | softpipe->quad.blend->destroy( softpipe->quad.blend ); |
| 84 | |
| 85 | if (softpipe->quad.pstipple) |
| 86 | softpipe->quad.pstipple->destroy( softpipe->quad.pstipple ); |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 87 | |
Younes Manton | a772260 | 2009-09-27 10:56:42 -0400 | [diff] [blame] | 88 | for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 89 | sp_destroy_tile_cache(softpipe->cbuf_cache[i]); |
Younes Manton | a772260 | 2009-09-27 10:56:42 -0400 | [diff] [blame] | 90 | pipe_surface_reference(&softpipe->framebuffer.cbufs[i], NULL); |
| 91 | } |
Alan Hourihane | 904469d | 2009-11-20 18:10:54 +0000 | [diff] [blame] | 92 | |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 93 | sp_destroy_tile_cache(softpipe->zsbuf_cache); |
Younes Manton | a772260 | 2009-09-27 10:56:42 -0400 | [diff] [blame] | 94 | pipe_surface_reference(&softpipe->framebuffer.zsbuf, NULL); |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 95 | |
Brian Paul | 0a14e9f | 2012-08-04 08:46:41 -0600 | [diff] [blame] | 96 | for (sh = 0; sh < Elements(softpipe->tex_cache); sh++) { |
| 97 | for (i = 0; i < Elements(softpipe->tex_cache[0]); i++) { |
| 98 | sp_destroy_tex_tile_cache(softpipe->tex_cache[sh][i]); |
| 99 | pipe_sampler_view_reference(&softpipe->sampler_views[sh][i], NULL); |
| 100 | } |
| 101 | } |
Michal Krol | 835bab0 | 2010-01-19 13:20:15 +0100 | [diff] [blame] | 102 | |
Brian Paul | 0a14e9f | 2012-08-04 08:46:41 -0600 | [diff] [blame] | 103 | for (sh = 0; sh < Elements(softpipe->constants); sh++) { |
| 104 | for (i = 0; i < Elements(softpipe->constants[0]); i++) { |
| 105 | if (softpipe->constants[sh][i]) { |
| 106 | pipe_resource_reference(&softpipe->constants[sh][i], NULL); |
Michal Krol | 835bab0 | 2010-01-19 13:20:15 +0100 | [diff] [blame] | 107 | } |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 108 | } |
| 109 | } |
| 110 | |
Marek Olšák | 3c9aa3a | 2010-12-26 18:43:39 +0100 | [diff] [blame] | 111 | for (i = 0; i < softpipe->num_vertex_buffers; i++) { |
| 112 | pipe_resource_reference(&softpipe->vertex_buffer[i].buffer, NULL); |
| 113 | } |
| 114 | |
Brian Paul | 1fce9d5 | 2010-05-06 15:10:51 -0600 | [diff] [blame] | 115 | tgsi_exec_machine_destroy(softpipe->fs_machine); |
| 116 | |
Roland Scheidegger | 6b35c2b | 2013-02-27 19:07:18 +0100 | [diff] [blame] | 117 | for (i = 0; i < PIPE_SHADER_TYPES; i++) { |
| 118 | FREE(softpipe->tgsi.sampler[i]); |
| 119 | } |
| 120 | |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 121 | FREE( softpipe ); |
| 122 | } |
| 123 | |
Brian Paul | afcaa45 | 2009-09-10 16:42:47 -0600 | [diff] [blame] | 124 | |
| 125 | /** |
| 126 | * if (the texture is being used as a framebuffer surface) |
Marek Olšák | 25485f4 | 2011-03-07 22:35:49 +0100 | [diff] [blame] | 127 | * return SP_REFERENCED_FOR_WRITE |
Brian Paul | afcaa45 | 2009-09-10 16:42:47 -0600 | [diff] [blame] | 128 | * else if (the texture is a bound texture source) |
Marek Olšák | 25485f4 | 2011-03-07 22:35:49 +0100 | [diff] [blame] | 129 | * return SP_REFERENCED_FOR_READ |
Brian Paul | afcaa45 | 2009-09-10 16:42:47 -0600 | [diff] [blame] | 130 | * else |
Marek Olšák | 25485f4 | 2011-03-07 22:35:49 +0100 | [diff] [blame] | 131 | * return SP_UNREFERENCED |
Brian Paul | afcaa45 | 2009-09-10 16:42:47 -0600 | [diff] [blame] | 132 | */ |
Marek Olšák | 25485f4 | 2011-03-07 22:35:49 +0100 | [diff] [blame] | 133 | unsigned int |
Keith Whitwell | 287c94e | 2010-04-10 16:05:54 +0100 | [diff] [blame] | 134 | softpipe_is_resource_referenced( struct pipe_context *pipe, |
Roland Scheidegger | 4c70014 | 2010-12-02 04:33:43 +0100 | [diff] [blame] | 135 | struct pipe_resource *texture, |
| 136 | unsigned level, int layer) |
Thomas Hellstrom | 9b75627 | 2009-04-15 15:53:34 +0200 | [diff] [blame] | 137 | { |
José Fonseca | 5d0cf9e | 2009-06-15 18:42:13 +0100 | [diff] [blame] | 138 | struct softpipe_context *softpipe = softpipe_context( pipe ); |
Brian Paul | 0a14e9f | 2012-08-04 08:46:41 -0600 | [diff] [blame] | 139 | unsigned i, sh; |
José Fonseca | 5d0cf9e | 2009-06-15 18:42:13 +0100 | [diff] [blame] | 140 | |
Keith Whitwell | 287c94e | 2010-04-10 16:05:54 +0100 | [diff] [blame] | 141 | if (texture->target == PIPE_BUFFER) |
Marek Olšák | 25485f4 | 2011-03-07 22:35:49 +0100 | [diff] [blame] | 142 | return SP_UNREFERENCED; |
Roland Scheidegger | 4c70014 | 2010-12-02 04:33:43 +0100 | [diff] [blame] | 143 | |
Brian Paul | 367cfca | 2009-11-19 11:37:50 -0700 | [diff] [blame] | 144 | /* check if any of the bound drawing surfaces are this texture */ |
Brian Paul | afcaa45 | 2009-09-10 16:42:47 -0600 | [diff] [blame] | 145 | if (softpipe->dirty_render_cache) { |
José Fonseca | 5d0cf9e | 2009-06-15 18:42:13 +0100 | [diff] [blame] | 146 | for (i = 0; i < softpipe->framebuffer.nr_cbufs; i++) { |
Brian Paul | afcaa45 | 2009-09-10 16:42:47 -0600 | [diff] [blame] | 147 | if (softpipe->framebuffer.cbufs[i] && |
| 148 | softpipe->framebuffer.cbufs[i]->texture == texture) { |
Marek Olšák | 25485f4 | 2011-03-07 22:35:49 +0100 | [diff] [blame] | 149 | return SP_REFERENCED_FOR_WRITE; |
Brian Paul | afcaa45 | 2009-09-10 16:42:47 -0600 | [diff] [blame] | 150 | } |
José Fonseca | 5d0cf9e | 2009-06-15 18:42:13 +0100 | [diff] [blame] | 151 | } |
Brian Paul | afcaa45 | 2009-09-10 16:42:47 -0600 | [diff] [blame] | 152 | if (softpipe->framebuffer.zsbuf && |
| 153 | softpipe->framebuffer.zsbuf->texture == texture) { |
Marek Olšák | 25485f4 | 2011-03-07 22:35:49 +0100 | [diff] [blame] | 154 | return SP_REFERENCED_FOR_WRITE; |
Brian Paul | afcaa45 | 2009-09-10 16:42:47 -0600 | [diff] [blame] | 155 | } |
José Fonseca | 5d0cf9e | 2009-06-15 18:42:13 +0100 | [diff] [blame] | 156 | } |
| 157 | |
Brian Paul | 367cfca | 2009-11-19 11:37:50 -0700 | [diff] [blame] | 158 | /* check if any of the tex_cache textures are this texture */ |
Brian Paul | 0a14e9f | 2012-08-04 08:46:41 -0600 | [diff] [blame] | 159 | for (sh = 0; sh < Elements(softpipe->tex_cache); sh++) { |
| 160 | for (i = 0; i < Elements(softpipe->tex_cache[0]); i++) { |
| 161 | if (softpipe->tex_cache[sh][i] && |
| 162 | softpipe->tex_cache[sh][i]->texture == texture) |
| 163 | return SP_REFERENCED_FOR_READ; |
| 164 | } |
Zack Rusin | 53bd979 | 2010-06-11 13:31:52 -0400 | [diff] [blame] | 165 | } |
| 166 | |
Marek Olšák | 25485f4 | 2011-03-07 22:35:49 +0100 | [diff] [blame] | 167 | return SP_UNREFERENCED; |
Thomas Hellstrom | 9b75627 | 2009-04-15 15:53:34 +0200 | [diff] [blame] | 168 | } |
| 169 | |
Brian Paul | afcaa45 | 2009-09-10 16:42:47 -0600 | [diff] [blame] | 170 | |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 171 | |
Brian Paul | afcaa45 | 2009-09-10 16:42:47 -0600 | [diff] [blame] | 172 | |
Brian Paul | 41450b0 | 2009-12-31 14:46:15 -0700 | [diff] [blame] | 173 | static void |
| 174 | softpipe_render_condition( struct pipe_context *pipe, |
| 175 | struct pipe_query *query, |
Roland Scheidegger | 793e8e3 | 2013-06-14 19:48:57 +0200 | [diff] [blame] | 176 | boolean condition, |
Brian Paul | 41450b0 | 2009-12-31 14:46:15 -0700 | [diff] [blame] | 177 | uint mode ) |
| 178 | { |
| 179 | struct softpipe_context *softpipe = softpipe_context( pipe ); |
| 180 | |
| 181 | softpipe->render_cond_query = query; |
| 182 | softpipe->render_cond_mode = mode; |
Roland Scheidegger | 793e8e3 | 2013-06-14 19:48:57 +0200 | [diff] [blame] | 183 | softpipe->render_cond_cond = condition; |
Brian Paul | 41450b0 | 2009-12-31 14:46:15 -0700 | [diff] [blame] | 184 | } |
| 185 | |
| 186 | |
| 187 | |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 188 | struct pipe_context * |
Marek Olšák | 0fc21ec | 2015-07-25 18:40:59 +0200 | [diff] [blame] | 189 | softpipe_create_context(struct pipe_screen *screen, |
| 190 | void *priv, unsigned flags) |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 191 | { |
Dave Airlie | 02932f3 | 2012-01-05 14:25:04 +0000 | [diff] [blame] | 192 | struct softpipe_screen *sp_screen = softpipe_screen(screen); |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 193 | struct softpipe_context *softpipe = CALLOC_STRUCT(softpipe_context); |
Brian Paul | 0a14e9f | 2012-08-04 08:46:41 -0600 | [diff] [blame] | 194 | uint i, sh; |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 195 | |
Brian Paul | 1a46dcc | 2008-08-22 15:25:21 -0600 | [diff] [blame] | 196 | util_init_math(); |
| 197 | |
Roland Scheidegger | 6b35c2b | 2013-02-27 19:07:18 +0100 | [diff] [blame] | 198 | for (i = 0; i < PIPE_SHADER_TYPES; i++) { |
| 199 | softpipe->tgsi.sampler[i] = sp_create_tgsi_sampler(); |
| 200 | } |
| 201 | |
Dave Airlie | eb9ad9f | 2016-03-22 07:59:35 +1000 | [diff] [blame^] | 202 | for (i = 0; i < PIPE_SHADER_TYPES; i++) { |
| 203 | softpipe->tgsi.image[i] = sp_create_tgsi_image(); |
| 204 | } |
| 205 | |
Brian Paul | b1d4857 | 2011-02-17 07:23:40 -0700 | [diff] [blame] | 206 | softpipe->dump_fs = debug_get_bool_option( "SOFTPIPE_DUMP_FS", FALSE ); |
Zack Rusin | ac96ee1 | 2009-12-23 13:30:12 -0500 | [diff] [blame] | 207 | softpipe->dump_gs = debug_get_bool_option( "SOFTPIPE_DUMP_GS", FALSE ); |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 208 | |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 209 | softpipe->pipe.screen = screen; |
| 210 | softpipe->pipe.destroy = softpipe_destroy; |
Keith Whitwell | 7f41f54 | 2010-02-08 12:55:59 +0000 | [diff] [blame] | 211 | softpipe->pipe.priv = priv; |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 212 | |
| 213 | /* state setters */ |
Brian Paul | 2739692 | 2010-09-25 13:58:41 -0600 | [diff] [blame] | 214 | softpipe_init_blend_funcs(&softpipe->pipe); |
Brian Paul | 63a5b7d | 2010-09-25 14:15:11 -0600 | [diff] [blame] | 215 | softpipe_init_clip_funcs(&softpipe->pipe); |
Brian Paul | 1e35f64 | 2010-09-25 14:19:18 -0600 | [diff] [blame] | 216 | softpipe_init_query_funcs( softpipe ); |
Brian Paul | bd13a0d | 2010-09-25 14:08:49 -0600 | [diff] [blame] | 217 | softpipe_init_rasterizer_funcs(&softpipe->pipe); |
Brian Paul | c5dd2e4 | 2010-09-25 14:02:38 -0600 | [diff] [blame] | 218 | softpipe_init_sampler_funcs(&softpipe->pipe); |
Brian Paul | 279b368 | 2010-09-25 13:54:24 -0600 | [diff] [blame] | 219 | softpipe_init_shader_funcs(&softpipe->pipe); |
Brian Paul | 5b2406c | 2010-09-25 14:12:12 -0600 | [diff] [blame] | 220 | softpipe_init_streamout_funcs(&softpipe->pipe); |
Brian Paul | 1e35f64 | 2010-09-25 14:19:18 -0600 | [diff] [blame] | 221 | softpipe_init_texture_funcs( &softpipe->pipe ); |
Brian Paul | eed4509 | 2010-09-25 14:06:58 -0600 | [diff] [blame] | 222 | softpipe_init_vertex_funcs(&softpipe->pipe); |
Dave Airlie | eb9ad9f | 2016-03-22 07:59:35 +1000 | [diff] [blame^] | 223 | softpipe_init_image_funcs(&softpipe->pipe); |
Roland Scheidegger | 057427d | 2010-03-01 18:46:29 +0100 | [diff] [blame] | 224 | |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 225 | softpipe->pipe.set_framebuffer_state = softpipe_set_framebuffer_state; |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 226 | |
Chia-I Wu | 6d28bf9 | 2010-07-16 04:35:58 +0800 | [diff] [blame] | 227 | softpipe->pipe.draw_vbo = softpipe_draw_vbo; |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 228 | |
| 229 | softpipe->pipe.clear = softpipe_clear; |
Marek Olšák | 7e02303 | 2011-03-08 00:57:48 +0100 | [diff] [blame] | 230 | softpipe->pipe.flush = softpipe_flush_wrapped; |
Dave Airlie | eb9ad9f | 2016-03-22 07:59:35 +1000 | [diff] [blame^] | 231 | softpipe->pipe.texture_barrier = softpipe_texture_barrier; |
| 232 | softpipe->pipe.memory_barrier = softpipe_memory_barrier; |
Brian Paul | 41450b0 | 2009-12-31 14:46:15 -0700 | [diff] [blame] | 233 | softpipe->pipe.render_condition = softpipe_render_condition; |
Christian König | 4e837f5 | 2011-07-08 16:56:11 +0200 | [diff] [blame] | 234 | |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 235 | /* |
| 236 | * Alloc caches for accessing drawing surfaces and textures. |
| 237 | * Must be before quad stage setup! |
| 238 | */ |
| 239 | for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) |
Keith Whitwell | b43c182 | 2010-03-11 15:23:16 +0000 | [diff] [blame] | 240 | softpipe->cbuf_cache[i] = sp_create_tile_cache( &softpipe->pipe ); |
| 241 | softpipe->zsbuf_cache = sp_create_tile_cache( &softpipe->pipe ); |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 242 | |
Brian Paul | 0a14e9f | 2012-08-04 08:46:41 -0600 | [diff] [blame] | 243 | /* Allocate texture caches */ |
| 244 | for (sh = 0; sh < Elements(softpipe->tex_cache); sh++) { |
| 245 | for (i = 0; i < Elements(softpipe->tex_cache[0]); i++) { |
| 246 | softpipe->tex_cache[sh][i] = sp_create_tex_tile_cache(&softpipe->pipe); |
| 247 | if (!softpipe->tex_cache[sh][i]) |
| 248 | goto fail; |
| 249 | } |
Zack Rusin | 53bd979 | 2010-06-11 13:31:52 -0400 | [diff] [blame] | 250 | } |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 251 | |
Brian Paul | 1fce9d5 | 2010-05-06 15:10:51 -0600 | [diff] [blame] | 252 | softpipe->fs_machine = tgsi_exec_machine_create(); |
| 253 | |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 254 | /* setup quad rendering stages */ |
Brian Paul | 3f40166 | 2009-11-19 14:02:06 -0700 | [diff] [blame] | 255 | softpipe->quad.shade = sp_quad_shade_stage(softpipe); |
| 256 | softpipe->quad.depth_test = sp_quad_depth_test_stage(softpipe); |
| 257 | softpipe->quad.blend = sp_quad_blend_stage(softpipe); |
Brian Paul | 44519e1 | 2010-04-17 11:53:35 -0600 | [diff] [blame] | 258 | softpipe->quad.pstipple = sp_quad_polygon_stipple_stage(softpipe); |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 259 | |
Brian | b9604fe | 2008-12-02 22:40:08 -0700 | [diff] [blame] | 260 | |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 261 | /* |
| 262 | * Create drawing context and plug our rendering stage into it. |
| 263 | */ |
Dave Airlie | 5840ec2 | 2012-01-11 10:16:56 +0000 | [diff] [blame] | 264 | if (sp_screen->use_llvm) |
Jakob Bornecrantz | 8783d42 | 2012-01-09 00:00:56 +0100 | [diff] [blame] | 265 | softpipe->draw = draw_create(&softpipe->pipe); |
| 266 | else |
| 267 | softpipe->draw = draw_create_no_llvm(&softpipe->pipe); |
Keith Whitwell | de81883 | 2008-05-12 14:10:03 +0100 | [diff] [blame] | 268 | if (!softpipe->draw) |
| 269 | goto fail; |
| 270 | |
Roland Scheidegger | 6b35c2b | 2013-02-27 19:07:18 +0100 | [diff] [blame] | 271 | draw_texture_sampler(softpipe->draw, |
| 272 | PIPE_SHADER_VERTEX, |
| 273 | (struct tgsi_sampler *) |
| 274 | softpipe->tgsi.sampler[PIPE_SHADER_VERTEX]); |
Brian | b9604fe | 2008-12-02 22:40:08 -0700 | [diff] [blame] | 275 | |
Roland Scheidegger | 6b35c2b | 2013-02-27 19:07:18 +0100 | [diff] [blame] | 276 | draw_texture_sampler(softpipe->draw, |
| 277 | PIPE_SHADER_GEOMETRY, |
| 278 | (struct tgsi_sampler *) |
| 279 | softpipe->tgsi.sampler[PIPE_SHADER_GEOMETRY]); |
Zack Rusin | 53bd979 | 2010-06-11 13:31:52 -0400 | [diff] [blame] | 280 | |
Dave Airlie | eb9ad9f | 2016-03-22 07:59:35 +1000 | [diff] [blame^] | 281 | draw_image(softpipe->draw, |
| 282 | PIPE_SHADER_VERTEX, |
| 283 | (struct tgsi_image *) |
| 284 | softpipe->tgsi.image[PIPE_SHADER_VERTEX]); |
| 285 | |
| 286 | draw_image(softpipe->draw, |
| 287 | PIPE_SHADER_GEOMETRY, |
| 288 | (struct tgsi_image *) |
| 289 | softpipe->tgsi.image[PIPE_SHADER_GEOMETRY]); |
| 290 | |
Brian Paul | b1d4857 | 2011-02-17 07:23:40 -0700 | [diff] [blame] | 291 | if (debug_get_bool_option( "SOFTPIPE_NO_RAST", FALSE )) |
Keith Whitwell | a5b87f2 | 2008-04-22 11:01:41 +0100 | [diff] [blame] | 292 | softpipe->no_rast = TRUE; |
| 293 | |
Keith Whitwell | 4fe0fc3 | 2009-08-23 11:22:41 +0100 | [diff] [blame] | 294 | softpipe->vbuf_backend = sp_create_vbuf_backend(softpipe); |
| 295 | if (!softpipe->vbuf_backend) |
| 296 | goto fail; |
| 297 | |
| 298 | softpipe->vbuf = draw_vbuf_stage(softpipe->draw, softpipe->vbuf_backend); |
| 299 | if (!softpipe->vbuf) |
| 300 | goto fail; |
| 301 | |
| 302 | draw_set_rasterize_stage(softpipe->draw, softpipe->vbuf); |
| 303 | draw_set_render(softpipe->draw, softpipe->vbuf_backend); |
| 304 | |
Marek Olšák | 3d9d4b1 | 2012-09-13 00:48:58 +0200 | [diff] [blame] | 305 | softpipe->blitter = util_blitter_create(&softpipe->pipe); |
| 306 | if (!softpipe->blitter) { |
| 307 | goto fail; |
| 308 | } |
| 309 | |
| 310 | /* must be done before installing Draw stages */ |
| 311 | util_blitter_cache_all_shaders(softpipe->blitter); |
Keith Whitwell | 4fe0fc3 | 2009-08-23 11:22:41 +0100 | [diff] [blame] | 312 | |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 313 | /* plug in AA line/point stages */ |
| 314 | draw_install_aaline_stage(softpipe->draw, &softpipe->pipe); |
| 315 | draw_install_aapoint_stage(softpipe->draw, &softpipe->pipe); |
| 316 | |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 317 | /* Do polygon stipple w/ texture map + frag prog? */ |
Brian Paul | 44519e1 | 2010-04-17 11:53:35 -0600 | [diff] [blame] | 318 | #if DO_PSTIPPLE_IN_DRAW_MODULE |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 319 | draw_install_pstipple_stage(softpipe->draw, &softpipe->pipe); |
Brian Paul | 44519e1 | 2010-04-17 11:53:35 -0600 | [diff] [blame] | 320 | #endif |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 321 | |
Brian Paul | 01c12ed | 2010-04-21 14:23:42 -0600 | [diff] [blame] | 322 | draw_wide_point_sprites(softpipe->draw, TRUE); |
| 323 | |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 324 | sp_init_surface_functions(softpipe); |
| 325 | |
Brian Paul | 57aa597 | 2011-07-21 09:55:22 -0600 | [diff] [blame] | 326 | #if DO_PSTIPPLE_IN_HELPER_MODULE |
| 327 | /* create the polgon stipple sampler */ |
| 328 | softpipe->pstipple.sampler = util_pstipple_create_sampler(&softpipe->pipe); |
| 329 | #endif |
| 330 | |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 331 | return &softpipe->pipe; |
Keith Whitwell | de81883 | 2008-05-12 14:10:03 +0100 | [diff] [blame] | 332 | |
| 333 | fail: |
| 334 | softpipe_destroy(&softpipe->pipe); |
| 335 | return NULL; |
Brian | 344356a | 2008-03-14 16:00:15 -0600 | [diff] [blame] | 336 | } |