1344356a0edee932604027386591c82f6666e607cBrian Paul/**************************************************************************
2344356a0edee932604027386591c82f6666e607cBrian Paul *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc.
4344356a0edee932604027386591c82f6666e607cBrian Paul * All Rights Reserved.
53ffd529ff19bf8dd7b022a267bf2afe44c7f0f65Brian Paul * Copyright 2008 VMware, Inc.  All rights reserved.
6344356a0edee932604027386591c82f6666e607cBrian Paul *
7344356a0edee932604027386591c82f6666e607cBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
8344356a0edee932604027386591c82f6666e607cBrian Paul * copy of this software and associated documentation files (the
9344356a0edee932604027386591c82f6666e607cBrian Paul * "Software"), to deal in the Software without restriction, including
10344356a0edee932604027386591c82f6666e607cBrian Paul * without limitation the rights to use, copy, modify, merge, publish,
11344356a0edee932604027386591c82f6666e607cBrian Paul * distribute, sub license, and/or sell copies of the Software, and to
12344356a0edee932604027386591c82f6666e607cBrian Paul * permit persons to whom the Software is furnished to do so, subject to
13344356a0edee932604027386591c82f6666e607cBrian Paul * the following conditions:
14344356a0edee932604027386591c82f6666e607cBrian Paul *
15344356a0edee932604027386591c82f6666e607cBrian Paul * The above copyright notice and this permission notice (including the
16344356a0edee932604027386591c82f6666e607cBrian Paul * next paragraph) shall be included in all copies or substantial portions
17344356a0edee932604027386591c82f6666e607cBrian Paul * of the Software.
18344356a0edee932604027386591c82f6666e607cBrian Paul *
19344356a0edee932604027386591c82f6666e607cBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20344356a0edee932604027386591c82f6666e607cBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21344356a0edee932604027386591c82f6666e607cBrian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
23344356a0edee932604027386591c82f6666e607cBrian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24344356a0edee932604027386591c82f6666e607cBrian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25344356a0edee932604027386591c82f6666e607cBrian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26344356a0edee932604027386591c82f6666e607cBrian Paul *
27344356a0edee932604027386591c82f6666e607cBrian Paul **************************************************************************/
28344356a0edee932604027386591c82f6666e607cBrian Paul
29344356a0edee932604027386591c82f6666e607cBrian Paul/* Author:
30877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca *    Keith Whitwell <keithw@vmware.com>
31344356a0edee932604027386591c82f6666e607cBrian Paul */
32344356a0edee932604027386591c82f6666e607cBrian Paul
33344356a0edee932604027386591c82f6666e607cBrian Paul#include "draw/draw_context.h"
344fe0fc3eba1f79beda890a5016359d549bab6ad4Keith Whitwell#include "draw/draw_vbuf.h"
35344356a0edee932604027386591c82f6666e607cBrian Paul#include "pipe/p_defines.h"
361a46dcc8a927dfb38ca1381e7b3dafb789f8257cBrian Paul#include "util/u_math.h"
374f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
3857aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul#include "util/u_pstipple.h"
3928486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
401fce9d58cc70deaff284e1d9d0ffcb15b61e7595Brian Paul#include "tgsi/tgsi_exec.h"
41afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie#include "sp_buffer.h"
42344356a0edee932604027386591c82f6666e607cBrian Paul#include "sp_clear.h"
43344356a0edee932604027386591c82f6666e607cBrian Paul#include "sp_context.h"
44344356a0edee932604027386591c82f6666e607cBrian Paul#include "sp_flush.h"
45344356a0edee932604027386591c82f6666e607cBrian Paul#include "sp_prim_vbuf.h"
46344356a0edee932604027386591c82f6666e607cBrian Paul#include "sp_state.h"
47344356a0edee932604027386591c82f6666e607cBrian Paul#include "sp_surface.h"
48344356a0edee932604027386591c82f6666e607cBrian Paul#include "sp_tile_cache.h"
4947800c572f199e7857e02e0f999b410c727a275dKeith Whitwell#include "sp_tex_tile_cache.h"
50b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell#include "sp_texture.h"
51344356a0edee932604027386591c82f6666e607cBrian Paul#include "sp_query.h"
5202932f37fa030f2d438b599106651cb938c3edc9Dave Airlie#include "sp_screen.h"
536b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger#include "sp_tex_sample.h"
54eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie#include "sp_image.h"
55344356a0edee932604027386591c82f6666e607cBrian Paul
56afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paulstatic void
57afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paulsoftpipe_destroy( struct pipe_context *pipe )
58344356a0edee932604027386591c82f6666e607cBrian Paul{
59344356a0edee932604027386591c82f6666e607cBrian Paul   struct softpipe_context *softpipe = softpipe_context( pipe );
600a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul   uint i, sh;
61344356a0edee932604027386591c82f6666e607cBrian Paul
6257aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul#if DO_PSTIPPLE_IN_HELPER_MODULE
6357aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul   if (softpipe->pstipple.sampler)
6457aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul      pipe->delete_sampler_state(pipe, softpipe->pstipple.sampler);
6557aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul
6657aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul   pipe_resource_reference(&softpipe->pstipple.texture, NULL);
6757aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul   pipe_sampler_view_reference(&softpipe->pstipple.sampler_view, NULL);
6857aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul#endif
6957aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul
703d9d4b1ce6e700d85920eca84ae58a4dcf7288c2Marek Olšák   if (softpipe->blitter) {
713d9d4b1ce6e700d85920eca84ae58a4dcf7288c2Marek Olšák      util_blitter_destroy(softpipe->blitter);
723d9d4b1ce6e700d85920eca84ae58a4dcf7288c2Marek Olšák   }
733d9d4b1ce6e700d85920eca84ae58a4dcf7288c2Marek Olšák
74de818835de70961602bb9ceca86b98e9bbc63fc1Keith Whitwell   if (softpipe->draw)
75de818835de70961602bb9ceca86b98e9bbc63fc1Keith Whitwell      draw_destroy( softpipe->draw );
76344356a0edee932604027386591c82f6666e607cBrian Paul
7737233f1ee0213a224611788bbab38840ba9f8308Brian Paul   if (softpipe->quad.shade)
7837233f1ee0213a224611788bbab38840ba9f8308Brian Paul      softpipe->quad.shade->destroy( softpipe->quad.shade );
7937233f1ee0213a224611788bbab38840ba9f8308Brian Paul
8037233f1ee0213a224611788bbab38840ba9f8308Brian Paul   if (softpipe->quad.depth_test)
8137233f1ee0213a224611788bbab38840ba9f8308Brian Paul      softpipe->quad.depth_test->destroy( softpipe->quad.depth_test );
8237233f1ee0213a224611788bbab38840ba9f8308Brian Paul
8337233f1ee0213a224611788bbab38840ba9f8308Brian Paul   if (softpipe->quad.blend)
8437233f1ee0213a224611788bbab38840ba9f8308Brian Paul      softpipe->quad.blend->destroy( softpipe->quad.blend );
8537233f1ee0213a224611788bbab38840ba9f8308Brian Paul
8637233f1ee0213a224611788bbab38840ba9f8308Brian Paul   if (softpipe->quad.pstipple)
8737233f1ee0213a224611788bbab38840ba9f8308Brian Paul      softpipe->quad.pstipple->destroy( softpipe->quad.pstipple );
88344356a0edee932604027386591c82f6666e607cBrian Paul
89a77226071f6814a53358a5d6caff685889d0e4ecYounes Manton   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
90344356a0edee932604027386591c82f6666e607cBrian Paul      sp_destroy_tile_cache(softpipe->cbuf_cache[i]);
91a77226071f6814a53358a5d6caff685889d0e4ecYounes Manton      pipe_surface_reference(&softpipe->framebuffer.cbufs[i], NULL);
92a77226071f6814a53358a5d6caff685889d0e4ecYounes Manton   }
93904469dcd2e50d950c5e061103907da659053ff2Alan Hourihane
94344356a0edee932604027386591c82f6666e607cBrian Paul   sp_destroy_tile_cache(softpipe->zsbuf_cache);
95a77226071f6814a53358a5d6caff685889d0e4ecYounes Manton   pipe_surface_reference(&softpipe->framebuffer.zsbuf, NULL);
96344356a0edee932604027386591c82f6666e607cBrian Paul
97f93802c465b021592837c846d713146ddc1a8155Brian Paul   for (sh = 0; sh < ARRAY_SIZE(softpipe->tex_cache); sh++) {
98f93802c465b021592837c846d713146ddc1a8155Brian Paul      for (i = 0; i < ARRAY_SIZE(softpipe->tex_cache[0]); i++) {
990a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul         sp_destroy_tex_tile_cache(softpipe->tex_cache[sh][i]);
1000a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul         pipe_sampler_view_reference(&softpipe->sampler_views[sh][i], NULL);
1010a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul      }
1020a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul   }
103835bab0143e11ab98551a061043f944fd6eab456Michal Krol
104f93802c465b021592837c846d713146ddc1a8155Brian Paul   for (sh = 0; sh < ARRAY_SIZE(softpipe->constants); sh++) {
105f93802c465b021592837c846d713146ddc1a8155Brian Paul      for (i = 0; i < ARRAY_SIZE(softpipe->constants[0]); i++) {
1060a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul         if (softpipe->constants[sh][i]) {
1070a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul            pipe_resource_reference(&softpipe->constants[sh][i], NULL);
108835bab0143e11ab98551a061043f944fd6eab456Michal Krol         }
109344356a0edee932604027386591c82f6666e607cBrian Paul      }
110344356a0edee932604027386591c82f6666e607cBrian Paul   }
111344356a0edee932604027386591c82f6666e607cBrian Paul
1123c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák   for (i = 0; i < softpipe->num_vertex_buffers; i++) {
1133c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák      pipe_resource_reference(&softpipe->vertex_buffer[i].buffer, NULL);
1143c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák   }
1153c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák
1161fce9d58cc70deaff284e1d9d0ffcb15b61e7595Brian Paul   tgsi_exec_machine_destroy(softpipe->fs_machine);
1171fce9d58cc70deaff284e1d9d0ffcb15b61e7595Brian Paul
1186b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger   for (i = 0; i < PIPE_SHADER_TYPES; i++) {
1196b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger      FREE(softpipe->tgsi.sampler[i]);
12046bfcd61f5ca81fc7e19f0d74ee9fa70f16e9df7José Fonseca      FREE(softpipe->tgsi.image[i]);
12146bfcd61f5ca81fc7e19f0d74ee9fa70f16e9df7José Fonseca      FREE(softpipe->tgsi.buffer[i]);
1226b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger   }
1236b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger
124344356a0edee932604027386591c82f6666e607cBrian Paul   FREE( softpipe );
125344356a0edee932604027386591c82f6666e607cBrian Paul}
126344356a0edee932604027386591c82f6666e607cBrian Paul
127afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul
128afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul/**
129afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul * if (the texture is being used as a framebuffer surface)
13025485f4b69447514ab8b595aced90c75606a99bdMarek Olšák *    return SP_REFERENCED_FOR_WRITE
131afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul * else if (the texture is a bound texture source)
13225485f4b69447514ab8b595aced90c75606a99bdMarek Olšák *    return SP_REFERENCED_FOR_READ
133afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul * else
13425485f4b69447514ab8b595aced90c75606a99bdMarek Olšák *    return SP_UNREFERENCED
135afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul */
13625485f4b69447514ab8b595aced90c75606a99bdMarek Olšákunsigned int
137287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellsoftpipe_is_resource_referenced( struct pipe_context *pipe,
1384c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                 struct pipe_resource *texture,
1394c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                 unsigned level, int layer)
1409b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom{
1415d0cf9ebb41c05b0c6fa6914ccbb1e1871e27099José Fonseca   struct softpipe_context *softpipe = softpipe_context( pipe );
1420a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul   unsigned i, sh;
1435d0cf9ebb41c05b0c6fa6914ccbb1e1871e27099José Fonseca
144287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   if (texture->target == PIPE_BUFFER)
14525485f4b69447514ab8b595aced90c75606a99bdMarek Olšák      return SP_UNREFERENCED;
1464c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
147367cfca808e74101689dd0acb247f3ec38fc4c7fBrian Paul   /* check if any of the bound drawing surfaces are this texture */
148afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul   if (softpipe->dirty_render_cache) {
1495d0cf9ebb41c05b0c6fa6914ccbb1e1871e27099José Fonseca      for (i = 0; i < softpipe->framebuffer.nr_cbufs; i++) {
150afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul         if (softpipe->framebuffer.cbufs[i] &&
151afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul             softpipe->framebuffer.cbufs[i]->texture == texture) {
15225485f4b69447514ab8b595aced90c75606a99bdMarek Olšák            return SP_REFERENCED_FOR_WRITE;
153afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul         }
1545d0cf9ebb41c05b0c6fa6914ccbb1e1871e27099José Fonseca      }
155afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul      if (softpipe->framebuffer.zsbuf &&
156afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul          softpipe->framebuffer.zsbuf->texture == texture) {
15725485f4b69447514ab8b595aced90c75606a99bdMarek Olšák         return SP_REFERENCED_FOR_WRITE;
158afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul      }
1595d0cf9ebb41c05b0c6fa6914ccbb1e1871e27099José Fonseca   }
1605d0cf9ebb41c05b0c6fa6914ccbb1e1871e27099José Fonseca
161367cfca808e74101689dd0acb247f3ec38fc4c7fBrian Paul   /* check if any of the tex_cache textures are this texture */
162f93802c465b021592837c846d713146ddc1a8155Brian Paul   for (sh = 0; sh < ARRAY_SIZE(softpipe->tex_cache); sh++) {
163f93802c465b021592837c846d713146ddc1a8155Brian Paul      for (i = 0; i < ARRAY_SIZE(softpipe->tex_cache[0]); i++) {
1640a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul         if (softpipe->tex_cache[sh][i] &&
1650a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul             softpipe->tex_cache[sh][i]->texture == texture)
1660a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul            return SP_REFERENCED_FOR_READ;
1670a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul      }
16853bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin   }
16953bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin
17025485f4b69447514ab8b595aced90c75606a99bdMarek Olšák   return SP_UNREFERENCED;
1719b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom}
1729b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom
173afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul
174344356a0edee932604027386591c82f6666e607cBrian Paul
175afcaa45a94af95e62b56fb795ba573b719fa6dafBrian Paul
17641450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paulstatic void
17741450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paulsoftpipe_render_condition( struct pipe_context *pipe,
17841450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paul                           struct pipe_query *query,
179793e8e3d7ed816cc9a066245dde798afdcf8b581Roland Scheidegger                           boolean condition,
18041450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paul                           uint mode )
18141450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paul{
18241450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paul   struct softpipe_context *softpipe = softpipe_context( pipe );
18341450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paul
18441450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paul   softpipe->render_cond_query = query;
18541450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paul   softpipe->render_cond_mode = mode;
186793e8e3d7ed816cc9a066245dde798afdcf8b581Roland Scheidegger   softpipe->render_cond_cond = condition;
18741450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paul}
18841450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paul
18941450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paul
19041450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paul
191344356a0edee932604027386591c82f6666e607cBrian Paulstruct pipe_context *
1920fc21ecfc0891d239f20bf7724e51bc75503570cMarek Olšáksoftpipe_create_context(struct pipe_screen *screen,
1930fc21ecfc0891d239f20bf7724e51bc75503570cMarek Olšák			void *priv, unsigned flags)
194344356a0edee932604027386591c82f6666e607cBrian Paul{
19502932f37fa030f2d438b599106651cb938c3edc9Dave Airlie   struct softpipe_screen *sp_screen = softpipe_screen(screen);
196344356a0edee932604027386591c82f6666e607cBrian Paul   struct softpipe_context *softpipe = CALLOC_STRUCT(softpipe_context);
1970a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul   uint i, sh;
198344356a0edee932604027386591c82f6666e607cBrian Paul
1991a46dcc8a927dfb38ca1381e7b3dafb789f8257cBrian Paul   util_init_math();
2001a46dcc8a927dfb38ca1381e7b3dafb789f8257cBrian Paul
2016b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger   for (i = 0; i < PIPE_SHADER_TYPES; i++) {
2026b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger      softpipe->tgsi.sampler[i] = sp_create_tgsi_sampler();
2036b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger   }
2046b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger
205eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie   for (i = 0; i < PIPE_SHADER_TYPES; i++) {
206eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie      softpipe->tgsi.image[i] = sp_create_tgsi_image();
207eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie   }
208eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie
209afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie   for (i = 0; i < PIPE_SHADER_TYPES; i++) {
210afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie      softpipe->tgsi.buffer[i] = sp_create_tgsi_buffer();
211afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie   }
212afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie
213b1d485712fb90ef243384cd646822ba1f460314bBrian Paul   softpipe->dump_fs = debug_get_bool_option( "SOFTPIPE_DUMP_FS", FALSE );
214ac96ee1c16419583aa43c9f4100aaca774b9439aZack Rusin   softpipe->dump_gs = debug_get_bool_option( "SOFTPIPE_DUMP_GS", FALSE );
215e749c30cebe071da450e28cb47b1b7deb8284a39Dave Airlie   softpipe->dump_cs = debug_get_bool_option( "SOFTPIPE_DUMP_CS", FALSE );
216344356a0edee932604027386591c82f6666e607cBrian Paul
217344356a0edee932604027386591c82f6666e607cBrian Paul   softpipe->pipe.screen = screen;
218344356a0edee932604027386591c82f6666e607cBrian Paul   softpipe->pipe.destroy = softpipe_destroy;
2197f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell   softpipe->pipe.priv = priv;
220344356a0edee932604027386591c82f6666e607cBrian Paul
221344356a0edee932604027386591c82f6666e607cBrian Paul   /* state setters */
2222739692a6edaa0233bac188855457236897a34d5Brian Paul   softpipe_init_blend_funcs(&softpipe->pipe);
22363a5b7d7cc92bd7b670e02225f355ed2f8341022Brian Paul   softpipe_init_clip_funcs(&softpipe->pipe);
2241e35f6472df3341aca4d62eb3a3210603701c285Brian Paul   softpipe_init_query_funcs( softpipe );
225bd13a0d282d5468c083d06f4443dfaf375e01ddaBrian Paul   softpipe_init_rasterizer_funcs(&softpipe->pipe);
226c5dd2e40e268e40335a47b86b7c4ce201e337a77Brian Paul   softpipe_init_sampler_funcs(&softpipe->pipe);
227279b368dc34d8829bfd23b83af7f78e10e303f54Brian Paul   softpipe_init_shader_funcs(&softpipe->pipe);
2285b2406c0b9069363259a3d4b9486b081be5ade03Brian Paul   softpipe_init_streamout_funcs(&softpipe->pipe);
2291e35f6472df3341aca4d62eb3a3210603701c285Brian Paul   softpipe_init_texture_funcs( &softpipe->pipe );
230eed4509b086828c6229a7b1865978ffa27377874Brian Paul   softpipe_init_vertex_funcs(&softpipe->pipe);
231eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie   softpipe_init_image_funcs(&softpipe->pipe);
232057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger
233344356a0edee932604027386591c82f6666e607cBrian Paul   softpipe->pipe.set_framebuffer_state = softpipe_set_framebuffer_state;
234344356a0edee932604027386591c82f6666e607cBrian Paul
2356d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu   softpipe->pipe.draw_vbo = softpipe_draw_vbo;
236344356a0edee932604027386591c82f6666e607cBrian Paul
237e749c30cebe071da450e28cb47b1b7deb8284a39Dave Airlie   softpipe->pipe.launch_grid = softpipe_launch_grid;
238e749c30cebe071da450e28cb47b1b7deb8284a39Dave Airlie
239344356a0edee932604027386591c82f6666e607cBrian Paul   softpipe->pipe.clear = softpipe_clear;
2407e02303497237cde958c28608477d0c355a8038bMarek Olšák   softpipe->pipe.flush = softpipe_flush_wrapped;
241eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie   softpipe->pipe.texture_barrier = softpipe_texture_barrier;
242eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie   softpipe->pipe.memory_barrier = softpipe_memory_barrier;
24341450b03a8e8e0f94f8eefc6880d32e9b0ef6f6dBrian Paul   softpipe->pipe.render_condition = softpipe_render_condition;
2444e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
245344356a0edee932604027386591c82f6666e607cBrian Paul   /*
246344356a0edee932604027386591c82f6666e607cBrian Paul    * Alloc caches for accessing drawing surfaces and textures.
247344356a0edee932604027386591c82f6666e607cBrian Paul    * Must be before quad stage setup!
248344356a0edee932604027386591c82f6666e607cBrian Paul    */
249344356a0edee932604027386591c82f6666e607cBrian Paul   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++)
250b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell      softpipe->cbuf_cache[i] = sp_create_tile_cache( &softpipe->pipe );
251b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell   softpipe->zsbuf_cache = sp_create_tile_cache( &softpipe->pipe );
252344356a0edee932604027386591c82f6666e607cBrian Paul
2530a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul   /* Allocate texture caches */
254f93802c465b021592837c846d713146ddc1a8155Brian Paul   for (sh = 0; sh < ARRAY_SIZE(softpipe->tex_cache); sh++) {
255f93802c465b021592837c846d713146ddc1a8155Brian Paul      for (i = 0; i < ARRAY_SIZE(softpipe->tex_cache[0]); i++) {
2560a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul         softpipe->tex_cache[sh][i] = sp_create_tex_tile_cache(&softpipe->pipe);
2570a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul         if (!softpipe->tex_cache[sh][i])
2580a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul            goto fail;
2590a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul      }
26053bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin   }
261344356a0edee932604027386591c82f6666e607cBrian Paul
262e3e6859381df15fe17a4bd2b93906f69a3657dd4Dave Airlie   softpipe->fs_machine = tgsi_exec_machine_create(PIPE_SHADER_FRAGMENT);
2631fce9d58cc70deaff284e1d9d0ffcb15b61e7595Brian Paul
264344356a0edee932604027386591c82f6666e607cBrian Paul   /* setup quad rendering stages */
2653f4016650099642f900fc169c078b1d78128899aBrian Paul   softpipe->quad.shade = sp_quad_shade_stage(softpipe);
2663f4016650099642f900fc169c078b1d78128899aBrian Paul   softpipe->quad.depth_test = sp_quad_depth_test_stage(softpipe);
2673f4016650099642f900fc169c078b1d78128899aBrian Paul   softpipe->quad.blend = sp_quad_blend_stage(softpipe);
26844519e18a410016fde7ad8a66cd042bbc90c8940Brian Paul   softpipe->quad.pstipple = sp_quad_polygon_stipple_stage(softpipe);
269344356a0edee932604027386591c82f6666e607cBrian Paul
270b9604fe7699355584307ee3f38e048914fdfd76bBrian Paul
271344356a0edee932604027386591c82f6666e607cBrian Paul   /*
272344356a0edee932604027386591c82f6666e607cBrian Paul    * Create drawing context and plug our rendering stage into it.
273344356a0edee932604027386591c82f6666e607cBrian Paul    */
2745840ec2d41d09895bec7074a90521978fb933695Dave Airlie   if (sp_screen->use_llvm)
2758783d4227ff1d1b2bf816180f8d95466a25c786fJakob Bornecrantz      softpipe->draw = draw_create(&softpipe->pipe);
2768783d4227ff1d1b2bf816180f8d95466a25c786fJakob Bornecrantz   else
2778783d4227ff1d1b2bf816180f8d95466a25c786fJakob Bornecrantz      softpipe->draw = draw_create_no_llvm(&softpipe->pipe);
278de818835de70961602bb9ceca86b98e9bbc63fc1Keith Whitwell   if (!softpipe->draw)
279de818835de70961602bb9ceca86b98e9bbc63fc1Keith Whitwell      goto fail;
280de818835de70961602bb9ceca86b98e9bbc63fc1Keith Whitwell
2816b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger   draw_texture_sampler(softpipe->draw,
2826b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger                        PIPE_SHADER_VERTEX,
2836b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger                        (struct tgsi_sampler *)
2846b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger                           softpipe->tgsi.sampler[PIPE_SHADER_VERTEX]);
2856b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger
2866b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger   draw_texture_sampler(softpipe->draw,
2876b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger                        PIPE_SHADER_GEOMETRY,
2886b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger                        (struct tgsi_sampler *)
2896b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger                           softpipe->tgsi.sampler[PIPE_SHADER_GEOMETRY]);
29053bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin
291eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie   draw_image(softpipe->draw,
292eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie              PIPE_SHADER_VERTEX,
293eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie              (struct tgsi_image *)
294eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie              softpipe->tgsi.image[PIPE_SHADER_VERTEX]);
295eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie
296eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie   draw_image(softpipe->draw,
297eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie              PIPE_SHADER_GEOMETRY,
298eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie              (struct tgsi_image *)
299eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie              softpipe->tgsi.image[PIPE_SHADER_GEOMETRY]);
300eb9ad9faa3975fc4f044b81d3b4b793866ef5563Dave Airlie
301afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie   draw_buffer(softpipe->draw,
302afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie              PIPE_SHADER_VERTEX,
303afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie              (struct tgsi_buffer *)
304afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie              softpipe->tgsi.buffer[PIPE_SHADER_VERTEX]);
305afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie
306afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie   draw_buffer(softpipe->draw,
307afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie              PIPE_SHADER_GEOMETRY,
308afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie              (struct tgsi_buffer *)
309afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie              softpipe->tgsi.buffer[PIPE_SHADER_GEOMETRY]);
310afa8707ba93a7d226a76319acda2a8dd89524db7Dave Airlie
311b1d485712fb90ef243384cd646822ba1f460314bBrian Paul   if (debug_get_bool_option( "SOFTPIPE_NO_RAST", FALSE ))
312a5b87f249ef79b1a8d8b9dbe72879b7ac9eb133cKeith Whitwell      softpipe->no_rast = TRUE;
313a5b87f249ef79b1a8d8b9dbe72879b7ac9eb133cKeith Whitwell
3144fe0fc3eba1f79beda890a5016359d549bab6ad4Keith Whitwell   softpipe->vbuf_backend = sp_create_vbuf_backend(softpipe);
3154fe0fc3eba1f79beda890a5016359d549bab6ad4Keith Whitwell   if (!softpipe->vbuf_backend)
3164fe0fc3eba1f79beda890a5016359d549bab6ad4Keith Whitwell      goto fail;
3174fe0fc3eba1f79beda890a5016359d549bab6ad4Keith Whitwell
3184fe0fc3eba1f79beda890a5016359d549bab6ad4Keith Whitwell   softpipe->vbuf = draw_vbuf_stage(softpipe->draw, softpipe->vbuf_backend);
3194fe0fc3eba1f79beda890a5016359d549bab6ad4Keith Whitwell   if (!softpipe->vbuf)
3204fe0fc3eba1f79beda890a5016359d549bab6ad4Keith Whitwell      goto fail;
3214fe0fc3eba1f79beda890a5016359d549bab6ad4Keith Whitwell
3224fe0fc3eba1f79beda890a5016359d549bab6ad4Keith Whitwell   draw_set_rasterize_stage(softpipe->draw, softpipe->vbuf);
3234fe0fc3eba1f79beda890a5016359d549bab6ad4Keith Whitwell   draw_set_render(softpipe->draw, softpipe->vbuf_backend);
3244fe0fc3eba1f79beda890a5016359d549bab6ad4Keith Whitwell
3253d9d4b1ce6e700d85920eca84ae58a4dcf7288c2Marek Olšák   softpipe->blitter = util_blitter_create(&softpipe->pipe);
3263d9d4b1ce6e700d85920eca84ae58a4dcf7288c2Marek Olšák   if (!softpipe->blitter) {
3273d9d4b1ce6e700d85920eca84ae58a4dcf7288c2Marek Olšák      goto fail;
3283d9d4b1ce6e700d85920eca84ae58a4dcf7288c2Marek Olšák   }
3293d9d4b1ce6e700d85920eca84ae58a4dcf7288c2Marek Olšák
3303d9d4b1ce6e700d85920eca84ae58a4dcf7288c2Marek Olšák   /* must be done before installing Draw stages */
3313d9d4b1ce6e700d85920eca84ae58a4dcf7288c2Marek Olšák   util_blitter_cache_all_shaders(softpipe->blitter);
3324fe0fc3eba1f79beda890a5016359d549bab6ad4Keith Whitwell
333344356a0edee932604027386591c82f6666e607cBrian Paul   /* plug in AA line/point stages */
334344356a0edee932604027386591c82f6666e607cBrian Paul   draw_install_aaline_stage(softpipe->draw, &softpipe->pipe);
335344356a0edee932604027386591c82f6666e607cBrian Paul   draw_install_aapoint_stage(softpipe->draw, &softpipe->pipe);
336344356a0edee932604027386591c82f6666e607cBrian Paul
337344356a0edee932604027386591c82f6666e607cBrian Paul   /* Do polygon stipple w/ texture map + frag prog? */
33844519e18a410016fde7ad8a66cd042bbc90c8940Brian Paul#if DO_PSTIPPLE_IN_DRAW_MODULE
339344356a0edee932604027386591c82f6666e607cBrian Paul   draw_install_pstipple_stage(softpipe->draw, &softpipe->pipe);
34044519e18a410016fde7ad8a66cd042bbc90c8940Brian Paul#endif
341344356a0edee932604027386591c82f6666e607cBrian Paul
34201c12ed60c9079e2c83a6c0e24c0e99db416668cBrian Paul   draw_wide_point_sprites(softpipe->draw, TRUE);
34301c12ed60c9079e2c83a6c0e24c0e99db416668cBrian Paul
344344356a0edee932604027386591c82f6666e607cBrian Paul   sp_init_surface_functions(softpipe);
345344356a0edee932604027386591c82f6666e607cBrian Paul
34657aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul#if DO_PSTIPPLE_IN_HELPER_MODULE
34757aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul   /* create the polgon stipple sampler */
34857aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul   softpipe->pstipple.sampler = util_pstipple_create_sampler(&softpipe->pipe);
34957aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul#endif
35057aa597b3d5dac0fc59c05557dafec59e14e1019Brian Paul
351344356a0edee932604027386591c82f6666e607cBrian Paul   return &softpipe->pipe;
352de818835de70961602bb9ceca86b98e9bbc63fc1Keith Whitwell
353de818835de70961602bb9ceca86b98e9bbc63fc1Keith Whitwell fail:
354de818835de70961602bb9ceca86b98e9bbc63fc1Keith Whitwell   softpipe_destroy(&softpipe->pipe);
355de818835de70961602bb9ceca86b98e9bbc63fc1Keith Whitwell   return NULL;
356344356a0edee932604027386591c82f6666e607cBrian Paul}
357