diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c index 4623eb7b08b..b7b7e531d70 100644 --- a/src/gallium/auxiliary/util/u_blitter.c +++ b/src/gallium/auxiliary/util/u_blitter.c @@ -711,6 +711,10 @@ void util_blitter_restore_fragment_states(struct blitter_context *blitter) ctx->base.is_sample_mask_saved = false; } + if (ctx->base.saved_min_samples != ~0 && pipe->set_min_samples) + pipe->set_min_samples(pipe, ctx->base.saved_min_samples); + ctx->base.saved_min_samples = ~0; + /* Miscellaneous states. */ /* XXX check whether these are saved and whether they need to be restored * (depending on the operation) */ @@ -1479,6 +1483,8 @@ void util_blitter_common_clear_setup(struct blitter_context *blitter, } pipe->set_sample_mask(pipe, ~0); + if (pipe->set_min_samples) + pipe->set_min_samples(pipe, 1); blitter_set_dst_dimensions(ctx, width, height); } @@ -1816,6 +1822,8 @@ static void do_blits(struct blitter_context_priv *ctx, /* Draw. */ pipe->set_sample_mask(pipe, ~0); + if (pipe->set_min_samples) + pipe->set_min_samples(pipe, 1); blitter_draw_tex(ctx, dstbox->x, dstbox->y, dstbox->x + dstbox->width, dstbox->y + dstbox->height, @@ -1871,6 +1879,9 @@ static void do_blits(struct blitter_context_priv *ctx, /* MSAA copy. */ unsigned i, max_sample = sample0_only ? 0 : dst_samples - 1; + if (pipe->set_min_samples) + pipe->set_min_samples(pipe, 1); + for (i = 0; i <= max_sample; i++) { pipe->set_sample_mask(pipe, 1 << i); blitter_draw_tex(ctx, dstbox->x, dstbox->y, @@ -1886,6 +1897,8 @@ static void do_blits(struct blitter_context_priv *ctx, } else { /* Normal copy, MSAA upsampling, or MSAA resolve. */ pipe->set_sample_mask(pipe, ~0); + if (pipe->set_min_samples) + pipe->set_min_samples(pipe, 1); blitter_draw_tex(ctx, dstbox->x, dstbox->y, dstbox->x + dstbox->width, dstbox->y + dstbox->height, @@ -2312,6 +2325,8 @@ void util_blitter_clear_render_target(struct blitter_context *blitter, fb_state.zsbuf = 0; pipe->set_framebuffer_state(pipe, &fb_state); pipe->set_sample_mask(pipe, ~0); + if (pipe->set_min_samples) + pipe->set_min_samples(pipe, 1); msaa = util_framebuffer_get_num_samples(&fb_state) > 1; blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); @@ -2395,6 +2410,8 @@ void util_blitter_clear_depth_stencil(struct blitter_context *blitter, fb_state.zsbuf = dstsurf; pipe->set_framebuffer_state(pipe, &fb_state); pipe->set_sample_mask(pipe, ~0); + if (pipe->set_min_samples) + pipe->set_min_samples(pipe, 1); blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); @@ -2464,6 +2481,8 @@ void util_blitter_custom_depth_stencil(struct blitter_context *blitter, fb_state.zsbuf = zsurf; pipe->set_framebuffer_state(pipe, &fb_state); pipe->set_sample_mask(pipe, sample_mask); + if (pipe->set_min_samples) + pipe->set_min_samples(pipe, 1); blitter_set_common_draw_rect_state(ctx, false, util_framebuffer_get_num_samples(&fb_state) > 1); @@ -2642,6 +2661,8 @@ void util_blitter_custom_resolve_color(struct blitter_context *blitter, pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); bind_fs_write_one_cbuf(ctx); pipe->set_sample_mask(pipe, sample_mask); + if (pipe->set_min_samples) + pipe->set_min_samples(pipe, 1); memset(&surf_tmpl, 0, sizeof(surf_tmpl)); surf_tmpl.format = format; @@ -2715,6 +2736,8 @@ void util_blitter_custom_color(struct blitter_context *blitter, fb_state.zsbuf = 0; pipe->set_framebuffer_state(pipe, &fb_state); pipe->set_sample_mask(pipe, ~0); + if (pipe->set_min_samples) + pipe->set_min_samples(pipe, 1); blitter_set_common_draw_rect_state(ctx, false, util_framebuffer_get_num_samples(&fb_state) > 1); @@ -2776,6 +2799,8 @@ void util_blitter_custom_shader(struct blitter_context *blitter, fb_state.cbufs[0] = dstsurf; pipe->set_framebuffer_state(pipe, &fb_state); pipe->set_sample_mask(pipe, ~0); + if (pipe->set_min_samples) + pipe->set_min_samples(pipe, 1); blitter_set_common_draw_rect_state(ctx, false, util_framebuffer_get_num_samples(&fb_state) > 1); @@ -2870,6 +2895,8 @@ util_blitter_stencil_fallback(struct blitter_context *blitter, fb_state.zsbuf = dst_view; pipe->set_framebuffer_state(pipe, &fb_state); pipe->set_sample_mask(pipe, ~0); + if (pipe->set_min_samples) + pipe->set_min_samples(pipe, 1); blitter_set_common_draw_rect_state(ctx, scissor != NULL, util_framebuffer_get_num_samples(&fb_state) > 1); diff --git a/src/gallium/auxiliary/util/u_blitter.h b/src/gallium/auxiliary/util/u_blitter.h index 48b9344430f..70157e5df4b 100644 --- a/src/gallium/auxiliary/util/u_blitter.h +++ b/src/gallium/auxiliary/util/u_blitter.h @@ -118,6 +118,7 @@ struct blitter_context bool skip_viewport_restore; bool is_sample_mask_saved; unsigned saved_sample_mask; + unsigned saved_min_samples; unsigned saved_num_sampler_states; void *saved_sampler_states[PIPE_MAX_SAMPLERS]; @@ -565,10 +566,11 @@ util_blitter_save_so_targets(struct blitter_context *blitter, static inline void util_blitter_save_sample_mask(struct blitter_context *blitter, - unsigned sample_mask) + unsigned sample_mask, unsigned min_samples) { blitter->is_sample_mask_saved = true; blitter->saved_sample_mask = sample_mask; + blitter->saved_min_samples = min_samples; } static inline void diff --git a/src/gallium/drivers/asahi/agx_blit.c b/src/gallium/drivers/asahi/agx_blit.c index 213761ade0b..545be057f4f 100644 --- a/src/gallium/drivers/asahi/agx_blit.c +++ b/src/gallium/drivers/asahi/agx_blit.c @@ -97,7 +97,7 @@ agx_blitter_save(struct agx_context *ctx, struct blitter_context *blitter, util_blitter_save_depth_stencil_alpha(blitter, &ctx->zs); util_blitter_save_stencil_ref(blitter, &ctx->stencil_ref); util_blitter_save_so_targets(blitter, 0, NULL); - util_blitter_save_sample_mask(blitter, ctx->sample_mask); + util_blitter_save_sample_mask(blitter, ctx->sample_mask, 0); util_blitter_save_framebuffer(blitter, &ctx->framebuffer); util_blitter_save_fragment_sampler_states(blitter, diff --git a/src/gallium/drivers/crocus/crocus_blit.c b/src/gallium/drivers/crocus/crocus_blit.c index c32bf9fbb1d..52255266675 100644 --- a/src/gallium/drivers/crocus/crocus_blit.c +++ b/src/gallium/drivers/crocus/crocus_blit.c @@ -49,7 +49,7 @@ void crocus_blitter_begin(struct crocus_context *ice, enum crocus_blitter_op op, util_blitter_save_depth_stencil_alpha(ice->blitter, ice->state.cso_zsa); util_blitter_save_stencil_ref(ice->blitter, &ice->state.stencil_ref); util_blitter_save_fragment_shader(ice->blitter, ice->shaders.uncompiled[MESA_SHADER_FRAGMENT]); - util_blitter_save_sample_mask(ice->blitter, ice->state.sample_mask); + util_blitter_save_sample_mask(ice->blitter, ice->state.sample_mask, 0); util_blitter_save_rasterizer(ice->blitter, ice->state.cso_rast); util_blitter_save_scissor(ice->blitter, &ice->state.scissors[0]); util_blitter_save_viewport(ice->blitter, &ice->state.viewports[0]); diff --git a/src/gallium/drivers/d3d12/d3d12_blit.cpp b/src/gallium/drivers/d3d12/d3d12_blit.cpp index ed44263c8f8..2310d79c67f 100644 --- a/src/gallium/drivers/d3d12/d3d12_blit.cpp +++ b/src/gallium/drivers/d3d12/d3d12_blit.cpp @@ -557,7 +557,7 @@ util_blit_save_state(struct d3d12_context *ctx) ctx->sampler_views[PIPE_SHADER_FRAGMENT]); util_blitter_save_fragment_constant_buffer_slot(ctx->blitter, ctx->cbufs[PIPE_SHADER_FRAGMENT]); util_blitter_save_vertex_buffer_slot(ctx->blitter, ctx->vbs); - util_blitter_save_sample_mask(ctx->blitter, ctx->gfx_pipeline_state.sample_mask); + util_blitter_save_sample_mask(ctx->blitter, ctx->gfx_pipeline_state.sample_mask, 0); util_blitter_save_so_targets(ctx->blitter, ctx->gfx_pipeline_state.num_so_targets, ctx->so_targets); } diff --git a/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c b/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c index 99fd6cc1327..113f9cf53b7 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c +++ b/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c @@ -61,7 +61,7 @@ etna_blit_save_state(struct etna_context *ctx) util_blitter_save_blend(ctx->blitter, ctx->blend); util_blitter_save_depth_stencil_alpha(ctx->blitter, ctx->zsa); util_blitter_save_stencil_ref(ctx->blitter, &ctx->stencil_ref_s); - util_blitter_save_sample_mask(ctx->blitter, ctx->sample_mask); + util_blitter_save_sample_mask(ctx->blitter, ctx->sample_mask, 0); util_blitter_save_framebuffer(ctx->blitter, &ctx->framebuffer_s); util_blitter_save_fragment_sampler_states(ctx->blitter, ctx->num_fragment_samplers, (void **)ctx->sampler); diff --git a/src/gallium/drivers/freedreno/freedreno_blitter.c b/src/gallium/drivers/freedreno/freedreno_blitter.c index c41a0736ecb..ad829711aa1 100644 --- a/src/gallium/drivers/freedreno/freedreno_blitter.c +++ b/src/gallium/drivers/freedreno/freedreno_blitter.c @@ -94,7 +94,7 @@ fd_blitter_pipe_begin(struct fd_context *ctx, bool render_cond) assert_dt util_blitter_save_blend(ctx->blitter, ctx->blend); util_blitter_save_depth_stencil_alpha(ctx->blitter, ctx->zsa); util_blitter_save_stencil_ref(ctx->blitter, &ctx->stencil_ref); - util_blitter_save_sample_mask(ctx->blitter, ctx->sample_mask); + util_blitter_save_sample_mask(ctx->blitter, ctx->sample_mask, ctx->min_samples); util_blitter_save_framebuffer(ctx->blitter, &ctx->framebuffer); util_blitter_save_fragment_sampler_states( ctx->blitter, ctx->tex[PIPE_SHADER_FRAGMENT].num_samplers, diff --git a/src/gallium/drivers/llvmpipe/lp_surface.c b/src/gallium/drivers/llvmpipe/lp_surface.c index a93131121f6..a116b02005f 100644 --- a/src/gallium/drivers/llvmpipe/lp_surface.c +++ b/src/gallium/drivers/llvmpipe/lp_surface.c @@ -159,7 +159,7 @@ static void lp_blit(struct pipe_context *pipe, util_blitter_save_tesseval_shader(lp->blitter, (void*)lp->tes); util_blitter_save_depth_stencil_alpha(lp->blitter, (void*)lp->depth_stencil); util_blitter_save_stencil_ref(lp->blitter, &lp->stencil_ref); - util_blitter_save_sample_mask(lp->blitter, lp->sample_mask); + util_blitter_save_sample_mask(lp->blitter, lp->sample_mask, lp->min_samples); util_blitter_save_framebuffer(lp->blitter, &lp->framebuffer); util_blitter_save_fragment_sampler_states(lp->blitter, lp->num_samplers[PIPE_SHADER_FRAGMENT], diff --git a/src/gallium/drivers/nouveau/nv30/nv30_miptree.c b/src/gallium/drivers/nouveau/nv30/nv30_miptree.c index aef160ac160..5d1f16b28c9 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_miptree.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_miptree.c @@ -258,7 +258,7 @@ nv30_blit(struct pipe_context *pipe, util_blitter_save_depth_stencil_alpha(nv30->blitter, nv30->zsa); util_blitter_save_stencil_ref(nv30->blitter, &nv30->stencil_ref); - util_blitter_save_sample_mask(nv30->blitter, nv30->sample_mask); + util_blitter_save_sample_mask(nv30->blitter, nv30->sample_mask, 0); util_blitter_save_framebuffer(nv30->blitter, &nv30->framebuffer); util_blitter_save_fragment_sampler_states(nv30->blitter, nv30->fragprog.num_samplers, diff --git a/src/gallium/drivers/panfrost/pan_blit.c b/src/gallium/drivers/panfrost/pan_blit.c index f2523e2e594..51ebbec3a62 100644 --- a/src/gallium/drivers/panfrost/pan_blit.c +++ b/src/gallium/drivers/panfrost/pan_blit.c @@ -49,7 +49,7 @@ panfrost_blitter_save( util_blitter_save_depth_stencil_alpha(blitter, ctx->depth_stencil); util_blitter_save_stencil_ref(blitter, &ctx->stencil_ref); util_blitter_save_so_targets(blitter, 0, NULL); - util_blitter_save_sample_mask(blitter, ctx->sample_mask); + util_blitter_save_sample_mask(blitter, ctx->sample_mask, ctx->min_samples); util_blitter_save_framebuffer(blitter, &ctx->pipe_framebuffer); util_blitter_save_fragment_sampler_states(blitter, diff --git a/src/gallium/drivers/r300/r300_blit.c b/src/gallium/drivers/r300/r300_blit.c index 2609ee30535..e2648e3a71f 100644 --- a/src/gallium/drivers/r300/r300_blit.c +++ b/src/gallium/drivers/r300/r300_blit.c @@ -68,7 +68,7 @@ static void r300_blitter_begin(struct r300_context* r300, enum r300_blitter_op o util_blitter_save_vertex_shader(r300->blitter, r300->vs_state.state); util_blitter_save_viewport(r300->blitter, &r300->viewport); util_blitter_save_scissor(r300->blitter, r300->scissor_state.state); - util_blitter_save_sample_mask(r300->blitter, *(unsigned*)r300->sample_mask.state); + util_blitter_save_sample_mask(r300->blitter, *(unsigned*)r300->sample_mask.state, 0); util_blitter_save_vertex_buffer_slot(r300->blitter, r300->vertex_buffer); util_blitter_save_vertex_elements(r300->blitter, r300->velems); diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c index 2ee4744bf0a..ddceebfeffe 100644 --- a/src/gallium/drivers/r600/r600_blit.c +++ b/src/gallium/drivers/r600/r600_blit.c @@ -76,7 +76,7 @@ static void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op util_blitter_save_blend(rctx->blitter, rctx->blend_state.cso); util_blitter_save_depth_stencil_alpha(rctx->blitter, rctx->dsa_state.cso); util_blitter_save_stencil_ref(rctx->blitter, &rctx->stencil_ref.pipe_state); - util_blitter_save_sample_mask(rctx->blitter, rctx->sample_mask.sample_mask); + util_blitter_save_sample_mask(rctx->blitter, rctx->sample_mask.sample_mask, rctx->ps_iter_samples); } if (op & R600_SAVE_FRAMEBUFFER) diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index 8c7860f0de6..c2c96d0dfbe 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -56,7 +56,7 @@ void si_blitter_begin(struct si_context *sctx, enum si_blitter_op op) util_blitter_save_depth_stencil_alpha(sctx->blitter, sctx->queued.named.dsa); util_blitter_save_stencil_ref(sctx->blitter, &sctx->stencil_ref.state); util_blitter_save_fragment_shader(sctx->blitter, sctx->shader.ps.cso); - util_blitter_save_sample_mask(sctx->blitter, sctx->sample_mask); + util_blitter_save_sample_mask(sctx->blitter, sctx->sample_mask, sctx->ps_iter_samples); util_blitter_save_scissor(sctx->blitter, &sctx->scissors[0]); util_blitter_save_window_rectangles(sctx->blitter, sctx->window_rectangles_include, sctx->num_window_rectangles, sctx->window_rectangles); diff --git a/src/gallium/drivers/svga/svga_pipe_blit.c b/src/gallium/drivers/svga/svga_pipe_blit.c index 1d3ec2a185a..8cff079eea6 100644 --- a/src/gallium/drivers/svga/svga_pipe_blit.c +++ b/src/gallium/drivers/svga/svga_pipe_blit.c @@ -634,7 +634,7 @@ try_blit(struct svga_context *svga, const struct pipe_blit_info *blit_info) util_blitter_save_depth_stencil_alpha(svga->blitter, (void*)svga->curr.depth); util_blitter_save_stencil_ref(svga->blitter, &svga->curr.stencil_ref); - util_blitter_save_sample_mask(svga->blitter, svga->curr.sample_mask); + util_blitter_save_sample_mask(svga->blitter, svga->curr.sample_mask, 0); util_blitter_save_framebuffer(svga->blitter, &svga->curr.framebuffer); util_blitter_save_fragment_sampler_states(svga->blitter, svga->curr.num_samplers[PIPE_SHADER_FRAGMENT], diff --git a/src/gallium/drivers/svga/svga_pipe_clear.c b/src/gallium/drivers/svga/svga_pipe_clear.c index 82b102081e5..01f513289dd 100644 --- a/src/gallium/drivers/svga/svga_pipe_clear.c +++ b/src/gallium/drivers/svga/svga_pipe_clear.c @@ -57,7 +57,7 @@ begin_blit(struct svga_context *svga) util_blitter_save_depth_stencil_alpha(svga->blitter, (void*)svga->curr.depth); util_blitter_save_stencil_ref(svga->blitter, &svga->curr.stencil_ref); - util_blitter_save_sample_mask(svga->blitter, svga->curr.sample_mask); + util_blitter_save_sample_mask(svga->blitter, svga->curr.sample_mask, 0); } diff --git a/src/gallium/drivers/swr/swr_context.cpp b/src/gallium/drivers/swr/swr_context.cpp index 2a07a3767b9..08637dba1d5 100644 --- a/src/gallium/drivers/swr/swr_context.cpp +++ b/src/gallium/drivers/swr/swr_context.cpp @@ -334,7 +334,7 @@ swr_blit(struct pipe_context *pipe, const struct pipe_blit_info *blit_info) util_blitter_save_depth_stencil_alpha(ctx->blitter, (void *)ctx->depth_stencil); util_blitter_save_stencil_ref(ctx->blitter, &ctx->stencil_ref); - util_blitter_save_sample_mask(ctx->blitter, ctx->sample_mask); + util_blitter_save_sample_mask(ctx->blitter, ctx->sample_mask, 0); util_blitter_save_framebuffer(ctx->blitter, &ctx->framebuffer); util_blitter_save_fragment_sampler_states( ctx->blitter, diff --git a/src/gallium/drivers/v3d/v3d_blit.c b/src/gallium/drivers/v3d/v3d_blit.c index 793f2d2e535..967d0d6d1d4 100644 --- a/src/gallium/drivers/v3d/v3d_blit.c +++ b/src/gallium/drivers/v3d/v3d_blit.c @@ -46,7 +46,7 @@ v3d_blitter_save(struct v3d_context *v3d) util_blitter_save_blend(v3d->blitter, v3d->blend); util_blitter_save_depth_stencil_alpha(v3d->blitter, v3d->zsa); util_blitter_save_stencil_ref(v3d->blitter, &v3d->stencil_ref); - util_blitter_save_sample_mask(v3d->blitter, v3d->sample_mask); + util_blitter_save_sample_mask(v3d->blitter, v3d->sample_mask, 0); util_blitter_save_framebuffer(v3d->blitter, &v3d->framebuffer); util_blitter_save_fragment_sampler_states(v3d->blitter, v3d->tex[PIPE_SHADER_FRAGMENT].num_samplers, diff --git a/src/gallium/drivers/vc4/vc4_blit.c b/src/gallium/drivers/vc4/vc4_blit.c index bdfbbf62a9b..9f4ab89e57f 100644 --- a/src/gallium/drivers/vc4/vc4_blit.c +++ b/src/gallium/drivers/vc4/vc4_blit.c @@ -177,7 +177,7 @@ vc4_blitter_save(struct vc4_context *vc4) util_blitter_save_blend(vc4->blitter, vc4->blend); util_blitter_save_depth_stencil_alpha(vc4->blitter, vc4->zsa); util_blitter_save_stencil_ref(vc4->blitter, &vc4->stencil_ref); - util_blitter_save_sample_mask(vc4->blitter, vc4->sample_mask); + util_blitter_save_sample_mask(vc4->blitter, vc4->sample_mask, 0); util_blitter_save_framebuffer(vc4->blitter, &vc4->framebuffer); util_blitter_save_fragment_sampler_states(vc4->blitter, vc4->fragtex.num_samplers, diff --git a/src/gallium/drivers/zink/zink_blit.c b/src/gallium/drivers/zink/zink_blit.c index 1dda73d9f9b..8055111afe0 100644 --- a/src/gallium/drivers/zink/zink_blit.c +++ b/src/gallium/drivers/zink/zink_blit.c @@ -329,7 +329,7 @@ zink_blit_begin(struct zink_context *ctx, enum zink_blit_flags flags) util_blitter_save_blend(ctx->blitter, ctx->gfx_pipeline_state.blend_state); util_blitter_save_depth_stencil_alpha(ctx->blitter, ctx->dsa_state); util_blitter_save_stencil_ref(ctx->blitter, &ctx->stencil_ref); - util_blitter_save_sample_mask(ctx->blitter, ctx->gfx_pipeline_state.sample_mask); + util_blitter_save_sample_mask(ctx->blitter, ctx->gfx_pipeline_state.sample_mask, 0); util_blitter_save_scissor(ctx->blitter, ctx->vp_state.scissor_states); /* also util_blitter_save_window_rectangles when we have that? */