diff options
Diffstat (limited to 'intel/intel_bufmgr_gem.c')
-rw-r--r-- | intel/intel_bufmgr_gem.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c index 60174e19..c5847a8a 100644 --- a/intel/intel_bufmgr_gem.c +++ b/intel/intel_bufmgr_gem.c | |||
@@ -99,6 +99,8 @@ typedef struct _drm_intel_bufmgr_gem { | |||
99 | int available_fences; | 99 | int available_fences; |
100 | int pci_device; | 100 | int pci_device; |
101 | int gen; | 101 | int gen; |
102 | char has_bsd; | ||
103 | char has_blt; | ||
102 | char bo_reuse; | 104 | char bo_reuse; |
103 | char fenced_relocs; | 105 | char fenced_relocs; |
104 | } drm_intel_bufmgr_gem; | 106 | } drm_intel_bufmgr_gem; |
@@ -1545,8 +1547,21 @@ drm_intel_gem_bo_mrb_exec2(drm_intel_bo *bo, int used, | |||
1545 | struct drm_i915_gem_execbuffer2 execbuf; | 1547 | struct drm_i915_gem_execbuffer2 execbuf; |
1546 | int ret, i; | 1548 | int ret, i; |
1547 | 1549 | ||
1548 | if ((ring_flag != I915_EXEC_RENDER) && (ring_flag != I915_EXEC_BSD)) | 1550 | switch (ring_flag) { |
1551 | default: | ||
1549 | return -EINVAL; | 1552 | return -EINVAL; |
1553 | case I915_EXEC_BLT: | ||
1554 | if (!bufmgr_gem->has_blt) | ||
1555 | return -EINVAL; | ||
1556 | break; | ||
1557 | case I915_EXEC_BSD: | ||
1558 | if (!bufmgr_gem->has_bsd) | ||
1559 | return -EINVAL; | ||
1560 | break; | ||
1561 | case I915_EXEC_RENDER: | ||
1562 | case I915_EXEC_DEFAULT: | ||
1563 | break; | ||
1564 | } | ||
1550 | 1565 | ||
1551 | pthread_mutex_lock(&bufmgr_gem->lock); | 1566 | pthread_mutex_lock(&bufmgr_gem->lock); |
1552 | /* Update indices and set up the validate list. */ | 1567 | /* Update indices and set up the validate list. */ |
@@ -2054,7 +2069,7 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size) | |||
2054 | struct drm_i915_gem_get_aperture aperture; | 2069 | struct drm_i915_gem_get_aperture aperture; |
2055 | drm_i915_getparam_t gp; | 2070 | drm_i915_getparam_t gp; |
2056 | int ret; | 2071 | int ret; |
2057 | int exec2 = 0, has_bsd = 0; | 2072 | int exec2 = 0; |
2058 | 2073 | ||
2059 | bufmgr_gem = calloc(1, sizeof(*bufmgr_gem)); | 2074 | bufmgr_gem = calloc(1, sizeof(*bufmgr_gem)); |
2060 | if (bufmgr_gem == NULL) | 2075 | if (bufmgr_gem == NULL) |
@@ -2107,8 +2122,11 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size) | |||
2107 | 2122 | ||
2108 | gp.param = I915_PARAM_HAS_BSD; | 2123 | gp.param = I915_PARAM_HAS_BSD; |
2109 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); | 2124 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); |
2110 | if (!ret) | 2125 | bufmgr_gem->has_bsd = ret == 0; |
2111 | has_bsd = 1; | 2126 | |
2127 | gp.param = I915_PARAM_HAS_BLT; | ||
2128 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); | ||
2129 | bufmgr_gem->has_blt = ret == 0; | ||
2112 | 2130 | ||
2113 | if (bufmgr_gem->gen < 4) { | 2131 | if (bufmgr_gem->gen < 4) { |
2114 | gp.param = I915_PARAM_NUM_FENCES_AVAIL; | 2132 | gp.param = I915_PARAM_NUM_FENCES_AVAIL; |
@@ -2165,7 +2183,7 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size) | |||
2165 | /* Use the new one if available */ | 2183 | /* Use the new one if available */ |
2166 | if (exec2) { | 2184 | if (exec2) { |
2167 | bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec2; | 2185 | bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec2; |
2168 | if (has_bsd) | 2186 | if (bufmgr_gem->has_bsd|bufmgr_gem->has_blt) |
2169 | bufmgr_gem->bufmgr.bo_mrb_exec = drm_intel_gem_bo_mrb_exec2; | 2187 | bufmgr_gem->bufmgr.bo_mrb_exec = drm_intel_gem_bo_mrb_exec2; |
2170 | } else | 2188 | } else |
2171 | bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec; | 2189 | bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec; |