Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4358 Serge 1
 
2
#include "util/u_memory.h"
3
4
 
5
#include "i915/i915_debug.h"
6
#include 
7
#include 
8
9
 
10
11
 
12
#define INTEL_MAX_RELOCS 400
13
14
 
15
#define INTEL_BATCH_CLIPRECTS    0x2
16
17
 
18
19
 
20
{
21
   struct i915_winsys_batchbuffer base;
22
23
 
24
25
 
26
};
27
28
 
29
i915_drm_batchbuffer(struct i915_winsys_batchbuffer *batch)
30
{
31
   return (struct i915_drm_batchbuffer *)batch;
32
}
33
34
 
35
i915_drm_batchbuffer_reset(struct i915_drm_batchbuffer *batch)
36
{
37
   struct i915_drm_winsys *idws = i915_drm_winsys(batch->base.iws);
38
39
 
40
      drm_intel_bo_unreference(batch->bo);
41
   batch->bo = drm_intel_bo_alloc(idws->gem_manager,
42
                                  "gallium3d_batchbuffer",
43
                                  batch->actual_size,
44
                                  4096);
45
46
 
47
   batch->base.ptr = batch->base.map;
48
   batch->base.size = batch->actual_size - BATCH_RESERVED;
49
   batch->base.relocs = 0;
50
}
51
52
 
53
i915_drm_batchbuffer_create(struct i915_winsys *iws)
54
{
55
   struct i915_drm_winsys *idws = i915_drm_winsys(iws);
56
   struct i915_drm_batchbuffer *batch = CALLOC_STRUCT(i915_drm_batchbuffer);
57
58
 
59
60
 
61
   batch->base.ptr = NULL;
62
   batch->base.size = 0;
63
64
 
65
66
 
67
68
 
69
70
 
71
}
72
73
 
74
i915_drm_batchbuffer_validate_buffers(struct i915_winsys_batchbuffer *batch,
75
				      struct i915_winsys_buffer **buffer,
76
				      int num_of_buffers)
77
{
78
   struct i915_drm_batchbuffer *drm_batch = i915_drm_batchbuffer(batch);
79
   drm_intel_bo *bos[num_of_buffers + 1];
80
   int i, ret;
81
82
 
83
   for (i = 0; i < num_of_buffers; i++)
84
      bos[i+1] = intel_bo(buffer[i]);
85
86
 
87
   if (ret != 0)
88
      return FALSE;
89
90
 
91
}
92
93
 
94
i915_drm_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch,
95
                            struct i915_winsys_buffer *buffer,
96
                            enum i915_winsys_buffer_usage usage,
97
                            unsigned pre_add, boolean fenced)
98
{
99
   struct i915_drm_batchbuffer *batch = i915_drm_batchbuffer(ibatch);
100
   unsigned write_domain = 0;
101
   unsigned read_domain = 0;
102
   unsigned offset;
103
   int ret = 0;
104
105
 
106
   case I915_USAGE_SAMPLER:
107
      write_domain = 0;
108
      read_domain = I915_GEM_DOMAIN_SAMPLER;
109
      break;
110
   case I915_USAGE_RENDER:
111
      write_domain = I915_GEM_DOMAIN_RENDER;
112
      read_domain = I915_GEM_DOMAIN_RENDER;
113
      break;
114
   case I915_USAGE_2D_TARGET:
115
      write_domain = I915_GEM_DOMAIN_RENDER;
116
      read_domain = I915_GEM_DOMAIN_RENDER;
117
      break;
118
   case I915_USAGE_2D_SOURCE:
119
      write_domain = 0;
120
      read_domain = I915_GEM_DOMAIN_RENDER;
121
      break;
122
   case I915_USAGE_VERTEX:
123
      write_domain = 0;
124
      read_domain = I915_GEM_DOMAIN_VERTEX;
125
      break;
126
   default:
127
      assert(0);
128
      return -1;
129
   }
130
131
 
132
133
 
134
      ret = drm_intel_bo_emit_reloc_fence(batch->bo, offset,
135
				    intel_bo(buffer), pre_add,
136
				    read_domain,
137
				    write_domain);
138
   else
139
      ret = drm_intel_bo_emit_reloc(batch->bo, offset,
140
				    intel_bo(buffer), pre_add,
141
				    read_domain,
142
				    write_domain);
143
144
 
145
   batch->base.ptr += 4;
146
147
 
148
      batch->base.relocs++;
149
150
 
151
}
152
153
 
154
i915_drm_throttle(struct i915_drm_winsys *idws)
155
{
156
   drmIoctl(idws->fd, DRM_IOCTL_I915_GEM_THROTTLE, NULL);
157
}
158
159
 
160
i915_drm_batchbuffer_flush(struct i915_winsys_batchbuffer *ibatch,
161
                           struct pipe_fence_handle **fence,
162
                           enum i915_winsys_flush_flags flags)
163
{
164
   struct i915_drm_batchbuffer *batch = i915_drm_batchbuffer(ibatch);
165
   unsigned used;
166
   int ret;
167
168
 
169
   i915_winsys_batchbuffer_dword_unchecked(ibatch, (0xA<<23));
170
171
 
172
   if (used & 4) {
173
      /* MI_NOOP */
174
      i915_winsys_batchbuffer_dword_unchecked(ibatch, 0);
175
      used += 4;
176
   }
177
178
 
179
   ret = drm_intel_bo_subdata(batch->bo, 0, used, batch->base.map);
180
   if (ret == 0 && i915_drm_winsys(ibatch->iws)->send_cmd)
181
      ret = drm_intel_bo_exec(batch->bo, used, NULL, 0, 0);
182
183
 
184
      i915_drm_throttle(i915_drm_winsys(ibatch->iws));
185
186
 
187
      i915_dump_batchbuffer(ibatch);
188
      assert(ret == 0);
189
   }
190
191
 
192
      FILE *file = fopen(i915_drm_winsys(ibatch->iws)->dump_raw_file, "a");
193
      if (file) {
194
	 fwrite(batch->base.map, used, 1, file);
195
	 fclose(file);
196
      }
197
   }
198
199
 
200
   drm_intel_bo_wait_rendering(batch->bo);
201
#endif
202
203
 
204
      ibatch->iws->fence_reference(ibatch->iws, fence, NULL);
205
206
 
207
      /* we run synced to GPU so just pass null */
208
      (*fence) = i915_drm_fence_create(NULL);
209
#else
210
      (*fence) = i915_drm_fence_create(batch->bo);
211
#endif
212
   }
213
214
 
215
}
216
217
 
218
i915_drm_batchbuffer_destroy(struct i915_winsys_batchbuffer *ibatch)
219
{
220
   struct i915_drm_batchbuffer *batch = i915_drm_batchbuffer(ibatch);
221
222
 
223
      drm_intel_bo_unreference(batch->bo);
224
225
 
226
   FREE(batch);
227
}
228
229
 
230
{
231
   idws->base.batchbuffer_create = i915_drm_batchbuffer_create;
232
   idws->base.validate_buffers = i915_drm_batchbuffer_validate_buffers;
233
   idws->base.batchbuffer_reloc = i915_drm_batchbuffer_reloc;
234
   idws->base.batchbuffer_flush = i915_drm_batchbuffer_flush;
235
   idws->base.batchbuffer_destroy = i915_drm_batchbuffer_destroy;
236
}
237