freedreno: Implement stencil blit fallback
Now that there is a util_blitter_clear_depth_stencil() helper, we can use that to implement stencil blits in the fallback path. Signed-off-by: Rob Clark <robdclark@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30064>
This commit is contained in:
@@ -10,10 +10,7 @@ dEQP-GLES3.functional.clipping.point.wide_point_clip,Fail
|
|||||||
dEQP-GLES3.functional.clipping.point.wide_point_clip_viewport_center,Fail
|
dEQP-GLES3.functional.clipping.point.wide_point_clip_viewport_center,Fail
|
||||||
dEQP-GLES3.functional.clipping.point.wide_point_clip_viewport_corner,Fail
|
dEQP-GLES3.functional.clipping.point.wide_point_clip_viewport_corner,Fail
|
||||||
dEQP-GLES3.functional.fbo.blit.depth_stencil.depth24_stencil8_basic,Fail
|
dEQP-GLES3.functional.fbo.blit.depth_stencil.depth24_stencil8_basic,Fail
|
||||||
dEQP-GLES3.functional.fbo.blit.depth_stencil.depth24_stencil8_scale,Fail
|
|
||||||
dEQP-GLES3.functional.fbo.blit.depth_stencil.depth24_stencil8_stencil_only,Fail
|
|
||||||
dEQP-GLES3.functional.fbo.blit.depth_stencil.depth32f_stencil8_basic,Fail
|
dEQP-GLES3.functional.fbo.blit.depth_stencil.depth32f_stencil8_basic,Fail
|
||||||
dEQP-GLES3.functional.fbo.blit.depth_stencil.depth32f_stencil8_scale,Fail
|
|
||||||
dEQP-GLES3.functional.fbo.blit.depth_stencil.depth32f_stencil8_stencil_only,Fail
|
dEQP-GLES3.functional.fbo.blit.depth_stencil.depth32f_stencil8_stencil_only,Fail
|
||||||
dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag,Fail
|
dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag,Fail
|
||||||
dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_dst_x,Fail
|
dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_dst_x,Fail
|
||||||
@@ -29,20 +26,13 @@ dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_dst_x,Fa
|
|||||||
dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_dst_y,Fail
|
dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_dst_y,Fail
|
||||||
dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_x,Fail
|
dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_x,Fail
|
||||||
dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_y,Fail
|
dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_y,Fail
|
||||||
dEQP-GLES3.functional.fbo.invalidate.sub.unbind_blit_color,Fail
|
|
||||||
dEQP-GLES3.functional.fbo.invalidate.sub.unbind_blit_depth,Fail
|
dEQP-GLES3.functional.fbo.invalidate.sub.unbind_blit_depth,Fail
|
||||||
dEQP-GLES3.functional.fbo.invalidate.sub.unbind_blit_msaa_color,Fail
|
|
||||||
dEQP-GLES3.functional.fbo.invalidate.sub.unbind_blit_msaa_depth,Fail
|
dEQP-GLES3.functional.fbo.invalidate.sub.unbind_blit_msaa_depth,Fail
|
||||||
dEQP-GLES3.functional.fbo.invalidate.whole.unbind_blit_color,Fail
|
dEQP-GLES3.functional.fbo.invalidate.whole.unbind_blit_color,Fail
|
||||||
dEQP-GLES3.functional.fbo.invalidate.whole.unbind_blit_depth,Fail
|
dEQP-GLES3.functional.fbo.invalidate.whole.unbind_blit_depth,Fail
|
||||||
dEQP-GLES3.functional.fbo.invalidate.whole.unbind_blit_msaa_color,Fail
|
|
||||||
dEQP-GLES3.functional.fbo.invalidate.whole.unbind_blit_msaa_depth,Fail
|
|
||||||
dEQP-GLES3.functional.fbo.msaa.2_samples.depth24_stencil8,Fail
|
|
||||||
dEQP-GLES3.functional.fbo.msaa.2_samples.depth32f_stencil8,Fail
|
dEQP-GLES3.functional.fbo.msaa.2_samples.depth32f_stencil8,Fail
|
||||||
dEQP-GLES3.functional.fbo.msaa.2_samples.stencil_index8,Fail
|
dEQP-GLES3.functional.fbo.msaa.2_samples.stencil_index8,Fail
|
||||||
dEQP-GLES3.functional.fbo.msaa.4_samples.depth24_stencil8,Fail
|
|
||||||
dEQP-GLES3.functional.fbo.msaa.4_samples.depth32f_stencil8,Fail
|
dEQP-GLES3.functional.fbo.msaa.4_samples.depth32f_stencil8,Fail
|
||||||
dEQP-GLES3.functional.fbo.msaa.4_samples.stencil_index8,Fail
|
|
||||||
dEQP-GLES3.functional.polygon_offset.float32_displacement_with_units,Fail
|
dEQP-GLES3.functional.polygon_offset.float32_displacement_with_units,Fail
|
||||||
dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.sampler3d_float_vertex,Fail
|
dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.sampler3d_float_vertex,Fail
|
||||||
dEQP-GLES3.functional.texture.specification.texstorage3d.size.3d_2x2x2_2_levels,Fail
|
dEQP-GLES3.functional.texture.specification.texstorage3d.size.3d_2x2x2_2_levels,Fail
|
||||||
@@ -73,8 +63,6 @@ KHR-GLES3.copy_tex_image_conversions.required.texture2d_texture2d,Fail
|
|||||||
KHR-GLES3.copy_tex_image_conversions.required.texture3d_cubemap_posx,Fail
|
KHR-GLES3.copy_tex_image_conversions.required.texture3d_cubemap_posx,Fail
|
||||||
KHR-GLES3.copy_tex_image_conversions.required.texture3d_texture2d,Fail
|
KHR-GLES3.copy_tex_image_conversions.required.texture3d_texture2d,Fail
|
||||||
|
|
||||||
KHR-GLES3.packed_depth_stencil.blit.depth32f_stencil8,Fail
|
|
||||||
|
|
||||||
# "Non-integer comparison: 1, 0, 18, 1e-05: 0.142857 == 0: not equal.
|
# "Non-integer comparison: 1, 0, 18, 1e-05: 0.142857 == 0: not equal.
|
||||||
# Copy stage: Gradient comparison failed during ReadPixels for input = [GL_RG, GL_FLOAT] output = [GL_RED, GL_FLOAT]"
|
# Copy stage: Gradient comparison failed during ReadPixels for input = [GL_RG, GL_FLOAT] output = [GL_RED, GL_FLOAT]"
|
||||||
KHR-GLES3.packed_pixels.pbo_rectangle.rg32f,Fail
|
KHR-GLES3.packed_pixels.pbo_rectangle.rg32f,Fail
|
||||||
|
|||||||
@@ -46,8 +46,6 @@ glx@glx-swap-pixmap-bad,Fail
|
|||||||
# "../src/freedreno/ir3/ir3_shader.h:968:ir3_link_add: Assertion `i < ARRAY_SIZE(l->var)' failed."
|
# "../src/freedreno/ir3/ir3_shader.h:968:ir3_link_add: Assertion `i < ARRAY_SIZE(l->var)' failed."
|
||||||
shaders@glsl-max-varyings >max_varying_components,Crash
|
shaders@glsl-max-varyings >max_varying_components,Crash
|
||||||
|
|
||||||
spec@arb_depth_buffer_float@fbo-clear-formats stencil,Fail
|
|
||||||
spec@arb_depth_buffer_float@fbo-clear-formats stencil@GL_DEPTH32F_STENCIL8,Fail
|
|
||||||
spec@arb_depth_buffer_float@fbo-generatemipmap-formats,Fail
|
spec@arb_depth_buffer_float@fbo-generatemipmap-formats,Fail
|
||||||
spec@arb_depth_buffer_float@fbo-generatemipmap-formats@GL_DEPTH_COMPONENT32F,Fail
|
spec@arb_depth_buffer_float@fbo-generatemipmap-formats@GL_DEPTH_COMPONENT32F,Fail
|
||||||
spec@arb_depth_buffer_float@fbo-generatemipmap-formats@GL_DEPTH_COMPONENT32F NPOT,Fail
|
spec@arb_depth_buffer_float@fbo-generatemipmap-formats@GL_DEPTH_COMPONENT32F NPOT,Fail
|
||||||
|
|||||||
@@ -53,8 +53,6 @@ glx@glx-swap-pixmap-bad,Fail
|
|||||||
# "../src/freedreno/ir3/ir3_shader.h:968:ir3_link_add: Assertion `i < ARRAY_SIZE(l->var)' failed."
|
# "../src/freedreno/ir3/ir3_shader.h:968:ir3_link_add: Assertion `i < ARRAY_SIZE(l->var)' failed."
|
||||||
shaders@glsl-max-varyings >max_varying_components,Crash
|
shaders@glsl-max-varyings >max_varying_components,Crash
|
||||||
|
|
||||||
spec@arb_depth_buffer_float@fbo-clear-formats stencil,Fail
|
|
||||||
spec@arb_depth_buffer_float@fbo-clear-formats stencil@GL_DEPTH32F_STENCIL8,Fail
|
|
||||||
spec@arb_depth_buffer_float@fbo-generatemipmap-formats,Fail
|
spec@arb_depth_buffer_float@fbo-generatemipmap-formats,Fail
|
||||||
spec@arb_depth_buffer_float@fbo-generatemipmap-formats@GL_DEPTH_COMPONENT32F,Fail
|
spec@arb_depth_buffer_float@fbo-generatemipmap-formats@GL_DEPTH_COMPONENT32F,Fail
|
||||||
spec@arb_depth_buffer_float@fbo-generatemipmap-formats@GL_DEPTH_COMPONENT32F NPOT,Fail
|
spec@arb_depth_buffer_float@fbo-generatemipmap-formats@GL_DEPTH_COMPONENT32F NPOT,Fail
|
||||||
|
|||||||
@@ -104,6 +104,8 @@ fd_blitter_pipe_begin(struct fd_context *ctx, bool render_cond) assert_dt
|
|||||||
util_blitter_save_fragment_sampler_views(
|
util_blitter_save_fragment_sampler_views(
|
||||||
ctx->blitter, ctx->tex[PIPE_SHADER_FRAGMENT].num_textures,
|
ctx->blitter, ctx->tex[PIPE_SHADER_FRAGMENT].num_textures,
|
||||||
ctx->tex[PIPE_SHADER_FRAGMENT].textures);
|
ctx->tex[PIPE_SHADER_FRAGMENT].textures);
|
||||||
|
util_blitter_save_fragment_constant_buffer_slot(ctx->blitter,
|
||||||
|
ctx->constbuf[PIPE_SHADER_FRAGMENT].cb);
|
||||||
if (!render_cond)
|
if (!render_cond)
|
||||||
util_blitter_save_render_condition(ctx->blitter, ctx->cond_query,
|
util_blitter_save_render_condition(ctx->blitter, ctx->cond_query,
|
||||||
ctx->cond_cond, ctx->cond_mode);
|
ctx->cond_cond, ctx->cond_mode);
|
||||||
@@ -117,22 +119,20 @@ fd_blitter_pipe_end(struct fd_context *ctx) assert_dt
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
static void
|
||||||
fd_blitter_blit(struct fd_context *ctx, const struct pipe_blit_info *info)
|
fd_blitter_prep(struct fd_context *ctx, const struct pipe_blit_info *info)
|
||||||
|
assert_dt
|
||||||
{
|
{
|
||||||
struct pipe_context *pctx = &ctx->base;
|
|
||||||
struct pipe_resource *dst = info->dst.resource;
|
struct pipe_resource *dst = info->dst.resource;
|
||||||
struct pipe_resource *src = info->src.resource;
|
struct pipe_resource *src = info->src.resource;
|
||||||
struct pipe_context *pipe = &ctx->base;
|
struct pipe_context *pipe = &ctx->base;
|
||||||
struct pipe_surface *dst_view, dst_templ;
|
|
||||||
struct pipe_sampler_view src_templ, *src_view;
|
|
||||||
|
|
||||||
/* If the blit is updating the whole contents of the resource,
|
/* If the blit is updating the whole contents of the resource,
|
||||||
* invalidate it so we don't trigger any unnecessary tile loads in the 3D
|
* invalidate it so we don't trigger any unnecessary tile loads in the 3D
|
||||||
* path.
|
* path.
|
||||||
*/
|
*/
|
||||||
if (util_blit_covers_whole_resource(info))
|
if (util_blit_covers_whole_resource(info))
|
||||||
pctx->invalidate_resource(pctx, info->dst.resource);
|
pipe->invalidate_resource(pipe, info->dst.resource);
|
||||||
|
|
||||||
/* The blit format may not match the resource format in this path, so
|
/* The blit format may not match the resource format in this path, so
|
||||||
* we need to validate that we can use the src/dst resource with the
|
* we need to validate that we can use the src/dst resource with the
|
||||||
@@ -153,6 +153,18 @@ fd_blitter_blit(struct fd_context *ctx, const struct pipe_blit_info *info)
|
|||||||
DBG_BLIT(info, NULL);
|
DBG_BLIT(info, NULL);
|
||||||
|
|
||||||
fd_blitter_pipe_begin(ctx, info->render_condition_enable);
|
fd_blitter_pipe_begin(ctx, info->render_condition_enable);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
fd_blitter_blit(struct fd_context *ctx, const struct pipe_blit_info *info)
|
||||||
|
{
|
||||||
|
struct pipe_resource *dst = info->dst.resource;
|
||||||
|
struct pipe_resource *src = info->src.resource;
|
||||||
|
struct pipe_context *pipe = &ctx->base;
|
||||||
|
struct pipe_surface *dst_view, dst_templ;
|
||||||
|
struct pipe_sampler_view src_templ, *src_view;
|
||||||
|
|
||||||
|
fd_blitter_prep(ctx, info);
|
||||||
|
|
||||||
/* Initialize the surface. */
|
/* Initialize the surface. */
|
||||||
default_dst_texture(&dst_templ, dst, info->dst.level, info->dst.box.z);
|
default_dst_texture(&dst_templ, dst, info->dst.level, info->dst.box.z);
|
||||||
@@ -311,6 +323,34 @@ fd_blitter_clear_depth_stencil(struct pipe_context *pctx, struct pipe_surface *p
|
|||||||
fd_blitter_pipe_end(ctx);
|
fd_blitter_pipe_end(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fd_blit_stencil_fallback(struct fd_context *ctx, const struct pipe_blit_info *info)
|
||||||
|
assert_dt
|
||||||
|
{
|
||||||
|
struct pipe_context *pctx = &ctx->base;
|
||||||
|
struct pipe_surface *dst_view, dst_templ;
|
||||||
|
|
||||||
|
util_blitter_default_dst_texture(&dst_templ, info->dst.resource,
|
||||||
|
info->dst.level, info->dst.box.z);
|
||||||
|
|
||||||
|
dst_view = pctx->create_surface(pctx, info->dst.resource, &dst_templ);
|
||||||
|
|
||||||
|
fd_blitter_prep(ctx, info);
|
||||||
|
|
||||||
|
util_blitter_clear_depth_stencil(ctx->blitter, dst_view, PIPE_CLEAR_STENCIL,
|
||||||
|
0, 0, info->dst.box.x, info->dst.box.y,
|
||||||
|
info->dst.box.width, info->dst.box.height);
|
||||||
|
|
||||||
|
fd_blitter_prep(ctx, info);
|
||||||
|
|
||||||
|
util_blitter_stencil_fallback(
|
||||||
|
ctx->blitter, info->dst.resource, info->dst.level, &info->dst.box,
|
||||||
|
info->src.resource, info->src.level, &info->src.box,
|
||||||
|
info->scissor_enable ? &info->scissor : NULL);
|
||||||
|
|
||||||
|
pipe_surface_release(pctx, &dst_view);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Optimal hardware path for blitting pixels.
|
* Optimal hardware path for blitting pixels.
|
||||||
* Scaling, format conversion, up- and downsampling (resolve) are allowed.
|
* Scaling, format conversion, up- and downsampling (resolve) are allowed.
|
||||||
@@ -328,8 +368,10 @@ fd_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info)
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (info.mask & PIPE_MASK_S) {
|
if (info.mask & PIPE_MASK_S) {
|
||||||
DBG("cannot blit stencil, skipping");
|
fd_blit_stencil_fallback(ctx, &info);
|
||||||
info.mask &= ~PIPE_MASK_S;
|
info.mask &= ~PIPE_MASK_S;
|
||||||
|
if (!info.mask)
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!util_blitter_is_blit_supported(ctx->blitter, &info)) {
|
if (!util_blitter_is_blit_supported(ctx->blitter, &info)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user