gallium/u_blitter: add option to override fragment shader for util_blitter_blit

radeonsi will use a custom MSAA resolving shader

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28917>
This commit is contained in:
Marek Olšák
2023-03-06 15:53:14 -05:00
committed by Marge Bot
parent 9ab9644c1f
commit 07fa635f11
21 changed files with 83 additions and 70 deletions

View File

@@ -1801,7 +1801,7 @@ void util_blitter_copy_texture(struct blitter_context *blitter,
util_blitter_blit_generic(blitter, dst_view, &dstbox,
src_view, srcbox, src->width0, src->height0,
PIPE_MASK_RGBAZS, PIPE_TEX_FILTER_NEAREST, NULL,
false, false, 0);
false, false, 0, NULL);
pipe_surface_reference(&dst_view, NULL);
pipe_sampler_view_reference(&src_view, NULL);
@@ -2011,7 +2011,8 @@ void util_blitter_blit_generic(struct blitter_context *blitter,
unsigned mask, unsigned filter,
const struct pipe_scissor_state *scissor,
bool alpha_blend, bool sample0_only,
unsigned dst_sample)
unsigned dst_sample,
void *fs_override)
{
struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
unsigned count = 0;
@@ -2094,36 +2095,40 @@ void util_blitter_blit_generic(struct blitter_context *blitter,
blitter_check_saved_fb_state(ctx);
blitter_disable_render_cond(ctx);
void *fs = fs_override;
/* Blend, DSA, fragment shader. */
if (dst_has_depth && dst_has_stencil) {
pipe->bind_blend_state(pipe, ctx->blend[0][0]);
pipe->bind_depth_stencil_alpha_state(pipe,
ctx->dsa_write_depth_stencil);
if (src_has_color) {
assert(use_txf);
ctx->bind_fs_state(pipe,
blitter_get_fs_pack_color_zs(ctx, src_target,
src_samples, dst->format, false));
} else {
ctx->bind_fs_state(pipe,
blitter_get_fs_texfetch_depthstencil(ctx, src_target, src_samples,
dst_samples, use_txf));
if (!fs) {
if (src_has_color) {
assert(use_txf);
fs = blitter_get_fs_pack_color_zs(ctx, src_target,
src_samples, dst->format, false);
} else {
fs = blitter_get_fs_texfetch_depthstencil(ctx, src_target,
src_samples, dst_samples,
use_txf);
}
}
} else if (dst_has_depth) {
pipe->bind_blend_state(pipe, ctx->blend[0][0]);
pipe->bind_depth_stencil_alpha_state(pipe,
ctx->dsa_write_depth_keep_stencil);
if (src_has_color &&
(src->format == PIPE_FORMAT_R32_UINT ||
src->format == PIPE_FORMAT_R32G32_UINT)) {
assert(use_txf);
ctx->bind_fs_state(pipe,
blitter_get_fs_pack_color_zs(ctx, src_target,
src_samples, dst->format, false));
} else {
ctx->bind_fs_state(pipe,
blitter_get_fs_texfetch_depth(ctx, src_target, src_samples,
dst_samples, use_txf));
if (!fs) {
if (src_has_color &&
(src->format == PIPE_FORMAT_R32_UINT ||
src->format == PIPE_FORMAT_R32G32_UINT)) {
assert(use_txf);
fs = blitter_get_fs_pack_color_zs(ctx, src_target, src_samples,
dst->format, false);
} else {
fs = blitter_get_fs_texfetch_depth(ctx, src_target, src_samples,
dst_samples, use_txf);
}
}
} else if (dst_has_stencil) {
pipe->bind_blend_state(pipe, ctx->blend[0][0]);
@@ -2131,30 +2136,33 @@ void util_blitter_blit_generic(struct blitter_context *blitter,
ctx->dsa_keep_depth_write_stencil);
assert(src_has_stencil); /* unpacking from color is unsupported */
ctx->bind_fs_state(pipe,
blitter_get_fs_texfetch_stencil(ctx, src_target, src_samples,
dst_samples, use_txf));
if (!fs) {
fs = blitter_get_fs_texfetch_stencil(ctx, src_target, src_samples,
dst_samples, use_txf);
}
} else {
unsigned colormask = mask & PIPE_MASK_RGBA;
pipe->bind_blend_state(pipe, ctx->blend[colormask][alpha_blend]);
pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
if (src_has_depth &&
(dst->format == PIPE_FORMAT_R32_UINT ||
dst->format == PIPE_FORMAT_R32G32_UINT)) {
assert(use_txf);
ctx->bind_fs_state(pipe,
blitter_get_fs_pack_color_zs(ctx, src_target,
src_samples, src->format, true));
} else {
ctx->bind_fs_state(pipe,
blitter_get_fs_texfetch_col(ctx, src->format, dst->format, src_target,
src_samples, dst_samples, filter,
use_txf));
if (!fs) {
if (src_has_depth &&
(dst->format == PIPE_FORMAT_R32_UINT ||
dst->format == PIPE_FORMAT_R32G32_UINT)) {
assert(use_txf);
fs = blitter_get_fs_pack_color_zs(ctx, src_target, src_samples,
src->format, true);
} else {
fs = blitter_get_fs_texfetch_col(ctx, src->format, dst->format,
src_target, src_samples,
dst_samples, filter, use_txf);
}
}
}
ctx->bind_fs_state(pipe, fs);
/* Set the linear filter only for scaled color non-MSAA blits. */
if (filter == PIPE_TEX_FILTER_LINEAR) {
if (src_target == PIPE_TEXTURE_RECT && ctx->has_texrect) {
@@ -2237,7 +2245,8 @@ out:
void
util_blitter_blit(struct blitter_context *blitter,
const struct pipe_blit_info *info)
const struct pipe_blit_info *info,
void *fs_override)
{
struct pipe_resource *dst = info->dst.resource;
struct pipe_resource *src = info->src.resource;
@@ -2263,7 +2272,7 @@ util_blitter_blit(struct blitter_context *blitter,
info->mask, info->filter,
info->scissor_enable ? &info->scissor : NULL,
info->alpha_blend, info->sample0_only,
info->dst_sample);
info->dst_sample, fs_override);
pipe_surface_reference(&dst_view, NULL);
pipe_sampler_view_reference(&src_view, NULL);

View File

@@ -272,10 +272,12 @@ void util_blitter_blit_generic(struct blitter_context *blitter,
unsigned mask, unsigned filter,
const struct pipe_scissor_state *scissor,
bool alpha_blend, bool sample0_only,
unsigned dst_sample);
unsigned dst_sample,
void *fs_override);
void util_blitter_blit(struct blitter_context *blitter,
const struct pipe_blit_info *info);
const struct pipe_blit_info *info,
void *fs_override);
void util_blitter_generate_mipmap(struct blitter_context *blitter,
struct pipe_resource *tex,

View File

@@ -391,7 +391,7 @@ agx_blit(struct pipe_context *pipe, const struct pipe_blit_info *info)
agx_flush_writer(ctx, agx_resource(info->dst.resource), "Blit");
agx_blitter_save(ctx, ctx->blitter, info->render_condition_enable);
util_blitter_blit(ctx->blitter, info);
util_blitter_blit(ctx->blitter, info, NULL);
}
static bool

View File

@@ -373,7 +373,7 @@ crocus_u_blitter(struct crocus_context *ice,
if (!util_format_has_alpha(dinfo.dst.resource->format))
dinfo.mask &= ~PIPE_MASK_A;
crocus_blitter_begin(ice, CROCUS_SAVE_FRAMEBUFFER | CROCUS_SAVE_TEXTURES | CROCUS_SAVE_FRAGMENT_STATE, info->render_condition_enable);
util_blitter_blit(ice->blitter, &dinfo);
util_blitter_blit(ice->blitter, &dinfo, NULL);
}
/**
@@ -412,7 +412,7 @@ crocus_blit(struct pipe_context *ctx, const struct pipe_blit_info *info)
struct pipe_blit_info depth_blit = *info;
depth_blit.mask = PIPE_MASK_Z;
crocus_blitter_begin(ice, CROCUS_SAVE_FRAMEBUFFER | CROCUS_SAVE_TEXTURES | CROCUS_SAVE_FRAGMENT_STATE, info->render_condition_enable);
util_blitter_blit(ice->blitter, &depth_blit);
util_blitter_blit(ice->blitter, &depth_blit, NULL);
struct pipe_surface *dst_view, dst_templ;
util_blitter_default_dst_texture(&dst_templ, info->dst.resource, info->dst.level, info->dst.box.z);

View File

@@ -295,7 +295,7 @@ util_blit(struct d3d12_context *ctx,
{
util_blit_save_state(ctx);
util_blitter_blit(ctx->blitter, info);
util_blitter_blit(ctx->blitter, info, NULL);
}
static bool

View File

@@ -127,7 +127,7 @@ etna_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info)
}
etna_blit_save_state(ctx, info.render_condition_enable);
util_blitter_blit(ctx->blitter, &info);
util_blitter_blit(ctx->blitter, &info, NULL);
success:
if (info.dst.resource->bind & PIPE_BIND_SAMPLER_VIEW)

View File

@@ -168,7 +168,8 @@ fd_blitter_blit(struct fd_context *ctx, const struct pipe_blit_info *info)
util_blitter_blit_generic(
ctx->blitter, dst_view, &info->dst.box, src_view, &info->src.box,
src->width0, src->height0, info->mask, info->filter,
info->scissor_enable ? &info->scissor : NULL, info->alpha_blend, false, 0);
info->scissor_enable ? &info->scissor : NULL, info->alpha_blend, false, 0,
NULL);
pipe_surface_reference(&dst_view, NULL);
pipe_sampler_view_reference(&src_view, NULL);

View File

@@ -119,7 +119,8 @@ i915_surface_copy_render(struct pipe_context *pipe, struct pipe_resource *dst,
util_blitter_blit_generic(i915->blitter, dst_view, &dstbox, src_view,
src_box, src_width0, src_height0, PIPE_MASK_RGBAZS,
PIPE_TEX_FILTER_NEAREST, NULL, false, false, 0);
PIPE_TEX_FILTER_NEAREST, NULL, false, false, 0,
NULL);
return;
fallback:
@@ -274,7 +275,7 @@ i915_blit(struct pipe_context *pipe, const struct pipe_blit_info *blit_info)
i915_util_blitter_save_states(i915);
util_blitter_blit(i915->blitter, &info);
util_blitter_blit(i915->blitter, &info, NULL);
}
static void

View File

@@ -879,7 +879,7 @@ lima_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info)
lima_util_blitter_save_states(ctx);
util_blitter_blit(ctx->blitter, &info);
util_blitter_blit(ctx->blitter, &info, NULL);
}
static void

View File

@@ -191,7 +191,7 @@ lp_blit(struct pipe_context *pipe,
util_blitter_save_render_condition(lp->blitter, lp->render_cond_query,
lp->render_cond_cond,
lp->render_cond_mode);
util_blitter_blit(lp->blitter, &info);
util_blitter_blit(lp->blitter, &info, NULL);
}

View File

@@ -268,7 +268,7 @@ nv30_blit(struct pipe_context *pipe,
nv30->fragprog.num_textures, nv30->fragprog.textures);
util_blitter_save_render_condition(nv30->blitter, nv30->render_cond_query,
nv30->render_cond_cond, nv30->render_cond_mode);
util_blitter_blit(nv30->blitter, &info);
util_blitter_blit(nv30->blitter, &info, NULL);
}
void

View File

@@ -90,7 +90,7 @@ panfrost_blit_no_afbc_legalization(struct pipe_context *pipe,
panfrost_blitter_save(ctx, info->render_condition_enable
? PAN_RENDER_BLIT_COND
: PAN_RENDER_BLIT);
util_blitter_blit(ctx->blitter, info);
util_blitter_blit(ctx->blitter, info, NULL);
}
void

View File

@@ -669,7 +669,7 @@ static void r300_resource_copy_region(struct pipe_context *pipe,
util_blitter_blit_generic(r300->blitter, dst_view, &dstbox,
src_view, src_box, src_width0, src_height0,
PIPE_MASK_RGBAZS, PIPE_TEX_FILTER_NEAREST, NULL,
false, false, 0);
false, false, 0, NULL);
r300_blitter_end(r300);
pipe_surface_reference(&dst_view, NULL);
@@ -791,7 +791,7 @@ static void r300_msaa_resolve(struct pipe_context *pipe,
blit.src.box.z = 0;
r300_blitter_begin(r300, R300_BLIT | R300_IGNORE_RENDER_COND);
util_blitter_blit(r300->blitter, &blit);
util_blitter_blit(r300->blitter, &blit, NULL);
r300_blitter_end(r300);
pipe_resource_reference(&tmp, NULL);
@@ -859,7 +859,7 @@ static void r300_blit(struct pipe_context *pipe,
r300_blitter_begin(r300, R300_BLIT |
(info.render_condition_enable ? 0 : R300_IGNORE_RENDER_COND));
util_blitter_blit(r300->blitter, &info);
util_blitter_blit(r300->blitter, &info, NULL);
r300_blitter_end(r300);
}

View File

@@ -790,7 +790,7 @@ void r600_resource_copy_region(struct pipe_context *ctx,
util_blitter_blit_generic(rctx->blitter, dst_view, &dstbox,
src_view, src_box, src_width0, src_height0,
PIPE_MASK_RGBAZS, PIPE_TEX_FILTER_NEAREST, NULL,
false, false, 0);
false, false, 0, NULL);
r600_blitter_end(ctx);
pipe_surface_reference(&dst_view, NULL);
@@ -884,7 +884,7 @@ static bool do_hardware_msaa_resolve(struct pipe_context *ctx,
r600_blitter_begin(ctx, R600_BLIT |
(info->render_condition_enable ? 0 : R600_DISABLE_RENDER_COND));
util_blitter_blit(rctx->blitter, &blit);
util_blitter_blit(rctx->blitter, &blit, NULL);
r600_blitter_end(ctx);
pipe_resource_reference(&tmp, NULL);
@@ -935,7 +935,7 @@ static void r600_blit(struct pipe_context *ctx,
r600_blitter_begin(ctx, R600_BLIT |
(info->render_condition_enable ? 0 : R600_DISABLE_RENDER_COND));
util_blitter_blit(rctx->blitter, info);
util_blitter_blit(rctx->blitter, info, NULL);
r600_blitter_end(ctx);
}

View File

@@ -1056,7 +1056,7 @@ void si_gfx_copy_image(struct si_context *sctx, struct pipe_resource *dst,
si_blitter_begin(sctx, SI_COPY);
util_blitter_blit_generic(sctx->blitter, dst_view, &dstbox, src_view, src_box, src->width0,
src->height0, PIPE_MASK_RGBAZS, PIPE_TEX_FILTER_NEAREST, NULL,
false, false, 0);
false, false, 0, NULL);
si_blitter_end(sctx);
pipe_surface_reference(&dst_view, NULL);
@@ -1259,7 +1259,7 @@ void si_gfx_blit(struct pipe_context *ctx, const struct pipe_blit_info *info)
sctx->sqtt_next_event = EventCmdBlitImage;
si_blitter_begin(sctx, SI_BLIT | (info->render_condition_enable ? 0 : SI_DISABLE_RENDER_COND));
util_blitter_blit(sctx->blitter, info);
util_blitter_blit(sctx->blitter, info, NULL);
si_blitter_end(sctx);
}

View File

@@ -84,7 +84,7 @@ static void sp_blit(struct pipe_context *pipe,
sp->sampler_views[PIPE_SHADER_FRAGMENT]);
util_blitter_save_render_condition(sp->blitter, sp->render_cond_query,
sp->render_cond_cond, sp->render_cond_mode);
util_blitter_blit(sp->blitter, info);
util_blitter_blit(sp->blitter, info, NULL);
}
static void

View File

@@ -690,7 +690,7 @@ try_blit(struct svga_context *svga, const struct pipe_blit_info *blit_info)
svga_toggle_render_condition(svga, blit.render_condition_enable, false);
util_blitter_blit(svga->blitter, &blit);
util_blitter_blit(svga->blitter, &blit, NULL);
svga_toggle_render_condition(svga, blit.render_condition_enable, true);

View File

@@ -127,7 +127,7 @@ v3d_render_blit(struct pipe_context *ctx, struct pipe_blit_info *info)
}
v3d_blitter_save(v3d, true, info->render_condition_enable);
util_blitter_blit(v3d->blitter, info);
util_blitter_blit(v3d->blitter, info, NULL);
pipe_resource_reference(&tiled, NULL);
info->mask = 0;
@@ -203,7 +203,7 @@ v3d_stencil_blit(struct pipe_context *ctx, struct pipe_blit_info *info)
PIPE_MASK_R,
PIPE_TEX_FILTER_NEAREST,
info->scissor_enable ? &info->scissor : NULL,
info->alpha_blend, false, 0);
info->alpha_blend, false, 0, NULL);
pipe_surface_reference(&dst_surf, NULL);
pipe_sampler_view_reference(&src_view, NULL);

View File

@@ -458,7 +458,7 @@ vc4_render_blit(struct pipe_context *ctx, struct pipe_blit_info *info)
}
vc4_blitter_save(vc4);
util_blitter_blit(vc4->blitter, info);
util_blitter_blit(vc4->blitter, info, NULL);
info->mask = 0;
}
@@ -528,7 +528,7 @@ vc4_stencil_blit(struct pipe_context *ctx, struct pipe_blit_info *info)
PIPE_MASK_RGBA : PIPE_MASK_R,
PIPE_TEX_FILTER_NEAREST,
info->scissor_enable ? &info->scissor : NULL,
info->alpha_blend, false, 0);
info->alpha_blend, false, 0, NULL);
pipe_surface_reference(&dst_surf, NULL);
pipe_sampler_view_reference(&src_view, NULL);

View File

@@ -361,7 +361,7 @@ zink_blit(struct pipe_context *pctx,
depth_blit.mask = PIPE_MASK_Z;
if (util_blitter_is_blit_supported(ctx->blitter, &depth_blit)) {
zink_blit_begin(ctx, ZINK_BLIT_SAVE_FB | ZINK_BLIT_SAVE_FS | ZINK_BLIT_SAVE_TEXTURES);
util_blitter_blit(ctx->blitter, &depth_blit);
util_blitter_blit(ctx->blitter, &depth_blit, NULL);
} else {
mesa_loge("ZINK: depth blit unsupported %s -> %s",
util_format_short_name(info->src.resource->format),
@@ -465,7 +465,7 @@ zink_blit(struct pipe_context *pctx,
} else {
struct pipe_blit_info new_info = *info;
new_info.src.resource = &use_src->base.b;
util_blitter_blit(ctx->blitter, &new_info);
util_blitter_blit(ctx->blitter, &new_info, NULL);
}
ctx->blitting = false;
ctx->rp_clears_enabled = rp_clears_enabled;

View File

@@ -809,7 +809,7 @@ zink_begin_render_pass(struct zink_context *ctx)
util_blitter_blit_generic(ctx->blitter, dst_view, &dstbox,
src_view, &dstbox, ctx->fb_state.width, ctx->fb_state.height,
PIPE_MASK_RGBAZS, PIPE_TEX_FILTER_NEAREST, NULL,
false, false, 0);
false, false, 0, NULL);
ctx->clears_enabled = clears_enabled;
ctx->rp_clears_enabled = rp_clears_enabled;
ctx->blitting = false;