Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / gallium / winsys / radeon / drm / radeon_winsys.h
1 /*
2  * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
3  * Copyright 2010 Marek Olšák <maraeo@gmail.com>
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  * on the rights to use, copy, modify, merge, publish, distribute, sub
9  * license, and/or sell copies of the Software, and to permit persons to whom
10  * the 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 NON-INFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
20  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22  * USE OR OTHER DEALINGS IN THE SOFTWARE. */
23
24 #ifndef RADEON_WINSYS_H
25 #define RADEON_WINSYS_H
26
27 /* The public winsys interface header for the radeon driver. */
28
29 #include "pipebuffer/pb_bufmgr.h"
30 #include "pipe/p_defines.h"
31 #include "pipe/p_state.h"
32
33 #define RADEON_MAX_CMDBUF_DWORDS (16 * 1024)
34 #define RADEON_FLUSH_ASYNC       (1 << 0)
35
36 /* Tiling flags. */
37 enum radeon_bo_layout {
38     RADEON_LAYOUT_LINEAR = 0,
39     RADEON_LAYOUT_TILED,
40     RADEON_LAYOUT_SQUARETILED,
41
42     RADEON_LAYOUT_UNKNOWN
43 };
44
45 enum radeon_bo_domain { /* bitfield */
46     RADEON_DOMAIN_GTT  = 2,
47     RADEON_DOMAIN_VRAM = 4
48 };
49
50 struct winsys_handle;
51 struct radeon_winsys_cs_handle;   /* for write_reloc etc. */
52
53 struct radeon_winsys_cs {
54     unsigned cdw;  /* Number of used dwords. */
55     uint32_t *buf; /* The command buffer. */
56 };
57
58 enum radeon_value_id {
59     RADEON_VID_PCI_ID,
60     RADEON_VID_R300_GB_PIPES,
61     RADEON_VID_R300_Z_PIPES,
62     RADEON_VID_GART_SIZE,
63     RADEON_VID_VRAM_SIZE,
64     RADEON_VID_DRM_MAJOR,
65     RADEON_VID_DRM_MINOR,
66     RADEON_VID_DRM_PATCHLEVEL,
67
68     /* These should probably go away: */
69
70     /* R300 features:
71      * - Hyper-Z
72      * - GB_Z_PEQ_CONFIG on rv350->r4xx
73      * - R500 FG_ALPHA_VALUE
74      *
75      * R600 features:
76      * - TBD
77      */
78     RADEON_VID_DRM_2_6_0,
79
80     /* R300 features:
81      * - R500 US_FORMAT regs
82      * - R500 ARGB2101010 colorbuffer
83      * - CMask and AA regs
84      * - R16F/RG16F
85      *
86      * R600 features:
87      * - TBD
88      */
89     RADEON_VID_DRM_2_8_0,
90 };
91
92 enum radeon_feature_id {
93     RADEON_FID_HYPERZ_RAM_ACCESS,     /* ZMask + HiZ */
94     RADEON_FID_CMASK_RAM_ACCESS,
95 };
96
97 struct radeon_winsys {
98     /**
99      * Destroy this winsys.
100      *
101      * \param ws        The winsys this function is called from.
102      */
103     void (*destroy)(struct radeon_winsys *ws);
104
105     /**
106      * Query a system value from a winsys.
107      *
108      * \param ws        The winsys this function is called from.
109      * \param vid       One of the RADEON_VID_* enums.
110      */
111     uint32_t (*get_value)(struct radeon_winsys *ws,
112                           enum radeon_value_id vid);
113
114     /**************************************************************************
115      * Buffer management. Buffer attributes are mostly fixed over its lifetime.
116      *
117      * Remember that gallium gets to choose the interface it needs, and the
118      * window systems must then implement that interface (rather than the
119      * other way around...).
120      *************************************************************************/
121
122     /**
123      * Create a buffer object.
124      *
125      * \param ws        The winsys this function is called from.
126      * \param size      The size to allocate.
127      * \param alignment An alignment of the buffer in memory.
128      * \param bind      A bitmask of the PIPE_BIND_* flags.
129      * \param usage     A bitmask of the PIPE_USAGE_* flags.
130      * \param domain    A bitmask of the RADEON_DOMAIN_* flags.
131      * \return          The created buffer object.
132      */
133     struct pb_buffer *(*buffer_create)(struct radeon_winsys *ws,
134                                        unsigned size,
135                                        unsigned alignment,
136                                        unsigned bind,
137                                        unsigned usage,
138                                        enum radeon_bo_domain domain);
139
140     struct radeon_winsys_cs_handle *(*buffer_get_cs_handle)(
141             struct pb_buffer *buf);
142
143     /**
144      * Map the entire data store of a buffer object into the client's address
145      * space.
146      *
147      * \param buf       A winsys buffer object to map.
148      * \param cs        A command stream to flush if the buffer is referenced by it.
149      * \param usage     A bitmask of the PIPE_TRANSFER_* flags.
150      * \return          The pointer at the beginning of the buffer.
151      */
152     void *(*buffer_map)(struct pb_buffer *buf,
153                         struct radeon_winsys_cs *cs,
154                         enum pipe_transfer_usage usage);
155
156     /**
157      * Unmap a buffer object from the client's address space.
158      *
159      * \param buf       A winsys buffer object to unmap.
160      */
161     void (*buffer_unmap)(struct pb_buffer *buf);
162
163     /**
164      * Return TRUE if a buffer object is being used by the GPU.
165      *
166      * \param buf       A winsys buffer object.
167      */
168     boolean (*buffer_is_busy)(struct pb_buffer *buf);
169
170     /**
171      * Wait for a buffer object until it is not used by a GPU. This is
172      * equivalent to a fence placed after the last command using the buffer,
173      * and synchronizing to the fence.
174      *
175      * \param buf       A winsys buffer object to wait for.
176      */
177     void (*buffer_wait)(struct pb_buffer *buf);
178
179     /**
180      * Return tiling flags describing a memory layout of a buffer object.
181      *
182      * \param buf       A winsys buffer object to get the flags from.
183      * \param macrotile A pointer to the return value of the microtile flag.
184      * \param microtile A pointer to the return value of the macrotile flag.
185      *
186      * \note microtile and macrotile are not bitmasks!
187      */
188     void (*buffer_get_tiling)(struct pb_buffer *buf,
189                               enum radeon_bo_layout *microtile,
190                               enum radeon_bo_layout *macrotile);
191
192     /**
193      * Set tiling flags describing a memory layout of a buffer object.
194      *
195      * \param buf       A winsys buffer object to set the flags for.
196      * \param cs        A command stream to flush if the buffer is referenced by it.
197      * \param macrotile A macrotile flag.
198      * \param microtile A microtile flag.
199      * \param stride    A stride of the buffer in bytes, for texturing.
200      *
201      * \note microtile and macrotile are not bitmasks!
202      */
203     void (*buffer_set_tiling)(struct pb_buffer *buf,
204                               struct radeon_winsys_cs *cs,
205                               enum radeon_bo_layout microtile,
206                               enum radeon_bo_layout macrotile,
207                               unsigned stride);
208
209     /**
210      * Get a winsys buffer from a winsys handle. The internal structure
211      * of the handle is platform-specific and only a winsys should access it.
212      *
213      * \param ws        The winsys this function is called from.
214      * \param whandle   A winsys handle pointer as was received from a state
215      *                  tracker.
216      * \param stride    The returned buffer stride in bytes.
217      * \param size      The returned buffer size.
218      */
219     struct pb_buffer *(*buffer_from_handle)(struct radeon_winsys *ws,
220                                             struct winsys_handle *whandle,
221                                             unsigned *stride,
222                                             unsigned *size);
223
224     /**
225      * Get a winsys handle from a winsys buffer. The internal structure
226      * of the handle is platform-specific and only a winsys should access it.
227      *
228      * \param buf       A winsys buffer object to get the handle from.
229      * \param whandle   A winsys handle pointer.
230      * \param stride    A stride of the buffer in bytes, for texturing.
231      * \return          TRUE on success.
232      */
233     boolean (*buffer_get_handle)(struct pb_buffer *buf,
234                                  unsigned stride,
235                                  struct winsys_handle *whandle);
236
237     /**************************************************************************
238      * Command submission.
239      *
240      * Each pipe context should create its own command stream and submit
241      * commands independently of other contexts.
242      *************************************************************************/
243
244     /**
245      * Create a command stream.
246      *
247      * \param ws        The winsys this function is called from.
248      */
249     struct radeon_winsys_cs *(*cs_create)(struct radeon_winsys *ws);
250
251     /**
252      * Destroy a command stream.
253      *
254      * \param cs        A command stream to destroy.
255      */
256     void (*cs_destroy)(struct radeon_winsys_cs *cs);
257
258     /**
259      * Add a new buffer relocation. Every relocation must first be added
260      * before it can be written.
261      *
262      * \param cs  A command stream to add buffer for validation against.
263      * \param buf A winsys buffer to validate.
264      * \param rd  A read domain containing a bitmask of the RADEON_DOMAIN_* flags.
265      * \param wd  A write domain containing a bitmask of the RADEON_DOMAIN_* flags.
266      */
267     void (*cs_add_reloc)(struct radeon_winsys_cs *cs,
268                          struct radeon_winsys_cs_handle *buf,
269                          enum radeon_bo_domain rd,
270                          enum radeon_bo_domain wd);
271
272     /**
273      * Return TRUE if there is enough memory in VRAM and GTT for the relocs
274      * added so far. If the validation fails, all the relocations which have
275      * been added since the last call of cs_validate will be removed and
276      * the CS will be flushed (provided there are still any relocations).
277      *
278      * \param cs        A command stream to validate.
279      */
280     boolean (*cs_validate)(struct radeon_winsys_cs *cs);
281
282     /**
283      * Write a relocated dword to a command buffer.
284      *
285      * \param cs        A command stream the relocation is written to.
286      * \param buf       A winsys buffer to write the relocation for.
287      * \param rd        A read domain containing a bitmask of the RADEON_DOMAIN_* flags.
288      * \param wd        A write domain containing a bitmask of the RADEON_DOMAIN_* flags.
289      */
290     void (*cs_write_reloc)(struct radeon_winsys_cs *cs,
291                            struct radeon_winsys_cs_handle *buf);
292
293     /**
294      * Flush a command stream.
295      *
296      * \param cs        A command stream to flush.
297      * \param flags,    RADEON_FLUSH_ASYNC or 0.
298      */
299     void (*cs_flush)(struct radeon_winsys_cs *cs, unsigned flags);
300
301     /**
302      * Set a flush callback which is called from winsys when flush is
303      * required.
304      *
305      * \param cs        A command stream to set the callback for.
306      * \param flush     A flush callback function associated with the command stream.
307      * \param user      A user pointer that will be passed to the flush callback.
308      */
309     void (*cs_set_flush)(struct radeon_winsys_cs *cs,
310                          void (*flush)(void *ctx, unsigned flags),
311                          void *user);
312
313     /**
314      * Return TRUE if a buffer is referenced by a command stream.
315      *
316      * \param cs        A command stream.
317      * \param buf       A winsys buffer.
318      */
319     boolean (*cs_is_buffer_referenced)(struct radeon_winsys_cs *cs,
320                                        struct radeon_winsys_cs_handle *buf);
321
322     /**
323      * Request access to a feature for a command stream.
324      *
325      * \param cs        A command stream.
326      * \param fid       A winsys buffer.
327      */
328     boolean (*cs_request_feature)(struct radeon_winsys_cs *cs,
329                                   enum radeon_feature_id fid,
330                                   boolean enable);
331 };
332
333 #endif