dEQP-GLES2.functional.clipping.point.wide_point_clip,Fail
dEQP-GLES2.functional.clipping.point.wide_point_clip_viewport_center,Fail
dEQP-GLES2.functional.clipping.point.wide_point_clip_viewport_corner,Fail
-dEQP-GLES2.functional.texture.specification.basic_copytexsubimage2d.2d_alpha,Fail
-dEQP-GLES2.functional.texture.specification.basic_copytexsubimage2d.2d_luminance,Fail
-dEQP-GLES2.functional.texture.specification.basic_copytexsubimage2d.2d_rgba,Fail
-dEQP-GLES2.functional.texture.specification.basic_copytexsubimage2d.2d_rgb,Fail
dEQP-GLES31.functional.image_load_store.early_fragment_tests.early_fragment_tests_stencil,Crash
dEQP-GLES31.functional.image_load_store.early_fragment_tests.early_fragment_tests_stencil_fbo,Crash
dEQP-GLES31.functional.image_load_store.early_fragment_tests.early_fragment_tests_stencil_fbo_with_no_stencil,Crash
dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.sampler3d_fixed_vertex,Fail
dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.sampler3d_float_vertex,Fail
dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler2dshadow_vertex,Fail
-dEQP-GLES3.functional.texture.specification.basic_copytexsubimage2d.2d_alpha,Fail
-dEQP-GLES3.functional.texture.specification.basic_copytexsubimage2d.2d_rgba,Fail
dEQP-GLES3.functional.transform_feedback.array_element.interleaved.lines.highp_float,Fail
dEQP-GLES3.functional.transform_feedback.array_element.interleaved.lines.highp_ivec2,Fail
dEQP-GLES3.functional.transform_feedback.array_element.interleaved.lines.highp_ivec4,Fail
}
static void
-fd_blitter_pipe_begin(struct fd_context *ctx, bool render_cond,
- bool discard) assert_dt
+fd_blitter_pipe_begin(struct fd_context *ctx, bool render_cond) assert_dt
{
util_blitter_save_vertex_buffer_slot(ctx->blitter, ctx->vtx.vertexbuf.vb);
util_blitter_save_vertex_elements(ctx->blitter, ctx->vtx.vtx);
if (ctx->batch)
fd_batch_update_queries(ctx->batch);
-
- ctx->in_discard_blit = discard;
}
static void
fd_blitter_pipe_end(struct fd_context *ctx) assert_dt
{
- ctx->in_discard_blit = false;
}
bool
fd_blitter_blit(struct fd_context *ctx, const struct pipe_blit_info *info)
{
+ struct pipe_context *pctx = &ctx->base;
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;
- bool discard = false;
+
+ /* 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
+ * path.
+ */
+ if (util_blit_covers_whole_resource(info))
+ pctx->invalidate_resource(pctx, info->dst.resource);
/* 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
if (src == dst)
pipe->flush(pipe, NULL, 0);
- if (!info->scissor_enable && !info->alpha_blend) {
- discard = util_texrange_covers_whole_level(
- info->dst.resource, info->dst.level, info->dst.box.x, info->dst.box.y,
- info->dst.box.z, info->dst.box.width, info->dst.box.height,
- info->dst.box.depth);
- }
-
DBG_BLIT(info, NULL);
- fd_blitter_pipe_begin(ctx, info->render_condition_enable, discard);
+ fd_blitter_pipe_begin(ctx, info->render_condition_enable);
/* Initialize the surface. */
default_dst_texture(&dst_templ, dst, info->dst.level, info->dst.box.z);
fd_blitter_pipe_end(ctx);
+ /* While this shouldn't technically be necessary, it is required for
+ * dEQP-GLES31.functional.stencil_texturing.format.stencil_index8_cube and
+ * 2d_array to pass.
+ */
+ fd_bc_flush_writer(ctx, fd_resource(info->dst.resource));
+
/* The fallback blitter must never fail: */
return true;
}
/* Note: don't use discard=true, if there was something to
* discard, that would have been already handled in fd_clear().
*/
- fd_blitter_pipe_begin(ctx, false, false);
+ fd_blitter_pipe_begin(ctx, false);
util_blitter_save_fragment_constant_buffer_slot(
ctx->blitter, ctx->constbuf[PIPE_SHADER_FRAGMENT].cb);
pctx->flush(pctx, NULL, 0);
}
- /* TODO we could discard if dst box covers dst level fully.. */
- fd_blitter_pipe_begin(ctx, false, false);
+ /* TODO we could invalidate if dst box covers dst level fully. */
+ fd_blitter_pipe_begin(ctx, false);
util_blitter_copy_texture(ctx->blitter, dst, dst_level, dstx, dsty, dstz,
src, src_level, src_box);
fd_blitter_pipe_end(ctx);
struct fd_batch *batch = fd_context_batch(ctx);
- if (ctx->in_discard_blit) {
- fd_batch_reset(batch);
- fd_context_all_dirty(ctx);
- }
-
batch_draw_tracking(batch, info, indirect);
while (unlikely(!fd_batch_lock_submit(batch))) {
assert(ctx->batch == batch);
}
- batch->blit = ctx->in_discard_blit;
- batch->back_blit = ctx->in_shadow;
batch->num_draws++;
- ctx->in_discard_blit = false;
-
/* Marking the batch as needing flush must come after the batch
* dependency tracking (resource_read()/resource_write()), as that
* can trigger a flush
struct fd_batch *batch = fd_context_batch(ctx);
- if (ctx->in_discard_blit) {
- fd_batch_reset(batch);
- fd_context_all_dirty(ctx);
- }
-
batch_clear_tracking(batch, buffers);
while (unlikely(!fd_batch_lock_submit(batch))) {