Merge branch 'gallium-front-ccw'
[mesa.git] / src / gallium / drivers / rbug / rbug_screen.c
1 /**************************************************************************
2 *
3 * Copyright 2010 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28
29 #include "pipe/p_screen.h"
30 #include "pipe/p_state.h"
31 #include "util/u_memory.h"
32 #include "util/u_debug.h"
33 #include "util/u_simple_list.h"
34
35 #include "rbug_public.h"
36 #include "rbug_screen.h"
37 #include "rbug_context.h"
38 #include "rbug_objects.h"
39
40 DEBUG_GET_ONCE_BOOL_OPTION(rbug, "GALLIUM_RBUG", FALSE)
41
42 static void
43 rbug_screen_destroy(struct pipe_screen *_screen)
44 {
45 struct rbug_screen *rb_screen = rbug_screen(_screen);
46 struct pipe_screen *screen = rb_screen->screen;
47
48 screen->destroy(screen);
49
50 FREE(rb_screen);
51 }
52
53 static const char *
54 rbug_screen_get_name(struct pipe_screen *_screen)
55 {
56 struct rbug_screen *rb_screen = rbug_screen(_screen);
57 struct pipe_screen *screen = rb_screen->screen;
58
59 return screen->get_name(screen);
60 }
61
62 static const char *
63 rbug_screen_get_vendor(struct pipe_screen *_screen)
64 {
65 struct rbug_screen *rb_screen = rbug_screen(_screen);
66 struct pipe_screen *screen = rb_screen->screen;
67
68 return screen->get_vendor(screen);
69 }
70
71 static int
72 rbug_screen_get_param(struct pipe_screen *_screen,
73 enum pipe_cap param)
74 {
75 struct rbug_screen *rb_screen = rbug_screen(_screen);
76 struct pipe_screen *screen = rb_screen->screen;
77
78 return screen->get_param(screen,
79 param);
80 }
81
82 static float
83 rbug_screen_get_paramf(struct pipe_screen *_screen,
84 enum pipe_cap param)
85 {
86 struct rbug_screen *rb_screen = rbug_screen(_screen);
87 struct pipe_screen *screen = rb_screen->screen;
88
89 return screen->get_paramf(screen,
90 param);
91 }
92
93 static boolean
94 rbug_screen_is_format_supported(struct pipe_screen *_screen,
95 enum pipe_format format,
96 enum pipe_texture_target target,
97 unsigned tex_usage,
98 unsigned geom_flags)
99 {
100 struct rbug_screen *rb_screen = rbug_screen(_screen);
101 struct pipe_screen *screen = rb_screen->screen;
102
103 return screen->is_format_supported(screen,
104 format,
105 target,
106 tex_usage,
107 geom_flags);
108 }
109
110 static struct pipe_context *
111 rbug_screen_context_create(struct pipe_screen *_screen,
112 void *priv)
113 {
114 struct rbug_screen *rb_screen = rbug_screen(_screen);
115 struct pipe_screen *screen = rb_screen->screen;
116 struct pipe_context *result;
117
118 result = screen->context_create(screen, priv);
119 if (result)
120 return rbug_context_create(_screen, result);
121 return NULL;
122 }
123
124 static struct pipe_resource *
125 rbug_screen_resource_create(struct pipe_screen *_screen,
126 const struct pipe_resource *templat)
127 {
128 struct rbug_screen *rb_screen = rbug_screen(_screen);
129 struct pipe_screen *screen = rb_screen->screen;
130 struct pipe_resource *result;
131
132 result = screen->resource_create(screen,
133 templat);
134
135 if (result)
136 return rbug_resource_create(rb_screen, result);
137 return NULL;
138 }
139
140 static struct pipe_resource *
141 rbug_screen_resource_from_handle(struct pipe_screen *_screen,
142 const struct pipe_resource *templ,
143 struct winsys_handle *handle)
144 {
145 struct rbug_screen *rb_screen = rbug_screen(_screen);
146 struct pipe_screen *screen = rb_screen->screen;
147 struct pipe_resource *result;
148
149 result = screen->resource_from_handle(screen, templ, handle);
150
151 result = rbug_resource_create(rbug_screen(_screen), result);
152
153 return result;
154 }
155
156 static boolean
157 rbug_screen_resource_get_handle(struct pipe_screen *_screen,
158 struct pipe_resource *_resource,
159 struct winsys_handle *handle)
160 {
161 struct rbug_screen *rb_screen = rbug_screen(_screen);
162 struct rbug_resource *rb_resource = rbug_resource(_resource);
163 struct pipe_screen *screen = rb_screen->screen;
164 struct pipe_resource *resource = rb_resource->resource;
165
166 return screen->resource_get_handle(screen, resource, handle);
167 }
168
169
170
171 static void
172 rbug_screen_resource_destroy(struct pipe_screen *screen,
173 struct pipe_resource *_resource)
174 {
175 rbug_resource_destroy(rbug_resource(_resource));
176 }
177
178 static struct pipe_surface *
179 rbug_screen_get_tex_surface(struct pipe_screen *_screen,
180 struct pipe_resource *_resource,
181 unsigned face,
182 unsigned level,
183 unsigned zslice,
184 unsigned usage)
185 {
186 struct rbug_screen *rb_screen = rbug_screen(_screen);
187 struct rbug_resource *rb_resource = rbug_resource(_resource);
188 struct pipe_screen *screen = rb_screen->screen;
189 struct pipe_resource *resource = rb_resource->resource;
190 struct pipe_surface *result;
191
192 result = screen->get_tex_surface(screen,
193 resource,
194 face,
195 level,
196 zslice,
197 usage);
198
199 if (result)
200 return rbug_surface_create(rb_resource, result);
201 return NULL;
202 }
203
204 static void
205 rbug_screen_tex_surface_destroy(struct pipe_surface *_surface)
206 {
207 rbug_surface_destroy(rbug_surface(_surface));
208 }
209
210
211
212 static struct pipe_resource *
213 rbug_screen_user_buffer_create(struct pipe_screen *_screen,
214 void *ptr,
215 unsigned bytes,
216 unsigned usage)
217 {
218 struct rbug_screen *rb_screen = rbug_screen(_screen);
219 struct pipe_screen *screen = rb_screen->screen;
220 struct pipe_resource *result;
221
222 result = screen->user_buffer_create(screen,
223 ptr,
224 bytes,
225 usage);
226
227 if (result)
228 return rbug_resource_create(rb_screen, result);
229 return NULL;
230 }
231
232
233
234 static void
235 rbug_screen_flush_frontbuffer(struct pipe_screen *_screen,
236 struct pipe_surface *_surface,
237 void *context_private)
238 {
239 struct rbug_screen *rb_screen = rbug_screen(_screen);
240 struct rbug_surface *rb_surface = rbug_surface(_surface);
241 struct pipe_screen *screen = rb_screen->screen;
242 struct pipe_surface *surface = rb_surface->surface;
243
244 screen->flush_frontbuffer(screen,
245 surface,
246 context_private);
247 }
248
249 static void
250 rbug_screen_fence_reference(struct pipe_screen *_screen,
251 struct pipe_fence_handle **ptr,
252 struct pipe_fence_handle *fence)
253 {
254 struct rbug_screen *rb_screen = rbug_screen(_screen);
255 struct pipe_screen *screen = rb_screen->screen;
256
257 screen->fence_reference(screen,
258 ptr,
259 fence);
260 }
261
262 static int
263 rbug_screen_fence_signalled(struct pipe_screen *_screen,
264 struct pipe_fence_handle *fence,
265 unsigned flags)
266 {
267 struct rbug_screen *rb_screen = rbug_screen(_screen);
268 struct pipe_screen *screen = rb_screen->screen;
269
270 return screen->fence_signalled(screen,
271 fence,
272 flags);
273 }
274
275 static int
276 rbug_screen_fence_finish(struct pipe_screen *_screen,
277 struct pipe_fence_handle *fence,
278 unsigned flags)
279 {
280 struct rbug_screen *rb_screen = rbug_screen(_screen);
281 struct pipe_screen *screen = rb_screen->screen;
282
283 return screen->fence_finish(screen,
284 fence,
285 flags);
286 }
287
288 boolean
289 rbug_enabled()
290 {
291 return debug_get_option_rbug();
292 }
293
294 struct pipe_screen *
295 rbug_screen_create(struct pipe_screen *screen)
296 {
297 struct rbug_screen *rb_screen;
298
299 if (!debug_get_option_rbug())
300 return screen;
301
302 rb_screen = CALLOC_STRUCT(rbug_screen);
303 if (!rb_screen)
304 return screen;
305
306 pipe_mutex_init(rb_screen->list_mutex);
307 make_empty_list(&rb_screen->contexts);
308 make_empty_list(&rb_screen->resources);
309 make_empty_list(&rb_screen->surfaces);
310 make_empty_list(&rb_screen->transfers);
311
312 rb_screen->base.winsys = NULL;
313
314 rb_screen->base.destroy = rbug_screen_destroy;
315 rb_screen->base.get_name = rbug_screen_get_name;
316 rb_screen->base.get_vendor = rbug_screen_get_vendor;
317 rb_screen->base.get_param = rbug_screen_get_param;
318 rb_screen->base.get_paramf = rbug_screen_get_paramf;
319 rb_screen->base.is_format_supported = rbug_screen_is_format_supported;
320 rb_screen->base.context_create = rbug_screen_context_create;
321 rb_screen->base.resource_create = rbug_screen_resource_create;
322 rb_screen->base.resource_from_handle = rbug_screen_resource_from_handle;
323 rb_screen->base.resource_get_handle = rbug_screen_resource_get_handle;
324 rb_screen->base.resource_destroy = rbug_screen_resource_destroy;
325 rb_screen->base.get_tex_surface = rbug_screen_get_tex_surface;
326 rb_screen->base.tex_surface_destroy = rbug_screen_tex_surface_destroy;
327 rb_screen->base.user_buffer_create = rbug_screen_user_buffer_create;
328 rb_screen->base.flush_frontbuffer = rbug_screen_flush_frontbuffer;
329 rb_screen->base.fence_reference = rbug_screen_fence_reference;
330 rb_screen->base.fence_signalled = rbug_screen_fence_signalled;
331 rb_screen->base.fence_finish = rbug_screen_fence_finish;
332
333 rb_screen->screen = screen;
334
335 rb_screen->private_context = screen->context_create(screen, NULL);
336 if (!rb_screen->private_context)
337 goto err_free;
338
339 rb_screen->rbug = rbug_start(rb_screen);
340
341 if (!rb_screen->rbug)
342 goto err_context;
343
344 return &rb_screen->base;
345
346 err_context:
347 rb_screen->private_context->destroy(rb_screen->private_context);
348 err_free:
349 FREE(rb_screen);
350 return screen;
351 }