Merge branch 'glsl2-head' into glsl2
[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 sample_count,
98 unsigned tex_usage,
99 unsigned geom_flags)
100 {
101 struct rbug_screen *rb_screen = rbug_screen(_screen);
102 struct pipe_screen *screen = rb_screen->screen;
103
104 return screen->is_format_supported(screen,
105 format,
106 target,
107 sample_count,
108 tex_usage,
109 geom_flags);
110 }
111
112 static struct pipe_context *
113 rbug_screen_context_create(struct pipe_screen *_screen,
114 void *priv)
115 {
116 struct rbug_screen *rb_screen = rbug_screen(_screen);
117 struct pipe_screen *screen = rb_screen->screen;
118 struct pipe_context *result;
119
120 result = screen->context_create(screen, priv);
121 if (result)
122 return rbug_context_create(_screen, result);
123 return NULL;
124 }
125
126 static struct pipe_resource *
127 rbug_screen_resource_create(struct pipe_screen *_screen,
128 const struct pipe_resource *templat)
129 {
130 struct rbug_screen *rb_screen = rbug_screen(_screen);
131 struct pipe_screen *screen = rb_screen->screen;
132 struct pipe_resource *result;
133
134 result = screen->resource_create(screen,
135 templat);
136
137 if (result)
138 return rbug_resource_create(rb_screen, result);
139 return NULL;
140 }
141
142 static struct pipe_resource *
143 rbug_screen_resource_from_handle(struct pipe_screen *_screen,
144 const struct pipe_resource *templ,
145 struct winsys_handle *handle)
146 {
147 struct rbug_screen *rb_screen = rbug_screen(_screen);
148 struct pipe_screen *screen = rb_screen->screen;
149 struct pipe_resource *result;
150
151 result = screen->resource_from_handle(screen, templ, handle);
152
153 result = rbug_resource_create(rbug_screen(_screen), result);
154
155 return result;
156 }
157
158 static boolean
159 rbug_screen_resource_get_handle(struct pipe_screen *_screen,
160 struct pipe_resource *_resource,
161 struct winsys_handle *handle)
162 {
163 struct rbug_screen *rb_screen = rbug_screen(_screen);
164 struct rbug_resource *rb_resource = rbug_resource(_resource);
165 struct pipe_screen *screen = rb_screen->screen;
166 struct pipe_resource *resource = rb_resource->resource;
167
168 return screen->resource_get_handle(screen, resource, handle);
169 }
170
171
172
173 static void
174 rbug_screen_resource_destroy(struct pipe_screen *screen,
175 struct pipe_resource *_resource)
176 {
177 rbug_resource_destroy(rbug_resource(_resource));
178 }
179
180 static struct pipe_surface *
181 rbug_screen_get_tex_surface(struct pipe_screen *_screen,
182 struct pipe_resource *_resource,
183 unsigned face,
184 unsigned level,
185 unsigned zslice,
186 unsigned usage)
187 {
188 struct rbug_screen *rb_screen = rbug_screen(_screen);
189 struct rbug_resource *rb_resource = rbug_resource(_resource);
190 struct pipe_screen *screen = rb_screen->screen;
191 struct pipe_resource *resource = rb_resource->resource;
192 struct pipe_surface *result;
193
194 result = screen->get_tex_surface(screen,
195 resource,
196 face,
197 level,
198 zslice,
199 usage);
200
201 if (result)
202 return rbug_surface_create(rb_resource, result);
203 return NULL;
204 }
205
206 static void
207 rbug_screen_tex_surface_destroy(struct pipe_surface *_surface)
208 {
209 rbug_surface_destroy(rbug_surface(_surface));
210 }
211
212
213
214 static struct pipe_resource *
215 rbug_screen_user_buffer_create(struct pipe_screen *_screen,
216 void *ptr,
217 unsigned bytes,
218 unsigned usage)
219 {
220 struct rbug_screen *rb_screen = rbug_screen(_screen);
221 struct pipe_screen *screen = rb_screen->screen;
222 struct pipe_resource *result;
223
224 result = screen->user_buffer_create(screen,
225 ptr,
226 bytes,
227 usage);
228
229 if (result)
230 return rbug_resource_create(rb_screen, result);
231 return NULL;
232 }
233
234
235
236 static void
237 rbug_screen_flush_frontbuffer(struct pipe_screen *_screen,
238 struct pipe_surface *_surface,
239 void *context_private)
240 {
241 struct rbug_screen *rb_screen = rbug_screen(_screen);
242 struct rbug_surface *rb_surface = rbug_surface(_surface);
243 struct pipe_screen *screen = rb_screen->screen;
244 struct pipe_surface *surface = rb_surface->surface;
245
246 screen->flush_frontbuffer(screen,
247 surface,
248 context_private);
249 }
250
251 static void
252 rbug_screen_fence_reference(struct pipe_screen *_screen,
253 struct pipe_fence_handle **ptr,
254 struct pipe_fence_handle *fence)
255 {
256 struct rbug_screen *rb_screen = rbug_screen(_screen);
257 struct pipe_screen *screen = rb_screen->screen;
258
259 screen->fence_reference(screen,
260 ptr,
261 fence);
262 }
263
264 static int
265 rbug_screen_fence_signalled(struct pipe_screen *_screen,
266 struct pipe_fence_handle *fence,
267 unsigned flags)
268 {
269 struct rbug_screen *rb_screen = rbug_screen(_screen);
270 struct pipe_screen *screen = rb_screen->screen;
271
272 return screen->fence_signalled(screen,
273 fence,
274 flags);
275 }
276
277 static int
278 rbug_screen_fence_finish(struct pipe_screen *_screen,
279 struct pipe_fence_handle *fence,
280 unsigned flags)
281 {
282 struct rbug_screen *rb_screen = rbug_screen(_screen);
283 struct pipe_screen *screen = rb_screen->screen;
284
285 return screen->fence_finish(screen,
286 fence,
287 flags);
288 }
289
290 boolean
291 rbug_enabled()
292 {
293 return debug_get_option_rbug();
294 }
295
296 struct pipe_screen *
297 rbug_screen_create(struct pipe_screen *screen)
298 {
299 struct rbug_screen *rb_screen;
300
301 if (!debug_get_option_rbug())
302 return screen;
303
304 rb_screen = CALLOC_STRUCT(rbug_screen);
305 if (!rb_screen)
306 return screen;
307
308 pipe_mutex_init(rb_screen->list_mutex);
309 make_empty_list(&rb_screen->contexts);
310 make_empty_list(&rb_screen->resources);
311 make_empty_list(&rb_screen->surfaces);
312 make_empty_list(&rb_screen->transfers);
313
314 rb_screen->base.winsys = NULL;
315
316 rb_screen->base.destroy = rbug_screen_destroy;
317 rb_screen->base.get_name = rbug_screen_get_name;
318 rb_screen->base.get_vendor = rbug_screen_get_vendor;
319 rb_screen->base.get_param = rbug_screen_get_param;
320 rb_screen->base.get_paramf = rbug_screen_get_paramf;
321 rb_screen->base.is_format_supported = rbug_screen_is_format_supported;
322 rb_screen->base.context_create = rbug_screen_context_create;
323 rb_screen->base.resource_create = rbug_screen_resource_create;
324 rb_screen->base.resource_from_handle = rbug_screen_resource_from_handle;
325 rb_screen->base.resource_get_handle = rbug_screen_resource_get_handle;
326 rb_screen->base.resource_destroy = rbug_screen_resource_destroy;
327 rb_screen->base.get_tex_surface = rbug_screen_get_tex_surface;
328 rb_screen->base.tex_surface_destroy = rbug_screen_tex_surface_destroy;
329 rb_screen->base.user_buffer_create = rbug_screen_user_buffer_create;
330 rb_screen->base.flush_frontbuffer = rbug_screen_flush_frontbuffer;
331 rb_screen->base.fence_reference = rbug_screen_fence_reference;
332 rb_screen->base.fence_signalled = rbug_screen_fence_signalled;
333 rb_screen->base.fence_finish = rbug_screen_fence_finish;
334
335 rb_screen->screen = screen;
336
337 rb_screen->private_context = screen->context_create(screen, NULL);
338 if (!rb_screen->private_context)
339 goto err_free;
340
341 rb_screen->rbug = rbug_start(rb_screen);
342
343 if (!rb_screen->rbug)
344 goto err_context;
345
346 return &rb_screen->base;
347
348 err_context:
349 rb_screen->private_context->destroy(rb_screen->private_context);
350 err_free:
351 FREE(rb_screen);
352 return screen;
353 }