i965g: more work on compiling, particularly the brw_draw files
[mesa.git] / src / gallium / drivers / i965 / brw_winsys.h
1 /**************************************************************************
2 *
3 * Copyright © 2009 Jakob Bornecrantz
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 **************************************************************************/
25
26 #ifndef BRW_WINSYS_H
27 #define BRW_WINSYS_H
28
29 #include "pipe/p_compiler.h"
30
31 struct brw_winsys;
32 struct pipe_fence_handle;
33
34 /* This currently just wraps dri_bo:
35 */
36 struct brw_winsys_buffer {
37 struct brw_winsys_screen *sws;
38 void *bo;
39 unsigned offset;
40 unsigned size;
41 };
42
43 enum brw_buffer_usage {
44 I915_GEM_DOMAIN_RENDER,
45 I915_GEM_DOMAIN_SAMPLER,
46 I915_GEM_DOMAIN_VERTEX,
47 I915_GEM_DOMAIN_INSTRUCTION,
48
49
50 /* XXX: migrate from domains to explicit usage cases, eg below:
51 */
52
53 /* use on textures */
54 BRW_USAGE_RENDER = 0x01,
55 BRW_USAGE_SAMPLER = 0x02,
56 BRW_USAGE_2D_TARGET = 0x04,
57 BRW_USAGE_2D_SOURCE = 0x08,
58 /* use on vertex */
59 BRW_USAGE_VERTEX = 0x10,
60 };
61
62 enum brw_buffer_type
63 {
64 BRW_BUFFER_TYPE_TEXTURE,
65 BRW_BUFFER_TYPE_SCANOUT, /**< a texture used for scanning out from */
66 BRW_BUFFER_TYPE_VERTEX,
67 BRW_BUFFER_TYPE_CURBE,
68 BRW_BUFFER_TYPE_QUERY,
69 BRW_BUFFER_TYPE_SHADER_CONSTANTS,
70 BRW_BUFFER_TYPE_WM_SCRATCH,
71 BRW_BUFFER_TYPE_BATCH,
72 };
73
74
75 /* AKA winsys context:
76 */
77 struct brw_batchbuffer {
78
79 struct brw_winsys *iws;
80 struct brw_winsys_buffer *buf;
81
82 /**
83 * Values exported to speed up the writing the batchbuffer,
84 * instead of having to go trough a accesor function for
85 * each dword written.
86 */
87 /*{@*/
88 uint8_t *map;
89 uint8_t *ptr;
90 size_t size;
91 struct {
92 uint8_t *end_ptr;
93 } emit;
94
95
96 size_t relocs;
97 size_t max_relocs;
98 /*@}*/
99 };
100
101 struct brw_winsys_screen {
102
103 /**
104 * Batchbuffer functions.
105 */
106 /*@{*/
107 /**
108 * Create a new batchbuffer.
109 */
110 struct brw_batchbuffer *(*batchbuffer_create)(struct brw_winsys_screen *iws);
111
112 /**
113 * Emit a relocation to a buffer.
114 * Target position in batchbuffer is the same as ptr.
115 */
116 int (*batchbuffer_reloc)(struct brw_batchbuffer *batch,
117 unsigned offset,
118 struct brw_winsys_buffer *reloc,
119 unsigned pre_add,
120 enum brw_buffer_usage usage);
121
122 /**
123 * Flush a bufferbatch.
124 */
125 void (*batchbuffer_flush)(struct brw_batchbuffer *batch,
126 struct pipe_fence_handle **fence);
127
128 /**
129 * Destroy a batchbuffer.
130 */
131 void (*batchbuffer_destroy)(struct brw_batchbuffer *batch);
132 /*@}*/
133
134
135 /**
136 * Buffer functions.
137 */
138
139 /*@{*/
140 /**
141 * Create a buffer.
142 */
143 struct brw_winsys_buffer *(*bo_alloc)( struct brw_winsys_screen *sws,
144 enum brw_buffer_type type,
145 unsigned size,
146 unsigned alignment );
147
148 /* Reference and unreference buffers:
149 */
150 void (*bo_reference)( struct brw_winsys_buffer *buffer );
151 void (*bo_unreference)( struct brw_winsys_buffer *buffer );
152 void (*bo_emit_reloc)( struct brw_winsys_buffer *buffer,
153 unsigned domain,
154 unsigned a,
155 unsigned b,
156 unsigned offset,
157 struct brw_winsys_buffer *b2);
158
159 void (*bo_subdata)(struct brw_winsys_buffer *dst,
160 size_t offset,
161 size_t size,
162 const void *data);
163
164 /* XXX: couldn't this be handled by returning true/false on
165 * bo_emit_reloc?
166 */
167 boolean (*check_aperture_space)( struct brw_winsys_screen *iws,
168 struct brw_winsys_buffer **buffers,
169 unsigned count );
170
171 /**
172 * Map a buffer.
173 */
174 void *(*buffer_map)(struct brw_winsys *iws,
175 struct brw_winsys_buffer *buffer,
176 boolean write);
177
178 /**
179 * Unmap a buffer.
180 */
181 void (*buffer_unmap)(struct brw_winsys *iws,
182 struct brw_winsys_buffer *buffer);
183
184 void (*buffer_destroy)(struct brw_winsys *iws,
185 struct brw_winsys_buffer *buffer);
186 /*@}*/
187
188
189 /**
190 * Fence functions.
191 */
192 /*@{*/
193 /**
194 * Reference fence and set ptr to fence.
195 */
196 void (*fence_reference)(struct brw_winsys *iws,
197 struct pipe_fence_handle **ptr,
198 struct pipe_fence_handle *fence);
199
200 /**
201 * Check if a fence has finished.
202 */
203 int (*fence_signalled)(struct brw_winsys *iws,
204 struct pipe_fence_handle *fence);
205
206 /**
207 * Wait on a fence to finish.
208 */
209 int (*fence_finish)(struct brw_winsys *iws,
210 struct pipe_fence_handle *fence);
211 /*@}*/
212
213
214 /**
215 * Destroy the winsys.
216 */
217 void (*destroy)(struct brw_winsys *iws);
218 };
219
220
221 /**
222 * Create brw pipe_screen.
223 */
224 struct pipe_screen *brw_create_screen(struct brw_winsys *iws, unsigned pci_id);
225
226 /**
227 * Create a brw pipe_context.
228 */
229 struct pipe_context *brw_create_context(struct pipe_screen *screen);
230
231 /**
232 * Get the brw_winsys buffer backing the texture.
233 *
234 * TODO UGLY
235 */
236 struct pipe_texture;
237 boolean brw_get_texture_buffer_brw(struct pipe_texture *texture,
238 struct brw_winsys_buffer **buffer,
239 unsigned *stride);
240
241 /**
242 * Wrap a brw_winsys buffer with a texture blanket.
243 *
244 * TODO UGLY
245 */
246 struct pipe_texture * brw_texture_blanket(struct pipe_screen *screen,
247 struct pipe_texture *tmplt,
248 unsigned pitch,
249 struct brw_winsys_buffer *buffer);
250
251
252
253
254 #endif