Lines Matching refs:rast
70 lp_rast_begin(struct lp_rasterizer *rast,
73 rast->curr_scene = scene;
83 lp_rast_end(struct lp_rasterizer *rast)
85 rast->curr_scene = NULL;
1058 if (!task->rast->no_rast) {
1099 lp_rast_queue_scene(struct lp_rasterizer *rast,
1104 lp_fence_reference(&rast->last_fence, scene->fence);
1105 if (rast->last_fence)
1106 rast->last_fence->issued = TRUE;
1108 if (rast->num_threads == 0) {
1117 lp_rast_begin(rast, scene);
1119 rasterize_scene(&rast->tasks[0], scene);
1121 lp_rast_end(rast);
1125 rast->curr_scene = NULL;
1131 lp_scene_enqueue(rast->full_scenes, scene);
1134 for (i = 0; i < rast->num_threads; i++) {
1135 pipe_semaphore_signal(&rast->tasks[i].work_ready);
1144 lp_rast_finish(struct lp_rasterizer *rast)
1146 if (rast->num_threads == 0) {
1153 for (i = 0; i < rast->num_threads; i++) {
1154 pipe_semaphore_wait(&rast->tasks[i].work_done);
1171 struct lp_rasterizer *rast = task->rast;
1190 if (rast->exit_flag)
1198 lp_rast_begin(rast, lp_scene_dequeue(rast->full_scenes, TRUE));
1202 * get a null rast->curr_scene pointer.
1204 util_barrier_wait(&rast->barrier);
1210 rasterize_scene(task, rast->curr_scene);
1213 util_barrier_wait(&rast->barrier);
1218 lp_rast_end(rast);
1240 create_rast_threads(struct lp_rasterizer *rast)
1243 for (unsigned i = 0; i < rast->num_threads; i++) {
1244 pipe_semaphore_init(&rast->tasks[i].work_ready, 0);
1245 pipe_semaphore_init(&rast->tasks[i].work_done, 0);
1246 if (thrd_success != u_thread_create(rast->threads + i, thread_function,
1247 (void *) &rast->tasks[i])) {
1248 rast->num_threads = i; /* previous thread is max */
1263 struct lp_rasterizer *rast;
1266 rast = CALLOC_STRUCT(lp_rasterizer);
1267 if (!rast) {
1271 rast->full_scenes = lp_scene_queue_create();
1272 if (!rast->full_scenes) {
1277 struct lp_rasterizer_task *task = &rast->tasks[i];
1278 task->rast = rast;
1287 rast->num_threads = num_threads;
1289 rast->no_rast = debug_get_bool_option("LP_NO_RAST", FALSE);
1291 create_rast_threads(rast);
1294 if (rast->num_threads > 0) {
1295 util_barrier_init(&rast->barrier, rast->num_threads);
1300 return rast;
1303 for (i = 0; i < MAX2(1, rast->num_threads); i++) {
1304 if (rast->tasks[i].thread_data.cache) {
1305 align_free(rast->tasks[i].thread_data.cache);
1309 lp_scene_queue_destroy(rast->full_scenes);
1311 FREE(rast);
1320 lp_rast_destroy(struct lp_rasterizer *rast)
1326 rast->exit_flag = TRUE;
1327 for (unsigned i = 0; i < rast->num_threads; i++) {
1328 pipe_semaphore_signal(&rast->tasks[i].work_ready);
1334 for (unsigned i = 0; i < rast->num_threads; i++) {
1340 if (GetExitCodeThread(rast->threads[i], &exit_code) &&
1342 pipe_semaphore_wait(&rast->tasks[i].work_done);
1345 thrd_join(rast->threads[i], NULL);
1350 for (unsigned i = 0; i < rast->num_threads; i++) {
1351 pipe_semaphore_destroy(&rast->tasks[i].work_ready);
1352 pipe_semaphore_destroy(&rast->tasks[i].work_done);
1354 for (unsigned i = 0; i < MAX2(1, rast->num_threads); i++) {
1355 align_free(rast->tasks[i].thread_data.cache);
1358 lp_fence_reference(&rast->last_fence, NULL);
1361 if (rast->num_threads > 0) {
1362 util_barrier_destroy(&rast->barrier);
1365 lp_scene_queue_destroy(rast->full_scenes);
1367 FREE(rast);
1370 void lp_rast_fence(struct lp_rasterizer *rast,
1374 lp_fence_reference((struct lp_fence **)fence, rast->last_fence);