1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 VMware, Inc. All rights reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Author: 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Keith Whitwell <keith@tungstengraphics.com> 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_context.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_vbuf.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pstipple.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_exec.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vl/vl_decoder.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vl/vl_video_buffer.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_clear.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_context.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_flush.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_prim_vbuf.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_state.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_surface.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_tile_cache.h" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_tex_tile_cache.h" 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_texture.h" 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_query.h" 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_screen.h" 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Map any drawing surfaces which aren't already mapped 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoftpipe_map_transfers(struct softpipe_context *sp) 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < sp->framebuffer.nr_cbufs; i++) { 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp_tile_cache_map_transfers(sp->cbuf_cache[i]); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp_tile_cache_map_transfers(sp->zsbuf_cache); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unmap any mapped drawing surfaces 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoftpipe_unmap_transfers(struct softpipe_context *sp) 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < sp->framebuffer.nr_cbufs; i++) { 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp_tile_cache_unmap_transfers(sp->cbuf_cache[i]); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp_tile_cache_unmap_transfers(sp->zsbuf_cache); 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoftpipe_destroy( struct pipe_context *pipe ) 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct softpipe_context *softpipe = softpipe_context( pipe ); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i, sh; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DO_PSTIPPLE_IN_HELPER_MODULE 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (softpipe->pstipple.sampler) 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_sampler_state(pipe, softpipe->pstipple.sampler); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&softpipe->pstipple.texture, NULL); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&softpipe->pstipple.sampler_view, NULL); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (softpipe->draw) 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_destroy( softpipe->draw ); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (softpipe->quad.shade) 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->quad.shade->destroy( softpipe->quad.shade ); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (softpipe->quad.depth_test) 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->quad.depth_test->destroy( softpipe->quad.depth_test ); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (softpipe->quad.blend) 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->quad.blend->destroy( softpipe->quad.blend ); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (softpipe->quad.pstipple) 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->quad.pstipple->destroy( softpipe->quad.pstipple ); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp_destroy_tile_cache(softpipe->cbuf_cache[i]); 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&softpipe->framebuffer.cbufs[i], NULL); 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp_destroy_tile_cache(softpipe->zsbuf_cache); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&softpipe->framebuffer.zsbuf, NULL); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (sh = 0; sh < Elements(softpipe->tex_cache); sh++) { 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < Elements(softpipe->tex_cache[0]); i++) { 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp_destroy_tex_tile_cache(softpipe->tex_cache[sh][i]); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&softpipe->sampler_views[sh][i], NULL); 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (sh = 0; sh < Elements(softpipe->constants); sh++) { 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < Elements(softpipe->constants[0]); i++) { 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (softpipe->constants[sh][i]) { 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&softpipe->constants[sh][i], NULL); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < softpipe->num_vertex_buffers; i++) { 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&softpipe->vertex_buffer[i].buffer, NULL); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_exec_machine_destroy(softpipe->fs_machine); 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE( softpipe ); 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if (the texture is being used as a framebuffer surface) 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * return SP_REFERENCED_FOR_WRITE 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * else if (the texture is a bound texture source) 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * return SP_REFERENCED_FOR_READ 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * else 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * return SP_UNREFERENCED 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned int 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoftpipe_is_resource_referenced( struct pipe_context *pipe, 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *texture, 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned level, int layer) 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct softpipe_context *softpipe = softpipe_context( pipe ); 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, sh; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texture->target == PIPE_BUFFER) 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SP_UNREFERENCED; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check if any of the bound drawing surfaces are this texture */ 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (softpipe->dirty_render_cache) { 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < softpipe->framebuffer.nr_cbufs; i++) { 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (softpipe->framebuffer.cbufs[i] && 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->framebuffer.cbufs[i]->texture == texture) { 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SP_REFERENCED_FOR_WRITE; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (softpipe->framebuffer.zsbuf && 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->framebuffer.zsbuf->texture == texture) { 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SP_REFERENCED_FOR_WRITE; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check if any of the tex_cache textures are this texture */ 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (sh = 0; sh < Elements(softpipe->tex_cache); sh++) { 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < Elements(softpipe->tex_cache[0]); i++) { 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (softpipe->tex_cache[sh][i] && 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->tex_cache[sh][i]->texture == texture) 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SP_REFERENCED_FOR_READ; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SP_UNREFERENCED; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoftpipe_render_condition( struct pipe_context *pipe, 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_query *query, 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint mode ) 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct softpipe_context *softpipe = softpipe_context( pipe ); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->render_cond_query = query; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->render_cond_mode = mode; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_context * 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoftpipe_create_context( struct pipe_screen *screen, 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *priv ) 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct softpipe_screen *sp_screen = softpipe_screen(screen); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct softpipe_context *softpipe = CALLOC_STRUCT(softpipe_context); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i, sh; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_init_math(); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->dump_fs = debug_get_bool_option( "SOFTPIPE_DUMP_FS", FALSE ); 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->dump_gs = debug_get_bool_option( "SOFTPIPE_DUMP_GS", FALSE ); 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->pipe.screen = screen; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->pipe.destroy = softpipe_destroy; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->pipe.priv = priv; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state setters */ 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe_init_blend_funcs(&softpipe->pipe); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe_init_clip_funcs(&softpipe->pipe); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe_init_query_funcs( softpipe ); 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe_init_rasterizer_funcs(&softpipe->pipe); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe_init_sampler_funcs(&softpipe->pipe); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe_init_shader_funcs(&softpipe->pipe); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe_init_streamout_funcs(&softpipe->pipe); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe_init_texture_funcs( &softpipe->pipe ); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe_init_vertex_funcs(&softpipe->pipe); 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->pipe.set_framebuffer_state = softpipe_set_framebuffer_state; 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->pipe.draw_vbo = softpipe_draw_vbo; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->pipe.clear = softpipe_clear; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->pipe.flush = softpipe_flush_wrapped; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->pipe.render_condition = softpipe_render_condition; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->pipe.create_video_decoder = vl_create_decoder; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->pipe.create_video_buffer = vl_video_buffer_create; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Alloc caches for accessing drawing surfaces and textures. 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Must be before quad stage setup! 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->cbuf_cache[i] = sp_create_tile_cache( &softpipe->pipe ); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->zsbuf_cache = sp_create_tile_cache( &softpipe->pipe ); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Allocate texture caches */ 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (sh = 0; sh < Elements(softpipe->tex_cache); sh++) { 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < Elements(softpipe->tex_cache[0]); i++) { 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->tex_cache[sh][i] = sp_create_tex_tile_cache(&softpipe->pipe); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!softpipe->tex_cache[sh][i]) 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->fs_machine = tgsi_exec_machine_create(); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* setup quad rendering stages */ 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->quad.shade = sp_quad_shade_stage(softpipe); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->quad.depth_test = sp_quad_depth_test_stage(softpipe); 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->quad.blend = sp_quad_blend_stage(softpipe); 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->quad.pstipple = sp_quad_polygon_stipple_stage(softpipe); 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create drawing context and plug our rendering stage into it. 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sp_screen->use_llvm) 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->draw = draw_create(&softpipe->pipe); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->draw = draw_create_no_llvm(&softpipe->pipe); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!softpipe->draw) 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_texture_samplers(softpipe->draw, 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_SHADER_VERTEX, 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_MAX_SAMPLERS, 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct tgsi_sampler **) 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->tgsi.samplers_list[PIPE_SHADER_VERTEX]); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_texture_samplers(softpipe->draw, 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_SHADER_GEOMETRY, 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_MAX_SAMPLERS, 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct tgsi_sampler **) 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->tgsi.samplers_list[PIPE_SHADER_GEOMETRY]); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (debug_get_bool_option( "SOFTPIPE_NO_RAST", FALSE )) 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->no_rast = TRUE; 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->vbuf_backend = sp_create_vbuf_backend(softpipe); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!softpipe->vbuf_backend) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->vbuf = draw_vbuf_stage(softpipe->draw, softpipe->vbuf_backend); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!softpipe->vbuf) 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_set_rasterize_stage(softpipe->draw, softpipe->vbuf); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_set_render(softpipe->draw, softpipe->vbuf_backend); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* plug in AA line/point stages */ 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_install_aaline_stage(softpipe->draw, &softpipe->pipe); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_install_aapoint_stage(softpipe->draw, &softpipe->pipe); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Do polygon stipple w/ texture map + frag prog? */ 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DO_PSTIPPLE_IN_DRAW_MODULE 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_install_pstipple_stage(softpipe->draw, &softpipe->pipe); 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_wide_point_sprites(softpipe->draw, TRUE); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp_init_surface_functions(softpipe); 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DO_PSTIPPLE_IN_HELPER_MODULE 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* create the polgon stipple sampler */ 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe->pstipple.sampler = util_pstipple_create_sampler(&softpipe->pipe); 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &softpipe->pipe; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fail: 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org softpipe_destroy(&softpipe->pipe); 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 338