diff options
Diffstat (limited to 'src/gallium/winsys/drm/intel/gem')
4 files changed, 78 insertions, 21 deletions
| diff --git a/src/gallium/winsys/drm/intel/gem/intel_drm_api.c b/src/gallium/winsys/drm/intel/gem/intel_drm_api.c index 4c5a1d2ea8..9ed570ff6e 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_drm_api.c +++ b/src/gallium/winsys/drm/intel/gem/intel_drm_api.c @@ -4,9 +4,10 @@  #include "intel_drm_winsys.h"  #include "util/u_memory.h" -#include "i915simple/i915_context.h" -#include "i915simple/i915_screen.h" +#include "i915/i915_context.h" +#include "i915/i915_screen.h" +#include "trace/tr_drm.h"  /*   * Helper functions @@ -40,6 +41,7 @@ intel_drm_buffer_from_handle(struct intel_drm_winsys *idws,                               const char* name, unsigned handle)  {     struct intel_drm_buffer *buf = CALLOC_STRUCT(intel_drm_buffer); +   uint32_t tile = 0, swizzle = 0;     if (!buf)        return NULL; @@ -52,6 +54,10 @@ intel_drm_buffer_from_handle(struct intel_drm_winsys *idws,     if (!buf->bo)        goto err; +   drm_intel_bo_get_tiling(buf->bo, &tile, &swizzle); +   if (tile != INTEL_TILE_NONE) +      buf->map_gtt = TRUE; +     return (struct intel_buffer *)buf;  err: @@ -166,6 +172,7 @@ intel_drm_create_screen(struct drm_api *api, int drmFD,     idws->base.destroy = intel_drm_winsys_destroy;     idws->pools.gem = drm_intel_bufmgr_gem_init(idws->fd, idws->max_batch_size); +   drm_intel_bufmgr_gem_enable_reuse(idws->pools.gem);     idws->softpipe = FALSE;     idws->dump_cmd = debug_get_bool_option("INTEL_DUMP_CMD", FALSE); @@ -198,5 +205,5 @@ struct drm_api intel_drm_api =  struct drm_api *  drm_api_create()  { -   return &intel_drm_api; +   return trace_drm_create(&intel_drm_api);  } diff --git a/src/gallium/winsys/drm/intel/gem/intel_drm_batchbuffer.c b/src/gallium/winsys/drm/intel/gem/intel_drm_batchbuffer.c index 5ca3ad9762..5b4dafc8e4 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_drm_batchbuffer.c +++ b/src/gallium/winsys/drm/intel/gem/intel_drm_batchbuffer.c @@ -13,6 +13,9 @@  #define INTEL_BATCH_CLIPRECTS    0x2  #undef INTEL_RUN_SYNC +#undef INTEL_MAP_BATCHBUFFER +#undef INTEL_MAP_GTT +#define INTEL_ALWAYS_FLUSH  struct intel_drm_batchbuffer  { @@ -33,6 +36,7 @@ static void  intel_drm_batchbuffer_reset(struct intel_drm_batchbuffer *batch)  {     struct intel_drm_winsys *idws = intel_drm_winsys(batch->base.iws); +   int ret;     if (batch->bo)        drm_intel_bo_unreference(batch->bo); @@ -40,8 +44,18 @@ intel_drm_batchbuffer_reset(struct intel_drm_batchbuffer *batch)                                    "gallium3d_batchbuffer",                                    batch->actual_size,                                    4096); -   drm_intel_bo_map(batch->bo, TRUE); + +#ifdef INTEL_MAP_BATCHBUFFER +#ifdef INTEL_MAP_GTT +   ret = drm_intel_gem_bo_map_gtt(batch->bo); +#else +   ret = drm_intel_bo_map(batch->bo, TRUE); +#endif +   assert(ret == 0);     batch->base.map = batch->bo->virtual; +#else +   (void)ret; +#endif     memset(batch->base.map, 0, batch->actual_size);     batch->base.ptr = batch->base.map; @@ -55,7 +69,13 @@ intel_drm_batchbuffer_create(struct intel_winsys *iws)     struct intel_drm_winsys *idws = intel_drm_winsys(iws);     struct intel_drm_batchbuffer *batch = CALLOC_STRUCT(intel_drm_batchbuffer); +   batch->actual_size = idws->max_batch_size; + +#ifdef INTEL_MAP_BATCHBUFFER     batch->base.map = NULL; +#else +   batch->base.map = MALLOC(batch->actual_size); +#endif     batch->base.ptr = NULL;     batch->base.size = 0; @@ -64,8 +84,6 @@ intel_drm_batchbuffer_create(struct intel_winsys *iws)     batch->base.iws = iws; -   batch->actual_size = idws->max_batch_size; -     intel_drm_batchbuffer_reset(batch);     return &batch->base; @@ -140,23 +158,32 @@ intel_drm_batchbuffer_flush(struct intel_batchbuffer *ibatch,     used = batch->base.ptr - batch->base.map;     assert((used & 3) == 0); -   if (used & 4) { -      // MI_FLUSH | FLUSH_MAP_CACHE; -      intel_batchbuffer_dword(ibatch, (0x0<<29)|(0x4<<23)|(1<<0)); -      // MI_NOOP -      intel_batchbuffer_dword(ibatch, (0x0<<29)|(0x0<<23)); -      // MI_BATCH_BUFFER_END; -      intel_batchbuffer_dword(ibatch, (0x0<<29)|(0xA<<23)); -   } else { -      //MI_FLUSH | FLUSH_MAP_CACHE; -      intel_batchbuffer_dword(ibatch, (0x0<<29)|(0x4<<23)|(1<<0)); -      // MI_BATCH_BUFFER_END; -      intel_batchbuffer_dword(ibatch, (0x0<<29)|(0xA<<23)); + +#ifdef INTEL_ALWAYS_FLUSH +   /* MI_FLUSH | FLUSH_MAP_CACHE */ +   intel_batchbuffer_dword(ibatch, (0x4<<23)|(1<<0)); +   used += 4; +#endif + +   if ((used & 4) == 0) { +      /* MI_NOOP */ +      intel_batchbuffer_dword(ibatch, 0);     } +   /* MI_BATCH_BUFFER_END */ +   intel_batchbuffer_dword(ibatch, (0xA<<23));     used = batch->base.ptr - batch->base.map; +   assert((used & 4) == 0); +#ifdef INTEL_MAP_BATCHBUFFER +#ifdef INTEL_MAP_GTT +   drm_intel_gem_bo_unmap_gtt(batch->bo); +#else     drm_intel_bo_unmap(batch->bo); +#endif +#else +   drm_intel_bo_subdata(batch->bo, 0, used, batch->base.map); +#endif     /* Do the sending to HW */     ret = drm_intel_bo_exec(batch->bo, used, NULL, 0, 0); @@ -202,7 +229,10 @@ intel_drm_batchbuffer_destroy(struct intel_batchbuffer *ibatch)     if (batch->bo)        drm_intel_bo_unreference(batch->bo); -   free(batch); +#ifndef INTEL_MAP_BATCHBUFFER +   FREE(batch->base.map); +#endif +   FREE(batch);  }  void intel_drm_winsys_init_batchbuffer_functions(struct intel_drm_winsys *idws) diff --git a/src/gallium/winsys/drm/intel/gem/intel_drm_buffer.c b/src/gallium/winsys/drm/intel/gem/intel_drm_buffer.c index e017cd2e98..ac4dd6e00e 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_drm_buffer.c +++ b/src/gallium/winsys/drm/intel/gem/intel_drm_buffer.c @@ -28,6 +28,7 @@ intel_drm_buffer_create(struct intel_winsys *iws,     } else if (type == INTEL_NEW_VERTEX) {        name = "gallium3d_vertex";        pool = idws->pools.gem; +      buf->map_gtt = TRUE;     } else if (type == INTEL_NEW_SCANOUT) {        name = "gallium3d_scanout";        pool = idws->pools.gem; @@ -57,11 +58,17 @@ intel_drm_buffer_set_fence_reg(struct intel_winsys *iws,                                 unsigned stride,                                 enum intel_buffer_tile tile)  { +   struct intel_drm_buffer *buf = intel_drm_buffer(buffer);     assert(I915_TILING_NONE == INTEL_TILE_NONE);     assert(I915_TILING_X == INTEL_TILE_X);     assert(I915_TILING_Y == INTEL_TILE_Y); -   return drm_intel_bo_set_tiling(intel_bo(buffer), &tile, stride); +   if (tile != INTEL_TILE_NONE) { +      assert(buf->map_count == 0); +      buf->map_gtt = TRUE; +   } + +   return drm_intel_bo_set_tiling(buf->bo, &tile, stride);  }  static void * @@ -109,6 +116,18 @@ intel_drm_buffer_unmap(struct intel_winsys *iws,        drm_intel_bo_unmap(intel_bo(buffer));  } +static int +intel_drm_buffer_write(struct intel_winsys *iws, +                       struct intel_buffer *buffer, +                       size_t offset, +                       size_t size, +                       const void *data) +{ +   struct intel_drm_buffer *buf = intel_drm_buffer(buffer); + +   return drm_intel_bo_subdata(buf->bo, offset, size, (void*)data); +} +  static void  intel_drm_buffer_destroy(struct intel_winsys *iws,                           struct intel_buffer *buffer) @@ -130,5 +149,6 @@ intel_drm_winsys_init_buffer_functions(struct intel_drm_winsys *idws)     idws->base.buffer_set_fence_reg = intel_drm_buffer_set_fence_reg;     idws->base.buffer_map = intel_drm_buffer_map;     idws->base.buffer_unmap = intel_drm_buffer_unmap; +   idws->base.buffer_write = intel_drm_buffer_write;     idws->base.buffer_destroy = intel_drm_buffer_destroy;  } diff --git a/src/gallium/winsys/drm/intel/gem/intel_drm_winsys.h b/src/gallium/winsys/drm/intel/gem/intel_drm_winsys.h index 415c45feea..b4a60563ef 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_drm_winsys.h +++ b/src/gallium/winsys/drm/intel/gem/intel_drm_winsys.h @@ -2,7 +2,7 @@  #ifndef INTEL_DRM_WINSYS_H  #define INTEL_DRM_WINSYS_H -#include "i915simple/intel_batchbuffer.h" +#include "i915/intel_batchbuffer.h"  #include "drm.h"  #include "intel_bufmgr.h" | 
