freedreno/a5xx: ARB_framebuffer_no_attachments support

Signed-off-by: Rob Clark <robdclark@gmail.com>
diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_screen.c b/src/gallium/drivers/freedreno/a5xx/fd5_screen.c
index 96f83ed..2816c36 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_screen.c
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_screen.c
@@ -73,6 +73,11 @@
 				PIPE_BIND_SHARED);
 	}
 
+	/* For ARB_framebuffer_no_attachments: */
+	if ((usage & PIPE_BIND_RENDER_TARGET) && (format == PIPE_FORMAT_NONE)) {
+		retval |= usage & PIPE_BIND_RENDER_TARGET;
+	}
+
 	if ((usage & PIPE_BIND_DEPTH_STENCIL) &&
 			(fd5_pipe2depth(format) != (enum a5xx_depth_format)~0) &&
 			(fd5_pipe2tex(format) != (enum a5xx_tex_fmt)~0)) {
diff --git a/src/gallium/drivers/freedreno/freedreno_gmem.c b/src/gallium/drivers/freedreno/freedreno_gmem.c
index 9c534c4..fef7673 100644
--- a/src/gallium/drivers/freedreno/freedreno_gmem.c
+++ b/src/gallium/drivers/freedreno/freedreno_gmem.c
@@ -397,6 +397,11 @@
 		} else if (!(fd_mesa_debug & FD_DBG_NOBYPASS)) {
 			sysmem = true;
 		}
+
+		/* For ARB_framebuffer_no_attachments: */
+		if ((pfb->nr_cbufs == 0) && !pfb->zsbuf) {
+			sysmem = true;
+		}
 	}
 
 	fd_reset_wfi(batch);
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
index 0061b20..62dfd26 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -295,7 +295,6 @@
 	case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
 	case PIPE_CAP_GENERATE_MIPMAP:
 	case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
-	case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
 	case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
 	case PIPE_CAP_CULL_DISTANCE:
 	case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
@@ -330,6 +329,7 @@
 		return 0;
 
 	case PIPE_CAP_DRAW_INDIRECT:
+	case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
 		if (is_a5xx(screen))
 			return 1;
 		return 0;