From a84a1e344f544ec4da61809d4f09853a94d93e07 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 3 Dec 2010 00:44:43 +0800 Subject: st/vega: Move vertex transformation to shader. It was done in path-to-polygon conversion. That meant that the results were invalidated when the transformation was modified, and CPU had to recreate the vertex buffer with new vertices. It could be a performance hit for apps that animate. --- src/gallium/state_trackers/vega/path.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'src/gallium/state_trackers/vega/path.c') diff --git a/src/gallium/state_trackers/vega/path.c b/src/gallium/state_trackers/vega/path.c index 31a043ea9b..d7253befd0 100644 --- a/src/gallium/state_trackers/vega/path.c +++ b/src/gallium/state_trackers/vega/path.c @@ -1565,10 +1565,11 @@ void path_render(struct path *p, VGbitfield paintModes, mat, &paint_matrix)) { /* First the fill */ + shader_set_surface_matrix(ctx->shader, mat); shader_set_paint(ctx->shader, ctx->state.vg.fill_paint); shader_set_paint_matrix(ctx->shader, &paint_matrix); shader_bind(ctx->shader); - path_fill(p, mat); + path_fill(p); } if ((paintModes & VG_STROKE_PATH) && @@ -1580,18 +1581,23 @@ void path_render(struct path *p, VGbitfield paintModes, * taking place."*/ if (ctx->state.vg.stroke.line_width.f <= 0) return; + shader_set_surface_matrix(ctx->shader, mat); shader_set_paint(ctx->shader, ctx->state.vg.stroke_paint); shader_set_paint_matrix(ctx->shader, &paint_matrix); shader_bind(ctx->shader); - path_stroke(p, mat); + path_stroke(p); } } -void path_fill(struct path *p, struct matrix *mat) +void path_fill(struct path *p) { struct vg_context *ctx = vg_current_context(); + struct matrix identity; + + matrix_load_identity(&identity); + { - struct polygon_array *polygon_array = path_get_fill_polygons(p, mat); + struct polygon_array *polygon_array = path_get_fill_polygons(p, &identity); struct array *polys = polygon_array->array; if (!polygon_array || !polys || !polys->num_elements) { @@ -1601,7 +1607,7 @@ void path_fill(struct path *p, struct matrix *mat) } } -void path_stroke(struct path *p, struct matrix *mat) +void path_stroke(struct path *p) { struct vg_context *ctx = vg_current_context(); VGFillRule old_fill = ctx->state.vg.fill_rule; @@ -1613,7 +1619,7 @@ void path_stroke(struct path *p, struct matrix *mat) if (stroke && !path_is_empty(stroke)) { ctx->state.vg.fill_rule = VG_NON_ZERO; - path_fill(stroke, mat); + path_fill(stroke); ctx->state.vg.fill_rule = old_fill; } -- cgit v1.2.3