Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1.  
  2. #include "i915_sw_winsys.h"
  3. #include "i915/i915_batchbuffer.h"
  4. #include "i915/i915_debug.h"
  5. #include "util/u_memory.h"
  6.  
  7. #define BATCH_RESERVED 16
  8.  
  9. #define INTEL_DEFAULT_RELOCS 100
  10. #define INTEL_MAX_RELOCS 400
  11.  
  12. #define INTEL_BATCH_NO_CLIPRECTS 0x1
  13. #define INTEL_BATCH_CLIPRECTS    0x2
  14.  
  15. #define INTEL_ALWAYS_FLUSH
  16.  
  17. struct i915_sw_batchbuffer
  18. {
  19.    struct i915_winsys_batchbuffer base;
  20.  
  21.    size_t actual_size;
  22. };
  23.  
  24. static INLINE struct i915_sw_batchbuffer *
  25. i915_sw_batchbuffer(struct i915_winsys_batchbuffer *batch)
  26. {
  27.    return (struct i915_sw_batchbuffer *)batch;
  28. }
  29.  
  30. static void
  31. i915_sw_batchbuffer_reset(struct i915_sw_batchbuffer *batch)
  32. {
  33.    memset(batch->base.map, 0, batch->actual_size);
  34.    batch->base.ptr = batch->base.map;
  35.    batch->base.size = batch->actual_size - BATCH_RESERVED;
  36.    batch->base.relocs = 0;
  37. }
  38.  
  39. static struct i915_winsys_batchbuffer *
  40. i915_sw_batchbuffer_create(struct i915_winsys *iws)
  41. {
  42.    struct i915_sw_winsys *isws = i915_sw_winsys(iws);
  43.    struct i915_sw_batchbuffer *batch = CALLOC_STRUCT(i915_sw_batchbuffer);
  44.  
  45.    batch->actual_size = isws->max_batch_size;
  46.  
  47.    batch->base.map = MALLOC(batch->actual_size);
  48.    batch->base.ptr = NULL;
  49.    batch->base.size = 0;
  50.  
  51.    batch->base.relocs = 0;
  52.  
  53.    batch->base.iws = iws;
  54.  
  55.    i915_sw_batchbuffer_reset(batch);
  56.  
  57.    return &batch->base;
  58. }
  59.  
  60. static boolean
  61. i915_sw_batchbuffer_validate_buffers(struct i915_winsys_batchbuffer *batch,
  62.                                      struct i915_winsys_buffer **buffer,
  63.                                      int num_of_buffers)
  64. {
  65.    return TRUE;
  66. }
  67.  
  68. static int
  69. i915_sw_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch,
  70.                           struct i915_winsys_buffer *buffer,
  71.                           enum i915_winsys_buffer_usage usage,
  72.                           unsigned pre_add, boolean fenced)
  73. {
  74.    struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
  75.    int ret = 0;
  76.  
  77.    if (usage == I915_USAGE_SAMPLER) {
  78.  
  79.    } else if (usage == I915_USAGE_RENDER) {
  80.  
  81.    } else if (usage == I915_USAGE_2D_TARGET) {
  82.  
  83.    } else if (usage == I915_USAGE_2D_SOURCE) {
  84.  
  85.    } else if (usage == I915_USAGE_VERTEX) {
  86.  
  87.    } else {
  88.       assert(0);
  89.       return -1;
  90.    }
  91.  
  92.    ((uint32_t*)batch->base.ptr)[0] = 0;
  93.    batch->base.ptr += 4;
  94.  
  95.    if (!ret)
  96.       batch->base.relocs++;
  97.  
  98.    return ret;
  99. }
  100.  
  101. static void
  102. i915_sw_batchbuffer_flush(struct i915_winsys_batchbuffer *ibatch,
  103.                           struct pipe_fence_handle **fence,
  104.                           enum i915_winsys_flush_flags flags)
  105. {
  106.    struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
  107.    unsigned used = 0;
  108.  
  109.    assert(i915_winsys_batchbuffer_space(ibatch) >= 0);
  110.  
  111.    used = batch->base.ptr - batch->base.map;
  112.    assert((used & 3) == 0);
  113.  
  114. #ifdef INTEL_ALWAYS_FLUSH
  115.    /* MI_FLUSH | FLUSH_MAP_CACHE */
  116.    i915_winsys_batchbuffer_dword_unchecked(ibatch, (0x4<<23)|(1<<0));
  117.    used += 4;
  118. #endif
  119.  
  120.    if ((used & 4) == 0) {
  121.       /* MI_NOOP */
  122.       i915_winsys_batchbuffer_dword_unchecked(ibatch, 0);
  123.    }
  124.    /* MI_BATCH_BUFFER_END */
  125.    i915_winsys_batchbuffer_dword_unchecked(ibatch, (0xA<<23));
  126.  
  127.    used = batch->base.ptr - batch->base.map;
  128.    assert((used & 4) == 0);
  129.  
  130.    if (i915_sw_winsys(ibatch->iws)->dump_cmd) {
  131.       i915_dump_batchbuffer(ibatch);
  132.    }
  133.  
  134.    if (fence) {
  135.       ibatch->iws->fence_reference(ibatch->iws, fence, NULL);
  136.  
  137.       (*fence) = i915_sw_fence_create();
  138.    }
  139.  
  140.    i915_sw_batchbuffer_reset(batch);
  141. }
  142.  
  143. static void
  144. i915_sw_batchbuffer_destroy(struct i915_winsys_batchbuffer *ibatch)
  145. {
  146.    struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
  147.  
  148.    FREE(batch->base.map);
  149.    FREE(batch);
  150. }
  151.  
  152. void i915_sw_winsys_init_batchbuffer_functions(struct i915_sw_winsys *isws)
  153. {
  154.    isws->base.batchbuffer_create = i915_sw_batchbuffer_create;
  155.    isws->base.validate_buffers = i915_sw_batchbuffer_validate_buffers;
  156.    isws->base.batchbuffer_reloc = i915_sw_batchbuffer_reloc;
  157.    isws->base.batchbuffer_flush = i915_sw_batchbuffer_flush;
  158.    isws->base.batchbuffer_destroy = i915_sw_batchbuffer_destroy;
  159. }
  160.