r300g: generalize the way we ask for hyperz
authorMarek Olšák <maraeo@gmail.com>
Sat, 7 Aug 2010 00:05:03 +0000 (02:05 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sun, 8 Aug 2010 20:28:35 +0000 (22:28 +0200)
This makes it compatible with the modified DRM interface in drm-radeon-testing.

Also, now you need to set RADEON_HYPERZ=1 to be able to use hyperz.
It's not bug-free yet.

src/gallium/winsys/radeon/drm/radeon_drm.c

index ecaf096dea2d13ed06eaec4620b6f2713b5e1096..593741b86c7be1447bcb9564c57b9b74dfdb1c5a 100644 (file)
@@ -55,6 +55,31 @@ radeon_winsys_create(int fd)
     return rws;
 }
 
+/* Enable/disable Hyper-Z access. Return TRUE on success. */
+static boolean radeon_set_hyperz_access(int fd, boolean enable)
+{
+#ifndef RADEON_INFO_WANT_HYPERZ
+#define RADEON_INFO_WANT_HYPERZ 7
+#endif
+
+    struct drm_radeon_info info = {0};
+    unsigned value = enable ? 1 : 0;
+
+    if (!debug_get_bool_option("RADEON_HYPERZ", FALSE))
+        return FALSE;
+
+    info.value = (unsigned long)&value;
+    info.request = RADEON_INFO_WANT_HYPERZ;
+
+    if (drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info)) != 0)
+        return FALSE;
+
+    if (enable && !value)
+        return FALSE;
+
+    return TRUE;
+}
+
 /* Helper function to do the ioctls needed for setup and init. */
 static void do_ioctls(int fd, struct radeon_libdrm_winsys* winsys)
 {
@@ -134,15 +159,7 @@ static void do_ioctls(int fd, struct radeon_libdrm_winsys* winsys)
     }
     winsys->z_pipes = target;
 
-    winsys->hyperz = FALSE;
-#ifndef RADEON_INFO_WANT_HYPERZ
-#define RADEON_INFO_WANT_HYPERZ 7
-#endif
-    info.request = RADEON_INFO_WANT_HYPERZ;
-    retval = drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info));
-    if (!retval && target == 1) {
-        winsys->hyperz = TRUE;
-    }
+    winsys->hyperz = radeon_set_hyperz_access(fd, TRUE);
 
     retval = drmCommandWriteRead(fd, DRM_RADEON_GEM_INFO,
             &gem_info, sizeof(gem_info));