aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mesa/pipe/draw/draw_wide_prims.c25
-rw-r--r--src/mesa/pipe/p_state.h1
-rw-r--r--src/mesa/state_tracker/st_atom_rasterizer.c1
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
*/