struct pipe_framebuffer_state fb, fb_saved;
struct pipe_viewport_state vp, vp_saved;
struct pipe_blend_color blend_color;
- struct pipe_stencil_ref stencil_ref;
+ struct pipe_stencil_ref stencil_ref, stencil_ref_saved;
};
{
assert(!ctx->depth_stencil_saved);
ctx->depth_stencil_saved = ctx->depth_stencil;
+ ctx->stencil_ref_saved = ctx->stencil_ref;
}
void cso_restore_depth_stencil_alpha(struct cso_context *ctx)
ctx->pipe->bind_depth_stencil_alpha_state(ctx->pipe, ctx->depth_stencil_saved);
}
ctx->depth_stencil_saved = NULL;
+ if (memcmp(&ctx->stencil_ref, &ctx->stencil_ref_saved, sizeof(ctx->stencil_ref))) {
+ ctx->stencil_ref = ctx->stencil_ref_saved;
+ ctx->pipe->set_stencil_ref(ctx->pipe, &ctx->stencil_ref);
+ }
}
}
-
-
enum pipe_error cso_set_blend_color(struct cso_context *ctx,
const struct pipe_blend_color *bc)
{
GLboolean color, GLboolean depth, GLboolean stencil)
{
struct st_context *st = ctx->st;
- struct pipe_stencil_ref stencil_ref;
const GLfloat x0 = (GLfloat) ctx->DrawBuffer->_Xmin;
const GLfloat x1 = (GLfloat) ctx->DrawBuffer->_Xmax;
GLfloat y0, y1;
{
struct pipe_depth_stencil_alpha_state depth_stencil;
memset(&depth_stencil, 0, sizeof(depth_stencil));
- memset(&stencil_ref, 0, sizeof(stencil_ref));
if (depth) {
depth_stencil.depth.enabled = 1;
depth_stencil.depth.writemask = 1;
}
if (stencil) {
+ struct pipe_stencil_ref stencil_ref;
+ memset(&stencil_ref, 0, sizeof(stencil_ref));
depth_stencil.stencil[0].enabled = 1;
depth_stencil.stencil[0].func = PIPE_FUNC_ALWAYS;
depth_stencil.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
cso_restore_fragment_shader(st->cso_context);
cso_restore_vertex_shader(st->cso_context);
- /* cannot restore stencil ref. Try to reconstruct? */
- if (stencil) {
- if (ctx->Stencil.Enabled && ctx->DrawBuffer->Visual.stencilBits > 0) {
- stencil_ref.ref_value[0] = ctx->Stencil.Ref[0] & 0xff;
- if (ctx->Stencil._TestTwoSide) {
- const GLuint back = ctx->Stencil._BackFace;
- stencil_ref.ref_value[1] = ctx->Stencil.Ref[back] & 0xff;
- }
- else {
- stencil_ref.ref_value[1] = stencil_ref.ref_value[0];
- }
- }
- cso_set_stencil_ref(st->cso_context, &stencil_ref);
- }
-
}