[Mesa-dev] [PATCH] i965: Query the actual GTT size for reporting total usuable GPU memory

Chris Wilson chris at chris-wilson.co.uk
Mon Oct 19 04:08:41 PDT 2015


The amount of memory that the GPU can use in any single batch is the
amount of memory it can map into its page tables, that is the GTT size.
With per-process GTT (i.e. every context has its own set of page tables),
this value may differ from the global GTT size (and is often larger).
When reporting how much memory a client may use with the GPU, it is the
size of the context GTT that is the limiting factor.

(Additionally, get_aperture_ioctl is relatively expensive for our query
of the constant GTT size as it also computes addition information not
used here and has the side-effect of doing a sysfs scan for PCI
devices.)

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Daniel Vetter <daniel at ffwll.ch>
Cc: Kristian Høgsberg <krh at bitplanet.net>
Cc: Kenneth Graunke <kenneth at whitecape.org>
Cc: Ian Romanick <ian.d.romanick at intel.com>
---
 src/mesa/drivers/dri/i965/intel_screen.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
index b77b747..cdf5b0d 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -787,6 +787,22 @@ static const __DRIimageExtension intelImageExtension = {
     .getCapabilities                    = NULL
 };
 
+static uint64_t intel_get_gtt_size(int fd)
+{
+   struct drm_i915_gem_context_param p;
+   size_t mappable_size, aper_size;
+
+   memset(&p, 0, sizeof(p));
+#define I915_CONTEXT_PARAM_GTT_SIZE 0x3 /* XXX requires future libdrm */
+   p.param = I915_CONTEXT_PARAM_GTT_SIZE;
+   if (drmIoctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM, &p) == 0)
+      return p.value;
+
+   drm_intel_get_aperture_sizes(fd, &mappable_size, &aper_size);
+
+   return aper_size;
+}
+
 static int
 brw_query_renderer_integer(__DRIscreen *psp, int param, unsigned int *value)
 {
@@ -808,11 +824,7 @@ brw_query_renderer_integer(__DRIscreen *psp, int param, unsigned int *value)
        * assume that there's some fragmentation, and we start doing extra
        * flushing, etc.  That's the big cliff apps will care about.
        */
-      size_t aper_size;
-      size_t mappable_size;
-
-      drm_intel_get_aperture_sizes(psp->fd, &mappable_size, &aper_size);
-
+      uint64_t aper_size = intel_get_gtt_size(psp->fd);
       const unsigned gpu_mappable_megabytes =
          (aper_size / (1024 * 1024)) * 3 / 4;
 
-- 
2.6.1



More information about the mesa-dev mailing list