diff --git a/src/gallium/drivers/panfrost/pan_blit.c b/src/gallium/drivers/panfrost/pan_blit.c
index 1140ff6b6e4..ab8c26d1d2d 100644
--- a/src/gallium/drivers/panfrost/pan_blit.c
+++ b/src/gallium/drivers/panfrost/pan_blit.c
@@ -25,7 +25,8 @@ panfrost_blitter_draw_rectangle(struct blitter_context *blitter,
struct panfrost_context *pctx = pan_context(ctx);
struct panfrost_screen *scr = pan_screen(ctx->screen);
- if (scr->dev.arch != 9 || depth != 0.0f || num_instances > 1)
+ if (scr->dev.arch <= 8 || scr->dev.arch >= 11 || depth != 0.0f ||
+ num_instances > 1)
goto fallback;
/* Map viewport to the dest rect of the framebuffer. The tiler will then be
diff --git a/src/gallium/drivers/panfrost/pan_csf.c b/src/gallium/drivers/panfrost/pan_csf.c
index 7b66a54f4b8..fabc3a4e4be 100644
--- a/src/gallium/drivers/panfrost/pan_csf.c
+++ b/src/gallium/drivers/panfrost/pan_csf.c
@@ -1476,12 +1476,97 @@ GENX(csf_launch_draw_indirect)(struct panfrost_batch *batch,
}
}
+#if PAN_ARCH == 10
+static struct pan_ptr
+csf_emit_fullscreen_dcd(struct panfrost_batch *batch,
+ struct pan_ptr vertex_array, uint64_t resources)
+{
+ struct panfrost_context *ctx = batch->ctx;
+ struct pan_ptr dcd = pan_pool_alloc_desc(&batch->pool.base, DRAW);
+ struct MALI_DCD_FLAGS_0 dcd_flags0_unpacked = { 0, };
+ struct MALI_DCD_FLAGS_1 dcd_flags1_unpacked = { 0, };
+
+ csf_emit_draw_flags(ctx, MESA_PRIM_QUADS, true, &dcd_flags0_unpacked,
+ &dcd_flags1_unpacked);
+
+ pan_cast_and_pack(dcd.cpu, DRAW, cfg) {
+ /* Flags */
+ cfg.flags_0 = dcd_flags0_unpacked;
+ cfg.flags_1 = dcd_flags1_unpacked;
+
+ /* Vertex descriptor */
+ if (vertex_array.cpu) {
+ cfg.vertex_array.packet = true;
+ cfg.vertex_array.pointer = vertex_array.gpu;
+ cfg.vertex_array.vertex_packet_stride =
+ PAN_RUN_FULLSCREEN_PACKET_STRIDE;
+ cfg.vertex_array.vertex_attribute_stride =
+ PAN_RUN_FULLSCREEN_ATTRIB_STRIDE;
+ }
+
+ /* Depth/stencil and blend descriptor */
+ cfg.minimum_z = batch->minimum_z;
+ cfg.maximum_z = batch->maximum_z;
+ cfg.depth_stencil = batch->depth_stencil;
+ cfg.blend_count = MAX2(batch->key.nr_cbufs, 1);
+ cfg.blend = batch->blend;
+
+ /* Shader environment */
+ cfg.shader.attribute_offset = 0;
+ cfg.shader.fau_count = DIV_ROUND_UP(
+ batch->nr_push_uniforms[MESA_SHADER_FRAGMENT], 2);
+ cfg.shader.resources = resources;
+ cfg.shader.shader = batch->rsd[MESA_SHADER_FRAGMENT];
+ cfg.shader.thread_storage = batch->tls.gpu;
+ cfg.shader.fau = batch->push_uniforms[MESA_SHADER_FRAGMENT];
+ }
+
+ return dcd;
+}
+#endif
+
void
GENX(csf_launch_draw_fullscreen)(struct panfrost_batch *batch,
enum blitter_attrib_type type,
const struct blitter_attrib *attrib)
{
- UNREACHABLE("draw fullscreen not implemented for csf");
+#if PAN_ARCH == 10
+ PAN_TRACE_FUNC(PAN_TRACE_GL_CSF);
+
+ struct cs_builder *b = batch->csf.cs.builder;
+
+ if (batch->draw_count == 0) {
+ emit_tiler_oom_context(b, batch);
+ cs_vt_start(batch->csf.cs.builder, cs_now());
+ }
+
+ /* Build draw call. */
+ struct pan_ptr array = panfrost_emit_fullscreen_vertex_array(batch, type,
+ attrib);
+ uint64_t resources = panfrost_emit_resources(batch, MESA_SHADER_FRAGMENT);
+ struct pan_ptr dcd = csf_emit_fullscreen_dcd(batch, array, resources);
+
+ struct mali_primitive_flags_packed primitive_flags;
+ pan_pack(&primitive_flags, PRIMITIVE_FLAGS, cfg) {
+ cfg.scissor_array_enable = false;
+ cfg.view_mask = 0;
+ }
+
+ /* Set input staging registers. */
+ uint64_t *sbd = (uint64_t *)batch->scissor;
+ cs_move64_to(b, cs_sr_reg64(b, FULLSCREEN, TILER_CTX),
+ csf_get_tiler_desc(batch));
+ cs_move64_to(b, cs_sr_reg64(b, FULLSCREEN, SCISSOR_BOX), *sbd);
+ cs_move32_to(b, cs_sr_reg32(b, FULLSCREEN, TILER_FLAGS),
+ primitive_flags.opaque[0]);
+
+ /* Emit RUN_FULLSCREEN. */
+ struct cs_index dcd_pointer = cs_reg64(b, 64);
+ cs_move64_to(b, dcd_pointer, dcd.gpu);
+ cs_run_fullscreen(b, 0, dcd_pointer);
+#else
+ UNREACHABLE("Unsupported architecture!");
+#endif
}
#define POSITION_FIFO_SIZE (64 * 1024)
diff --git a/src/panfrost/ci/panfrost-g610-fails.txt b/src/panfrost/ci/panfrost-g610-fails.txt
index 1285b3a49bd..327c9500e97 100644
--- a/src/panfrost/ci/panfrost-g610-fails.txt
+++ b/src/panfrost/ci/panfrost-g610-fails.txt
@@ -113,7 +113,6 @@ spec@egl 1.4@eglterminate then unbind context,Fail
spec@egl_khr_gl_image@egl_khr_gl_renderbuffer_image-clear-shared-image gl_depth_component24,Fail
spec@egl_khr_surfaceless_context@viewport,Fail
spec@egl_mesa_configless_context@basic,Fail
-spec@ext_framebuffer_blit@fbo-blit-check-limits,Fail
spec@ext_framebuffer_multisample@accuracy 16 srgb depthstencil,Fail
spec@ext_framebuffer_multisample@accuracy 16 srgb depthstencil linear,Fail
spec@ext_framebuffer_multisample@accuracy 16 srgb small depthstencil,Fail
diff --git a/src/panfrost/genxml/v10.xml b/src/panfrost/genxml/v10.xml
index 2fd4bb86637..0eeae1d67fd 100644
--- a/src/panfrost/genxml/v10.xml
+++ b/src/panfrost/genxml/v10.xml
@@ -921,6 +921,12 @@
+
+
+
+
+
+
@@ -2095,10 +2101,8 @@
-
+
-
-