lp_setup.c revision 5e6a9005100ec2636ce9734a5e4535216494cf60
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/************************************************************************** 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All Rights Reserved. 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copy of this software and associated documentation files (the 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "Software"), to deal in the Software without restriction, including 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * without limitation the rights to use, copy, modify, merge, publish, 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * distribute, sub license, and/or sell copies of the Software, and to 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * permit persons to whom the Software is furnished to do so, subject to 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions: 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The above copyright notice and this permission notice (including the 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * next paragraph) shall be included in all copies or substantial portions 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * of the Software. 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project **************************************************************************/ 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/** 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Tiling engine. 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Builds per-tile display lists and executes them on calls to 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lp_setup_flush(). 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "pipe/p_defines.h" 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "util/u_inlines.h" 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "util/u_memory.h" 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "util/u_pack_color.h" 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "util/u_surface.h" 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "lp_scene.h" 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "lp_scene_queue.h" 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "lp_buffer.h" 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "lp_texture.h" 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "lp_debug.h" 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "lp_fence.h" 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "lp_rast.h" 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "lp_setup_context.h" 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "draw/draw_context.h" 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "draw/draw_vbuf.h" 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void set_scene_state( struct setup_context *, unsigned ); 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct lp_scene * 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlp_setup_get_current_scene(struct setup_context *setup) 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!setup->scene) { 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* wait for a free/empty scene 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->scene = lp_scene_dequeue(setup->empty_scenes, TRUE); 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(0)lp_scene_reset( setup->scene ); /* XXX temporary? */ 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_scene_set_framebuffer_size(setup->scene, 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->fb.width, 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->fb.height); 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return setup->scene; 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectfirst_triangle( struct setup_context *setup, 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const float (*v0)[4], 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const float (*v1)[4], 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const float (*v2)[4]) 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project set_scene_state( setup, SETUP_ACTIVE ); 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_setup_choose_triangle( setup ); 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->triangle( setup, v0, v1, v2 ); 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectfirst_line( struct setup_context *setup, 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const float (*v0)[4], 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const float (*v1)[4]) 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project set_scene_state( setup, SETUP_ACTIVE ); 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_setup_choose_line( setup ); 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->line( setup, v0, v1 ); 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectfirst_point( struct setup_context *setup, 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const float (*v0)[4]) 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project set_scene_state( setup, SETUP_ACTIVE ); 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_setup_choose_point( setup ); 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->point( setup, v0 ); 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void reset_context( struct setup_context *setup ) 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Reset derived state */ 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->constants.stored_size = 0; 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->constants.stored_data = NULL; 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->fs.stored = NULL; 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->dirty = ~0; 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* no current bin */ 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->scene = NULL; 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Reset some state: 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->clear.flags = 0; 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Have an explicit "start-binning" call and get rid of this 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * pointer twiddling? 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->line = first_line; 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->point = first_point; 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->triangle = first_triangle; 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/** Rasterize all scene's bins */ 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlp_setup_rasterize_scene( struct setup_context *setup, 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project boolean write_depth ) 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct lp_scene *scene = lp_setup_get_current_scene(setup); 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_rasterize_scene(setup->rast, 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project scene, 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &setup->fb, 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_depth); 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project reset_context( setup ); 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__); 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbegin_binning( struct setup_context *setup ) 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct lp_scene *scene = lp_setup_get_current_scene(setup); 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LP_DBG(DEBUG_SETUP, "%s color: %s depth: %s\n", __FUNCTION__, 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (setup->clear.flags & PIPE_CLEAR_COLOR) ? "clear": "load", 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) ? "clear": "load"); 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (setup->fb.nr_cbufs) { 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (setup->clear.flags & PIPE_CLEAR_COLOR) 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_scene_bin_everywhere( scene, 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_rast_clear_color, 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->clear.color ); 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_scene_bin_everywhere( scene, 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_rast_load_color, 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_rast_arg_null() ); 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (setup->fb.zsbuf) { 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_scene_bin_everywhere( scene, 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_rast_clear_zstencil, 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->clear.zstencil ); 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LP_DBG(DEBUG_SETUP, "%s done\n", __FUNCTION__); 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This basically bins and then flushes any outstanding full-screen 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * clears. 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * TODO: fast path for fullscreen clears and no triangles. 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectexecute_clears( struct setup_context *setup ) 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project begin_binning( setup ); 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_setup_rasterize_scene( setup, TRUE ); 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectset_scene_state( struct setup_context *setup, 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned new_state ) 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned old_state = setup->state; 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (old_state == new_state) 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LP_DBG(DEBUG_SETUP, "%s old %d new %d\n", __FUNCTION__, old_state, new_state); 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (new_state) { 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SETUP_ACTIVE: 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project begin_binning( setup ); 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SETUP_CLEARED: 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (old_state == SETUP_ACTIVE) { 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project assert(0); 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SETUP_FLUSHED: 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (old_state == SETUP_CLEARED) 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project execute_clears( setup ); 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_setup_rasterize_scene( setup, TRUE ); 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->state = new_state; 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlp_setup_flush( struct setup_context *setup, 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned flags ) 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project set_scene_state( setup, SETUP_FLUSHED ); 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlp_setup_bind_framebuffer( struct setup_context *setup, 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const struct pipe_framebuffer_state *fb ) 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct lp_scene *scene = lp_setup_get_current_scene(setup); 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project set_scene_state( setup, SETUP_FLUSHED ); 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* re-get scene pointer, may have a new scene after flushing */ 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project scene = lp_setup_get_current_scene(setup); 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project util_copy_framebuffer_state(&setup->fb, fb); 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_scene_set_framebuffer_size(scene, setup->fb.width, setup->fb.height); 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlp_setup_clear( struct setup_context *setup, 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const float *color, 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project double depth, 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned stencil, 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned flags ) 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct lp_scene *scene = lp_setup_get_current_scene(setup); 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned i; 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state); 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (flags & PIPE_CLEAR_COLOR) { 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i = 0; i < 4; ++i) 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->clear.color.clear_color[i] = float_to_ubyte(color[i]); 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (flags & PIPE_CLEAR_DEPTHSTENCIL) { 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->clear.zstencil.clear_zstencil = 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project util_pack_z_stencil(setup->fb.zsbuf->format, 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project depth, 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project stencil); 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (setup->state == SETUP_ACTIVE) { 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Add the clear to existing scene. In the unusual case where 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * both color and depth-stencil are being cleared when there's 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * already been some rendering, we could discard the currently 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * binned scene and start again, but I don't see that as being 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * a common usage. 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (flags & PIPE_CLEAR_COLOR) 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_scene_bin_everywhere( scene, 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_rast_clear_color, 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->clear.color ); 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_scene_bin_everywhere( scene, 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lp_rast_clear_zstencil, 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->clear.zstencil ); 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Put ourselves into the 'pre-clear' state, specifically to try 30443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom * and accumulate multiple clears to color and depth_stencil 30543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom * buffers which the app or state-tracker might issue 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * separately. 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project set_scene_state( setup, SETUP_CLEARED ); 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setup->clear.flags |= flags; 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 313 314 315/** 316 * Emit a fence. 317 */ 318struct pipe_fence_handle * 319lp_setup_fence( struct setup_context *setup ) 320{ 321 struct lp_scene *scene = lp_setup_get_current_scene(setup); 322 const unsigned rank = lp_scene_get_num_bins( scene ); /* xxx */ 323 struct lp_fence *fence = lp_fence_create(rank); 324 325 LP_DBG(DEBUG_SETUP, "%s rank %u\n", __FUNCTION__, rank); 326 327 set_scene_state( setup, SETUP_ACTIVE ); 328 329 /* insert the fence into all command bins */ 330 lp_scene_bin_everywhere( scene, 331 lp_rast_fence, 332 lp_rast_arg_fence(fence) ); 333 334 return (struct pipe_fence_handle *) fence; 335} 336 337 338void 339lp_setup_set_triangle_state( struct setup_context *setup, 340 unsigned cull_mode, 341 boolean ccw_is_frontface, 342 boolean scissor ) 343{ 344 LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 345 346 setup->ccw_is_frontface = ccw_is_frontface; 347 setup->cullmode = cull_mode; 348 setup->triangle = first_triangle; 349 setup->scissor_test = scissor; 350} 351 352 353 354void 355lp_setup_set_fs_inputs( struct setup_context *setup, 356 const struct lp_shader_input *input, 357 unsigned nr ) 358{ 359 LP_DBG(DEBUG_SETUP, "%s %p %u\n", __FUNCTION__, (void *) input, nr); 360 361 memcpy( setup->fs.input, input, nr * sizeof input[0] ); 362 setup->fs.nr_inputs = nr; 363} 364 365void 366lp_setup_set_fs_functions( struct setup_context *setup, 367 lp_jit_frag_func jit_function0, 368 lp_jit_frag_func jit_function1, 369 boolean opaque ) 370{ 371 LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, (void *) jit_function0); 372 /* FIXME: reference count */ 373 374 setup->fs.current.jit_function[0] = jit_function0; 375 setup->fs.current.jit_function[1] = jit_function1; 376 setup->fs.current.opaque = opaque; 377 setup->dirty |= LP_SETUP_NEW_FS; 378} 379 380void 381lp_setup_set_fs_constants(struct setup_context *setup, 382 struct pipe_buffer *buffer) 383{ 384 LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, (void *) buffer); 385 386 pipe_buffer_reference(&setup->constants.current, buffer); 387 388 setup->dirty |= LP_SETUP_NEW_CONSTANTS; 389} 390 391 392void 393lp_setup_set_alpha_ref_value( struct setup_context *setup, 394 float alpha_ref_value ) 395{ 396 LP_DBG(DEBUG_SETUP, "%s %f\n", __FUNCTION__, alpha_ref_value); 397 398 if(setup->fs.current.jit_context.alpha_ref_value != alpha_ref_value) { 399 setup->fs.current.jit_context.alpha_ref_value = alpha_ref_value; 400 setup->dirty |= LP_SETUP_NEW_FS; 401 } 402} 403 404void 405lp_setup_set_blend_color( struct setup_context *setup, 406 const struct pipe_blend_color *blend_color ) 407{ 408 LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 409 410 assert(blend_color); 411 412 if(memcmp(&setup->blend_color.current, blend_color, sizeof *blend_color) != 0) { 413 memcpy(&setup->blend_color.current, blend_color, sizeof *blend_color); 414 setup->dirty |= LP_SETUP_NEW_BLEND_COLOR; 415 } 416} 417 418 419void 420lp_setup_set_scissor( struct setup_context *setup, 421 const struct pipe_scissor_state *scissor ) 422{ 423 LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 424 425 assert(scissor); 426 427 if (memcmp(&setup->scissor.current, scissor, sizeof(*scissor)) != 0) { 428 setup->scissor.current = *scissor; /* struct copy */ 429 setup->dirty |= LP_SETUP_NEW_SCISSOR; 430 } 431} 432 433 434void 435lp_setup_set_flatshade_first( struct setup_context *setup, 436 boolean flatshade_first ) 437{ 438 setup->flatshade_first = flatshade_first; 439} 440 441 442void 443lp_setup_set_vertex_info( struct setup_context *setup, 444 struct vertex_info *vertex_info ) 445{ 446 /* XXX: just silently holding onto the pointer: 447 */ 448 setup->vertex_info = vertex_info; 449} 450 451 452/** 453 * Called during state validation when LP_NEW_TEXTURE is set. 454 */ 455void 456lp_setup_set_sampler_textures( struct setup_context *setup, 457 unsigned num, struct pipe_texture **texture) 458{ 459 unsigned i; 460 461 LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 462 463 assert(num <= PIPE_MAX_SAMPLERS); 464 465 for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { 466 struct pipe_texture *tex = i < num ? texture[i] : NULL; 467 468 if(tex) { 469 struct llvmpipe_texture *lp_tex = llvmpipe_texture(tex); 470 struct lp_jit_texture *jit_tex; 471 jit_tex = &setup->fs.current.jit_context.textures[i]; 472 jit_tex->width = tex->width0; 473 jit_tex->height = tex->height0; 474 jit_tex->stride = lp_tex->stride[0]; 475 if(!lp_tex->dt) 476 jit_tex->data = lp_tex->data; 477 else 478 /* FIXME: map the rendertarget */ 479 assert(0); 480 481 /* the scene references this texture */ 482 { 483 struct lp_scene *scene = lp_setup_get_current_scene(setup); 484 lp_scene_texture_reference(scene, tex); 485 } 486 } 487 } 488 489 setup->dirty |= LP_SETUP_NEW_FS; 490} 491 492 493/** 494 * Is the given texture referenced by any scene? 495 * Note: we have to check all scenes including any scenes currently 496 * being rendered and the current scene being built. 497 */ 498unsigned 499lp_setup_is_texture_referenced( const struct setup_context *setup, 500 const struct pipe_texture *texture ) 501{ 502 unsigned i; 503 504 /* check the render targets */ 505 for (i = 0; i < setup->fb.nr_cbufs; i++) { 506 if (setup->fb.cbufs[i]->texture == texture) 507 return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; 508 } 509 if (setup->fb.zsbuf && setup->fb.zsbuf->texture == texture) { 510 return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; 511 } 512 513 /* check textures referenced by the scene */ 514 for (i = 0; i < Elements(setup->scenes); i++) { 515 if (lp_scene_is_texture_referenced(setup->scenes[i], texture)) { 516 return PIPE_REFERENCED_FOR_READ; 517 } 518 } 519 520 return PIPE_UNREFERENCED; 521} 522 523 524/** 525 * Called by vbuf code when we're about to draw something. 526 */ 527void 528lp_setup_update_state( struct setup_context *setup ) 529{ 530 struct lp_scene *scene = lp_setup_get_current_scene(setup); 531 532 LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 533 534 assert(setup->fs.current.jit_function); 535 536 if(setup->dirty & LP_SETUP_NEW_BLEND_COLOR) { 537 uint8_t *stored; 538 unsigned i, j; 539 540 stored = lp_scene_alloc_aligned(scene, 4 * 16, 16); 541 542 /* smear each blend color component across 16 ubyte elements */ 543 for (i = 0; i < 4; ++i) { 544 uint8_t c = float_to_ubyte(setup->blend_color.current.color[i]); 545 for (j = 0; j < 16; ++j) 546 stored[i*16 + j] = c; 547 } 548 549 setup->blend_color.stored = stored; 550 551 setup->fs.current.jit_context.blend_color = setup->blend_color.stored; 552 setup->dirty |= LP_SETUP_NEW_FS; 553 } 554 555 if (setup->dirty & LP_SETUP_NEW_SCISSOR) { 556 float *stored; 557 558 stored = lp_scene_alloc_aligned(scene, 4 * sizeof(int32_t), 16); 559 560 stored[0] = (float) setup->scissor.current.minx; 561 stored[1] = (float) setup->scissor.current.miny; 562 stored[2] = (float) setup->scissor.current.maxx; 563 stored[3] = (float) setup->scissor.current.maxy; 564 565 setup->scissor.stored = stored; 566 567 setup->fs.current.jit_context.scissor_xmin = stored[0]; 568 setup->fs.current.jit_context.scissor_ymin = stored[1]; 569 setup->fs.current.jit_context.scissor_xmax = stored[2]; 570 setup->fs.current.jit_context.scissor_ymax = stored[3]; 571 572 setup->dirty |= LP_SETUP_NEW_FS; 573 } 574 575 if(setup->dirty & LP_SETUP_NEW_CONSTANTS) { 576 struct pipe_buffer *buffer = setup->constants.current; 577 578 if(buffer) { 579 unsigned current_size = buffer->size; 580 const void *current_data = llvmpipe_buffer(buffer)->data; 581 582 /* TODO: copy only the actually used constants? */ 583 584 if(setup->constants.stored_size != current_size || 585 !setup->constants.stored_data || 586 memcmp(setup->constants.stored_data, 587 current_data, 588 current_size) != 0) { 589 void *stored; 590 591 stored = lp_scene_alloc(scene, current_size); 592 if(stored) { 593 memcpy(stored, 594 current_data, 595 current_size); 596 setup->constants.stored_size = current_size; 597 setup->constants.stored_data = stored; 598 } 599 } 600 } 601 else { 602 setup->constants.stored_size = 0; 603 setup->constants.stored_data = NULL; 604 } 605 606 setup->fs.current.jit_context.constants = setup->constants.stored_data; 607 setup->dirty |= LP_SETUP_NEW_FS; 608 } 609 610 611 if(setup->dirty & LP_SETUP_NEW_FS) { 612 if(!setup->fs.stored || 613 memcmp(setup->fs.stored, 614 &setup->fs.current, 615 sizeof setup->fs.current) != 0) { 616 /* The fs state that's been stored in the scene is different from 617 * the new, current state. So allocate a new lp_rast_state object 618 * and append it to the bin's setup data buffer. 619 */ 620 struct lp_rast_state *stored = 621 (struct lp_rast_state *) lp_scene_alloc(scene, sizeof *stored); 622 if(stored) { 623 memcpy(stored, 624 &setup->fs.current, 625 sizeof setup->fs.current); 626 setup->fs.stored = stored; 627 628 /* put the state-set command into all bins */ 629 lp_scene_bin_state_command( scene, 630 lp_rast_set_state, 631 lp_rast_arg_state(setup->fs.stored) ); 632 } 633 } 634 } 635 636 setup->dirty = 0; 637 638 assert(setup->fs.stored); 639} 640 641 642 643/* Only caller is lp_setup_vbuf_destroy() 644 */ 645void 646lp_setup_destroy( struct setup_context *setup ) 647{ 648 reset_context( setup ); 649 650 pipe_buffer_reference(&setup->constants.current, NULL); 651 652 /* free the scenes in the 'empty' queue */ 653 while (1) { 654 struct lp_scene *scene = lp_scene_dequeue(setup->empty_scenes, FALSE); 655 if (!scene) 656 break; 657 lp_scene_destroy(scene); 658 } 659 660 lp_rast_destroy( setup->rast ); 661 662 FREE( setup ); 663} 664 665 666/** 667 * Create a new primitive tiling engine. Plug it into the backend of 668 * the draw module. Currently also creates a rasterizer to use with 669 * it. 670 */ 671struct setup_context * 672lp_setup_create( struct pipe_screen *screen, 673 struct draw_context *draw ) 674{ 675 unsigned i; 676 struct setup_context *setup = CALLOC_STRUCT(setup_context); 677 678 if (!setup) 679 return NULL; 680 681 lp_setup_init_vbuf(setup); 682 683 setup->empty_scenes = lp_scene_queue_create(); 684 if (!setup->empty_scenes) 685 goto fail; 686 687 setup->rast = lp_rast_create( screen, setup->empty_scenes ); 688 if (!setup->rast) 689 goto fail; 690 691 setup->vbuf = draw_vbuf_stage(draw, &setup->base); 692 if (!setup->vbuf) 693 goto fail; 694 695 draw_set_rasterize_stage(draw, setup->vbuf); 696 draw_set_render(draw, &setup->base); 697 698 /* create some empty scenes */ 699 for (i = 0; i < MAX_SCENES; i++) { 700 setup->scenes[i] = lp_scene_create(); 701 lp_scene_enqueue(setup->empty_scenes, setup->scenes[i]); 702 } 703 704 setup->triangle = first_triangle; 705 setup->line = first_line; 706 setup->point = first_point; 707 708 setup->dirty = ~0; 709 710 return setup; 711 712fail: 713 if (setup->rast) 714 lp_rast_destroy( setup->rast ); 715 716 if (setup->vbuf) 717 ; 718 719 if (setup->empty_scenes) 720 lp_scene_queue_destroy(setup->empty_scenes); 721 722 FREE(setup); 723 return NULL; 724} 725 726