i915g: Switch from pipe_winsys to intel_winsys
[mesa.git] / src / gallium / winsys / drm / intel / gem / intel_be_context.c
1
2 #include "pipe/p_screen.h"
3
4 #include "softpipe/sp_winsys.h"
5
6 #include "intel_be_device.h"
7 #include "intel_be_context.h"
8 #include "intel_be_batchbuffer.h"
9
10 #include "i915_drm.h"
11
12 #include "intel_be_api.h"
13
14 static struct i915_batchbuffer *
15 intel_be_batch_get(struct i915_winsys *sws)
16 {
17 struct intel_be_context *intel = intel_be_context(sws);
18 return &intel->batch->base;
19 }
20
21 static void
22 intel_be_batch_reloc(struct i915_winsys *sws,
23 struct pipe_buffer *buf,
24 unsigned access_flags,
25 unsigned delta)
26 {
27 struct intel_be_context *intel = intel_be_context(sws);
28 drm_intel_bo *bo = intel_bo(buf);
29 int ret;
30 uint32_t read = 0;
31 uint32_t write = 0;
32
33 if (access_flags & I915_BUFFER_ACCESS_WRITE) {
34 write = I915_GEM_DOMAIN_RENDER;
35 read = I915_GEM_DOMAIN_RENDER;
36 }
37
38 if (access_flags & I915_BUFFER_ACCESS_READ) {
39 read |= I915_GEM_DOMAIN_SAMPLER;
40 }
41
42 ret = intel_be_offset_relocation(intel->batch,
43 delta,
44 bo,
45 read,
46 write);
47 assert(ret == 0);
48
49 /* TODO change return type */
50 /* return ret; */
51 }
52
53 static void
54 intel_be_batch_flush(struct i915_winsys *sws,
55 struct pipe_fence_handle **fence)
56 {
57 struct intel_be_context *intel = intel_be_context(sws);
58 struct intel_be_fence **f = (struct intel_be_fence **)fence;
59
60 intel_be_batchbuffer_flush(intel->batch, f);
61 }
62
63
64 /*
65 * Misc functions.
66 */
67
68 static void
69 intel_be_destroy_context(struct i915_winsys *winsys)
70 {
71 struct intel_be_context *intel = intel_be_context(winsys);
72
73 intel_be_batchbuffer_free(intel->batch);
74
75 free(intel);
76 }
77
78 boolean
79 intel_be_init_context(struct intel_be_context *intel, struct intel_be_device *device)
80 {
81 assert(intel);
82 assert(device);
83 intel->device = device;
84
85 intel->base.batch_get = intel_be_batch_get;
86 intel->base.batch_reloc = intel_be_batch_reloc;
87 intel->base.batch_flush = intel_be_batch_flush;
88
89 intel->base.destroy = intel_be_destroy_context;
90
91 intel->batch = intel_be_batchbuffer_alloc(intel);
92
93 return true;
94 }
95
96 struct pipe_context *
97 intel_be_create_context(struct drm_api *api, struct pipe_screen *screen)
98 {
99 struct intel_be_context *intel;
100 struct pipe_context *pipe;
101 struct intel_be_device *device = intel_be_device(screen->winsys);
102
103 intel = (struct intel_be_context *)malloc(sizeof(*intel));
104 memset(intel, 0, sizeof(*intel));
105
106 intel_be_init_context(intel, device);
107
108 if (device->softpipe)
109 pipe = softpipe_create(screen);
110 else
111 pipe = i915_create_context(screen, &device->base, &intel->base);
112
113 if (pipe)
114 pipe->priv = intel;
115
116 return pipe;
117 }