void draw_aapoint_prepare_outputs(struct draw_context *draw, struct draw_stage *stage) { struct aapoint_stage *aapoint = aapoint_stage(stage); const struct pipe_rasterizer_state *rast = draw->rasterizer; /* update vertex attrib info */ aapoint->pos_slot = draw_current_shader_position_output(draw); if (!rast->point_smooth) return; /* allocate the extra post-transformed vertex attribute */ aapoint->tex_slot = draw_alloc_extra_vertex_attrib(draw, TGSI_SEMANTIC_GENERIC, aapoint->fs->generic_attrib); assert(aapoint->tex_slot > 0); /* output[0] is vertex pos */ /* find psize slot in post-transform vertex */ aapoint->psize_slot = -1; if (draw->rasterizer->point_size_per_vertex) { const struct tgsi_shader_info *info = draw_get_shader_info(draw); uint i; /* find PSIZ vertex output */ for (i = 0; i < info->num_outputs; i++) { if (info->output_semantic_name[i] == TGSI_SEMANTIC_PSIZE) { aapoint->psize_slot = i; break; } } } }
static void aaline_first_line(struct draw_stage *stage, struct prim_header *header) { auto struct aaline_stage *aaline = aaline_stage(stage); struct draw_context *draw = stage->draw; struct pipe_context *pipe = draw->pipe; const struct pipe_rasterizer_state *rast = draw->rasterizer; uint num_samplers; void *r; assert(draw->rasterizer->line_smooth); if (draw->rasterizer->line_width <= 2.2) aaline->half_line_width = 1.1f; else aaline->half_line_width = 0.5f * draw->rasterizer->line_width; /* * Bind (generate) our fragprog, sampler and texture */ if (!bind_aaline_fragment_shader(aaline)) { stage->line = draw_pipe_passthrough_line; stage->line(stage, header); return; } /* update vertex attrib info */ aaline->tex_slot = draw_current_shader_outputs(draw); aaline->pos_slot = draw_current_shader_position_output(draw);; /* allocate the extra post-transformed vertex attribute */ (void) draw_alloc_extra_vertex_attrib(draw, TGSI_SEMANTIC_GENERIC, aaline->fs->generic_attrib); /* how many samplers? */ /* we'll use sampler/texture[pstip->sampler_unit] for the stipple */ num_samplers = MAX2(aaline->num_sampler_views, aaline->num_samplers); num_samplers = MAX2(num_samplers, aaline->fs->sampler_unit + 1); aaline->state.sampler[aaline->fs->sampler_unit] = aaline->sampler_cso; pipe_sampler_view_reference(&aaline->state.sampler_views[aaline->fs->sampler_unit], aaline->sampler_view); draw->suspend_flushing = TRUE; aaline->driver_bind_sampler_states(pipe, num_samplers, aaline->state.sampler); aaline->driver_set_sampler_views(pipe, num_samplers, aaline->state.sampler_views); /* 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 line */ stage->line = aaline_line; stage->line(stage, header); }
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); /* update vertex attrib info */ aapoint->pos_slot = draw_current_shader_position_output(draw); /* allocate the extra post-transformed vertex attribute */ aapoint->tex_slot = draw_alloc_extra_vertex_attrib(draw, TGSI_SEMANTIC_GENERIC, aapoint->fs->generic_attrib); assert(aapoint->tex_slot > 0); /* output[0] is vertex pos */ /* find psize slot in post-transform vertex */ aapoint->psize_slot = -1; if (draw->rasterizer->point_size_per_vertex) { const struct tgsi_shader_info *info = draw_get_shader_info(draw); uint i; /* find PSIZ vertex output */ for (i = 0; i < info->num_outputs; i++) { if (info->output_semantic_name[i] == TGSI_SEMANTIC_PSIZE) { aapoint->psize_slot = i; break; } } } 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); }
void draw_prim_assembler_prepare_outputs(struct draw_assembler *ia) { struct draw_context *draw = ia->draw; if (needs_primid(draw)) { ia->primid_slot = draw_alloc_extra_vertex_attrib( ia->draw, TGSI_SEMANTIC_PRIMID, 0); } else { ia->primid_slot = -1; } ia->primid = 0; }
void draw_aaline_prepare_outputs(struct draw_context *draw, struct draw_stage *stage) { struct aaline_stage *aaline = aaline_stage(stage); const struct pipe_rasterizer_state *rast = draw->rasterizer; /* update vertex attrib info */ aaline->pos_slot = draw_current_shader_position_output(draw);; if (!rast->line_smooth) return; /* allocate the extra post-transformed vertex attribute */ aaline->tex_slot = draw_alloc_extra_vertex_attrib(draw, TGSI_SEMANTIC_GENERIC, aaline->fs->generic_attrib); }
static void widepoint_first_point(struct draw_stage *stage, struct prim_header *header) { struct widepoint_stage *wide = widepoint_stage(stage); struct draw_context *draw = stage->draw; struct pipe_context *pipe = draw->pipe; const struct pipe_rasterizer_state *rast = draw->rasterizer; void *r; wide->half_point_size = 0.5f * rast->point_size; wide->xbias = 0.0; wide->ybias = 0.0; if (rast->half_pixel_center) { wide->xbias = 0.125; wide->ybias = -0.125; } /* Disable triangle culling, stippling, unfilled mode etc. */ r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade); draw->suspend_flushing = TRUE; pipe->bind_rasterizer_state(pipe, r); draw->suspend_flushing = FALSE; /* XXX we won't know the real size if it's computed by the vertex shader! */ if ((rast->point_size > draw->pipeline.wide_point_threshold) || (rast->point_quad_rasterization && draw->pipeline.point_sprite)) { stage->point = widepoint_point; } else { stage->point = draw_pipe_passthrough_point; } draw_remove_extra_vertex_attribs(draw); if (rast->point_quad_rasterization) { const struct draw_fragment_shader *fs = draw->fs.fragment_shader; uint i; assert(fs); wide->num_texcoord_gen = 0; /* Loop over fragment shader inputs looking for the PCOORD input or inputs * for which bit 'k' in sprite_coord_enable is set. */ for (i = 0; i < fs->info.num_inputs; i++) { int slot; const unsigned sn = fs->info.input_semantic_name[i]; const unsigned si = fs->info.input_semantic_index[i]; if (sn == wide->sprite_coord_semantic) { /* Note that sprite_coord_enable is a bitfield of 32 bits. */ if (si >= 32 || !(rast->sprite_coord_enable & (1 << si))) continue; } else if (sn != TGSI_SEMANTIC_PCOORD) { continue; } /* OK, this generic attribute needs to be replaced with a * sprite coord (see above). */ slot = draw_alloc_extra_vertex_attrib(draw, sn, si); /* add this slot to the texcoord-gen list */ wide->texcoord_gen_slot[wide->num_texcoord_gen++] = slot; } } wide->psize_slot = -1; if (rast->point_size_per_vertex) { /* find PSIZ vertex output */ const struct draw_vertex_shader *vs = draw->vs.vertex_shader; uint i; for (i = 0; i < vs->info.num_outputs; i++) { if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_PSIZE) { wide->psize_slot = i; break; } } } stage->point( stage, header ); }