diff --git a/src/gallium/drivers/nv30/nv30_screen.c b/src/gallium/drivers/nv30/nv30_screen.c
index 41af384..4eeaae5 100644
--- a/src/gallium/drivers/nv30/nv30_screen.c
+++ b/src/gallium/drivers/nv30/nv30_screen.c
@@ -10,6 +10,18 @@
 #define NV34TCL_CHIPSET_3X_MASK 0x00000010
 #define NV35TCL_CHIPSET_3X_MASK 0x000001e0
 
+/* FIXME: should find a way to get front surface */
+struct nouveau_winsys {
+	struct pipe_winsys base;
+
+	struct pipe_screen *pscreen;
+
+	unsigned nr_pctx;
+	struct pipe_context **pctx;
+
+	struct pipe_surface *front;
+};
+
 static int
 nv30_screen_get_param(struct pipe_screen *pscreen, int param)
 {
@@ -83,6 +95,24 @@ nv30_screen_surface_format_supported(struct pipe_screen *pscreen,
 				     enum pipe_texture_target target,
 				     unsigned tex_usage, unsigned geom_flags)
 {
+#if 1
+	struct pipe_surface *front = ((struct nouveau_winsys *) pscreen->winsys)->front;
+
+	if (tex_usage & PIPE_TEXTURE_USAGE_RENDER_TARGET) {
+		return (format == front->format);
+	} else
+	if (tex_usage & PIPE_TEXTURE_USAGE_DEPTH_STENCIL) {
+		switch (format) {
+		case PIPE_FORMAT_Z24S8_UNORM:
+		case PIPE_FORMAT_Z24X8_UNORM:
+			return (front->format == PIPE_FORMAT_A8R8G8B8_UNORM)
+				|| (front->format == PIPE_FORMAT_A8R8G8B8_UNORM);
+		case PIPE_FORMAT_Z16_UNORM:
+			return (front->format == PIPE_FORMAT_R5G6B5_UNORM);
+		default:
+			break;
+		}
+#else
 	if (tex_usage & PIPE_TEXTURE_USAGE_RENDER_TARGET) {
 		switch (format) {
 		case PIPE_FORMAT_A8R8G8B8_UNORM:
@@ -101,6 +131,7 @@ nv30_screen_surface_format_supported(struct pipe_screen *pscreen,
 		default:
 			break;
 		}
+#endif
 	} else {
 		switch (format) {
 		case PIPE_FORMAT_A8R8G8B8_UNORM:
