Tizen 2.0 Release
[framework/graphics/cairo.git] / src / drm / cairo-drm-private.h
1 /* Cairo - a vector graphics library with display and print output
2  *
3  * Copyright © 2009 Chris Wilson
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it either under the terms of the GNU Lesser General Public
7  * License version 2.1 as published by the Free Software Foundation
8  * (the "LGPL") or, at your option, under the terms of the Mozilla
9  * Public License Version 1.1 (the "MPL"). If you do not alter this
10  * notice, a recipient may use your version of this file under either
11  * the MPL or the LGPL.
12  *
13  * You should have received a copy of the LGPL along with this library
14  * in the file COPYING-LGPL-2.1; if not, write to the Free Software
15  * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
16  * You should have received a copy of the MPL along with this library
17  * in the file COPYING-MPL-1.1
18  *
19  * The contents of this file are subject to the Mozilla Public License
20  * Version 1.1 (the "License"); you may not use this file except in
21  * compliance with the License. You may obtain a copy of the License at
22  * http://www.mozilla.org/MPL/
23  *
24  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
25  * OF ANY KIND, either express or implied. See the LGPL or the MPL for
26  * the specific language governing rights and limitations.
27  *
28  * The Original Code is the cairo graphics library.
29  *
30  * The Initial Developer of the Original Code is Chris Wilson.
31  *
32  * Contributors(s):
33  *      Chris Wilson <chris@chris-wilson.co.uk>
34  */
35
36 #ifndef CAIRO_DRM_PRIVATE_H
37 #define CAIRO_DRM_PRIVATE_H
38
39 #include "cairo-drm.h"
40
41 #include "cairo-device-private.h"
42 #include "cairo-reference-count-private.h"
43 #include "cairo-surface-private.h"
44
45 #include <sys/types.h> /* dev_t */
46
47 typedef struct _cairo_drm_device cairo_drm_device_t;
48
49 typedef cairo_drm_device_t *
50 (*cairo_drm_device_create_func_t) (int fd,
51                                    dev_t dev,
52                                    int vendor_id,
53                                    int chip_id);
54
55 typedef cairo_int_status_t
56 (*cairo_drm_device_flush_func_t) (cairo_drm_device_t *device);
57
58 typedef cairo_int_status_t
59 (*cairo_drm_device_throttle_func_t) (cairo_drm_device_t *device);
60
61 typedef void
62 (*cairo_drm_device_destroy_func_t) (void *data);
63
64 typedef cairo_surface_t *
65 (*cairo_drm_surface_create_func_t) (cairo_drm_device_t *device,
66                                     cairo_format_t format,
67                                     int width, int height);
68
69 typedef cairo_surface_t *
70 (*cairo_drm_surface_create_for_name_func_t) (cairo_drm_device_t *device,
71                                              unsigned int name,
72                                              cairo_format_t format,
73                                              int width, int height, int stride);
74
75 typedef cairo_surface_t *
76 (*cairo_drm_surface_create_from_cacheable_image_func_t)
77     (cairo_drm_device_t *device, cairo_surface_t *image);
78
79 typedef cairo_int_status_t
80 (*cairo_drm_surface_flink_func_t) (void *surface);
81
82 typedef cairo_status_t
83 (*cairo_drm_surface_enable_scan_out_func_t) (void *surface);
84
85 typedef cairo_surface_t *
86 (*cairo_drm_surface_map_to_image_func_t) (void *surface);
87
88 typedef struct _cairo_drm_bo_backend {
89     void (*release) (void *device, void *bo);
90 } cairo_drm_bo_backend_t;
91
92 typedef struct _cairo_drm_device_backend {
93     cairo_drm_device_flush_func_t flush;
94     cairo_drm_device_throttle_func_t throttle;
95     cairo_drm_device_destroy_func_t destroy;
96 } cairo_drm_device_backend_t;
97
98 typedef struct _cairo_drm_surface_backend {
99     cairo_drm_surface_create_func_t create;
100     cairo_drm_surface_create_for_name_func_t create_for_name;
101     cairo_drm_surface_create_from_cacheable_image_func_t create_from_cacheable_image;
102     cairo_drm_surface_flink_func_t flink;
103     cairo_drm_surface_enable_scan_out_func_t enable_scan_out;
104     cairo_drm_surface_map_to_image_func_t map_to_image;
105 } cairo_drm_surface_backend_t;
106
107 typedef struct _cairo_drm_bo {
108     cairo_reference_count_t ref_count;
109     uint32_t name;
110     uint32_t handle;
111     uint32_t size;
112 } cairo_drm_bo_t;
113
114 struct _cairo_drm_device {
115     cairo_device_t base;
116
117     int vendor_id;
118     int chip_id;
119     dev_t id;
120     int fd;
121
122     int max_surface_size;
123
124     cairo_drm_bo_backend_t bo;
125     cairo_drm_surface_backend_t surface;
126     cairo_drm_device_backend_t device;
127
128     cairo_drm_device_t *next, *prev;
129 };
130
131 typedef struct _cairo_drm_surface {
132     cairo_surface_t base;
133
134     cairo_drm_bo_t *bo;
135
136     cairo_format_t format;
137     int width, height, stride;
138
139     cairo_surface_t *fallback;
140     uint32_t map_count;
141 } cairo_drm_surface_t;
142
143 static inline cairo_drm_bo_t *
144 cairo_drm_bo_reference (cairo_drm_bo_t *bo)
145 {
146     _cairo_reference_count_inc (&bo->ref_count);
147     return bo;
148 }
149
150 static cairo_always_inline void
151 cairo_drm_bo_destroy (cairo_device_t *abstract_device,
152                       cairo_drm_bo_t *bo)
153 {
154     if (_cairo_reference_count_dec_and_test (&bo->ref_count)) {
155         cairo_drm_device_t *device = (cairo_drm_device_t *) abstract_device;
156         device->bo.release (device, bo);
157     }
158 }
159
160 cairo_private cairo_status_t
161 _cairo_drm_bo_open_for_name (const cairo_drm_device_t *dev,
162                              cairo_drm_bo_t *bo,
163                              uint32_t name);
164
165 cairo_private cairo_status_t
166 _cairo_drm_bo_flink (const cairo_drm_device_t *dev,
167                      cairo_drm_bo_t *bo);
168
169 cairo_private void
170 _cairo_drm_bo_close (const cairo_drm_device_t *dev,
171                      cairo_drm_bo_t *bo);
172
173 cairo_private void
174 _cairo_drm_surface_init (cairo_drm_surface_t *surface,
175                          cairo_format_t format,
176                          int width, int height);
177
178 cairo_private cairo_status_t
179 _cairo_drm_surface_finish (cairo_drm_surface_t *surface);
180
181 cairo_private void
182 _cairo_drm_surface_get_font_options (void                  *abstract_surface,
183                                      cairo_font_options_t  *options);
184
185 cairo_private cairo_bool_t
186 _cairo_drm_surface_get_extents (void *abstract_surface,
187                                 cairo_rectangle_int_t *rectangle);
188
189 cairo_private cairo_int_status_t
190 _cairo_drm_surface_flink (void *abstract_surface);
191
192 static inline cairo_drm_device_t *
193 _cairo_drm_device_create_in_error (cairo_status_t status)
194 {
195     return (cairo_drm_device_t *) _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY);
196 }
197
198 cairo_private cairo_drm_device_t *
199 _cairo_drm_device_init (cairo_drm_device_t *device,
200                         int fd,
201                         dev_t devid,
202                         int vendor_id,
203                         int chip_id,
204                         int max_surface_size);
205
206 cairo_private void
207 _cairo_drm_device_fini (cairo_drm_device_t *device);
208
209 /* h/w specific backends */
210
211 cairo_private cairo_drm_device_t *
212 _cairo_drm_intel_device_create (int fd, dev_t dev, int vendor_id, int chip_id);
213
214 cairo_private cairo_drm_device_t *
215 _cairo_drm_i915_device_create (int fd, dev_t dev, int vendor_id, int chip_id);
216
217 cairo_private cairo_drm_device_t *
218 _cairo_drm_i965_device_create (int fd, dev_t dev, int vendor_id, int chip_id);
219
220 cairo_private cairo_drm_device_t *
221 _cairo_drm_radeon_device_create (int fd, dev_t dev, int vendor_id, int chip_id);
222
223 #if CAIRO_HAS_GALLIUM_SURFACE
224 cairo_private cairo_drm_device_t *
225 _cairo_drm_gallium_device_create (int fd, dev_t dev, int vendor_id, int chip_id);
226 #endif
227
228 slim_hidden_proto (cairo_drm_device_default);
229 slim_hidden_proto (cairo_drm_device_get);
230 slim_hidden_proto (cairo_drm_device_get_for_fd);
231
232 slim_hidden_proto (cairo_drm_surface_create_for_name);
233
234 cairo_private cairo_bool_t
235 _cairo_drm_size_is_valid (cairo_device_t *abstract_device,
236                           int width, int height);
237
238 #endif /* CAIRO_DRM_PRIVATE_H */