Merge branch 'llvm-cliptest-viewport'
[mesa.git] / src / gallium / winsys / r600 / drm / r600_priv.h
index 07e734268d5771012421df49f6d6915520cf7290..b5bd7bd92c1d31bd1e8108ecd8bfd51b408fe59d 100644 (file)
@@ -40,9 +40,9 @@ struct radeon {
        unsigned                        device;
        unsigned                        family;
        enum chip_class                 chip_class;
-       boolean                         use_mem_constant; /* true for evergreen */
        struct pb_manager *kman; /* kernel bo manager */
        struct pb_manager *cman; /* cached bo manager */
+       struct r600_tiling_info tiling_info;
 };
 
 struct radeon *r600_new(int fd, unsigned device);
@@ -54,6 +54,7 @@ struct r600_reg {
        unsigned                        offset;
        unsigned                        need_bo;
        unsigned                        flush_flags;
+       unsigned                        flush_mask;
 };
 
 struct radeon_bo {
@@ -64,15 +65,20 @@ struct radeon_bo {
        unsigned                        map_count;
        void                            *data;
        struct list_head                fencedlist;
+       unsigned                        fence;
+       struct r600_context             *ctx;
        boolean                         shared;
-       int64_t                         last_busy;
-       boolean                         set_busy;
+       struct r600_reloc               *reloc;
+       unsigned                        reloc_id;
+       unsigned                        last_flush;
 };
 
 struct r600_bo {
        struct pipe_reference           reference;
        struct pb_buffer                *pb;
        unsigned                        size;
+       unsigned                        tiling_flags;
+       unsigned                        kernel_pitch;
 };
 
 
@@ -91,7 +97,10 @@ int radeon_bo_wait(struct radeon *radeon, struct radeon_bo *bo);
 int radeon_bo_busy(struct radeon *radeon, struct radeon_bo *bo, uint32_t *domain);
 void radeon_bo_pbmgr_flush_maps(struct pb_manager *_mgr);
 int radeon_bo_fencelist(struct radeon *radeon, struct radeon_bo **bolist, uint32_t num_bo);
-
+int radeon_bo_get_tiling_flags(struct radeon *radeon,
+                              struct radeon_bo *bo,
+                              uint32_t *tiling_flags,
+                              uint32_t *pitch);
 
 /* radeon_bo_pb.c */
 struct radeon_bo *radeon_bo_pb_get_bo(struct pb_buffer *_buf);
@@ -100,7 +109,10 @@ struct pb_buffer *radeon_bo_pb_create_buffer_from_handle(struct pb_manager *_mgr
                                                         uint32_t handle);
 
 /* r600_hw_context.c */
+int r600_context_init_fence(struct r600_context *ctx);
 void r600_context_bo_reloc(struct r600_context *ctx, u32 *pm4, struct r600_bo *rbo);
+void r600_context_bo_flush(struct r600_context *ctx, unsigned flush_flags,
+                               unsigned flush_mask, struct r600_bo *rbo);
 struct r600_bo *r600_context_reg_bo(struct r600_context *ctx, unsigned offset);
 int r600_context_add_block(struct r600_context *ctx, const struct r600_reg *reg, unsigned nreg);
 
@@ -132,6 +144,7 @@ static void inline r600_context_reg(struct r600_context *ctx,
                ctx->pm4_dirty_cdwords += block->pm4_ndwords;
                block->status |= R600_BLOCK_STATUS_ENABLED;
                block->status |= R600_BLOCK_STATUS_DIRTY;
+               LIST_ADDTAIL(&block->list,&ctx->dirty);
        }
 }
 
@@ -143,16 +156,19 @@ static inline void r600_context_block_emit_dirty(struct r600_context *ctx, struc
                if (block->pm4_bo_index[j]) {
                        /* find relocation */
                        id = block->pm4_bo_index[j];
-                       for (int k = 0; k < block->reloc[id].nreloc; k++) {
-                               r600_context_bo_reloc(ctx,
-                                       &block->pm4[block->reloc[id].bo_pm4_index[k]],
+                       r600_context_bo_reloc(ctx,
+                                       &block->pm4[block->reloc[id].bo_pm4_index],
+                                       block->reloc[id].bo);
+                       r600_context_bo_flush(ctx,
+                                       block->reloc[id].flush_flags,
+                                       block->reloc[id].flush_mask,
                                        block->reloc[id].bo);
-                       }
                }
        }
        memcpy(&ctx->pm4[ctx->pm4_cdwords], block->pm4, block->pm4_ndwords * 4);
        ctx->pm4_cdwords += block->pm4_ndwords;
        block->status ^= R600_BLOCK_STATUS_DIRTY;
+       LIST_DELINIT(&block->list);
 }
 
 static inline int radeon_bo_map(struct radeon *radeon, struct radeon_bo *bo)