r600g: move more DRM queries into winsys/radeon
[mesa.git] / src / gallium / winsys / r600 / drm / r600_priv.h
index ee48754625aa916d9dcca461b6abc21349996314..036468e3a31f14fcf1e7a6b1e2162adf999b4fc0 100644 (file)
 #ifndef R600_PRIV_H
 #define R600_PRIV_H
 
-#include <errno.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <pipebuffer/pb_bufmgr.h>
-#include "util/u_double_list.h"
 #include "r600.h"
+#include "../../radeon/drm/radeon_winsys.h"
+#include "util/u_hash_table.h"
+#include "os/os_thread.h"
+#include "radeon_drm.h"
+
+#define PKT_COUNT_C                     0xC000FFFF
+#define PKT_COUNT_S(x)                  (((x) & 0x3FFF) << 16)
 
 struct radeon {
-       int                             fd;
-       int                             refcount;
-       unsigned                        device;
+       struct radeon_winsys            *ws;
+       struct radeon_info              info;
        unsigned                        family;
        enum chip_class                 chip_class;
-       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);
-void r600_delete(struct radeon *r600);
+/* these flags are used in register flags and added into block flags */
+#define REG_FLAG_NEED_BO 1
+#define REG_FLAG_DIRTY_ALWAYS 2
+#define REG_FLAG_RV6XX_SBU 4
+#define REG_FLAG_NOT_R600 8
+#define REG_FLAG_ENABLE_ALWAYS 16
+#define BLOCK_FLAG_RESOURCE 32
+#define REG_FLAG_FLUSH_CHANGE 64
 
 struct r600_reg {
-       unsigned                        opcode;
-       unsigned                        offset_base;
        unsigned                        offset;
-       unsigned                        need_bo;
+       unsigned                        flags;
        unsigned                        flush_flags;
+       unsigned                        flush_mask;
 };
 
+#define BO_BOUND_TEXTURE 1
 struct radeon_bo {
        struct pipe_reference           reference;
+       struct pb_buffer                *buf;
+       struct radeon_winsys_cs_handle  *cs_buf;
        unsigned                        handle;
        unsigned                        size;
-       unsigned                        alignment;
-       unsigned                        map_count;
+       int                             map_count;
        void                            *data;
-       struct list_head                fencedlist;
-       boolean                         shared;
-       int64_t                         last_busy;
-       boolean                         set_busy;
+
+       unsigned                        last_flush;
+       unsigned                        binding;
 };
 
 struct r600_bo {
-       struct pipe_reference           reference;
-       struct pb_buffer                *pb;
-       unsigned                        size;
+       struct pipe_reference           reference; /* this must be the first member for the r600_bo_reference inline to work */
+       /* DO NOT MOVE THIS ^ */
+       unsigned                        domains;
+       struct radeon_bo                *bo;
 };
 
-
-/* radeon_pciid.c */
+/*
+ * radeon_pciid.c
+ */
 unsigned radeon_family_from_device(unsigned device);
 
-/* r600_drm.c */
-struct radeon *radeon_decref(struct radeon *radeon);
-
-/* radeon_bo.c */
+/*
+ * radeon_bo.c
+ */
 struct radeon_bo *radeon_bo(struct radeon *radeon, unsigned handle,
-                           unsigned size, unsigned alignment, void *ptr);
+                           unsigned size, unsigned alignment, unsigned bind, unsigned initial_domain);
 void radeon_bo_reference(struct radeon *radeon, struct radeon_bo **dst,
                         struct radeon_bo *src);
 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);
+int radeon_bo_get_name(struct radeon *radeon,
+                      struct radeon_bo *bo,
+                      uint32_t *name);
+int radeon_bo_fixed_map(struct radeon *radeon, struct radeon_bo *bo);
 
-
-/* radeon_bo_pb.c */
-struct radeon_bo *radeon_bo_pb_get_bo(struct pb_buffer *_buf);
-struct pb_manager *radeon_bo_pbmgr_create(struct radeon *radeon);
-struct pb_buffer *radeon_bo_pb_create_buffer_from_handle(struct pb_manager *_mgr,
-                                                        uint32_t handle);
-
-/* r600_hw_context.c */
-void r600_context_bo_reloc(struct r600_context *ctx, u32 *pm4, struct r600_bo *rbo);
+/*
+ * r600_hw_context.c
+ */
+int r600_context_init_fence(struct r600_context *ctx);
+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);
-
-/* r600_bo.c */
-unsigned r600_bo_get_handle(struct r600_bo *bo);
-unsigned r600_bo_get_size(struct r600_bo *bo);
-static INLINE struct radeon_bo *r600_bo_get_bo(struct r600_bo *bo)
+int r600_context_add_block(struct r600_context *ctx, const struct r600_reg *reg, unsigned nreg,
+                          unsigned opcode, unsigned offset_base);
+void r600_context_pipe_state_set_resource(struct r600_context *ctx, struct r600_pipe_resource_state *state, struct r600_block *block);
+void r600_context_block_emit_dirty(struct r600_context *ctx, struct r600_block *block);
+void r600_context_block_resource_emit_dirty(struct r600_context *ctx, struct r600_block *block);
+void r600_context_dirty_block(struct r600_context *ctx, struct r600_block *block,
+                             int dirty, int index);
+int r600_setup_block_table(struct r600_context *ctx);
+void r600_context_reg(struct r600_context *ctx,
+                     unsigned offset, unsigned value,
+                     unsigned mask);
+void r600_init_cs(struct r600_context *ctx);
+int r600_resource_init(struct r600_context *ctx, struct r600_range *range, unsigned offset, unsigned nblocks, unsigned stride, struct r600_reg *reg, int nreg, unsigned offset_base);
+
+static INLINE unsigned r600_context_bo_reloc(struct r600_context *ctx, struct r600_bo *rbo)
 {
-       return radeon_bo_pb_get_bo(bo->pb);
-}
+       struct radeon_bo *bo = rbo->bo;
+       unsigned reloc_index;
 
-#define CTX_RANGE_ID(ctx, offset) (((offset) >> (ctx)->hash_shift) & 255)
-#define CTX_BLOCK_ID(ctx, offset) ((offset) & ((1 << (ctx)->hash_shift) - 1))
+       assert(bo != NULL);
 
-static void inline r600_context_reg(struct r600_context *ctx,
-                                       unsigned offset, unsigned value,
-                                       unsigned mask)
-{
-       struct r600_range *range;
-       struct r600_block *block;
-       unsigned id;
-
-       range = &ctx->range[CTX_RANGE_ID(ctx, offset)];
-       block = range->blocks[CTX_BLOCK_ID(ctx, offset)];
-       id = (offset - block->start_offset) >> 2;
-       block->reg[id] &= ~mask;
-       block->reg[id] |= value;
-       if (!(block->status & R600_BLOCK_STATUS_DIRTY)) {
-               ctx->pm4_dirty_cdwords += block->pm4_ndwords;
-               block->status |= R600_BLOCK_STATUS_ENABLED;
-               block->status |= R600_BLOCK_STATUS_DIRTY;
-       }
-}
+       reloc_index =
+               ctx->radeon->ws->cs_add_reloc(ctx->cs, bo->cs_buf, rbo->domains, rbo->domains);
 
-static inline void r600_context_block_emit_dirty(struct r600_context *ctx, struct r600_block *block)
-{
-       int id;
-
-       for (int j = 0; j < block->nreg; j++) {
-               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]],
-                                       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;
+       if (reloc_index >= ctx->creloc)
+               ctx->creloc = reloc_index+1;
+
+       radeon_bo_reference(ctx->radeon, &ctx->bo[reloc_index], bo);
+       return reloc_index * 4;
 }
 
+/*
+ * r600_bo.c
+ */
+void r600_bo_destroy(struct radeon *radeon, struct r600_bo *bo);
+
+
+/*
+ * radeon_bo.c
+ */
 static inline int radeon_bo_map(struct radeon *radeon, struct radeon_bo *bo)
 {
+       if (bo->map_count == 0 && !bo->data)
+               return radeon_bo_fixed_map(radeon, bo);
        bo->map_count++;
        return 0;
 }
@@ -166,4 +164,17 @@ static inline void radeon_bo_unmap(struct radeon *radeon, struct radeon_bo *bo)
        assert(bo->map_count >= 0);
 }
 
+/*
+ * fence
+ */
+static inline boolean fence_is_after(unsigned fence, unsigned ofence)
+{
+       /* handle wrap around */
+       if (fence < 0x80000000 && ofence > 0x80000000)
+               return TRUE;
+       if (fence > ofence)
+               return TRUE;
+       return FALSE;
+}
+
 #endif