radeon/r200/r300: cleanup some of the renderbuffer code
[mesa.git] / src / gallium / winsys / drm / intel / common / intel_be_context.c
1
2 /*
3 * Authors: Jakob Bornecrantz <jakob-at-tungstengraphics.com>
4 */
5
6 #include "ws_dri_fencemgr.h"
7 #include "intel_be_device.h"
8 #include "intel_be_context.h"
9 #include "intel_be_batchbuffer.h"
10
11 static INLINE struct intel_be_context *
12 intel_be_context(struct i915_winsys *sws)
13 {
14 return (struct intel_be_context *)sws;
15 }
16
17 /* Simple batchbuffer interface:
18 */
19
20 static struct i915_batchbuffer*
21 intel_i915_batch_get(struct i915_winsys *sws)
22 {
23 struct intel_be_context *intel = intel_be_context(sws);
24 return &intel->batch->base;
25 }
26
27 static void intel_i915_batch_reloc(struct i915_winsys *sws,
28 struct pipe_buffer *buf,
29 unsigned access_flags,
30 unsigned delta)
31 {
32 struct intel_be_context *intel = intel_be_context(sws);
33
34 unsigned flags = DRM_BO_FLAG_MEM_TT;
35 unsigned mask = DRM_BO_MASK_MEM;
36
37 if (access_flags & I915_BUFFER_ACCESS_WRITE) {
38 flags |= DRM_BO_FLAG_WRITE;
39 mask |= DRM_BO_FLAG_WRITE;
40 }
41
42 if (access_flags & I915_BUFFER_ACCESS_READ) {
43 flags |= DRM_BO_FLAG_READ;
44 mask |= DRM_BO_FLAG_READ;
45 }
46
47 intel_be_offset_relocation(intel->batch,
48 delta,
49 dri_bo(buf),
50 flags,
51 mask);
52 }
53
54 static void intel_i915_batch_flush(struct i915_winsys *sws,
55 struct pipe_fence_handle **fence)
56 {
57 struct intel_be_context *intel = intel_be_context(sws);
58
59 union {
60 struct _DriFenceObject *dri;
61 struct pipe_fence_handle *pipe;
62 } fu;
63
64 if (fence)
65 assert(!*fence);
66
67 fu.dri = intel_be_batchbuffer_flush(intel->batch);
68
69 if (!fu.dri) {
70 assert(0);
71 *fence = NULL;
72 return;
73 }
74
75 if (fu.dri) {
76 if (fence)
77 *fence = fu.pipe;
78 else
79 driFenceUnReference(&fu.dri);
80 }
81
82 }
83
84 boolean
85 intel_be_init_context(struct intel_be_context *intel, struct intel_be_device *device)
86 {
87 assert(intel);
88 assert(device);
89
90 intel->device = device;
91
92 /* TODO move framebuffer createion to the driver */
93
94 intel->base.batch_get = intel_i915_batch_get;
95 intel->base.batch_reloc = intel_i915_batch_reloc;
96 intel->base.batch_flush = intel_i915_batch_flush;
97
98 intel->batch = intel_be_batchbuffer_alloc(intel);
99
100 return true;
101 }
102
103 void
104 intel_be_destroy_context(struct intel_be_context *intel)
105 {
106 intel_be_batchbuffer_free(intel->batch);
107 }