intel: Don't change tiling mode unless the kernel reports success.

Fixes:

  Bug 26686 - Some textures are distorted with libdrm 2.4.18 in GTAVC&GTA3
  http://bugs.freedesktop.org/show_bug.cgi?id=26686

This bug continues to haunt me. The kernel SET_TILING ioctl is
inconsistent in its return values when reporting an error. If one of its
sanity checks fail, then the input values are left unchanged. If the
kernel later fails to change the tiling mode, then the input values are
modified to match the current tiling on the object. In short, userspace
cannot trust the return values upon error and so we must assume that
upon error our current tiling mode matches reality and not update.
main
Chris Wilson 2010-05-24 18:35:41 +01:00
parent a3305b076c
commit fcf3e616ee
1 changed files with 7 additions and 5 deletions

View File

@ -1662,13 +1662,15 @@ drm_intel_gem_bo_set_tiling(drm_intel_bo *bo, uint32_t * tiling_mode,
DRM_IOCTL_I915_GEM_SET_TILING,
&set_tiling);
} while (ret == -1 && errno == EINTR);
bo_gem->tiling_mode = set_tiling.tiling_mode;
bo_gem->swizzle_mode = set_tiling.swizzle_mode;
drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
if (ret == 0) {
bo_gem->tiling_mode = set_tiling.tiling_mode;
bo_gem->swizzle_mode = set_tiling.swizzle_mode;
drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
} else
ret = -errno;
*tiling_mode = bo_gem->tiling_mode;
return ret == 0 ? 0 : -errno;
return ret;
}
static int