ilo: rework winsys bo reloc functions
authorChia-I Wu <olvaffe@gmail.com>
Sat, 8 Mar 2014 07:57:51 +0000 (15:57 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Mon, 10 Mar 2014 08:42:42 +0000 (16:42 +0800)
Rename

  intel_bo_emit_reloc() to intel_bo_add_reloc(),
  intel_bo_clear_relocs() to intel_bo_truncate_relocs(), and
  intel_bo_references() to intel_bo_has_reloc().

Besides, we need intel_bo_get_offset() only to get the presumed offset afer
adding a reloc entry.  Remove the function and make intel_bo_add_reloc()
return the presumed offset.  While at it, switch to gem_bo->offset64 from
gem_bo->offset.

src/gallium/drivers/ilo/ilo_cp.c
src/gallium/drivers/ilo/ilo_cp.h
src/gallium/drivers/ilo/ilo_query.c
src/gallium/drivers/ilo/ilo_transfer.c
src/gallium/winsys/intel/drm/intel_drm_winsys.c
src/gallium/winsys/intel/intel_winsys.h

index 85d40aa7a5fcc58efb0171f6aa345992a5debb9a..55d90266cb509f0a7150b10583492d86845c064c 100644 (file)
@@ -77,7 +77,7 @@ ilo_cp_longjmp(struct ilo_cp *cp, const struct ilo_cp_jmp_buf *jmp)
    cp->size = jmp->size;
    cp->used = jmp->used;
    cp->stolen = jmp->stolen;
-   intel_bo_clear_relocs(cp->bo, jmp->reloc_count);
+   intel_bo_truncate_relocs(cp->bo, jmp->reloc_count);
 }
 
 /**
index 6d6bb16716e01b7ce4d0f50523eadd498a6a61a6..9a09ac9106a4d0b54d842171656f8d0ff62dea1a 100644 (file)
@@ -330,15 +330,20 @@ static inline void
 ilo_cp_write_bo(struct ilo_cp *cp, uint32_t val, struct intel_bo *bo,
                 uint32_t read_domains, uint32_t write_domain)
 {
-   if (bo) {
-      intel_bo_emit_reloc(cp->bo, cp->cmd_cur * 4,
-            bo, val, read_domains, write_domain);
+   uint64_t presumed_offset;
 
-      ilo_cp_write(cp, val + intel_bo_get_offset(bo));
+   if (bo) {
+      intel_bo_add_reloc(cp->bo, cp->cmd_cur * 4, bo, val,
+            read_domains, write_domain, &presumed_offset);
    }
    else {
-      ilo_cp_write(cp, val);
+      presumed_offset = 0;
    }
+
+   /* 32-bit addressing */
+   assert(presumed_offset == (uint64_t) ((uint32_t) presumed_offset));
+
+   ilo_cp_write(cp, (uint32_t) presumed_offset);
 }
 
 /**
index 5154ddbdefc9200928e82965bb045546181362b3..59a6b0686c305d494bd0c1486241f38c8c407966 100644 (file)
@@ -168,7 +168,7 @@ ilo_get_query_result(struct pipe_context *pipe, struct pipe_query *query,
       return false;
 
    if (q->bo) {
-      if (intel_bo_references(ilo->cp->bo, q->bo))
+      if (intel_bo_has_reloc(ilo->cp->bo, q->bo))
          ilo_cp_flush(ilo->cp, "syncing for queries");
 
       if (!wait && intel_bo_is_busy(q->bo))
index 5b8a6588e94834f20a3c0e6ca06a05e9bf9fab2b..b6e52e1651c4ac68041cfc79283836eeda67afea 100644 (file)
@@ -39,7 +39,7 @@
 static bool
 is_bo_busy(struct ilo_context *ilo, struct intel_bo *bo, bool *need_flush)
 {
-   const bool referenced = intel_bo_references(ilo->cp->bo, bo);
+   const bool referenced = intel_bo_has_reloc(ilo->cp->bo, bo);
 
    if (need_flush)
       *need_flush = referenced;
index cfd1adde2e9c99b370acd37c2f5b1928a05d5c09..ad91281e62e81d580ae6d789fd5813c14514de42 100644 (file)
@@ -386,7 +386,7 @@ intel_winsys_decode_commands(struct intel_winsys *winsys,
    used /= 4;
 
    drm_intel_decode_set_batch_pointer(winsys->decode,
-         intel_bo_get_virtual(bo), intel_bo_get_offset(bo), used);
+         gem_bo(bo)->virtual, gem_bo(bo)->offset64, used);
 
    drm_intel_decode(winsys->decode);
 
@@ -411,12 +411,6 @@ intel_bo_get_size(const struct intel_bo *bo)
    return gem_bo(bo)->size;
 }
 
-unsigned long
-intel_bo_get_offset(const struct intel_bo *bo)
-{
-   return gem_bo(bo)->offset;
-}
-
 void *
 intel_bo_get_virtual(const struct intel_bo *bo)
 {
@@ -465,13 +459,20 @@ intel_bo_pread(struct intel_bo *bo, unsigned long offset,
 }
 
 int
-intel_bo_emit_reloc(struct intel_bo *bo, uint32_t offset,
-                    struct intel_bo *target_bo, uint32_t target_offset,
-                    uint32_t read_domains, uint32_t write_domain)
+intel_bo_add_reloc(struct intel_bo *bo, uint32_t offset,
+                   struct intel_bo *target_bo, uint32_t target_offset,
+                   uint32_t read_domains, uint32_t write_domain,
+                   uint64_t *presumed_offset)
 {
-   return drm_intel_bo_emit_reloc(gem_bo(bo), offset,
+   int err;
+
+   err = drm_intel_bo_emit_reloc(gem_bo(bo), offset,
          gem_bo(target_bo), target_offset,
          read_domains, write_domain);
+
+   *presumed_offset = gem_bo(target_bo)->offset64 + target_offset;
+
+   return err;
 }
 
 int
@@ -481,13 +482,13 @@ intel_bo_get_reloc_count(struct intel_bo *bo)
 }
 
 void
-intel_bo_clear_relocs(struct intel_bo *bo, int start)
+intel_bo_truncate_relocs(struct intel_bo *bo, int start)
 {
    drm_intel_gem_bo_clear_relocs(gem_bo(bo), start);
 }
 
 bool
-intel_bo_references(struct intel_bo *bo, struct intel_bo *target_bo)
+intel_bo_has_reloc(struct intel_bo *bo, struct intel_bo *target_bo)
 {
    return drm_intel_bo_references(gem_bo(bo), gem_bo(target_bo));
 }
index 4a58d6c0bcaa04baa388375eabd5349d4461fe45..cdd47def651adfa6dc9544fa7b2996e38fa0a076 100644 (file)
@@ -204,12 +204,6 @@ intel_bo_unreference(struct intel_bo *bo);
 unsigned long
 intel_bo_get_size(const struct intel_bo *bo);
 
-/**
- * Return the last-seen-by-GPU offset of \p bo.
- */
-unsigned long
-intel_bo_get_offset(const struct intel_bo *bo);
-
 /**
  * Return the pointer to the memory area of the mapped \p bo.
  */
@@ -270,9 +264,10 @@ intel_bo_pread(struct intel_bo *bo, unsigned long offset,
  * \p target_offset.
  */
 int
-intel_bo_emit_reloc(struct intel_bo *bo, uint32_t offset,
-                    struct intel_bo *target_bo, uint32_t target_offset,
-                    uint32_t read_domains, uint32_t write_domain);
+intel_bo_add_reloc(struct intel_bo *bo, uint32_t offset,
+                   struct intel_bo *target_bo, uint32_t target_offset,
+                   uint32_t read_domains, uint32_t write_domain,
+                   uint64_t *presumed_offset);
 
 /**
  * Return the current number of relocations.
@@ -281,20 +276,20 @@ int
 intel_bo_get_reloc_count(struct intel_bo *bo);
 
 /**
- * Discard all relocations except the first \p start ones.
+ * Truncate all relocations except the first \p start ones.
  *
  * Combined with \p intel_bo_get_reloc_count(), they can be used to undo the
- * \p intel_bo_emit_reloc() calls that were just made.
+ * \p intel_bo_add_reloc() calls that were just made.
  */
 void
-intel_bo_clear_relocs(struct intel_bo *bo, int start);
+intel_bo_truncate_relocs(struct intel_bo *bo, int start);
 
 /**
  * Return true if \p target_bo is on the relocation list of \p bo, or on
  * the relocation list of some bo that is referenced by \p bo.
  */
 bool
-intel_bo_references(struct intel_bo *bo, struct intel_bo *target_bo);
+intel_bo_has_reloc(struct intel_bo *bo, struct intel_bo *target_bo);
 
 /**
  * Submit \p bo for execution.