From: Chia-I Wu Date: Wed, 1 Dec 2010 09:13:09 +0000 (+0800) Subject: st/vega: Initialize pipe states with renderer. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d7a6901cac48cc3c4eea24113e108ef9dce843c4;p=mesa.git st/vega: Initialize pipe states with renderer. Initialize vertex elements, rasterizer, stencil ref, and vertex shader with renderer_create. Remove RASTERIZER_DIRTY and VS_DIRTY flags. --- diff --git a/src/gallium/state_trackers/vega/renderer.c b/src/gallium/state_trackers/vega/renderer.c index 8a195f316be..7d0ff32e95e 100644 --- a/src/gallium/state_trackers/vega/renderer.c +++ b/src/gallium/state_trackers/vega/renderer.c @@ -508,7 +508,6 @@ static void renderer_quad_draw(struct renderer *r) sizeof(r->vertices), PIPE_BIND_VERTEX_BUFFER); if (buf) { - cso_set_vertex_elements(r->cso, 2, r->velems); util_draw_vertex_buffer(r->pipe, buf, 0, PIPE_PRIM_TRIANGLE_FAN, Elements(r->vertices), /* verts */ @@ -912,6 +911,7 @@ VGboolean renderer_polygon_stencil_begin(struct renderer *renderer, assert(renderer->state == RENDERER_STATE_INIT); + cso_save_vertex_elements(renderer->cso); cso_save_blend(renderer->cso); cso_save_depth_stencil_alpha(renderer->cso); @@ -1015,6 +1015,8 @@ void renderer_polygon_stencil_end(struct renderer *renderer) if (renderer->u.polygon_stencil.manual_two_sides) cso_restore_rasterizer(renderer->cso); + cso_restore_vertex_elements(renderer->cso); + /* restore color writes */ cso_restore_blend(renderer->cso); @@ -1031,17 +1033,12 @@ VGboolean renderer_polygon_fill_begin(struct renderer *renderer, VGboolean save_dsa) { struct pipe_depth_stencil_alpha_state dsa; - struct pipe_stencil_ref sr; assert(renderer->state == RENDERER_STATE_INIT); if (save_dsa) cso_save_depth_stencil_alpha(renderer->cso); - /* only need a fixed 0. Rely on default or move it out at least? */ - memset(&sr, 0, sizeof(sr)); - cso_set_stencil_ref(renderer->cso, &sr); - /* setup stencil ops */ memset(&dsa, 0, sizeof(dsa)); dsa.stencil[0].enabled = 1; @@ -1086,9 +1083,12 @@ void renderer_polygon_fill_end(struct renderer *renderer) struct renderer * renderer_create(struct vg_context *owner) { + struct renderer *renderer; + struct pipe_rasterizer_state *raster; + struct pipe_stencil_ref sr; VGint i; - struct renderer *renderer = CALLOC_STRUCT(renderer); + renderer = CALLOC_STRUCT(renderer); if (!renderer) return NULL; @@ -1105,6 +1105,19 @@ struct renderer * renderer_create(struct vg_context *owner) renderer->velems[i].vertex_buffer_index = 0; renderer->velems[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; } + cso_set_vertex_elements(renderer->cso, 2, renderer->velems); + + /* GL rasterization rules */ + raster = &renderer->g3d.rasterizer; + memset(raster, 0, sizeof(*raster)); + raster->gl_rasterization_rules = 1; + cso_set_rasterizer(renderer->cso, raster); + + /* fixed at 0 */ + memset(&sr, 0, sizeof(sr)); + cso_set_stencil_ref(renderer->cso, &sr); + + renderer_set_vs(renderer, RENDERER_VS_PLAIN); renderer->state = RENDERER_STATE_INIT; @@ -1258,13 +1271,6 @@ void renderer_validate(struct renderer *renderer, cso_set_blend(renderer->cso, &blend); } - if (dirty & RASTERIZER_DIRTY) { - struct pipe_rasterizer_state *raster = &renderer->g3d.rasterizer; - memset(raster, 0, sizeof(struct pipe_rasterizer_state)); - raster->gl_rasterization_rules = 1; - cso_set_rasterizer(renderer->cso, raster); - } - if (dirty & FRAMEBUFFER_DIRTY) { struct pipe_framebuffer_state *fb = &renderer->g3d.fb; struct pipe_resource **cbuf = &renderer->vs_const_buffer; @@ -1309,9 +1315,6 @@ void renderer_validate(struct renderer *renderer, } } - if (dirty & VS_DIRTY) - renderer_set_vs(renderer, RENDERER_VS_PLAIN); - /* must be last because it renders to the depth buffer*/ if (dirty & DEPTH_STENCIL_DIRTY) { update_clip_state(renderer, state); diff --git a/src/gallium/state_trackers/vega/vg_context.c b/src/gallium/state_trackers/vega/vg_context.c index beb5f06da0d..5b072655c74 100644 --- a/src/gallium/state_trackers/vega/vg_context.c +++ b/src/gallium/state_trackers/vega/vg_context.c @@ -407,7 +407,7 @@ void vg_validate_state(struct vg_context *ctx) renderer_validate(ctx->renderer, ctx->state.dirty, ctx->draw_buffer, &ctx->state.vg); - ctx->state.dirty = NONE_DIRTY; + ctx->state.dirty = 0; shader_set_masking(ctx->shader, ctx->state.vg.masking); shader_set_image_mode(ctx->shader, ctx->state.vg.image_mode); diff --git a/src/gallium/state_trackers/vega/vg_context.h b/src/gallium/state_trackers/vega/vg_context.h index 7e921151e71..d616a20a3d9 100644 --- a/src/gallium/state_trackers/vega/vg_context.h +++ b/src/gallium/state_trackers/vega/vg_context.h @@ -78,14 +78,13 @@ enum vg_object_type { VG_OBJECT_LAST }; enum dirty_state { - NONE_DIRTY = 0<<0, - BLEND_DIRTY = 1<<1, - RASTERIZER_DIRTY = 1<<2, - FRAMEBUFFER_DIRTY = 1<<3, - VS_DIRTY = 1<<4, - DEPTH_STENCIL_DIRTY = 1<<5, - ALL_DIRTY = BLEND_DIRTY | RASTERIZER_DIRTY | - FRAMEBUFFER_DIRTY | VS_DIRTY | DEPTH_STENCIL_DIRTY + BLEND_DIRTY = 1 << 0, + FRAMEBUFFER_DIRTY = 1 << 1, + DEPTH_STENCIL_DIRTY = 1 << 2, + + ALL_DIRTY = BLEND_DIRTY | + FRAMEBUFFER_DIRTY | + DEPTH_STENCIL_DIRTY }; struct vg_context