vk: Query aperture size up front in anv_physical_device_init()
authorKristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
Tue, 21 Jul 2015 20:09:25 +0000 (13:09 -0700)
committerKristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
Tue, 11 Aug 2015 00:18:55 +0000 (17:18 -0700)
We already query the device in various ways here and we can just also
get the aperture size.  This avoids keeping an extra drm fd open
during the life time of the driver.

Also, we need to use explicit 64 bit types for the aperture size, not
size_t.

src/vulkan/anv_device.c
src/vulkan/anv_gem.c
src/vulkan/anv_private.h

index 0c05c33f62641d2626852495520277d847d29c1c..7eed78c660e4eb4c6dfe02164c67809b2f4c2399 100644 (file)
@@ -41,20 +41,15 @@ anv_env_get_int(const char *name)
    return strtol(val, NULL, 0);
 }
 
-static void
-anv_physical_device_finish(struct anv_physical_device *device)
-{
-   if (device->fd >= 0)
-      close(device->fd);
-}
-
 static VkResult
 anv_physical_device_init(struct anv_physical_device *device,
                          struct anv_instance *instance,
                          const char *path)
 {
-   device->fd = open(path, O_RDWR | O_CLOEXEC);
-   if (device->fd < 0)
+   int fd;
+
+   fd = open(path, O_RDWR | O_CLOEXEC);
+   if (fd < 0)
       return vk_error(VK_ERROR_UNAVAILABLE);
 
    device->instance = instance;
@@ -66,7 +61,7 @@ anv_physical_device_init(struct anv_physical_device *device,
       /* INTEL_DEVID_OVERRIDE implies INTEL_NO_HW. */
       device->no_hw = true;
    } else {
-      device->chipset_id = anv_gem_get_param(device->fd, I915_PARAM_CHIPSET_ID);
+      device->chipset_id = anv_gem_get_param(fd, I915_PARAM_CHIPSET_ID);
    }
    if (!device->chipset_id)
       goto fail;
@@ -76,22 +71,27 @@ anv_physical_device_init(struct anv_physical_device *device,
    if (!device->info)
       goto fail;
    
-   if (!anv_gem_get_param(device->fd, I915_PARAM_HAS_WAIT_TIMEOUT))
+   if (anv_gem_get_aperture(fd, &device->aperture_size) == -1)
+      goto fail;
+
+   if (!anv_gem_get_param(fd, I915_PARAM_HAS_WAIT_TIMEOUT))
       goto fail;
 
-   if (!anv_gem_get_param(device->fd, I915_PARAM_HAS_EXECBUF2))
+   if (!anv_gem_get_param(fd, I915_PARAM_HAS_EXECBUF2))
       goto fail;
 
-   if (!anv_gem_get_param(device->fd, I915_PARAM_HAS_LLC))
+   if (!anv_gem_get_param(fd, I915_PARAM_HAS_LLC))
       goto fail;
 
-   if (!anv_gem_get_param(device->fd, I915_PARAM_HAS_EXEC_CONSTANTS))
+   if (!anv_gem_get_param(fd, I915_PARAM_HAS_EXEC_CONSTANTS))
       goto fail;
    
+   close(fd);
+
    return VK_SUCCESS;
    
 fail:
-   anv_physical_device_finish(device);
+   close(fd);
    return vk_error(VK_ERROR_UNAVAILABLE);
 }
 
@@ -154,10 +154,6 @@ VkResult anv_DestroyInstance(
 {
    ANV_FROM_HANDLE(anv_instance, instance, _instance);
 
-   if (instance->physicalDeviceCount > 0) {
-      anv_physical_device_finish(&instance->physicalDevice);
-   }
-
    VG(VALGRIND_DESTROY_MEMPOOL(instance));
 
    instance->pfnFree(instance->pAllocUserData, instance);
@@ -456,17 +452,12 @@ VkResult anv_GetPhysicalDeviceMemoryProperties(
     VkPhysicalDeviceMemoryProperties*           pMemoryProperties)
 {
    ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice);
-
-   size_t aperture_size;
-   size_t heap_size;
-
-   if (anv_gem_get_aperture(physical_device, &aperture_size) == -1)
-      return vk_error(VK_ERROR_UNAVAILABLE);
+   VkDeviceSize heap_size;
 
    /* Reserve some wiggle room for the driver by exposing only 75% of the
     * aperture to the heap.
     */
-   heap_size = 3 * aperture_size / 4;
+   heap_size = 3 * physical_device->aperture_size / 4;
 
    /* The property flags below are valid only for llc platforms. */
    pMemoryProperties->memoryTypeCount = 1;
index 4ce857e2a5f28febf85547769c1d37ea97c15913..01671d2ea50cccc5d75da0b0b32eb4947c592153 100644 (file)
@@ -230,13 +230,13 @@ anv_gem_destroy_context(struct anv_device *device, int context)
 }
 
 int
-anv_gem_get_aperture(struct anv_physical_device *physical_dev, uint64_t *size)
+anv_gem_get_aperture(int fd, uint64_t *size)
 {
    struct drm_i915_gem_get_aperture aperture;
    int ret;
 
    VG_CLEAR(aperture);
-   ret = anv_ioctl(physical_dev->fd, DRM_IOCTL_I915_GEM_GET_APERTURE, &aperture);
+   ret = anv_ioctl(fd, DRM_IOCTL_I915_GEM_GET_APERTURE, &aperture);
    if (ret == -1)
       return -1;
 
index 48edc6c95ed04e9fe97e29457652c9fc3909f5c7..d53f63d5d27b1209f4c65a6322147524b12e0ece 100644 (file)
@@ -339,7 +339,7 @@ struct anv_physical_device {
     const char *                                path;
     const char *                                name;
     const struct brw_device_info *              info;
-    int                                         fd;
+    uint64_t                                    aperture_size;
 };
 
 struct anv_instance {
@@ -444,7 +444,7 @@ int anv_gem_set_tiling(struct anv_device *device, int gem_handle,
 int anv_gem_create_context(struct anv_device *device);
 int anv_gem_destroy_context(struct anv_device *device, int context);
 int anv_gem_get_param(int fd, uint32_t param);
-int anv_gem_get_aperture(struct anv_physical_device *physical_dev, uint64_t *size);
+int anv_gem_get_aperture(int fd, uint64_t *size);
 int anv_gem_handle_to_fd(struct anv_device *device, int gem_handle);
 int anv_gem_fd_to_handle(struct anv_device *device, int fd);
 int anv_gem_userptr(struct anv_device *device, void *mem, size_t size);