Merge commit 'origin/master' into HEAD
[mesa.git] / src / gallium / drivers / trace / tr_screen.c
1 /**************************************************************************
2 *
3 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
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 TUNGSTEN GRAPHICS 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 #include "util/u_memory.h"
29
30 #include "tr_dump.h"
31 #include "tr_state.h"
32 #include "tr_winsys.h"
33 #include "tr_texture.h"
34 #include "tr_screen.h"
35
36
37 static const char *
38 trace_screen_get_name(struct pipe_screen *_screen)
39 {
40 struct trace_screen *tr_scr = trace_screen(_screen);
41 struct pipe_screen *screen = tr_scr->screen;
42 const char *result;
43
44 trace_dump_call_begin("pipe_screen", "get_name");
45
46 trace_dump_arg(ptr, screen);
47
48 result = screen->get_name(screen);
49
50 trace_dump_ret(string, result);
51
52 trace_dump_call_end();
53
54 return result;
55 }
56
57
58 static const char *
59 trace_screen_get_vendor(struct pipe_screen *_screen)
60 {
61 struct trace_screen *tr_scr = trace_screen(_screen);
62 struct pipe_screen *screen = tr_scr->screen;
63 const char *result;
64
65 trace_dump_call_begin("pipe_screen", "get_vendor");
66
67 trace_dump_arg(ptr, screen);
68
69 result = screen->get_vendor(screen);
70
71 trace_dump_ret(string, result);
72
73 trace_dump_call_end();
74
75 return result;
76 }
77
78
79 static int
80 trace_screen_get_param(struct pipe_screen *_screen,
81 int param)
82 {
83 struct trace_screen *tr_scr = trace_screen(_screen);
84 struct pipe_screen *screen = tr_scr->screen;
85 int result;
86
87 trace_dump_call_begin("pipe_screen", "get_param");
88
89 trace_dump_arg(ptr, screen);
90 trace_dump_arg(int, param);
91
92 result = screen->get_param(screen, param);
93
94 trace_dump_ret(int, result);
95
96 trace_dump_call_end();
97
98 return result;
99 }
100
101
102 static float
103 trace_screen_get_paramf(struct pipe_screen *_screen,
104 int param)
105 {
106 struct trace_screen *tr_scr = trace_screen(_screen);
107 struct pipe_screen *screen = tr_scr->screen;
108 float result;
109
110 trace_dump_call_begin("pipe_screen", "get_paramf");
111
112 trace_dump_arg(ptr, screen);
113 trace_dump_arg(int, param);
114
115 result = screen->get_paramf(screen, param);
116
117 trace_dump_ret(float, result);
118
119 trace_dump_call_end();
120
121 return result;
122 }
123
124
125 static boolean
126 trace_screen_is_format_supported(struct pipe_screen *_screen,
127 enum pipe_format format,
128 enum pipe_texture_target target,
129 unsigned tex_usage,
130 unsigned geom_flags)
131 {
132 struct trace_screen *tr_scr = trace_screen(_screen);
133 struct pipe_screen *screen = tr_scr->screen;
134 boolean result;
135
136 trace_dump_call_begin("pipe_screen", "is_format_supported");
137
138 trace_dump_arg(ptr, screen);
139 trace_dump_arg(format, format);
140 trace_dump_arg(int, target);
141 trace_dump_arg(uint, tex_usage);
142 trace_dump_arg(uint, geom_flags);
143
144 result = screen->is_format_supported(screen, format, target, tex_usage, geom_flags);
145
146 trace_dump_ret(bool, result);
147
148 trace_dump_call_end();
149
150 return result;
151 }
152
153
154 static struct pipe_texture *
155 trace_screen_texture_create(struct pipe_screen *_screen,
156 const struct pipe_texture *templat)
157 {
158 struct trace_screen *tr_scr = trace_screen(_screen);
159 struct pipe_screen *screen = tr_scr->screen;
160 struct pipe_texture *result;
161
162 trace_dump_call_begin("pipe_screen", "texture_create");
163
164 trace_dump_arg(ptr, screen);
165 trace_dump_arg(template, templat);
166
167 result = screen->texture_create(screen, templat);
168
169 trace_dump_ret(ptr, result);
170
171 trace_dump_call_end();
172
173 result = trace_texture_create(tr_scr, result);
174
175 return result;
176 }
177
178
179 static struct pipe_texture *
180 trace_screen_texture_blanket(struct pipe_screen *_screen,
181 const struct pipe_texture *templat,
182 const unsigned *ppitch,
183 struct pipe_buffer *buffer)
184 {
185 struct trace_screen *tr_scr = trace_screen(_screen);
186 struct pipe_screen *screen = tr_scr->screen;
187 unsigned pitch = *ppitch;
188 struct pipe_texture *result;
189
190 trace_dump_call_begin("pipe_screen", "texture_blanket");
191
192 trace_dump_arg(ptr, screen);
193 trace_dump_arg(template, templat);
194 trace_dump_arg(uint, pitch);
195 trace_dump_arg(ptr, buffer);
196
197 result = screen->texture_blanket(screen, templat, ppitch, buffer);
198
199 trace_dump_ret(ptr, result);
200
201 trace_dump_call_end();
202
203 result = trace_texture_create(tr_scr, result);
204
205 return result;
206 }
207
208
209 static void
210 trace_screen_texture_release(struct pipe_screen *_screen,
211 struct pipe_texture **ptexture)
212 {
213 struct trace_screen *tr_scr = trace_screen(_screen);
214 struct pipe_screen *screen = tr_scr->screen;
215 struct trace_texture *tr_tex;
216 struct pipe_texture *texture;
217
218 assert(ptexture);
219 if(*ptexture) {
220 tr_tex = trace_texture(tr_scr, *ptexture);
221 texture = tr_tex->texture;
222 assert(texture->screen == screen);
223 }
224 else
225 texture = NULL;
226
227 if (*ptexture) {
228 if (!--(*ptexture)->refcount) {
229 trace_dump_call_begin("pipe_screen", "texture_destroy");
230
231 trace_dump_arg(ptr, screen);
232 trace_dump_arg(ptr, texture);
233
234 trace_texture_destroy(tr_scr, *ptexture);
235
236 trace_dump_call_end();
237 }
238
239 *ptexture = NULL;
240 }
241 }
242
243
244 static struct pipe_surface *
245 trace_screen_get_tex_surface(struct pipe_screen *_screen,
246 struct pipe_texture *texture,
247 unsigned face, unsigned level,
248 unsigned zslice,
249 unsigned usage)
250 {
251 struct trace_screen *tr_scr = trace_screen(_screen);
252 struct pipe_screen *screen = tr_scr->screen;
253 struct trace_texture *tr_tex;
254 struct pipe_surface *result;
255
256 assert(texture);
257 tr_tex = trace_texture(tr_scr, texture);
258 texture = tr_tex->texture;
259 assert(texture->screen == screen);
260
261 trace_dump_call_begin("pipe_screen", "get_tex_surface");
262
263 trace_dump_arg(ptr, screen);
264 trace_dump_arg(ptr, texture);
265 trace_dump_arg(uint, face);
266 trace_dump_arg(uint, level);
267 trace_dump_arg(uint, zslice);
268 trace_dump_arg(uint, usage);
269
270 result = screen->get_tex_surface(screen, texture, face, level, zslice, usage);
271
272 trace_dump_ret(ptr, result);
273
274 trace_dump_call_end();
275
276 result = trace_surface_create(tr_tex, result);
277
278 return result;
279 }
280
281
282 static void
283 trace_screen_tex_surface_release(struct pipe_screen *_screen,
284 struct pipe_surface **psurface)
285 {
286 struct trace_screen *tr_scr = trace_screen(_screen);
287 struct pipe_screen *screen = tr_scr->screen;
288 struct trace_texture *tr_tex;
289 struct trace_surface *tr_surf;
290 struct pipe_surface *surface;
291
292 assert(psurface);
293 if(*psurface) {
294 tr_tex = trace_texture(tr_scr, (*psurface)->texture);
295 tr_surf = trace_surface(tr_tex, *psurface);
296 surface = tr_surf->surface;
297 }
298 else
299 surface = NULL;
300
301 if (*psurface) {
302 if (!--(*psurface)->refcount) {
303 trace_dump_call_begin("pipe_screen", "tex_surface_destroy");
304
305 trace_dump_arg(ptr, screen);
306 trace_dump_arg(ptr, surface);
307
308 trace_surface_destroy(tr_tex, *psurface);
309
310 trace_dump_call_end();
311 }
312
313 *psurface = NULL;
314 }
315 }
316
317
318 static void *
319 trace_screen_surface_map(struct pipe_screen *_screen,
320 struct pipe_surface *surface,
321 unsigned flags)
322 {
323 struct trace_screen *tr_scr = trace_screen(_screen);
324 struct pipe_screen *screen = tr_scr->screen;
325 struct trace_texture *tr_tex;
326 struct trace_surface *tr_surf;
327 void *map;
328
329 tr_tex = trace_texture(tr_scr, surface->texture);
330 tr_surf = trace_surface(tr_tex, surface);
331 surface = tr_surf->surface;
332
333 map = screen->surface_map(screen, surface, flags);
334 if(map) {
335 if(flags & PIPE_BUFFER_USAGE_CPU_WRITE) {
336 assert(!tr_surf->map);
337 tr_surf->map = map;
338 }
339 }
340
341 return map;
342 }
343
344
345 static void
346 trace_screen_surface_unmap(struct pipe_screen *_screen,
347 struct pipe_surface *surface)
348 {
349 struct trace_screen *tr_scr = trace_screen(_screen);
350 struct pipe_screen *screen = tr_scr->screen;
351 struct trace_texture *tr_tex;
352 struct trace_surface *tr_surf;
353
354 tr_tex = trace_texture(tr_scr, surface->texture);
355 tr_surf = trace_surface(tr_tex, surface);
356 surface = tr_surf->surface;
357
358 if(tr_surf->map) {
359 size_t size = surface->nblocksy * surface->stride;
360
361 trace_dump_call_begin("pipe_winsys", "surface_write");
362
363 trace_dump_arg(ptr, screen);
364
365 trace_dump_arg(ptr, surface);
366
367 trace_dump_arg_begin("data");
368 trace_dump_bytes(tr_surf->map, size);
369 trace_dump_arg_end();
370
371 trace_dump_arg_begin("stride");
372 trace_dump_uint(surface->stride);
373 trace_dump_arg_end();
374
375 trace_dump_arg_begin("size");
376 trace_dump_uint(size);
377 trace_dump_arg_end();
378
379 trace_dump_call_end();
380
381 tr_surf->map = NULL;
382 }
383
384 screen->surface_unmap(screen, surface);
385 }
386
387
388 static void
389 trace_screen_destroy(struct pipe_screen *_screen)
390 {
391 struct trace_screen *tr_scr = trace_screen(_screen);
392 struct pipe_screen *screen = tr_scr->screen;
393
394 trace_dump_call_begin("pipe_screen", "destroy");
395
396 trace_dump_arg(ptr, screen);
397
398 screen->destroy(screen);
399
400 trace_dump_call_end();
401
402 trace_dump_trace_end();
403
404 FREE(tr_scr);
405 }
406
407
408 struct pipe_screen *
409 trace_screen_create(struct pipe_screen *screen)
410 {
411 struct trace_screen *tr_scr;
412 struct pipe_winsys *winsys;
413
414 if(!screen)
415 goto error1;
416
417 if(!trace_dump_trace_begin())
418 goto error1;
419
420 tr_scr = CALLOC_STRUCT(trace_screen);
421 if(!tr_scr)
422 goto error2;
423
424 winsys = trace_winsys_create(screen->winsys);
425 if(!winsys)
426 goto error3;
427
428 tr_scr->base.winsys = winsys;
429 tr_scr->base.destroy = trace_screen_destroy;
430 tr_scr->base.get_name = trace_screen_get_name;
431 tr_scr->base.get_vendor = trace_screen_get_vendor;
432 tr_scr->base.get_param = trace_screen_get_param;
433 tr_scr->base.get_paramf = trace_screen_get_paramf;
434 tr_scr->base.is_format_supported = trace_screen_is_format_supported;
435 tr_scr->base.texture_create = trace_screen_texture_create;
436 tr_scr->base.texture_blanket = trace_screen_texture_blanket;
437 tr_scr->base.texture_release = trace_screen_texture_release;
438 tr_scr->base.get_tex_surface = trace_screen_get_tex_surface;
439 tr_scr->base.tex_surface_release = trace_screen_tex_surface_release;
440 tr_scr->base.surface_map = trace_screen_surface_map;
441 tr_scr->base.surface_unmap = trace_screen_surface_unmap;
442
443 tr_scr->screen = screen;
444
445 trace_dump_call_begin("", "pipe_screen_create");
446 trace_dump_arg_begin("winsys");
447 trace_dump_ptr(screen->winsys);
448 trace_dump_arg_end();
449 trace_dump_ret(ptr, screen);
450 trace_dump_call_end();
451
452 return &tr_scr->base;
453
454 error3:
455 FREE(tr_scr);
456 error2:
457 trace_dump_trace_end();
458 error1:
459 return screen;
460 }
461
462
463 struct trace_screen *
464 trace_screen(struct pipe_screen *screen)
465 {
466 assert(screen);
467 assert(screen->destroy == trace_screen_destroy);
468 return (struct trace_screen *)screen;
469 }