i915: fixup up bufmgr to pass num buffers to kernel
authorDave Airlie <airlied@redhat.com>
Tue, 9 Oct 2007 02:18:50 +0000 (12:18 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 9 Oct 2007 02:18:50 +0000 (12:18 +1000)
remove unneeded entry points

src/mesa/drivers/dri/Makefile.template
src/mesa/drivers/dri/common/dri_bufmgr.c
src/mesa/drivers/dri/common/dri_bufmgr.h
src/mesa/drivers/dri/common/dri_bufmgr_fake.c
src/mesa/drivers/dri/i915/intel_batchbuffer.c
src/mesa/drivers/dri/i915/intel_bufmgr_ttm.c
src/mesa/drivers/dri/i915/intel_ioctl.c
src/mesa/drivers/dri/i915/intel_ioctl.h

index 3abce004c9235a5a9cb30a12adf9074b4e2b7bef..6ed6fc15b5479bfafc552642f54529ec63b9aa49 100644 (file)
@@ -13,7 +13,6 @@ COMMON_SOURCES = \
 
 COMMON_BM_SOURCES = \
        ../common/dri_bufmgr.c \
-       ../common/dri_bufmgr_ttm.c \
        ../common/dri_bufmgr_fake.c
 
 
index 91caa8757d298c29605ee4bebd300f4385e40b65..83886480dd3a5175adb3d9cd1fcc4dfcaf7096bd 100644 (file)
@@ -88,18 +88,6 @@ dri_bo_unmap(dri_bo *buf)
    return buf->bufmgr->bo_unmap(buf);
 }
 
-int
-dri_bo_validate(dri_bo *buf, unsigned int flags)
-{
-   return buf->bufmgr->bo_validate(buf, flags);
-}
-
-dri_fence *
-dri_fence_validated(dri_bufmgr *bufmgr, const char *name, GLboolean flushed)
-{
-   return bufmgr->fence_validated(bufmgr, name, flushed);
-}
-
 void
 dri_fence_wait(dri_fence *fence)
 {
@@ -157,9 +145,9 @@ void dri_emit_reloc(dri_bo *batch_buf, GLuint flags, GLuint delta, GLuint offset
    batch_buf->bufmgr->emit_reloc(batch_buf, flags, delta, offset, relocatee);
 }
 
-void *dri_process_relocs(dri_bo *batch_buf)
+void *dri_process_relocs(dri_bo *batch_buf, GLuint *count)
 {
-   return batch_buf->bufmgr->process_relocs(batch_buf);
+   return batch_buf->bufmgr->process_relocs(batch_buf, count);
 }
 
 void dri_post_submit(dri_bo *batch_buf, dri_fence **last_fence)
index 46e41f9bec1fea8fec95107005fee9017aa81686..7dbb558949aff60136b51bcec4d343da842a504c 100644 (file)
@@ -116,30 +116,6 @@ struct _dri_bufmgr {
    /** Reduces the refcount on the userspace mapping of the buffer object. */
    int (*bo_unmap)(dri_bo *buf);
 
-   /**
-    * Makes the buffer accessible to the graphics chip.
-    *
-    * The resulting offset of the buffer within the graphics aperture is then
-    * available at buf->offset until the buffer is fenced.
-    *
-    * Flags should consist of the memory types that the buffer may be validated
-    * into and the read/write/exe flags appropriate to the use of the buffer.
-    */
-   int (*bo_validate)(dri_bo *buf, unsigned int flags);
-
-   /**
-    * Associates the current set of validated buffers with a fence.
-    *
-    * Once fenced, the buffer manager will allow the validated buffers to be
-    * evicted when the graphics device's execution has passed the fence
-    * command.
-    *
-    * The fence object will have flags for the sum of the read/write/exe flags
-    * of the validated buffers associated with it.
-    */
-   dri_fence * (*fence_validated)(dri_bufmgr *bufmgr, const char *name,
-                                 GLboolean flushed);
-
    /** Takes a reference on a fence object */
    void (*fence_reference)(dri_fence *fence);
 
@@ -164,7 +140,7 @@ struct _dri_bufmgr {
     */
    void (*emit_reloc)(dri_bo *batch_buf, GLuint flags, GLuint delta, GLuint offset, dri_bo *relocatee);
 
-   void *(*process_relocs)(dri_bo *batch_buf);
+  void *(*process_relocs)(dri_bo *batch_buf, GLuint *count);
 
    void (*post_submit)(dri_bo *batch_buf, dri_fence **fence);
 };
@@ -178,9 +154,6 @@ void dri_bo_reference(dri_bo *bo);
 void dri_bo_unreference(dri_bo *bo);
 int dri_bo_map(dri_bo *buf, GLboolean write_enable);
 int dri_bo_unmap(dri_bo *buf);
-int dri_bo_validate(dri_bo *buf, unsigned int flags);
-dri_fence *dri_fence_validated(dri_bufmgr *bufmgr, const char *name,
-                              GLboolean flushed);
 void dri_fence_wait(dri_fence *fence);
 void dri_fence_reference(dri_fence *fence);
 void dri_fence_unreference(dri_fence *fence);
@@ -205,7 +178,7 @@ dri_bo *dri_ttm_bo_create_from_handle(dri_bufmgr *bufmgr, const char *name,
                                      unsigned int handle);
 
 void dri_emit_reloc(dri_bo *batch_buf, GLuint flags, GLuint delta, GLuint offset, dri_bo *relocatee);
-void *dri_process_relocs(dri_bo *batch_buf);
+void *dri_process_relocs(dri_bo *batch_buf, uint32_t *count);
 void dri_post_process_relocs(dri_bo *batch_buf);
 void dri_post_submit(dri_bo *batch_buf, dri_fence **last_fence);
 #endif
index adf0cf5ab72b7a4ac794173a012cc5974b07e3fd..bda45d921c99ac4be4521d740ee0aa5656b79423 100644 (file)
@@ -881,11 +881,12 @@ relocation_sort(const void *a_in, const void *b_in) {
 }
 
 static void *
-dri_fake_process_reloc(dri_bo *batch_buf)
+dri_fake_process_relocs(dri_bo *batch_buf, GLuint *count_p)
 {
    dri_bufmgr_fake *bufmgr_fake = (dri_bufmgr_fake *)batch_buf->bufmgr;
    GLuint i;
    GLuint *ptr;
+   GLuint count = 0;
 
    assert(batch_buf->virtual != NULL);
    ptr = batch_buf->virtual;
@@ -926,23 +927,25 @@ dri_fake_process_reloc(dri_bo *batch_buf)
         /* Validate.  If we fail, fence to clear the unfenced list and bail
          * out.
          */
-        ret = dri_bo_validate(r->buf, validate_flags);
+        ret = dri_fake_bo_validate(r->buf, validate_flags);
         if (ret != 0) {
            dri_fence *fo;
            dri_bo_unmap(batch_buf);
-           fo = dri_fence_validated(batch_buf->bufmgr,
-                                    "batchbuffer failure fence", GL_TRUE);
+           fo = dri_fake_fence_validated(batch_buf->bufmgr,
+                                         "batchbuffer failure fence", GL_TRUE);
            dri_fence_unreference(fo);
            goto done;
         }
+        count++;
       }
       ptr[r->offset / 4] = r->buf->offset + r->delta;
       dri_bo_unreference(r->buf);
    }
    dri_bo_unmap(batch_buf);
 
-   dri_bo_validate(batch_buf, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_EXE);
+   dri_fake_bo_validate(batch_buf, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_EXE);
 
+   *count_p = count;
    bufmgr_fake->nr_relocs = 0;
  done:
    return NULL;
@@ -954,7 +957,7 @@ dri_fake_post_submit(dri_bo *batch_buf, dri_fence **last_fence)
    dri_bufmgr_fake *bufmgr_fake = (dri_bufmgr_fake *)batch_buf->bufmgr;
    dri_fence *fo;
 
-   fo = dri_fence_validated(batch_buf->bufmgr, "Batch fence", GL_TRUE);
+   fo = dri_fake_fence_validated(batch_buf->bufmgr, "Batch fence", GL_TRUE);
 
    if (bufmgr_fake->performed_rendering) {
       dri_fence_unreference(*last_fence);
@@ -994,14 +997,12 @@ dri_bufmgr_fake_init(unsigned long low_offset, void *low_virtual,
    bufmgr_fake->bufmgr.bo_unreference = dri_fake_bo_unreference;
    bufmgr_fake->bufmgr.bo_map = dri_fake_bo_map;
    bufmgr_fake->bufmgr.bo_unmap = dri_fake_bo_unmap;
-   bufmgr_fake->bufmgr.bo_validate = dri_fake_bo_validate;
-   bufmgr_fake->bufmgr.fence_validated = dri_fake_fence_validated;
    bufmgr_fake->bufmgr.fence_wait = dri_fake_fence_wait;
    bufmgr_fake->bufmgr.fence_reference = dri_fake_fence_reference;
    bufmgr_fake->bufmgr.fence_unreference = dri_fake_fence_unreference;
    bufmgr_fake->bufmgr.destroy = dri_fake_destroy;
    bufmgr_fake->bufmgr.emit_reloc = dri_fake_emit_reloc;
-   bufmgr_fake->bufmgr.process_relocs = dri_fake_process_reloc;
+   bufmgr_fake->bufmgr.process_relocs = dri_fake_process_relocs;
    bufmgr_fake->bufmgr.post_submit = dri_fake_post_submit;
    bufmgr_fake->fence_emit = fence_emit;
    bufmgr_fake->fence_wait = fence_wait;
index 34c6d6f764b2802025057e07ae310834393950a1..0422029353d7f4db736100602ca4bfcb8e909d3b 100644 (file)
@@ -127,8 +127,9 @@ do_flush_locked(struct intel_batchbuffer *batch,
 {
    struct intel_context *intel = batch->intel;
    void *start;
+   GLuint count;
 
-   start = dri_process_relocs(batch->buf);
+   start = dri_process_relocs(batch->buf, &count);
 
    batch->map = NULL;
    batch->ptr = NULL;
@@ -143,7 +144,7 @@ do_flush_locked(struct intel_batchbuffer *batch,
       if (intel->intelScreen->ttm == GL_TRUE) {
         intel_exec_ioctl(batch->intel,
                          used, ignore_cliprects, allow_unlock,
-                         start, &batch->last_fence);
+                         start, count, &batch->last_fence);
       } else {
         intel_batch_ioctl(batch->intel,
                           batch->buf->offset,
index e85bc7e2f8081f121a834e7711977a7770470df9..ae6de49628114c434cb643cdd5153f04ffad7a2a 100644 (file)
@@ -162,7 +162,7 @@ static int intel_create_bo_list(int numTarget, struct intel_bo_list *list, void
 
 
 static struct drm_i915_op_arg *
-intel_setup_validate_list(int fd, struct intel_bo_list *list, struct intel_bo_list *reloc_list)
+intel_setup_validate_list(int fd, struct intel_bo_list *list, struct intel_bo_list *reloc_list, GLuint *count_p)
 {
     struct intel_bo_node *node;
     struct intel_bo_reloc_node *rl_node;
@@ -170,6 +170,7 @@ intel_setup_validate_list(int fd, struct intel_bo_list *list, struct intel_bo_li
     struct drm_i915_op_arg *arg, *first;
     struct drm_bo_op_req *req;
     uint64_t *prevNext = NULL;
+    GLuint count = 0;
 
     first = NULL;
 
@@ -202,11 +203,13 @@ intel_setup_validate_list(int fd, struct intel_bo_list *list, struct intel_bo_li
                arg->reloc_handle = rl_node->type_list.buf.handle;
            }
        }
+       count++;
     }
 
     if (!first)
        return 0;
 
+    *count_p = count;
     return first;
 }
 
@@ -385,8 +388,6 @@ static int intel_add_validate_reloc(int fd, struct intel_bo_list *reloc_list, st
            cur_type->relocs[0] = (reloc_info->type << 16);
            cur_type->relocs[1] = 0;
 
-           //      cur->relocs[cur->nr_reloc_lists-1][1] = 0;// TODO ADD HANDLE HERE
-           
            cur->nr_reloc_types++;
        }
     }
@@ -615,45 +616,6 @@ dri_ttm_bo_unmap(dri_bo *buf)
    return drmBOUnmap(bufmgr_ttm->fd, &ttm_buf->drm_bo);
 }
 
-static int
-dri_ttm_validate(dri_bo *buf, unsigned int flags)
-{
-   dri_bufmgr_ttm *bufmgr_ttm;
-   dri_bo_ttm *ttm_buf = (dri_bo_ttm *)buf;
-   unsigned int mask;
-   int err;
-
-   /* XXX: Sanity-check whether we've already validated this one under
-    * different flags.  See drmAddValidateItem().
-    */
-
-   bufmgr_ttm = (dri_bufmgr_ttm *)buf->bufmgr;
-
-   /* Calculate the appropriate mask to pass to the DRM. There appears to be
-    * be a direct relationship to flags, so it's unnecessary to have it passed
-    * in as an argument.
-    */
-   mask = DRM_BO_MASK_MEM;
-   mask |= flags & (DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE | DRM_BO_FLAG_EXE);
-
-   err = drmBOValidate(bufmgr_ttm->fd, &ttm_buf->drm_bo, 0, flags, mask, 0);
-
-   if (err == 0) {
-      /* XXX: add to fence list for sanity checking */
-   } else {
-      fprintf(stderr, "failed to validate buffer (%s): %s\n",
-             ttm_buf->name, strerror(-err));
-   }
-
-   buf->offset = ttm_buf->drm_bo.offset;
-
-#if BUFMGR_DEBUG
-   fprintf(stderr, "bo_validate: %p (%s)\n", &ttm_buf->bo, ttm_buf->name);
-#endif
-
-   return err;
-}
-
 /* Returns a dri_bo wrapping the given buffer object handle.
  *
  * This can be used when one application needs to pass a buffer object
@@ -691,12 +653,6 @@ intel_ttm_fence_create_from_arg(dri_bufmgr *bufmgr, const char *name,
    return &ttm_fence->fence;
 }
 
-static dri_fence *
-dri_ttm_fence_validated(dri_bufmgr *bufmgr, const char *name,
-                       GLboolean flushed)
-{
-   return NULL;
-}
 
 static void
 dri_ttm_fence_reference(dri_fence *fence)
@@ -826,7 +782,7 @@ dri_ttm_emit_reloc(dri_bo *batch_buf, GLuint flags, GLuint delta, GLuint offset,
 
 
 static void *
-dri_ttm_process_reloc(dri_bo *batch_buf)
+dri_ttm_process_reloc(dri_bo *batch_buf, GLuint *count)
 {
    dri_bufmgr_ttm *bufmgr_ttm = (dri_bufmgr_ttm *)batch_buf->bufmgr;
    void *ptr;
@@ -837,7 +793,7 @@ dri_ttm_process_reloc(dri_bo *batch_buf)
    intel_add_validate_buffer(&bufmgr_ttm->list, batch_buf, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_EXE,
                             DRM_BO_MASK_MEM | DRM_BO_FLAG_EXE, &itemLoc, NULL);
 
-   ptr = intel_setup_validate_list(bufmgr_ttm->fd, &bufmgr_ttm->list, &bufmgr_ttm->reloc_list);
+   ptr = intel_setup_validate_list(bufmgr_ttm->fd, &bufmgr_ttm->list, &bufmgr_ttm->reloc_list, count);
 
    return ptr;
 }
@@ -883,8 +839,6 @@ intel_bufmgr_ttm_init(int fd, unsigned int fence_type,
    bufmgr_ttm->bufmgr.bo_unreference = dri_ttm_bo_unreference;
    bufmgr_ttm->bufmgr.bo_map = dri_ttm_bo_map;
    bufmgr_ttm->bufmgr.bo_unmap = dri_ttm_bo_unmap;
-   bufmgr_ttm->bufmgr.bo_validate = dri_ttm_validate;
-   bufmgr_ttm->bufmgr.fence_validated = dri_ttm_fence_validated;
    bufmgr_ttm->bufmgr.fence_reference = dri_ttm_fence_reference;
    bufmgr_ttm->bufmgr.fence_unreference = dri_ttm_fence_unreference;
    bufmgr_ttm->bufmgr.fence_wait = dri_ttm_fence_wait;
index 873e8b97883c2d83ea2d884eaefcfbabb0d482cb..94f7e73ecfb29688b073e637a2b97bbba0963b70 100644 (file)
@@ -137,7 +137,7 @@ void
 intel_exec_ioctl(struct intel_context *intel,
                 GLuint used,
                 GLboolean ignore_cliprects, GLboolean allow_unlock,
-                void *start, dri_fence **fence)
+                void *start, GLuint count, dri_fence **fence)
 {
    struct drm_i915_execbuffer execbuf;
    dri_fence *fo;
@@ -151,6 +151,7 @@ intel_exec_ioctl(struct intel_context *intel,
 
    memset(&execbuf, 0, sizeof(execbuf));
 
+   execbuf.num_buffers = count;
    execbuf.batch.used = used;
    execbuf.batch.cliprects = intel->pClipRects;
    execbuf.batch.num_cliprects = ignore_cliprects ? 0 : intel->numClipRects;
index 689f21cae8979925872f047d83578acc52b50a6b..953fee92406b86a4f6d92836113cd6cf36acb72f 100644 (file)
@@ -40,5 +40,5 @@ void intel_batch_ioctl(struct intel_context *intel,
 void intel_exec_ioctl(struct intel_context *intel,
                      GLuint used,
                      GLboolean ignore_cliprects, GLboolean allow_unlock,
-                     void *start, dri_fence **fence);
+                     void *start, GLuint count, dri_fence **fence);
 #endif