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