Browse Source

u_blitter: restore some states conditionally

tags/mesa-8.0-rc1
Marek Olšák 14 years ago
parent
commit
363295d720
1 changed files with 17 additions and 12 deletions
  1. 17
    12
      src/gallium/auxiliary/util/u_blitter.c

+ 17
- 12
src/gallium/auxiliary/util/u_blitter.c View File

@@ -26,8 +26,8 @@

/**
* @file
* Blitter utility to facilitate acceleration of the clear, clear_render_target, clear_depth_stencil
* resource_copy_region functions.
* Blitter utility to facilitate acceleration of the clear, clear_render_target,
* clear_depth_stencil, and resource_copy_region functions.
*
* @author Marek Olšák
*/
@@ -197,8 +197,6 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe)
memset(&velem[0], 0, sizeof(velem[0]) * 2);
for (i = 0; i < 2; i++) {
velem[i].src_offset = i * 4 * sizeof(float);
velem[i].instance_divisor = 0;
velem[i].vertex_buffer_index = 0;
velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
}
ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
@@ -288,26 +286,33 @@ static void blitter_restore_CSOs(struct blitter_context_priv *ctx)
unsigned i;

/* restore the state objects which are always required to be saved */
pipe->bind_blend_state(pipe, ctx->base.saved_blend_state);
pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state);
pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state);
pipe->bind_fs_state(pipe, ctx->base.saved_fs);
pipe->bind_vs_state(pipe, ctx->base.saved_vs);
pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state);

ctx->base.saved_blend_state = INVALID_PTR;
ctx->base.saved_dsa_state = INVALID_PTR;
ctx->base.saved_rs_state = INVALID_PTR;
ctx->base.saved_fs = INVALID_PTR;
ctx->base.saved_vs = INVALID_PTR;
ctx->base.saved_velem_state = INVALID_PTR;

/* restore the state objects which are required to be saved for clear/copy
*/
if (ctx->base.saved_blend_state != INVALID_PTR) {
pipe->bind_blend_state(pipe, ctx->base.saved_blend_state);
ctx->base.saved_blend_state = INVALID_PTR;
}
if (ctx->base.saved_dsa_state != INVALID_PTR) {
pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state);
ctx->base.saved_dsa_state = INVALID_PTR;
}
if (ctx->base.saved_fs != INVALID_PTR) {
pipe->bind_fs_state(pipe, ctx->base.saved_fs);
ctx->base.saved_fs = INVALID_PTR;
}

pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref);
pipe->set_viewport_state(pipe, &ctx->base.saved_viewport);
pipe->set_clip_state(pipe, &ctx->base.saved_clip);

/* restore the state objects which are required to be saved before copy/fill
*/
if (ctx->base.saved_fb_state.nr_cbufs != ~0) {
pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state);
util_unreference_framebuffer_state(&ctx->base.saved_fb_state);

Loading…
Cancel
Save