aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'intel/intel_bufmgr_gem.c')
-rw-r--r--intel/intel_bufmgr_gem.c28
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;