diff options
author | Chia-I Wu <[email protected]> | 2010-11-27 22:05:37 +0800 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2010-12-01 11:23:49 +0800 |
commit | 438359597cd4254558f4d2fd5b54eb32c03e1b4c (patch) | |
tree | a1b7101f867a562cf932dac5da313ec785681d5d /src/gallium/state_trackers/vega/vg_context.c | |
parent | 3b71cb6ad6dabfefc9363a35872f4e70e1125603 (diff) |
st/vega: Delay fb state update to vg_validate_state.
vg_manager_validate_framebuffer should mark the fb dirty and have
vg_validate_state call cso_set_framebuffer. Rename VIEWPORT_DIRTY to
FRAMEBUFFER_DIRTY.
Diffstat (limited to 'src/gallium/state_trackers/vega/vg_context.c')
-rw-r--r-- | src/gallium/state_trackers/vega/vg_context.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/src/gallium/state_trackers/vega/vg_context.c b/src/gallium/state_trackers/vega/vg_context.c index d5347838807..037505e2365 100644 --- a/src/gallium/state_trackers/vega/vg_context.c +++ b/src/gallium/state_trackers/vega/vg_context.c @@ -387,27 +387,45 @@ void vg_validate_state(struct vg_context *ctx) raster->gl_rasterization_rules = 1; cso_set_rasterizer(ctx->cso_context, &ctx->state.g3d.rasterizer); } - if ((ctx->state.dirty & VIEWPORT_DIRTY)) { + if ((ctx->state.dirty & FRAMEBUFFER_DIRTY)) { struct pipe_framebuffer_state *fb = &ctx->state.g3d.fb; - const VGint param_bytes = 8 * sizeof(VGfloat); - VGfloat vs_consts[8] = { - 2.f/fb->width, 2.f/fb->height, 1, 1, - -1, -1, 0, 0 - }; struct pipe_resource **cbuf = &ctx->vs_const_buffer; + VGfloat vs_consts[8]; + memset(fb, 0, sizeof(struct pipe_framebuffer_state)); + fb->width = ctx->draw_buffer->width; + fb->height = ctx->draw_buffer->height; + fb->nr_cbufs = 1; + fb->cbufs[0] = ctx->draw_buffer->strb->surface; + fb->zsbuf = ctx->draw_buffer->dsrb->surface; + + cso_set_framebuffer(ctx->cso_context, fb); vg_set_viewport(ctx, VEGA_Y0_BOTTOM); + /* surface coordinates to clipped coordinates */ + vs_consts[0] = 2.0f / fb->width; + vs_consts[1] = 2.0f / fb->height; + vs_consts[2] = 1.0f; + vs_consts[3] = 1.0f; + vs_consts[4] = -1.0f; + vs_consts[5] = -1.0f; + vs_consts[6] = 0.0f; + vs_consts[7] = 0.0f; + pipe_resource_reference(cbuf, NULL); *cbuf = pipe_buffer_create(ctx->pipe->screen, PIPE_BIND_CONSTANT_BUFFER, - param_bytes); + sizeof(vs_consts)); if (*cbuf) { st_no_flush_pipe_buffer_write(ctx, *cbuf, - 0, param_bytes, vs_consts); + 0, sizeof(vs_consts), vs_consts); } ctx->pipe->set_constant_buffer(ctx->pipe, PIPE_SHADER_VERTEX, 0, *cbuf); + + /* we also got a new depth buffer */ + if ((ctx->state.dirty & DEPTH_STENCIL_DIRTY)) + ctx->pipe->clear(ctx->pipe, PIPE_CLEAR_DEPTHSTENCIL, NULL, 0.0, 0); } if ((ctx->state.dirty & VS_DIRTY)) { cso_set_vertex_shader_handle(ctx->cso_context, |