1
2#include "i915_sw_winsys.h"
3#include "i915/i915_batchbuffer.h"
4#include "i915/i915_debug.h"
5#include "util/u_memory.h"
6
7#define BATCH_RESERVED 16
8
9#define INTEL_DEFAULT_RELOCS 100
10#define INTEL_MAX_RELOCS 400
11
12#define INTEL_BATCH_NO_CLIPRECTS 0x1
13#define INTEL_BATCH_CLIPRECTS    0x2
14
15#define INTEL_ALWAYS_FLUSH
16
17struct i915_sw_batchbuffer
18{
19   struct i915_winsys_batchbuffer base;
20
21   size_t actual_size;
22};
23
24static INLINE struct i915_sw_batchbuffer *
25i915_sw_batchbuffer(struct i915_winsys_batchbuffer *batch)
26{
27   return (struct i915_sw_batchbuffer *)batch;
28}
29
30static void
31i915_sw_batchbuffer_reset(struct i915_sw_batchbuffer *batch)
32{
33   memset(batch->base.map, 0, batch->actual_size);
34   batch->base.ptr = batch->base.map;
35   batch->base.size = batch->actual_size - BATCH_RESERVED;
36   batch->base.relocs = 0;
37}
38
39static struct i915_winsys_batchbuffer *
40i915_sw_batchbuffer_create(struct i915_winsys *iws)
41{
42   struct i915_sw_winsys *isws = i915_sw_winsys(iws);
43   struct i915_sw_batchbuffer *batch = CALLOC_STRUCT(i915_sw_batchbuffer);
44
45   batch->actual_size = isws->max_batch_size;
46
47   batch->base.map = MALLOC(batch->actual_size);
48   batch->base.ptr = NULL;
49   batch->base.size = 0;
50
51   batch->base.relocs = 0;
52
53   batch->base.iws = iws;
54
55   i915_sw_batchbuffer_reset(batch);
56
57   return &batch->base;
58}
59
60static boolean
61i915_sw_batchbuffer_validate_buffers(struct i915_winsys_batchbuffer *batch,
62				     struct i915_winsys_buffer **buffer,
63				     int num_of_buffers)
64{
65   return TRUE;
66}
67
68static int
69i915_sw_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch,
70                          struct i915_winsys_buffer *buffer,
71                          enum i915_winsys_buffer_usage usage,
72                          unsigned pre_add, boolean fenced)
73{
74   struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
75   int ret = 0;
76
77   if (usage == I915_USAGE_SAMPLER) {
78
79   } else if (usage == I915_USAGE_RENDER) {
80
81   } else if (usage == I915_USAGE_2D_TARGET) {
82
83   } else if (usage == I915_USAGE_2D_SOURCE) {
84
85   } else if (usage == I915_USAGE_VERTEX) {
86
87   } else {
88      assert(0);
89      return -1;
90   }
91
92   ((uint32_t*)batch->base.ptr)[0] = 0;
93   batch->base.ptr += 4;
94
95   if (!ret)
96      batch->base.relocs++;
97
98   return ret;
99}
100
101static void
102i915_sw_batchbuffer_flush(struct i915_winsys_batchbuffer *ibatch,
103                          struct pipe_fence_handle **fence)
104{
105   struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
106   unsigned used = 0;
107
108   assert(i915_winsys_batchbuffer_space(ibatch) >= 0);
109
110   used = batch->base.ptr - batch->base.map;
111   assert((used & 3) == 0);
112
113#ifdef INTEL_ALWAYS_FLUSH
114   /* MI_FLUSH | FLUSH_MAP_CACHE */
115   i915_winsys_batchbuffer_dword_unchecked(ibatch, (0x4<<23)|(1<<0));
116   used += 4;
117#endif
118
119   if ((used & 4) == 0) {
120      /* MI_NOOP */
121      i915_winsys_batchbuffer_dword_unchecked(ibatch, 0);
122   }
123   /* MI_BATCH_BUFFER_END */
124   i915_winsys_batchbuffer_dword_unchecked(ibatch, (0xA<<23));
125
126   used = batch->base.ptr - batch->base.map;
127   assert((used & 4) == 0);
128
129   if (i915_sw_winsys(ibatch->iws)->dump_cmd) {
130      i915_dump_batchbuffer(ibatch);
131   }
132
133   if (fence) {
134      ibatch->iws->fence_reference(ibatch->iws, fence, NULL);
135
136      (*fence) = i915_sw_fence_create();
137   }
138
139   i915_sw_batchbuffer_reset(batch);
140}
141
142static void
143i915_sw_batchbuffer_destroy(struct i915_winsys_batchbuffer *ibatch)
144{
145   struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
146
147   FREE(batch->base.map);
148   FREE(batch);
149}
150
151void i915_sw_winsys_init_batchbuffer_functions(struct i915_sw_winsys *isws)
152{
153   isws->base.batchbuffer_create = i915_sw_batchbuffer_create;
154   isws->base.validate_buffers = i915_sw_batchbuffer_validate_buffers;
155   isws->base.batchbuffer_reloc = i915_sw_batchbuffer_reloc;
156   isws->base.batchbuffer_flush = i915_sw_batchbuffer_flush;
157   isws->base.batchbuffer_destroy = i915_sw_batchbuffer_destroy;
158}
159