static void
i915_sw_batchbuffer_flush(struct i915_winsys_batchbuffer *ibatch,
                          struct pipe_fence_handle **fence)
{
   struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
   unsigned used = 0;
   int i;

   assert(i915_winsys_batchbuffer_space(ibatch) >= 0);

   used = batch->base.ptr - batch->base.map;
   assert((used & 3) == 0);

#ifdef INTEL_ALWAYS_FLUSH
   /* MI_FLUSH | FLUSH_MAP_CACHE */
   i915_winsys_batchbuffer_dword(ibatch, (0x4<<23)|(1<<0));
   used += 4;
#endif

   if ((used & 4) == 0) {
      /* MI_NOOP */
      i915_winsys_batchbuffer_dword(ibatch, 0);
   }
   /* MI_BATCH_BUFFER_END */
   i915_winsys_batchbuffer_dword(ibatch, (0xA<<23));

   used = batch->base.ptr - batch->base.map;
   assert((used & 4) == 0);

   if (i915_sw_winsys(ibatch->iws)->dump_cmd) {
      unsigned *ptr = (unsigned *)batch->base.map;

      debug_printf("%s:\n", __func__);
      for (i = 0; i < used / 4; i++, ptr++) {
         debug_printf("\t%08x:    %08x\n", i*4, *ptr);
      }
   }

   if (fence) {
      ibatch->iws->fence_reference(ibatch->iws, fence, NULL);

      (*fence) = i915_sw_fence_create();
   }

   i915_sw_batchbuffer_reset(batch);
}
Ejemplo n.º 2
0
static struct i915_winsys_batchbuffer *
i915_sw_batchbuffer_create(struct i915_winsys *iws)
{
   struct i915_sw_winsys *isws = i915_sw_winsys(iws);
   struct i915_sw_batchbuffer *batch = CALLOC_STRUCT(i915_sw_batchbuffer);

   batch->actual_size = isws->max_batch_size;

   batch->base.map = MALLOC(batch->actual_size);
   batch->base.ptr = NULL;
   batch->base.size = 0;

   batch->base.relocs = 0;

   batch->base.iws = iws;

   i915_sw_batchbuffer_reset(batch);

   return &batch->base;
}
Ejemplo n.º 3
0
static void
i915_sw_batchbuffer_flush(struct i915_winsys_batchbuffer *ibatch,
                          struct pipe_fence_handle **fence)
{
   struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
   unsigned used = 0;

   assert(i915_winsys_batchbuffer_space(ibatch) >= 0);

   used = batch->base.ptr - batch->base.map;
   assert((used & 3) == 0);

#ifdef INTEL_ALWAYS_FLUSH
   /* MI_FLUSH | FLUSH_MAP_CACHE */
   i915_winsys_batchbuffer_dword_unchecked(ibatch, (0x4<<23)|(1<<0));
   used += 4;
#endif

   if ((used & 4) == 0) {
      /* MI_NOOP */
      i915_winsys_batchbuffer_dword_unchecked(ibatch, 0);
   }
   /* MI_BATCH_BUFFER_END */
   i915_winsys_batchbuffer_dword_unchecked(ibatch, (0xA<<23));

   used = batch->base.ptr - batch->base.map;
   assert((used & 4) == 0);

   if (i915_sw_winsys(ibatch->iws)->dump_cmd) {
      i915_dump_batchbuffer(ibatch);
   }

   if (fence) {
      ibatch->iws->fence_reference(ibatch->iws, fence, NULL);

      (*fence) = i915_sw_fence_create();
   }

   i915_sw_batchbuffer_reset(batch);
}
Ejemplo n.º 4
0
static void
i915_sw_destroy(struct i915_winsys *iws)
{
   struct i915_sw_winsys *isws = i915_sw_winsys(iws);
   FREE(isws);
}