static void lp_rast_end( struct lp_rasterizer *rast ) { lp_scene_end_rasterization( rast->curr_scene ); rast->curr_scene = NULL; }
static void lp_rast_end( struct lp_rasterizer *rast ) { lp_scene_end_rasterization( rast->curr_scene ); rast->curr_scene = NULL; #ifdef DEBUG if (0) debug_printf("Post render scene: tile unswizzle: %u tile swizzle: %u\n", lp_tile_unswizzle_count, lp_tile_swizzle_count); #endif }
/** Rasterize all scene's bins */ static void lp_setup_rasterize_scene( struct lp_setup_context *setup ) { struct lp_scene *scene = setup->scene; struct llvmpipe_screen *screen = llvmpipe_screen(scene->pipe->screen); scene->num_active_queries = setup->active_binned_queries; memcpy(scene->active_queries, setup->active_queries, scene->num_active_queries * sizeof(scene->active_queries[0])); lp_scene_end_binning(scene); lp_fence_reference(&setup->last_fence, scene->fence); if (setup->last_fence) setup->last_fence->issued = TRUE; pipe_mutex_lock(screen->rast_mutex); /* FIXME: We enqueue the scene then wait on the rasterizer to finish. * This means we never actually run any vertex stuff in parallel to * rasterization (not in the same context at least) which is what the * multiple scenes per setup is about - when we get a new empty scene * any old one is already empty again because we waited here for * raster tasks to be finished. Ideally, we shouldn't need to wait here * and rely on fences elsewhere when waiting is necessary. * Certainly, lp_scene_end_rasterization() would need to be deferred too * and there's probably other bits why this doesn't actually work. */ lp_rast_queue_scene(screen->rast, scene); lp_rast_finish(screen->rast); pipe_mutex_unlock(screen->rast_mutex); lp_scene_end_rasterization(setup->scene); lp_setup_reset( setup ); LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__); }
/** Rasterize all scene's bins */ static void lp_setup_rasterize_scene( struct lp_setup_context *setup ) { struct lp_scene *scene = setup->scene; struct llvmpipe_screen *screen = llvmpipe_screen(scene->pipe->screen); lp_scene_end_binning(scene); lp_fence_reference(&setup->last_fence, scene->fence); if (setup->last_fence) setup->last_fence->issued = TRUE; pipe_mutex_lock(screen->rast_mutex); lp_rast_queue_scene(screen->rast, scene); lp_rast_finish(screen->rast); pipe_mutex_unlock(screen->rast_mutex); lp_scene_end_rasterization(setup->scene); lp_setup_reset( setup ); LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__); }
static boolean set_scene_state( struct lp_setup_context *setup, enum setup_state new_state, const char *reason) { unsigned old_state = setup->state; if (old_state == new_state) return TRUE; if (LP_DEBUG & DEBUG_SCENE) { debug_printf("%s old %s new %s%s%s\n", __FUNCTION__, states[old_state], states[new_state], (new_state == SETUP_FLUSHED) ? ": " : "", (new_state == SETUP_FLUSHED) ? reason : ""); if (new_state == SETUP_FLUSHED && setup->scene) lp_debug_draw_bins_by_cmd_length(setup->scene); } /* wait for a free/empty scene */ if (old_state == SETUP_FLUSHED) lp_setup_get_empty_scene(setup); switch (new_state) { case SETUP_CLEARED: break; case SETUP_ACTIVE: if (!begin_binning( setup )) goto fail; break; case SETUP_FLUSHED: if (old_state == SETUP_CLEARED) if (!execute_clears( setup )) goto fail; lp_setup_rasterize_scene( setup ); assert(setup->scene == NULL); break; default: assert(0 && "invalid setup state mode"); goto fail; } setup->state = new_state; return TRUE; fail: if (setup->scene) { lp_scene_end_rasterization(setup->scene); setup->scene = NULL; } setup->state = SETUP_FLUSHED; lp_setup_reset( setup ); return FALSE; }