gallium: also save/restore stencil_ref in cso_save/restore_depth_stencil_alpha
makes life of state trackers easier
This commit is contained in:
@@ -93,7 +93,7 @@ struct cso_context {
|
|||||||
struct pipe_framebuffer_state fb, fb_saved;
|
struct pipe_framebuffer_state fb, fb_saved;
|
||||||
struct pipe_viewport_state vp, vp_saved;
|
struct pipe_viewport_state vp, vp_saved;
|
||||||
struct pipe_blend_color blend_color;
|
struct pipe_blend_color blend_color;
|
||||||
struct pipe_stencil_ref stencil_ref;
|
struct pipe_stencil_ref stencil_ref, stencil_ref_saved;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -746,6 +746,7 @@ void cso_save_depth_stencil_alpha(struct cso_context *ctx)
|
|||||||
{
|
{
|
||||||
assert(!ctx->depth_stencil_saved);
|
assert(!ctx->depth_stencil_saved);
|
||||||
ctx->depth_stencil_saved = ctx->depth_stencil;
|
ctx->depth_stencil_saved = ctx->depth_stencil;
|
||||||
|
ctx->stencil_ref_saved = ctx->stencil_ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cso_restore_depth_stencil_alpha(struct cso_context *ctx)
|
void cso_restore_depth_stencil_alpha(struct cso_context *ctx)
|
||||||
@@ -755,6 +756,10 @@ void cso_restore_depth_stencil_alpha(struct cso_context *ctx)
|
|||||||
ctx->pipe->bind_depth_stencil_alpha_state(ctx->pipe, ctx->depth_stencil_saved);
|
ctx->pipe->bind_depth_stencil_alpha_state(ctx->pipe, ctx->depth_stencil_saved);
|
||||||
}
|
}
|
||||||
ctx->depth_stencil_saved = NULL;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1058,8 +1063,6 @@ void cso_restore_viewport(struct cso_context *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
enum pipe_error cso_set_blend_color(struct cso_context *ctx,
|
enum pipe_error cso_set_blend_color(struct cso_context *ctx,
|
||||||
const struct pipe_blend_color *bc)
|
const struct pipe_blend_color *bc)
|
||||||
{
|
{
|
||||||
|
@@ -192,7 +192,6 @@ clear_with_quad(GLcontext *ctx,
|
|||||||
GLboolean color, GLboolean depth, GLboolean stencil)
|
GLboolean color, GLboolean depth, GLboolean stencil)
|
||||||
{
|
{
|
||||||
struct st_context *st = ctx->st;
|
struct st_context *st = ctx->st;
|
||||||
struct pipe_stencil_ref stencil_ref;
|
|
||||||
const GLfloat x0 = (GLfloat) ctx->DrawBuffer->_Xmin;
|
const GLfloat x0 = (GLfloat) ctx->DrawBuffer->_Xmin;
|
||||||
const GLfloat x1 = (GLfloat) ctx->DrawBuffer->_Xmax;
|
const GLfloat x1 = (GLfloat) ctx->DrawBuffer->_Xmax;
|
||||||
GLfloat y0, y1;
|
GLfloat y0, y1;
|
||||||
@@ -248,7 +247,6 @@ clear_with_quad(GLcontext *ctx,
|
|||||||
{
|
{
|
||||||
struct pipe_depth_stencil_alpha_state depth_stencil;
|
struct pipe_depth_stencil_alpha_state depth_stencil;
|
||||||
memset(&depth_stencil, 0, sizeof(depth_stencil));
|
memset(&depth_stencil, 0, sizeof(depth_stencil));
|
||||||
memset(&stencil_ref, 0, sizeof(stencil_ref));
|
|
||||||
if (depth) {
|
if (depth) {
|
||||||
depth_stencil.depth.enabled = 1;
|
depth_stencil.depth.enabled = 1;
|
||||||
depth_stencil.depth.writemask = 1;
|
depth_stencil.depth.writemask = 1;
|
||||||
@@ -256,6 +254,8 @@ clear_with_quad(GLcontext *ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (stencil) {
|
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].enabled = 1;
|
||||||
depth_stencil.stencil[0].func = PIPE_FUNC_ALWAYS;
|
depth_stencil.stencil[0].func = PIPE_FUNC_ALWAYS;
|
||||||
depth_stencil.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
|
depth_stencil.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
|
||||||
@@ -285,21 +285,6 @@ clear_with_quad(GLcontext *ctx,
|
|||||||
cso_restore_fragment_shader(st->cso_context);
|
cso_restore_fragment_shader(st->cso_context);
|
||||||
cso_restore_vertex_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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user