[Mesa-dev] [PATCH 12/19] gallium/i915: handle query_renderer caps

Emil Velikov emil.l.velikov at gmail.com
Thu Aug 14 15:18:21 PDT 2014


Implementation based on the classic driver with the following
changes:
 - Use auxiliarry function os_get_total_physical_memory to get the
total amount of memory.
 - Move the libdrm_intel specific get_aperture_size to the winsys.

Cc: Stephane Marchesin <stephane.marchesin at gmail.com>
Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
---
 src/gallium/drivers/i915/i915_screen.c        | 23 +++++++++++++++++++++++
 src/gallium/drivers/i915/i915_winsys.h        |  5 +++++
 src/gallium/winsys/i915/drm/i915_drm_winsys.c | 12 ++++++++++++
 3 files changed, 40 insertions(+)

diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c
index ca3dd4a..f3b89b5 100644
--- a/src/gallium/drivers/i915/i915_screen.c
+++ b/src/gallium/drivers/i915/i915_screen.c
@@ -27,6 +27,7 @@
 
 
 #include "draw/draw_context.h"
+#include "os/os_misc.h"
 #include "util/u_format.h"
 #include "util/u_format_s3tc.h"
 #include "util/u_inlines.h"
@@ -282,6 +283,28 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
    case PIPE_CAP_ENDIANNESS:
       return PIPE_ENDIAN_LITTLE;
 
+   case PIPE_CAP_VENDOR_ID:
+      return 0x8086;
+   case PIPE_CAP_DEVICE_ID:
+      return is->iws->pci_id;
+   case PIPE_CAP_ACCELERATED:
+      return 1;
+   case PIPE_CAP_VIDEO_MEMORY: {
+      /* Once a batch uses more than 75% of the maximum mappable size, we
+       * assume that there's some fragmentation, and we start doing extra
+       * flushing, etc.  That's the big cliff apps will care about.
+       */
+      const int gpu_mappable_megabytes = is->iws->aperture_size(is->iws) * 3 / 4;
+      uint64_t system_memory;
+
+      if (!os_get_total_physical_memory(&system_memory))
+         return 0;
+
+      return MIN2(gpu_mappable_megabytes, (int) (system_memory >> 20));
+   }
+   case PIPE_CAP_UMA:
+      return 1;
+
    default:
       debug_printf("%s: Unknown cap %u.\n", __FUNCTION__, cap);
       return 0;
diff --git a/src/gallium/drivers/i915/i915_winsys.h b/src/gallium/drivers/i915/i915_winsys.h
index 8823c54..6cf802f 100644
--- a/src/gallium/drivers/i915/i915_winsys.h
+++ b/src/gallium/drivers/i915/i915_winsys.h
@@ -247,6 +247,11 @@ struct i915_winsys {
                        struct pipe_fence_handle *fence);
    /*@}*/
 
+   /**
+    * Retrieve the aperture size (in MiB) of the device.
+    */
+   int (*aperture_size)(struct i915_winsys *iws);
+
 
    /**
     * Destroy the winsys.
diff --git a/src/gallium/winsys/i915/drm/i915_drm_winsys.c b/src/gallium/winsys/i915/drm/i915_drm_winsys.c
index 9e16f40..d4a2e01 100644
--- a/src/gallium/winsys/i915/drm/i915_drm_winsys.c
+++ b/src/gallium/winsys/i915/drm/i915_drm_winsys.c
@@ -28,6 +28,17 @@ i915_drm_get_device_id(int fd, unsigned int *device_id)
    assert(ret == 0);
 }
 
+static int
+i915_drm_aperture_size(struct i915_winsys *iws)
+{
+   struct i915_drm_winsys *idws = i915_drm_winsys(iws);
+   size_t aper_size, mappable_size;
+
+   drm_intel_get_aperture_sizes(idws->fd, &mappable_size, &aper_size);
+
+   return aper_size >> 20;
+}
+
 static void
 i915_drm_winsys_destroy(struct i915_winsys *iws)
 {
@@ -58,6 +69,7 @@ i915_drm_winsys_create(int drmFD)
    idws->base.pci_id = deviceID;
    idws->max_batch_size = 1 * 4096;
 
+   idws->base.aperture_size = i915_drm_aperture_size;
    idws->base.destroy = i915_drm_winsys_destroy;
 
    idws->gem_manager = drm_intel_bufmgr_gem_init(idws->fd, idws->max_batch_size);
-- 
2.0.2



More information about the mesa-dev mailing list