X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_cb_clear.c;h=e38f44ed78bc5ac3ee17683e62deef74a6227cc8;hb=9037005d6034d6bcbeb508e0f783622e2351b957;hp=436f7019ae2fc56fe9131baea2da2a801d862103;hpb=c9e4dc8d5e8f5e860f93eb3555a507402506b59a;p=mesa.git diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c index 436f7019ae2..e38f44ed78b 100644 --- a/src/mesa/state_tracker/st_cb_clear.c +++ b/src/mesa/state_tracker/st_cb_clear.c @@ -85,19 +85,19 @@ void st_destroy_clear(struct st_context *st) { if (st->clear.fs) { - cso_delete_fragment_shader(st->cso_context, st->clear.fs); + st->pipe->delete_fs_state(st->pipe, st->clear.fs); st->clear.fs = NULL; } if (st->clear.vs) { - cso_delete_vertex_shader(st->cso_context, st->clear.vs); + st->pipe->delete_vs_state(st->pipe, st->clear.vs); st->clear.vs = NULL; } if (st->clear.vs_layered) { - cso_delete_vertex_shader(st->cso_context, st->clear.vs_layered); + st->pipe->delete_vs_state(st->pipe, st->clear.vs_layered); st->clear.vs_layered = NULL; } if (st->clear.gs_layered) { - cso_delete_geometry_shader(st->cso_context, st->clear.gs_layered); + st->pipe->delete_gs_state(st->pipe, st->clear.gs_layered); st->clear.gs_layered = NULL; } } @@ -280,6 +280,7 @@ clear_with_quad(struct gl_context *ctx, unsigned clear_buffers) int i; blend.independent_blend_enable = num_buffers > 1; + blend.max_rt = num_buffers - 1; for (i = 0; i < num_buffers; i++) { if (!(clear_buffers & (PIPE_CLEAR_COLOR0 << i))) @@ -431,6 +432,7 @@ st_Clear(struct gl_context *ctx, GLbitfield mask) = ctx->DrawBuffer->Attachment[BUFFER_STENCIL].Renderbuffer; GLbitfield quad_buffers = 0x0; GLbitfield clear_buffers = 0x0; + bool have_scissor_buffers = false; GLuint i; st_flush_bitmap_cache(st); @@ -461,12 +463,14 @@ st_Clear(struct gl_context *ctx, GLbitfield mask) unsigned surf_colormask = util_format_colormask(util_format_description(strb->surface->format)); - if (is_scissor_enabled(ctx, rb) || + bool scissor = is_scissor_enabled(ctx, rb); + if ((scissor && !st->can_scissor_clear) || is_window_rectangle_enabled(ctx) || ((colormask & surf_colormask) != surf_colormask)) quad_buffers |= PIPE_CLEAR_COLOR0 << i; else clear_buffers |= PIPE_CLEAR_COLOR0 << i; + have_scissor_buffers |= scissor && st->can_scissor_clear; } } } @@ -509,10 +513,31 @@ st_Clear(struct gl_context *ctx, GLbitfield mask) * renderbuffers, because it's likely to be faster. */ if (clear_buffers) { + const struct gl_scissor_rect *scissor = &ctx->Scissor.ScissorArray[0]; + struct pipe_scissor_state scissor_state = { + .minx = MAX2(scissor->X, 0), + .miny = MAX2(scissor->Y, 0), + .maxx = MAX2(scissor->X + scissor->Width, 0), + .maxy = MAX2(scissor->Y + scissor->Height, 0), + + }; + + /* Now invert Y if needed. + * Gallium drivers use the convention Y=0=top for surfaces. + */ + if (st->state.fb_orientation == Y_0_TOP) { + const struct gl_framebuffer *fb = ctx->DrawBuffer; + /* use intermediate variables to avoid uint underflow */ + GLint miny, maxy; + miny = fb->Height - scissor_state.maxy; + maxy = fb->Height - scissor_state.miny; + scissor_state.miny = MAX2(miny, 0); + scissor_state.maxy = MAX2(maxy, 0); + } /* We can't translate the clear color to the colorbuffer format, * because different colorbuffers may have different formats. */ - st->pipe->clear(st->pipe, clear_buffers, + st->pipe->clear(st->pipe, clear_buffers, have_scissor_buffers ? &scissor_state : NULL, (union pipe_color_union*)&ctx->Color.ClearColor, ctx->Depth.Clear, ctx->Stencil.Clear); }