/** * Put a BeginQuery command into all bins. */ void lp_setup_begin_query(struct lp_setup_context *setup, struct llvmpipe_query *pq) { /* init the query to its beginning state */ assert(setup->active_query == NULL); if (setup->scene) { if (!lp_scene_bin_everywhere(setup->scene, LP_RAST_OP_BEGIN_QUERY, lp_rast_arg_query(pq))) { lp_setup_flush_and_restart(setup); if (!lp_scene_bin_everywhere(setup->scene, LP_RAST_OP_BEGIN_QUERY, lp_rast_arg_query(pq))) { assert(0); return; } } } setup->active_query = pq; }
/** * Put a BeginQuery command into all bins. */ void lp_setup_begin_query(struct lp_setup_context *setup, struct llvmpipe_query *pq) { /* init the query to its beginning state */ assert(setup->active_query[pq->type] == NULL); set_scene_state(setup, SETUP_ACTIVE, "begin_query"); setup->active_query[pq->type] = pq; /* XXX: It is possible that a query is created before the scene * has been created. This means that setup->scene == NULL resulting * in the query not being binned and thus is ignored. */ if (setup->scene) { if (!lp_scene_bin_everywhere(setup->scene, LP_RAST_OP_BEGIN_QUERY, lp_rast_arg_query(pq))) { if (!lp_setup_flush_and_restart(setup)) return; if (!lp_scene_bin_everywhere(setup->scene, LP_RAST_OP_BEGIN_QUERY, lp_rast_arg_query(pq))) { return; } } } }
static void lp_setup_line( struct lp_setup_context *setup, const float (*v0)[4], const float (*v1)[4] ) { if (!try_setup_line( setup, v0, v1 )) { if (!lp_setup_flush_and_restart(setup)) return; if (!try_setup_line( setup, v0, v1 )) return; } }
/** * Put a BeginQuery command into all bins. */ void lp_setup_begin_query(struct lp_setup_context *setup, struct llvmpipe_query *pq) { set_scene_state(setup, SETUP_ACTIVE, "begin_query"); if (!(pq->type == PIPE_QUERY_OCCLUSION_COUNTER || pq->type == PIPE_QUERY_OCCLUSION_PREDICATE || pq->type == PIPE_QUERY_PIPELINE_STATISTICS)) return; /* init the query to its beginning state */ assert(setup->active_binned_queries < LP_MAX_ACTIVE_BINNED_QUERIES); /* exceeding list size so just ignore the query */ if (setup->active_binned_queries >= LP_MAX_ACTIVE_BINNED_QUERIES) { return; } assert(setup->active_queries[setup->active_binned_queries] == NULL); setup->active_queries[setup->active_binned_queries] = pq; setup->active_binned_queries++; assert(setup->scene); if (setup->scene) { if (!lp_scene_bin_everywhere(setup->scene, LP_RAST_OP_BEGIN_QUERY, lp_rast_arg_query(pq))) { if (!lp_setup_flush_and_restart(setup)) return; if (!lp_scene_bin_everywhere(setup->scene, LP_RAST_OP_BEGIN_QUERY, lp_rast_arg_query(pq))) { return; } } setup->scene->had_queries |= TRUE; } }
void lp_setup_update_state( struct lp_setup_context *setup, boolean update_scene ) { /* Some of the 'draw' pipeline stages may have changed some driver state. * Make sure we've processed those state changes before anything else. * * XXX this is the only place where llvmpipe_context is used in the * setup code. This may get refactored/changed... */ { struct llvmpipe_context *lp = llvmpipe_context(setup->pipe); if (lp->dirty) { llvmpipe_update_derived(lp); } /* Will probably need to move this somewhere else, just need * to know about vertex shader point size attribute. */ setup->psize = lp->psize_slot; assert(lp->dirty == 0); } if (update_scene) set_scene_state( setup, SETUP_ACTIVE, __FUNCTION__ ); /* Only call into update_scene_state() if we already have a * scene: */ if (update_scene && setup->scene) { assert(setup->state == SETUP_ACTIVE); if (!try_update_scene_state(setup)) { lp_setup_flush_and_restart(setup); if (!try_update_scene_state(setup)) assert(0); } } }
/** * Put an EndQuery command into all bins. */ void lp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq) { set_scene_state(setup, SETUP_ACTIVE, "end_query"); assert(setup->scene); if (setup->scene) { /* pq->fence should be the fence of the *last* scene which * contributed to the query result. */ lp_fence_reference(&pq->fence, setup->scene->fence); if (pq->type == PIPE_QUERY_OCCLUSION_COUNTER || pq->type == PIPE_QUERY_OCCLUSION_PREDICATE || pq->type == PIPE_QUERY_PIPELINE_STATISTICS || pq->type == PIPE_QUERY_TIMESTAMP) { if (pq->type == PIPE_QUERY_TIMESTAMP && !(setup->scene->tiles_x | setup->scene->tiles_y)) { /* * If there's a zero width/height framebuffer, there's no bins and * hence no rast task is ever run. So fill in something here instead. */ pq->end[0] = os_time_get_nano(); } if (!lp_scene_bin_everywhere(setup->scene, LP_RAST_OP_END_QUERY, lp_rast_arg_query(pq))) { if (!lp_setup_flush_and_restart(setup)) goto fail; if (!lp_scene_bin_everywhere(setup->scene, LP_RAST_OP_END_QUERY, lp_rast_arg_query(pq))) { goto fail; } } setup->scene->had_queries |= TRUE; } } else { lp_fence_reference(&pq->fence, setup->last_fence); } fail: /* Need to do this now not earlier since it still needs to be marked as * active when binning it would cause a flush. */ if (pq->type == PIPE_QUERY_OCCLUSION_COUNTER || pq->type == PIPE_QUERY_OCCLUSION_PREDICATE || pq->type == PIPE_QUERY_PIPELINE_STATISTICS) { unsigned i; /* remove from active binned query list */ for (i = 0; i < setup->active_binned_queries; i++) { if (setup->active_queries[i] == pq) break; } assert(i < setup->active_binned_queries); if (i == setup->active_binned_queries) return; setup->active_binned_queries--; setup->active_queries[i] = setup->active_queries[setup->active_binned_queries]; setup->active_queries[setup->active_binned_queries] = NULL; } }