i915g: prepare winsys/batchbuffer for execbuf2

Wire up a fenced parameter, switch all relocations to _FENCED

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Jakob Bornecrantz <wallbraker@gmail.com>
Signed-off-by: Jakob Bornecrantz <wallbraker@gmail.com>
This commit is contained in:
Daniel Vetter
2010-11-21 20:21:00 +01:00
committed by Jakob Bornecrantz
parent 1c60840338
commit 135b083461
8 changed files with 38 additions and 27 deletions
+4 -1
View File
@@ -38,7 +38,10 @@
i915_winsys_batchbuffer_dword(i915->batch, dword)
#define OUT_RELOC(buf, usage, offset) \
i915_winsys_batchbuffer_reloc(i915->batch, buf, usage, offset)
i915_winsys_batchbuffer_reloc(i915->batch, buf, usage, offset, false)
#define OUT_RELOC_FENCED(buf, usage, offset) \
i915_winsys_batchbuffer_reloc(i915->batch, buf, usage, offset, true)
#define FLUSH_BATCH(fence) \
i915_flush(i915, fence)
+2 -2
View File
@@ -74,9 +74,9 @@ static INLINE int
i915_winsys_batchbuffer_reloc(struct i915_winsys_batchbuffer *batch,
struct i915_winsys_buffer *buffer,
enum i915_winsys_buffer_usage usage,
size_t offset)
size_t offset, bool fenced)
{
return batch->iws->batchbuffer_reloc(batch, buffer, usage, offset);
return batch->iws->batchbuffer_reloc(batch, buffer, usage, offset, fenced);
}
#endif
+3 -3
View File
@@ -74,7 +74,7 @@ i915_fill_blit(struct i915_context *i915,
OUT_BATCH(BR13);
OUT_BATCH((y << 16) | x);
OUT_BATCH(((y + h) << 16) | (x + w));
OUT_RELOC(dst_buffer, I915_USAGE_2D_TARGET, dst_offset);
OUT_RELOC_FENCED(dst_buffer, I915_USAGE_2D_TARGET, dst_offset);
OUT_BATCH(color);
}
@@ -138,8 +138,8 @@ i915_copy_blit(struct i915_context *i915,
OUT_BATCH(BR13);
OUT_BATCH((dst_y << 16) | dst_x);
OUT_BATCH((dst_y2 << 16) | dst_x2);
OUT_RELOC(dst_buffer, I915_USAGE_2D_TARGET, dst_offset);
OUT_RELOC_FENCED(dst_buffer, I915_USAGE_2D_TARGET, dst_offset);
OUT_BATCH((src_y << 16) | src_x);
OUT_BATCH(((int) src_pitch & 0xffff));
OUT_RELOC(src_buffer, I915_USAGE_2D_SOURCE, src_offset);
OUT_RELOC_FENCED(src_buffer, I915_USAGE_2D_SOURCE, src_offset);
}
+3 -3
View File
@@ -230,7 +230,7 @@ i915_emit_hardware_state(struct i915_context *i915 )
BUF_3D_PITCH(tex->stride) | /* pitch in bytes */
ctile);
OUT_RELOC(tex->buffer,
OUT_RELOC_FENCED(tex->buffer,
I915_USAGE_RENDER,
cbuf_surface->offset);
}
@@ -249,7 +249,7 @@ i915_emit_hardware_state(struct i915_context *i915 )
BUF_3D_PITCH(tex->stride) | /* pitch in bytes */
ztile);
OUT_RELOC(tex->buffer,
OUT_RELOC_FENCED(tex->buffer,
I915_USAGE_RENDER,
depth_surface->offset);
}
@@ -298,7 +298,7 @@ i915_emit_hardware_state(struct i915_context *i915 )
count++;
OUT_RELOC(buf, I915_USAGE_SAMPLER, offset);
OUT_RELOC_FENCED(buf, I915_USAGE_SAMPLER, offset);
OUT_BATCH(i915->current.texbuffer[unit][0]); /* MS3 */
OUT_BATCH(i915->current.texbuffer[unit][1]); /* MS4 */
}
+1 -1
View File
@@ -106,7 +106,7 @@ struct i915_winsys {
int (*batchbuffer_reloc)(struct i915_winsys_batchbuffer *batch,
struct i915_winsys_buffer *reloc,
enum i915_winsys_buffer_usage usage,
unsigned offset);
unsigned offset, bool fenced);
/**
* Flush a bufferbatch.
@@ -94,7 +94,7 @@ static int
i915_drm_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch,
struct i915_winsys_buffer *buffer,
enum i915_winsys_buffer_usage usage,
unsigned pre_add)
unsigned pre_add, bool fenced)
{
struct i915_drm_batchbuffer *batch = i915_drm_batchbuffer(ibatch);
unsigned write_domain = 0;
@@ -104,37 +104,44 @@ i915_drm_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch,
assert(batch->base.relocs < batch->base.max_relocs);
if (usage == I915_USAGE_SAMPLER) {
switch (usage) {
case I915_USAGE_SAMPLER:
write_domain = 0;
read_domain = I915_GEM_DOMAIN_SAMPLER;
} else if (usage == I915_USAGE_RENDER) {
break;
case I915_USAGE_RENDER:
write_domain = I915_GEM_DOMAIN_RENDER;
read_domain = I915_GEM_DOMAIN_RENDER;
} else if (usage == I915_USAGE_2D_TARGET) {
break;
case I915_USAGE_2D_TARGET:
write_domain = I915_GEM_DOMAIN_RENDER;
read_domain = I915_GEM_DOMAIN_RENDER;
} else if (usage == I915_USAGE_2D_SOURCE) {
break;
case I915_USAGE_2D_SOURCE:
write_domain = 0;
read_domain = I915_GEM_DOMAIN_RENDER;
} else if (usage == I915_USAGE_VERTEX) {
break;
case I915_USAGE_VERTEX:
write_domain = 0;
read_domain = I915_GEM_DOMAIN_VERTEX;
} else {
break;
default:
assert(0);
return -1;
}
offset = (unsigned)(batch->base.ptr - batch->base.map);
ret = drm_intel_bo_emit_reloc(batch->bo, offset,
intel_bo(buffer), pre_add,
read_domain,
write_domain);
if (fenced)
ret = drm_intel_bo_emit_reloc_fence(batch->bo, offset,
intel_bo(buffer), pre_add,
read_domain,
write_domain);
else
ret = drm_intel_bo_emit_reloc(batch->bo, offset,
intel_bo(buffer), pre_add,
read_domain,
write_domain);
((uint32_t*)batch->base.ptr)[0] = intel_bo(buffer)->offset + pre_add;
batch->base.ptr += 4;
@@ -69,6 +69,7 @@ i915_drm_winsys_create(int drmFD)
idws->gem_manager = drm_intel_bufmgr_gem_init(idws->fd, idws->max_batch_size);
drm_intel_bufmgr_gem_enable_reuse(idws->gem_manager);
drm_intel_bufmgr_gem_enable_fenced_relocs(idws->gem_manager);
idws->dump_cmd = debug_get_bool_option("I915_DUMP_CMD", FALSE);
idws->send_cmd = !debug_get_bool_option("I915_NO_HW", FALSE);
@@ -61,7 +61,7 @@ static int
i915_sw_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch,
struct i915_winsys_buffer *buffer,
enum i915_winsys_buffer_usage usage,
unsigned pre_add)
unsigned pre_add, bool fenced)
{
struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
int ret = 0;