struct draw_pt_middle_end *draw_pt_fetch_pipeline_or_emit( struct draw_context *draw ) { struct fetch_pipeline_middle_end *fpme = CALLOC_STRUCT( fetch_pipeline_middle_end ); if (!fpme) goto fail; fpme->base.prepare = fetch_pipeline_prepare; fpme->base.run = fetch_pipeline_run; fpme->base.run_linear = fetch_pipeline_linear_run; fpme->base.run_linear_elts = fetch_pipeline_linear_run_elts; fpme->base.finish = fetch_pipeline_finish; fpme->base.destroy = fetch_pipeline_destroy; fpme->draw = draw; fpme->fetch = draw_pt_fetch_create( draw ); if (!fpme->fetch) goto fail; fpme->post_vs = draw_pt_post_vs_create( draw ); if (!fpme->post_vs) goto fail; fpme->emit = draw_pt_emit_create( draw ); if (!fpme->emit) goto fail; return &fpme->base; fail: if (fpme) fetch_pipeline_destroy( &fpme->base ); return NULL; }
struct draw_pt_middle_end * draw_pt_fetch_pipeline_or_emit_llvm(struct draw_context *draw) { struct llvm_middle_end *fpme = 0; if (!draw->llvm) return NULL; fpme = CALLOC_STRUCT( llvm_middle_end ); if (!fpme) goto fail; fpme->base.prepare = llvm_middle_end_prepare; fpme->base.bind_parameters = llvm_middle_end_bind_parameters; fpme->base.run = llvm_middle_end_run; fpme->base.run_linear = llvm_middle_end_linear_run; fpme->base.run_linear_elts = llvm_middle_end_linear_run_elts; fpme->base.finish = llvm_middle_end_finish; fpme->base.destroy = llvm_middle_end_destroy; fpme->draw = draw; fpme->fetch = draw_pt_fetch_create( draw ); if (!fpme->fetch) goto fail; fpme->post_vs = draw_pt_post_vs_create( draw ); if (!fpme->post_vs) goto fail; fpme->emit = draw_pt_emit_create( draw ); if (!fpme->emit) goto fail; fpme->so_emit = draw_pt_so_emit_create( draw ); if (!fpme->so_emit) goto fail; fpme->llvm = draw->llvm; if (!fpme->llvm) goto fail; fpme->current_variant = NULL; return &fpme->base; fail: if (fpme) llvm_middle_end_destroy( &fpme->base ); return NULL; }