Tizen 2.0 Release
[profile/ivi/osmesa.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 #include "pipe/p_defines.h"
31 #include "util/u_inlines.h"
32
33 struct brw_winsys;
34 struct pipe_fence_handle;
35
36 /* Not sure why the winsys needs this:
37  */
38 #define BRW_BATCH_SIZE (32*1024)
39
40 struct brw_winsys_screen;
41
42 /* Need a tiny bit of information inside the abstract buffer struct:
43  */
44 struct brw_winsys_buffer {
45    struct pipe_reference reference;
46    struct brw_winsys_screen *sws;
47    unsigned size;
48 };
49
50
51 /* Should be possible to validate usages above against buffer creation
52  * types, below:
53  */
54 enum brw_buffer_type
55 {
56    BRW_BUFFER_TYPE_TEXTURE,
57    BRW_BUFFER_TYPE_SCANOUT,          /**< a texture used for scanning out from */
58    BRW_BUFFER_TYPE_VERTEX,
59    BRW_BUFFER_TYPE_CURBE,
60    BRW_BUFFER_TYPE_QUERY,
61    BRW_BUFFER_TYPE_SHADER_CONSTANTS,
62    BRW_BUFFER_TYPE_SHADER_SCRATCH,
63    BRW_BUFFER_TYPE_BATCH,
64    BRW_BUFFER_TYPE_GENERAL_STATE,
65    BRW_BUFFER_TYPE_SURFACE_STATE,
66    BRW_BUFFER_TYPE_PIXEL,            /* image uploads, pbo's, etc */
67    BRW_BUFFER_TYPE_GENERIC,          /* unknown */
68    BRW_BUFFER_TYPE_MAX               /* Count of possible values */
69 };
70
71
72 /* Describe the usage of a particular buffer in a relocation.  The DRM
73  * winsys will translate these back to GEM read/write domain flags.
74  */
75 enum brw_buffer_usage {
76    BRW_USAGE_STATE,         /* INSTRUCTION, 0 */
77    BRW_USAGE_QUERY_RESULT,  /* INSTRUCTION, INSTRUCTION */
78    BRW_USAGE_RENDER_TARGET, /* RENDER,      0 */
79    BRW_USAGE_DEPTH_BUFFER,  /* RENDER,      RENDER */
80    BRW_USAGE_BLIT_SOURCE,   /* RENDER,      0 */
81    BRW_USAGE_BLIT_DEST,     /* RENDER,      RENDER */
82    BRW_USAGE_SAMPLER,       /* SAMPLER,     0 */
83    BRW_USAGE_VERTEX,        /* VERTEX,      0 */
84    BRW_USAGE_SCRATCH,       /* 0,           0 */
85    BRW_USAGE_MAX
86 };
87
88 enum brw_buffer_data_type {
89    BRW_DATA_GS_CC_VP,
90    BRW_DATA_GS_CC_UNIT,
91    BRW_DATA_GS_WM_PROG,
92    BRW_DATA_GS_SAMPLER_DEFAULT_COLOR,
93    BRW_DATA_GS_SAMPLER,
94    BRW_DATA_GS_WM_UNIT,
95    BRW_DATA_GS_SF_PROG,
96    BRW_DATA_GS_SF_VP,
97    BRW_DATA_GS_SF_UNIT,
98    BRW_DATA_GS_VS_UNIT,
99    BRW_DATA_GS_VS_PROG,
100    BRW_DATA_GS_GS_UNIT,
101    BRW_DATA_GS_GS_PROG,
102    BRW_DATA_GS_CLIP_VP,
103    BRW_DATA_GS_CLIP_UNIT,
104    BRW_DATA_GS_CLIP_PROG,
105    BRW_DATA_SS_SURFACE,
106    BRW_DATA_SS_SURF_BIND,
107    BRW_DATA_CONSTANT_BUFFER,
108    BRW_DATA_BATCH_BUFFER,
109    BRW_DATA_OTHER,
110    BRW_DATA_MAX
111 };
112
113
114 /* Matches the i915_drm definitions:
115  */
116 #define BRW_TILING_NONE  0
117 #define BRW_TILING_X     1
118 #define BRW_TILING_Y     2
119
120
121 /* Relocations to be applied with subdata in a call to sws->bo_subdata, below.
122  *
123  * Effectively this encodes:
124  *
125  *    (unsigned *)(subdata + offset) = bo->offset + delta
126  */
127 struct brw_winsys_reloc {
128    enum brw_buffer_usage usage; /* debug only */
129    unsigned delta;
130    unsigned offset;
131    struct brw_winsys_buffer *bo;
132 };
133
134 static INLINE void make_reloc(struct brw_winsys_reloc *reloc,
135                               enum brw_buffer_usage usage,
136                               unsigned delta,
137                               unsigned offset,
138                               struct brw_winsys_buffer *bo)
139 {
140    reloc->usage = usage;
141    reloc->delta = delta;
142    reloc->offset = offset;
143    reloc->bo = bo;              /* Note - note taking a reference yet */
144 }
145
146
147
148 struct brw_winsys_screen {
149
150    unsigned pci_id;
151    int gen;
152    /**
153     * Buffer functions.
154     */
155
156    /*@{*/
157    /**
158     * Create a buffer.
159     */
160    enum pipe_error (*bo_alloc)(struct brw_winsys_screen *sws,
161                                enum brw_buffer_type type,
162                                unsigned size,
163                                unsigned alignment,
164                                struct brw_winsys_buffer **bo_out);
165
166    enum pipe_error (*bo_from_handle)(struct brw_winsys_screen *sws,
167                                      struct winsys_handle *whandle,
168                                      unsigned *stride,
169                                      unsigned *tiling,
170                                      struct brw_winsys_buffer **bo_out);
171
172    enum pipe_error (*bo_get_handle)(struct brw_winsys_buffer *buffer,
173                                     struct winsys_handle *whandle,
174                                     unsigned stride);
175
176    /* Destroy a buffer when our refcount goes to zero:
177     */
178    void (*bo_destroy)(struct brw_winsys_buffer *buffer);
179
180    /* delta -- added to b2->offset, and written into buffer
181     * offset -- location above value is written to within buffer
182     */
183    enum pipe_error (*bo_emit_reloc)(struct brw_winsys_buffer *buffer,
184                                     enum brw_buffer_usage usage,
185                                     unsigned delta,
186                                     unsigned offset,
187                                     struct brw_winsys_buffer *b2);
188
189    enum pipe_error (*bo_exec)(struct brw_winsys_buffer *buffer,
190                               unsigned bytes_used);
191
192    enum pipe_error (*bo_subdata)(struct brw_winsys_buffer *buffer,
193                                  enum brw_buffer_data_type data_type,
194                                  size_t offset,
195                                  size_t size,
196                                  const void *data,
197                                  const struct brw_winsys_reloc *reloc,
198                                  unsigned nr_reloc );
199
200    boolean (*bo_is_busy)(struct brw_winsys_buffer *buffer);
201    boolean (*bo_references)(struct brw_winsys_buffer *a,
202                             struct brw_winsys_buffer *b);
203
204    /* XXX: couldn't this be handled by returning true/false on
205     * bo_emit_reloc?
206     */
207    enum pipe_error (*check_aperture_space)(struct brw_winsys_screen *iws,
208                                            struct brw_winsys_buffer **buffers,
209                                            unsigned count);
210
211    /**
212     * Map a buffer.
213     */
214    void *(*bo_map)(struct brw_winsys_buffer *buffer,
215                    enum brw_buffer_data_type data_type,
216                    unsigned offset,
217                    unsigned length,
218                    boolean write,
219                    boolean discard,
220                    boolean flush_explicit);
221
222    void (*bo_flush_range)(struct brw_winsys_buffer *buffer,
223                           unsigned offset,
224                           unsigned length);
225
226    /**
227     * Unmap a buffer.
228     */
229    void (*bo_unmap)(struct brw_winsys_buffer *buffer);
230    /*@}*/
231
232    
233    /* Wait for buffer to go idle.  Similar to map+unmap, but doesn't
234     * mark buffer contents as dirty.
235     */
236    void (*bo_wait_idle)(struct brw_winsys_buffer *buffer);
237    
238    /**
239     * Destroy the winsys.
240     */
241    void (*destroy)(struct brw_winsys_screen *iws);
242 };
243
244 static INLINE void *
245 bo_map_read(struct brw_winsys_screen *sws, struct brw_winsys_buffer *buf)
246 {
247    return sws->bo_map( buf,
248                        BRW_DATA_OTHER,
249                        0, buf->size,
250                        FALSE, FALSE, FALSE );
251 }
252
253 static INLINE void
254 bo_reference(struct brw_winsys_buffer **ptr, struct brw_winsys_buffer *buf)
255 {
256    struct brw_winsys_buffer *old_buf = *ptr;
257
258    if (pipe_reference(&(*ptr)->reference, &buf->reference))
259       old_buf->sws->bo_destroy(old_buf);
260
261    *ptr = buf;
262 }
263
264
265
266 /*************************************************************************
267  * Cooperative dumping between winsys and driver.  TODO: make this
268  * driver-only by wrapping calls to winsys->bo_subdata().
269  */
270
271 #ifdef DEBUG
272 extern int BRW_DUMP;
273 #else
274 #define BRW_DUMP 0
275 #endif 
276
277 #define DUMP_ASM                0x1
278 #define DUMP_STATE              0x2
279 #define DUMP_BATCH              0x4
280
281 void brw_dump_data( unsigned pci_id,
282                     enum brw_buffer_data_type data_type,
283                     unsigned offset,
284                     const void *data,
285                     size_t size, int gen );
286
287
288 #endif