mirror of
				https://github.com/tiagovignatti/intel-gpu-tools.git
				synced 2025-11-04 03:58:27 +00:00 
			
		
		
		
	igt/gem_streaming_writes: Reorder src/dst to avoid executing on snooped
During the streaming setup, we execute a dummy batch in order to bind the objects into the GTT and query their offsets. For this, we should not use a snooped buffer for the dummy batch, or else we may anger the GPU. Given that we have a choice, use the other buffer for the dummy batch. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
		
							parent
							
								
									85ee6e7b36
								
							
						
					
					
						commit
						a5a6d40ca8
					
				@ -60,6 +60,15 @@ static bool __gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 *eb)
 | 
			
		||||
	return drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, eb) == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define SRC 0
 | 
			
		||||
#define DST 1
 | 
			
		||||
#define BATCH 2
 | 
			
		||||
 | 
			
		||||
#define src exec[SRC].handle
 | 
			
		||||
#define src_offset exec[SRC].offset
 | 
			
		||||
#define dst exec[DST].handle
 | 
			
		||||
#define dst_offset exec[DST].offset
 | 
			
		||||
 | 
			
		||||
static void test_streaming(int fd, int mode, int sync)
 | 
			
		||||
{
 | 
			
		||||
	const int has_64bit_reloc = intel_gen(intel_get_drm_devid(fd)) >= 8;
 | 
			
		||||
@ -77,13 +86,9 @@ static void test_streaming(int fd, int mode, int sync)
 | 
			
		||||
	int i, n;
 | 
			
		||||
 | 
			
		||||
	memset(exec, 0, sizeof(exec));
 | 
			
		||||
	exec[0].handle = gem_create(fd, OBJECT_SIZE);
 | 
			
		||||
	exec[0].flags = EXEC_OBJECT_WRITE;
 | 
			
		||||
#define dst exec[0].handle
 | 
			
		||||
#define dst_offset exec[0].offset
 | 
			
		||||
	exec[1].handle = gem_create(fd, OBJECT_SIZE);
 | 
			
		||||
#define src exec[1].handle
 | 
			
		||||
#define src_offset exec[1].offset
 | 
			
		||||
	exec[SRC].handle = gem_create(fd, OBJECT_SIZE);
 | 
			
		||||
	exec[DST].handle = gem_create(fd, OBJECT_SIZE);
 | 
			
		||||
	exec[DST].flags = EXEC_OBJECT_WRITE;
 | 
			
		||||
 | 
			
		||||
	switch (mode) {
 | 
			
		||||
	case 0: /* cpu/snoop */
 | 
			
		||||
@ -102,14 +107,14 @@ static void test_streaming(int fd, int mode, int sync)
 | 
			
		||||
	d = gem_mmap__cpu(fd, dst, 0, OBJECT_SIZE, PROT_READ);
 | 
			
		||||
	igt_assert(d);
 | 
			
		||||
 | 
			
		||||
	gem_write(fd, src, 0, tmp, sizeof(tmp));
 | 
			
		||||
	gem_write(fd, dst, 0, tmp, sizeof(tmp));
 | 
			
		||||
	memset(&execbuf, 0, sizeof(execbuf));
 | 
			
		||||
	execbuf.buffers_ptr = (uintptr_t)exec;
 | 
			
		||||
	execbuf.buffer_count = 2;
 | 
			
		||||
	execbuf.flags = LOCAL_I915_EXEC_HANDLE_LUT;
 | 
			
		||||
	if (!__gem_execbuf(fd, &execbuf)) {
 | 
			
		||||
		execbuf.flags = 0;
 | 
			
		||||
		gem_execbuf(fd, &execbuf);
 | 
			
		||||
		igt_require(__gem_execbuf(fd, &execbuf) == 0);
 | 
			
		||||
	}
 | 
			
		||||
	/* We assume that the active objects are fixed to avoid relocations */
 | 
			
		||||
	__src_offset = src_offset;
 | 
			
		||||
@ -119,7 +124,7 @@ static void test_streaming(int fd, int mode, int sync)
 | 
			
		||||
	for (i = 0; i < 64; i++) {
 | 
			
		||||
		reloc[2*i+0].offset = 64*i + 4 * sizeof(uint32_t);
 | 
			
		||||
		reloc[2*i+0].delta = 0;
 | 
			
		||||
		reloc[2*i+0].target_handle = execbuf.flags & LOCAL_I915_EXEC_HANDLE_LUT ? 0 : dst;
 | 
			
		||||
		reloc[2*i+0].target_handle = execbuf.flags & LOCAL_I915_EXEC_HANDLE_LUT ? DST : dst;
 | 
			
		||||
		reloc[2*i+0].presumed_offset = dst_offset;
 | 
			
		||||
		reloc[2*i+0].read_domains = I915_GEM_DOMAIN_RENDER;
 | 
			
		||||
		reloc[2*i+0].write_domain = I915_GEM_DOMAIN_RENDER;
 | 
			
		||||
@ -128,7 +133,7 @@ static void test_streaming(int fd, int mode, int sync)
 | 
			
		||||
		if (has_64bit_reloc)
 | 
			
		||||
			reloc[2*i+1].offset +=  sizeof(uint32_t);
 | 
			
		||||
		reloc[2*i+1].delta = 0;
 | 
			
		||||
		reloc[2*i+1].target_handle = execbuf.flags & LOCAL_I915_EXEC_HANDLE_LUT ? 1 : src;
 | 
			
		||||
		reloc[2*i+1].target_handle = execbuf.flags & LOCAL_I915_EXEC_HANDLE_LUT ? SRC : src;
 | 
			
		||||
		reloc[2*i+1].presumed_offset = src_offset;
 | 
			
		||||
		reloc[2*i+1].read_domains = I915_GEM_DOMAIN_RENDER;
 | 
			
		||||
		reloc[2*i+1].write_domain = 0;
 | 
			
		||||
@ -242,13 +247,9 @@ static void test_batch(int fd, int mode, int reverse)
 | 
			
		||||
	uint32_t offset;
 | 
			
		||||
 | 
			
		||||
	memset(exec, 0, sizeof(exec));
 | 
			
		||||
	exec[0].handle = gem_create(fd, OBJECT_SIZE);
 | 
			
		||||
	exec[0].flags = EXEC_OBJECT_WRITE;
 | 
			
		||||
#define dst exec[0].handle
 | 
			
		||||
#define dst_offset exec[0].offset
 | 
			
		||||
	exec[1].handle = gem_create(fd, OBJECT_SIZE);
 | 
			
		||||
#define src exec[1].handle
 | 
			
		||||
#define src_offset exec[1].offset
 | 
			
		||||
	exec[DST].handle = gem_create(fd, OBJECT_SIZE);
 | 
			
		||||
	exec[DST].flags = EXEC_OBJECT_WRITE;
 | 
			
		||||
	exec[SRC].handle = gem_create(fd, OBJECT_SIZE);
 | 
			
		||||
 | 
			
		||||
	s = gem_mmap__wc(fd, src, 0, OBJECT_SIZE, PROT_READ | PROT_WRITE);
 | 
			
		||||
	igt_assert(s);
 | 
			
		||||
@ -259,7 +260,7 @@ static void test_batch(int fd, int mode, int reverse)
 | 
			
		||||
	memset(reloc, 0, sizeof(reloc));
 | 
			
		||||
	reloc[0].offset =  4 * sizeof(uint32_t);
 | 
			
		||||
	reloc[0].delta = 0;
 | 
			
		||||
	reloc[0].target_handle = execbuf.flags & LOCAL_I915_EXEC_HANDLE_LUT ? 0 : dst;
 | 
			
		||||
	reloc[0].target_handle = execbuf.flags & LOCAL_I915_EXEC_HANDLE_LUT ? DST : dst;
 | 
			
		||||
	reloc[0].presumed_offset = dst_offset;
 | 
			
		||||
	reloc[0].read_domains = I915_GEM_DOMAIN_RENDER;
 | 
			
		||||
	reloc[0].write_domain = I915_GEM_DOMAIN_RENDER;
 | 
			
		||||
@ -268,7 +269,7 @@ static void test_batch(int fd, int mode, int reverse)
 | 
			
		||||
	if (has_64bit_reloc)
 | 
			
		||||
		reloc[1].offset +=  sizeof(uint32_t);
 | 
			
		||||
	reloc[1].delta = 0;
 | 
			
		||||
	reloc[1].target_handle = execbuf.flags & LOCAL_I915_EXEC_HANDLE_LUT ? 1 : src;
 | 
			
		||||
	reloc[1].target_handle = execbuf.flags & LOCAL_I915_EXEC_HANDLE_LUT ? SRC : src;
 | 
			
		||||
	reloc[1].presumed_offset = src_offset;
 | 
			
		||||
	reloc[1].read_domains = I915_GEM_DOMAIN_RENDER;
 | 
			
		||||
	reloc[1].write_domain = 0;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user