gen_device_info devinfo;
uint32_t batch_bo_handle;
+#if GEN_GEN >= 8
+ uint64_t batch_bo_addr;
+#endif
uint32_t batch_offset;
void *batch_map;
+#if GEN_GEN < 8
std::vector<drm_i915_gem_relocation_entry> relocs;
+#endif
uint32_t data_bo_handle;
+#if GEN_GEN >= 8
+ uint64_t data_bo_addr;
+#endif
void *data_map;
char *input;
char *output;
(void *)&ctx_create), 0) << strerror(errno);
ctx_id = ctx_create.ctx_id;
+ if (GEN_GEN >= 8) {
+ /* On gen8+, we require softpin */
+ int has_softpin;
+ drm_i915_getparam getparam = drm_i915_getparam();
+ getparam.param = I915_PARAM_HAS_EXEC_SOFTPIN;
+ getparam.value = &has_softpin;
+ ASSERT_EQ(drmIoctl(fd, DRM_IOCTL_I915_GETPARAM,
+ (void *)&getparam), 0) << strerror(errno);
+ ASSERT_TRUE(has_softpin);
+ }
+
// Create the batch buffer
drm_i915_gem_create gem_create = drm_i915_gem_create();
gem_create.size = BATCH_BO_SIZE;
ASSERT_EQ(drmIoctl(fd, DRM_IOCTL_I915_GEM_CREATE,
(void *)&gem_create), 0) << strerror(errno);
batch_bo_handle = gem_create.handle;
+#if GEN_GEN >= 8
+ batch_bo_addr = 0xffffffffdff70000ULL;
+#endif
drm_i915_gem_caching gem_caching = drm_i915_gem_caching();
gem_caching.handle = batch_bo_handle;
ASSERT_EQ(drmIoctl(fd, DRM_IOCTL_I915_GEM_CREATE,
(void *)&gem_create), 0) << strerror(errno);
data_bo_handle = gem_create.handle;
+#if GEN_GEN >= 8
+ data_bo_addr = 0xffffffffefff0000ULL;
+#endif
gem_caching = drm_i915_gem_caching();
gem_caching.handle = data_bo_handle;
objects[0].handle = data_bo_handle;
objects[0].relocation_count = 0;
objects[0].relocs_ptr = 0;
+#if GEN_GEN >= 8 /* On gen8+, we pin everything */
+ objects[0].flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS |
+ EXEC_OBJECT_PINNED |
+ EXEC_OBJECT_WRITE;
+ objects[0].offset = data_bo_addr;
+#else
objects[0].flags = EXEC_OBJECT_WRITE;
objects[0].offset = -1;
- if (GEN_GEN >= 8)
- objects[0].flags |= EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
+#endif
objects[1].handle = batch_bo_handle;
+#if GEN_GEN >= 8 /* On gen8+, we don't use relocations */
+ objects[1].relocation_count = 0;
+ objects[1].relocs_ptr = 0;
+ objects[1].flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS |
+ EXEC_OBJECT_PINNED;
+ objects[1].offset = batch_bo_addr;
+#else
objects[1].relocation_count = relocs.size();
objects[1].relocs_ptr = (uintptr_t)(void *)&relocs[0];
objects[1].flags = 0;
objects[1].offset = -1;
- if (GEN_GEN >= 8)
- objects[1].flags |= EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
+#endif
drm_i915_gem_execbuffer2 execbuf = drm_i915_gem_execbuffer2();
execbuf.buffers_ptr = (uintptr_t)(void *)objects;
__gen_combine_address(mi_builder_test *test, void *location,
address addr, uint32_t delta)
{
+#if GEN_GEN >= 8
+ uint64_t addr_u64 = addr.gem_handle == test->data_bo_handle ?
+ test->data_bo_addr : test->batch_bo_addr;
+ return addr_u64 + addr.offset + delta;
+#else
drm_i915_gem_relocation_entry reloc = drm_i915_gem_relocation_entry();
reloc.target_handle = addr.gem_handle == test->data_bo_handle ? 0 : 1;
reloc.delta = addr.offset + delta;
test->relocs.push_back(reloc);
return reloc.delta;
+#endif
}
void *