diff options
| -rw-r--r-- | src/gallium/drivers/i915/i915_batch.h | 5 | ||||
| -rw-r--r-- | src/gallium/drivers/i915/i915_batchbuffer.h | 4 | ||||
| -rw-r--r-- | src/gallium/drivers/i915/i915_blit.c | 6 | ||||
| -rw-r--r-- | src/gallium/drivers/i915/i915_state_emit.c | 6 | ||||
| -rw-r--r-- | src/gallium/drivers/i915/i915_winsys.h | 2 | ||||
| -rw-r--r-- | src/gallium/winsys/i915/drm/i915_drm_batchbuffer.c | 39 | ||||
| -rw-r--r-- | src/gallium/winsys/i915/drm/i915_drm_winsys.c | 1 | ||||
| -rw-r--r-- | src/gallium/winsys/i915/sw/i915_sw_batchbuffer.c | 2 | 
8 files changed, 38 insertions, 27 deletions
| diff --git a/src/gallium/drivers/i915/i915_batch.h b/src/gallium/drivers/i915/i915_batch.h index c411b84ccd..6e93da7620 100644 --- a/src/gallium/drivers/i915/i915_batch.h +++ b/src/gallium/drivers/i915/i915_batch.h @@ -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) diff --git a/src/gallium/drivers/i915/i915_batchbuffer.h b/src/gallium/drivers/i915/i915_batchbuffer.h index c1cd314e7b..f210c53c72 100644 --- a/src/gallium/drivers/i915/i915_batchbuffer.h +++ b/src/gallium/drivers/i915/i915_batchbuffer.h @@ -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 diff --git a/src/gallium/drivers/i915/i915_blit.c b/src/gallium/drivers/i915/i915_blit.c index cdf20c0055..97c2566515 100644 --- a/src/gallium/drivers/i915/i915_blit.c +++ b/src/gallium/drivers/i915/i915_blit.c @@ -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);  } diff --git a/src/gallium/drivers/i915/i915_state_emit.c b/src/gallium/drivers/i915/i915_state_emit.c index 49dff1f775..51bbb2bb08 100644 --- a/src/gallium/drivers/i915/i915_state_emit.c +++ b/src/gallium/drivers/i915/i915_state_emit.c @@ -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 */                 } diff --git a/src/gallium/drivers/i915/i915_winsys.h b/src/gallium/drivers/i915/i915_winsys.h index 2ca9e581f3..ddf8a90634 100644 --- a/src/gallium/drivers/i915/i915_winsys.h +++ b/src/gallium/drivers/i915/i915_winsys.h @@ -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. diff --git a/src/gallium/winsys/i915/drm/i915_drm_batchbuffer.c b/src/gallium/winsys/i915/drm/i915_drm_batchbuffer.c index c6daa52a37..79aa74c21b 100644 --- a/src/gallium/winsys/i915/drm/i915_drm_batchbuffer.c +++ b/src/gallium/winsys/i915/drm/i915_drm_batchbuffer.c @@ -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; diff --git a/src/gallium/winsys/i915/drm/i915_drm_winsys.c b/src/gallium/winsys/i915/drm/i915_drm_winsys.c index cc0b6a9957..2288b48b2b 100644 --- a/src/gallium/winsys/i915/drm/i915_drm_winsys.c +++ b/src/gallium/winsys/i915/drm/i915_drm_winsys.c @@ -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); diff --git a/src/gallium/winsys/i915/sw/i915_sw_batchbuffer.c b/src/gallium/winsys/i915/sw/i915_sw_batchbuffer.c index a480cfed57..44773ae30e 100644 --- a/src/gallium/winsys/i915/sw/i915_sw_batchbuffer.c +++ b/src/gallium/winsys/i915/sw/i915_sw_batchbuffer.c @@ -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; | 
