diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/pipe/draw/draw_wide_prims.c | 25 | ||||
-rw-r--r-- | src/mesa/pipe/p_state.h | 1 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_atom_rasterizer.c | 1 |
3 files changed, 26 insertions, 1 deletions
diff --git a/src/mesa/pipe/draw/draw_wide_prims.c b/src/mesa/pipe/draw/draw_wide_prims.c index 917944a6110..e61cc2e025d 100644 --- a/src/mesa/pipe/draw/draw_wide_prims.c +++ b/src/mesa/pipe/draw/draw_wide_prims.c @@ -43,6 +43,8 @@ struct wide_stage { uint texcoord_slot[PIPE_MAX_SHADER_OUTPUTS]; uint texcoord_mode[PIPE_MAX_SHADER_OUTPUTS]; uint num_texcoords; + + int psize_slot; }; @@ -158,7 +160,7 @@ static void wide_point( struct draw_stage *stage, { const struct wide_stage *wide = wide_stage(stage); const boolean sprite = stage->draw->rasterizer->point_sprite; - float half_size = wide->half_point_size; + float half_size; float left_adj, right_adj; struct prim_header tri; @@ -174,6 +176,14 @@ static void wide_point( struct draw_stage *stage, float *pos2 = v2->data[0]; float *pos3 = v3->data[0]; + /* point size is either per-vertex or fixed size */ + if (wide->psize_slot >= 0) { + half_size = header->v[0]->data[wide->psize_slot][0]; + } + else { + half_size = wide->half_point_size; + } + left_adj = -half_size + 0.25; right_adj = half_size + 0.25; @@ -248,6 +258,19 @@ static void wide_begin( struct draw_stage *stage ) } wide->num_texcoords = j; } + + wide->psize_slot = -1; + if (draw->rasterizer->point_size_per_vertex) { + /* find PSIZ vertex output */ + const struct draw_vertex_shader *vs = draw->vertex_shader; + uint i; + for (i = 0; i < vs->state->num_outputs; i++) { + if (vs->state->output_semantic_name[i] == TGSI_SEMANTIC_PSIZE) { + wide->psize_slot = i; + break; + } + } + } stage->next->begin( stage->next ); } diff --git a/src/mesa/pipe/p_state.h b/src/mesa/pipe/p_state.h index ecbcbd098af..4a18d25ab89 100644 --- a/src/mesa/pipe/p_state.h +++ b/src/mesa/pipe/p_state.h @@ -86,6 +86,7 @@ struct pipe_rasterizer_state unsigned poly_stipple_enable:1; unsigned point_smooth:1; unsigned point_sprite:1; + unsigned point_size_per_vertex:1; /**< size computed in vertex shader */ unsigned multisample:1; /* XXX maybe more ms state in future */ unsigned line_smooth:1; unsigned line_stipple_enable:1; diff --git a/src/mesa/state_tracker/st_atom_rasterizer.c b/src/mesa/state_tracker/st_atom_rasterizer.c index 9f857e28375..2a7128dd27c 100644 --- a/src/mesa/state_tracker/st_atom_rasterizer.c +++ b/src/mesa/state_tracker/st_atom_rasterizer.c @@ -201,6 +201,7 @@ static void update_raster_state( struct st_context *st ) raster.sprite_coord_mode[i] = PIPE_SPRITE_COORD_NONE; } } + raster.point_size_per_vertex = ctx->VertexProgram.PointSizeEnabled; /* _NEW_LINE */ |