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 <ch...@chris-wilson.co.uk>
Cc: Daniel Vetter <dan...@ffwll.ch>
Cc: Kristian Høgsberg <k...@bitplanet.net>
Cc: Kenneth Graunke <kenn...@whitecape.org>
Cc: Ian Romanick <ian.d.roman...@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

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to