1848b8605Smrg/**************************************************************************
2848b8605Smrg *
3848b8605Smrg * Copyright © 2009 Jakob Bornecrantz
4848b8605Smrg *
5848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
6848b8605Smrg * copy of this software and associated documentation files (the "Software"),
7848b8605Smrg * to deal in the Software without restriction, including without limitation
8848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the
10848b8605Smrg * Software is furnished to do so, subject to the following conditions:
11848b8605Smrg *
12848b8605Smrg * The above copyright notice and this permission notice (including the next
13848b8605Smrg * paragraph) shall be included in all copies or substantial portions of the
14848b8605Smrg * Software.
15848b8605Smrg *
16848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17848b8605Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20848b8605Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21848b8605Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22848b8605Smrg * DEALINGS IN THE SOFTWARE.
23848b8605Smrg *
24848b8605Smrg **************************************************************************/
25848b8605Smrg
26848b8605Smrg#ifndef I915_WINSYS_H
27848b8605Smrg#define I915_WINSYS_H
28848b8605Smrg
29848b8605Smrg#include "pipe/p_compiler.h"
30848b8605Smrg
31848b8605Smrgstruct i915_winsys;
32848b8605Smrgstruct i915_winsys_buffer;
33848b8605Smrgstruct i915_winsys_batchbuffer;
34848b8605Smrgstruct pipe_resource;
35848b8605Smrgstruct pipe_fence_handle;
36848b8605Smrgstruct winsys_handle;
37848b8605Smrg
38848b8605Smrgenum i915_winsys_buffer_usage
39848b8605Smrg{
40848b8605Smrg   /* use on textures */
41848b8605Smrg   I915_USAGE_RENDER    = 0x01,
42848b8605Smrg   I915_USAGE_SAMPLER   = 0x02,
43848b8605Smrg   I915_USAGE_2D_TARGET = 0x04,
44848b8605Smrg   I915_USAGE_2D_SOURCE = 0x08,
45848b8605Smrg   /* use on vertex */
46848b8605Smrg   I915_USAGE_VERTEX    = 0x10
47848b8605Smrg};
48848b8605Smrg
49848b8605Smrgenum i915_winsys_buffer_type
50848b8605Smrg{
51848b8605Smrg   I915_NEW_TEXTURE,
52848b8605Smrg   I915_NEW_SCANOUT, /**< a texture used for scanning out from */
53848b8605Smrg   I915_NEW_VERTEX
54848b8605Smrg};
55848b8605Smrg
56848b8605Smrg/* These need to be in sync with the definitions of libdrm-intel! */
57848b8605Smrgenum i915_winsys_buffer_tile
58848b8605Smrg{
59848b8605Smrg   I915_TILE_NONE,
60848b8605Smrg   I915_TILE_X,
61848b8605Smrg   I915_TILE_Y
62848b8605Smrg};
63848b8605Smrg
64848b8605Smrgenum i915_winsys_flush_flags
65848b8605Smrg{
66848b8605Smrg   I915_FLUSH_ASYNC = 0,
67848b8605Smrg   I915_FLUSH_END_OF_FRAME = 1
68848b8605Smrg};
69848b8605Smrg
70848b8605Smrgstruct i915_winsys_batchbuffer {
71848b8605Smrg
72848b8605Smrg   struct i915_winsys *iws;
73848b8605Smrg
74848b8605Smrg   /**
75848b8605Smrg    * Values exported to speed up the writing the batchbuffer,
76848b8605Smrg    * instead of having to go trough a accesor function for
77848b8605Smrg    * each dword written.
78848b8605Smrg    */
79848b8605Smrg   /*{@*/
80848b8605Smrg   uint8_t *map;
81848b8605Smrg   uint8_t *ptr;
82848b8605Smrg   size_t size;
83848b8605Smrg
84848b8605Smrg   size_t relocs;
85848b8605Smrg   /*@}*/
86848b8605Smrg};
87848b8605Smrg
88848b8605Smrgstruct i915_winsys {
89848b8605Smrg
90848b8605Smrg   unsigned pci_id; /**< PCI ID for the device */
91848b8605Smrg
92848b8605Smrg   /**
93848b8605Smrg    * Batchbuffer functions.
94848b8605Smrg    */
95848b8605Smrg   /*@{*/
96848b8605Smrg   /**
97848b8605Smrg    * Create a new batchbuffer.
98848b8605Smrg    */
99848b8605Smrg   struct i915_winsys_batchbuffer *
100848b8605Smrg      (*batchbuffer_create)(struct i915_winsys *iws);
101848b8605Smrg
102848b8605Smrg   /**
103848b8605Smrg    * Validate buffers for usage in this batchbuffer.
104848b8605Smrg    * Does space-checking and asorted other book-keeping.
105848b8605Smrg    *
106848b8605Smrg    * @batch
107848b8605Smrg    * @buffers array to buffers to validate
108848b8605Smrg    * @num_of_buffers size of the passed array
109848b8605Smrg    */
110848b8605Smrg   boolean (*validate_buffers)(struct i915_winsys_batchbuffer *batch,
111848b8605Smrg			       struct i915_winsys_buffer **buffers,
112848b8605Smrg			       int num_of_buffers);
113848b8605Smrg
114848b8605Smrg   /**
115848b8605Smrg    * Emit a relocation to a buffer.
116848b8605Smrg    * Target position in batchbuffer is the same as ptr.
117848b8605Smrg    *
118848b8605Smrg    * @batch
119848b8605Smrg    * @reloc buffer address to be inserted into target.
120848b8605Smrg    * @usage how is the hardware going to use the buffer.
121848b8605Smrg    * @offset add this to the reloc buffers address
122848b8605Smrg    * @target buffer where to write the address, null for batchbuffer.
123848b8605Smrg    * @fenced relocation needs a fence.
124848b8605Smrg    */
125848b8605Smrg   int (*batchbuffer_reloc)(struct i915_winsys_batchbuffer *batch,
126848b8605Smrg                            struct i915_winsys_buffer *reloc,
127848b8605Smrg                            enum i915_winsys_buffer_usage usage,
128848b8605Smrg                            unsigned offset, boolean fenced);
129848b8605Smrg
130848b8605Smrg   /**
131848b8605Smrg    * Flush a bufferbatch.
132848b8605Smrg    */
133848b8605Smrg   void (*batchbuffer_flush)(struct i915_winsys_batchbuffer *batch,
134848b8605Smrg                             struct pipe_fence_handle **fence,
135848b8605Smrg                             enum i915_winsys_flush_flags flags);
136848b8605Smrg
137848b8605Smrg   /**
138848b8605Smrg    * Destroy a batchbuffer.
139848b8605Smrg    */
140848b8605Smrg   void (*batchbuffer_destroy)(struct i915_winsys_batchbuffer *batch);
141848b8605Smrg   /*@}*/
142848b8605Smrg
143848b8605Smrg
144848b8605Smrg   /**
145848b8605Smrg    * Buffer functions.
146848b8605Smrg    */
147848b8605Smrg   /*@{*/
148848b8605Smrg   /**
149848b8605Smrg    * Create a buffer.
150848b8605Smrg    */
151848b8605Smrg   struct i915_winsys_buffer *
152848b8605Smrg      (*buffer_create)(struct i915_winsys *iws,
153848b8605Smrg                       unsigned size,
154848b8605Smrg                       enum i915_winsys_buffer_type type);
155848b8605Smrg
156848b8605Smrg   /**
157848b8605Smrg    * Create a tiled buffer.
158848b8605Smrg    *
159848b8605Smrg    * *stride, height are in bytes. The winsys tries to allocate the buffer with
160848b8605Smrg    * the tiling mode provide in *tiling. If tiling is no possible, *tiling will
161848b8605Smrg    * be set to I915_TILE_NONE. The calculated stride (incorporateing hw/kernel
162848b8605Smrg    * requirements) is always returned in *stride.
163848b8605Smrg    */
164848b8605Smrg   struct i915_winsys_buffer *
165848b8605Smrg      (*buffer_create_tiled)(struct i915_winsys *iws,
166848b8605Smrg                             unsigned *stride, unsigned height,
167848b8605Smrg                             enum i915_winsys_buffer_tile *tiling,
168848b8605Smrg                             enum i915_winsys_buffer_type type);
169848b8605Smrg
170848b8605Smrg   /**
171848b8605Smrg    * Creates a buffer from a handle.
172848b8605Smrg    * Used to implement pipe_screen::resource_from_handle.
173848b8605Smrg    * Also provides the stride information needed for the
174848b8605Smrg    * texture via the stride argument.
175848b8605Smrg    */
176848b8605Smrg   struct i915_winsys_buffer *
177848b8605Smrg      (*buffer_from_handle)(struct i915_winsys *iws,
178848b8605Smrg                            struct winsys_handle *whandle,
179b8e80941Smrg                            unsigned height,
180848b8605Smrg                            enum i915_winsys_buffer_tile *tiling,
181848b8605Smrg                            unsigned *stride);
182848b8605Smrg
183848b8605Smrg   /**
184848b8605Smrg    * Used to implement pipe_screen::resource_get_handle.
185848b8605Smrg    * The winsys might need the stride information.
186848b8605Smrg    */
187848b8605Smrg   boolean (*buffer_get_handle)(struct i915_winsys *iws,
188848b8605Smrg                                struct i915_winsys_buffer *buffer,
189848b8605Smrg                                struct winsys_handle *whandle,
190848b8605Smrg                                unsigned stride);
191848b8605Smrg
192848b8605Smrg   /**
193848b8605Smrg    * Map a buffer.
194848b8605Smrg    */
195848b8605Smrg   void *(*buffer_map)(struct i915_winsys *iws,
196848b8605Smrg                       struct i915_winsys_buffer *buffer,
197848b8605Smrg                       boolean write);
198848b8605Smrg
199848b8605Smrg   /**
200848b8605Smrg    * Unmap a buffer.
201848b8605Smrg    */
202848b8605Smrg   void (*buffer_unmap)(struct i915_winsys *iws,
203848b8605Smrg                        struct i915_winsys_buffer *buffer);
204848b8605Smrg
205848b8605Smrg   /**
206848b8605Smrg    * Write to a buffer.
207848b8605Smrg    *
208848b8605Smrg    * Arguments follows pipe_buffer_write.
209848b8605Smrg    */
210848b8605Smrg   int (*buffer_write)(struct i915_winsys *iws,
211848b8605Smrg                       struct i915_winsys_buffer *dst,
212848b8605Smrg                       size_t offset,
213848b8605Smrg                       size_t size,
214848b8605Smrg                       const void *data);
215848b8605Smrg
216848b8605Smrg   void (*buffer_destroy)(struct i915_winsys *iws,
217848b8605Smrg                          struct i915_winsys_buffer *buffer);
218848b8605Smrg
219848b8605Smrg   /**
220848b8605Smrg    * Check if a buffer is busy.
221848b8605Smrg    */
222848b8605Smrg   boolean (*buffer_is_busy)(struct i915_winsys *iws,
223848b8605Smrg                             struct i915_winsys_buffer *buffer);
224848b8605Smrg   /*@}*/
225848b8605Smrg
226848b8605Smrg
227848b8605Smrg   /**
228848b8605Smrg    * Fence functions.
229848b8605Smrg    */
230848b8605Smrg   /*@{*/
231848b8605Smrg   /**
232848b8605Smrg    * Reference fence and set ptr to fence.
233848b8605Smrg    */
234848b8605Smrg   void (*fence_reference)(struct i915_winsys *iws,
235848b8605Smrg                           struct pipe_fence_handle **ptr,
236848b8605Smrg                           struct pipe_fence_handle *fence);
237848b8605Smrg
238848b8605Smrg   /**
239848b8605Smrg    * Check if a fence has finished.
240848b8605Smrg    */
241848b8605Smrg   int (*fence_signalled)(struct i915_winsys *iws,
242848b8605Smrg                          struct pipe_fence_handle *fence);
243848b8605Smrg
244848b8605Smrg   /**
245848b8605Smrg    * Wait on a fence to finish.
246848b8605Smrg    */
247848b8605Smrg   int (*fence_finish)(struct i915_winsys *iws,
248848b8605Smrg                       struct pipe_fence_handle *fence);
249848b8605Smrg   /*@}*/
250848b8605Smrg
251848b8605Smrg   /**
252848b8605Smrg    * Retrieve the aperture size (in MiB) of the device.
253848b8605Smrg    */
254848b8605Smrg   int (*aperture_size)(struct i915_winsys *iws);
255848b8605Smrg
256848b8605Smrg
257848b8605Smrg   /**
258848b8605Smrg    * Destroy the winsys.
259848b8605Smrg    */
260848b8605Smrg   void (*destroy)(struct i915_winsys *iws);
261848b8605Smrg};
262848b8605Smrg
263848b8605Smrg#endif
264