static void aapoint_first_point(struct draw_stage *stage, struct prim_header *header) { auto struct aapoint_stage *aapoint = aapoint_stage(stage); struct draw_context *draw = stage->draw; struct pipe_context *pipe = draw->pipe; const struct pipe_rasterizer_state *rast = draw->rasterizer; void *r; assert(draw->rasterizer->point_smooth); if (draw->rasterizer->point_size <= 2.0) aapoint->radius = 1.0; else aapoint->radius = 0.5f * draw->rasterizer->point_size; /* * Bind (generate) our fragprog. */ bind_aapoint_fragment_shader(aapoint); draw_aapoint_prepare_outputs(draw, draw->pipeline.aapoint); draw->suspend_flushing = TRUE; /* Disable triangle culling, stippling, unfilled mode etc. */ r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade); pipe->bind_rasterizer_state(pipe, r); draw->suspend_flushing = FALSE; /* now really draw first point */ stage->point = aapoint_point; stage->point(stage, header); }
/** * Prepare outputs slots from the draw module * * Certain parts of the draw module can emit additional * outputs that can be quite useful to the backends, a good * example of it is the process of decomposing primitives * into wireframes (aka. lines) which normally would lose * the face-side information, but using this method we can * inject another shader output which passes the original * face side information to the backend. */ void draw_prepare_shader_outputs(struct draw_context *draw) { draw_remove_extra_vertex_attribs(draw); draw_prim_assembler_prepare_outputs(draw->ia); draw_unfilled_prepare_outputs(draw, draw->pipeline.unfilled); if (draw->pipeline.aapoint) draw_aapoint_prepare_outputs(draw, draw->pipeline.aapoint); if (draw->pipeline.aaline) draw_aaline_prepare_outputs(draw, draw->pipeline.aaline); }