r600g: move some queries into winsys/radeon
[mesa.git] / src / gallium / winsys / r600 / drm / r600_priv.h
index f8363f9272b99cd64ced138cb3b3a83aceba9a4a..9fc7c534646a49fc1eb18b4e40b1a13b96ed0344 100644 (file)
@@ -35,6 +35,7 @@
 #include "util/u_hash_table.h"
 #include <os/os_thread.h>
 #include "r600.h"
+#include "../../radeon/drm/radeon_winsys.h"
 
 #define PKT_COUNT_C                     0xC000FFFF
 #define PKT_COUNT_S(x)                  (((x) & 0x3FFF) << 16)
@@ -43,9 +44,7 @@ struct r600_bomgr;
 struct r600_bo;
 
 struct radeon {
-       int                             fd;
-       int                             refcount;
-       unsigned                        device;
+       struct radeon_info              info;
        unsigned                        family;
        enum chip_class                 chip_class;
        struct r600_tiling_info         tiling_info;
@@ -53,28 +52,32 @@ struct radeon {
        unsigned                        fence;
        unsigned                        *cfence;
        struct r600_bo                  *fence_bo;
-       unsigned                        clock_crystal_freq;
-       unsigned                        num_backends;
-       unsigned                        minor_version;
+       unsigned                        num_tile_pipes;
+       unsigned                        backend_map;
+       boolean                         backend_map_valid;
 
         /* List of buffer handles and its mutex. */
        struct util_hash_table          *bo_handles;
        pipe_mutex bo_handles_mutex;
 };
 
+/* 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                        flags;
        unsigned                        flush_flags;
        unsigned                        flush_mask;
 };
 
+#define BO_BOUND_TEXTURE 1
 struct radeon_bo {
        struct pipe_reference           reference;
        unsigned                        handle;
@@ -90,10 +93,12 @@ struct radeon_bo {
        unsigned                        reloc_id;
        unsigned                        last_flush;
        unsigned                        name;
+       unsigned                        binding;
 };
 
 struct r600_bo {
-       struct pipe_reference           reference;
+       struct pipe_reference           reference; /* this must be the first member for the r600_bo_reference inline to work */
+       /* DO NOT MOVE THIS ^ */
        unsigned                        size;
        unsigned                        tiling_flags;
        unsigned                        kernel_pitch;
@@ -132,7 +137,7 @@ unsigned radeon_family_from_device(unsigned device);
  * radeon_bo.c
  */
 struct radeon_bo *radeon_bo(struct radeon *radeon, unsigned handle,
-                           unsigned size, unsigned alignment);
+                           unsigned size, unsigned alignment, 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);
@@ -145,24 +150,43 @@ int radeon_bo_get_tiling_flags(struct radeon *radeon,
 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);
 
 /*
  * 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_get_reloc(struct r600_context *ctx, 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);
-void r600_context_pipe_state_set_resource(struct r600_context *ctx, struct r600_pipe_state *state, unsigned offset);
+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 void r600_context_bo_reloc(struct r600_context *ctx, u32 *pm4, struct r600_bo *rbo)
+{
+       struct radeon_bo *bo = rbo->bo;
+
+       assert(bo != NULL);
+
+       if (!bo->reloc)
+               r600_context_get_reloc(ctx, rbo);
+
+       /* set PKT3 to point to proper reloc */
+       *pm4 = bo->reloc_id;
+}
+
 /*
  * r600_bo.c
  */
@@ -173,7 +197,7 @@ void r600_bo_destroy(struct radeon *radeon, struct r600_bo *bo);
  */
 struct r600_bomgr *r600_bomgr_create(struct radeon *radeon, unsigned usecs);
 void r600_bomgr_destroy(struct r600_bomgr *mgr);
-bool r600_bomgr_bo_destroy(struct r600_bomgr *mgr, struct r600_bo *bo);
+boolean r600_bomgr_bo_destroy(struct r600_bomgr *mgr, struct r600_bo *bo);
 void r600_bomgr_bo_init(struct r600_bomgr *mgr, struct r600_bo *bo);
 struct r600_bo *r600_bomgr_bo_create(struct r600_bomgr *mgr,
                                        unsigned size,
@@ -184,14 +208,15 @@ struct r600_bo *r600_bomgr_bo_create(struct r600_bomgr *mgr,
 /*
  * helpers
  */
-#define CTX_RANGE_ID(ctx, offset) (((offset) >> (ctx)->hash_shift) & 255)
-#define CTX_BLOCK_ID(ctx, offset) ((offset) & ((1 << (ctx)->hash_shift) - 1))
+
 
 /*
  * 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;
 }
@@ -205,7 +230,7 @@ static inline void radeon_bo_unmap(struct radeon *radeon, struct radeon_bo *bo)
 /*
  * fence
  */
-static inline bool fence_is_after(unsigned fence, unsigned ofence)
+static inline boolean fence_is_after(unsigned fence, unsigned ofence)
 {
        /* handle wrap around */
        if (fence < 0x80000000 && ofence > 0x80000000)