swr: calculate viewport width/height based on the scale
[mesa.git] / src / gallium / drivers / trace / tr_screen.c
1 /**************************************************************************
2 *
3 * Copyright 2008 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 #include "util/u_format.h"
29 #include "util/u_memory.h"
30 #include "util/simple_list.h"
31
32 #include "tr_dump.h"
33 #include "tr_dump_defines.h"
34 #include "tr_dump_state.h"
35 #include "tr_texture.h"
36 #include "tr_context.h"
37 #include "tr_screen.h"
38 #include "tr_public.h"
39
40
41 static boolean trace = FALSE;
42
43 static const char *
44 trace_screen_get_name(struct pipe_screen *_screen)
45 {
46 struct trace_screen *tr_scr = trace_screen(_screen);
47 struct pipe_screen *screen = tr_scr->screen;
48 const char *result;
49
50 trace_dump_call_begin("pipe_screen", "get_name");
51
52 trace_dump_arg(ptr, screen);
53
54 result = screen->get_name(screen);
55
56 trace_dump_ret(string, result);
57
58 trace_dump_call_end();
59
60 return result;
61 }
62
63
64 static const char *
65 trace_screen_get_vendor(struct pipe_screen *_screen)
66 {
67 struct trace_screen *tr_scr = trace_screen(_screen);
68 struct pipe_screen *screen = tr_scr->screen;
69 const char *result;
70
71 trace_dump_call_begin("pipe_screen", "get_vendor");
72
73 trace_dump_arg(ptr, screen);
74
75 result = screen->get_vendor(screen);
76
77 trace_dump_ret(string, result);
78
79 trace_dump_call_end();
80
81 return result;
82 }
83
84
85 static const char *
86 trace_screen_get_device_vendor(struct pipe_screen *_screen)
87 {
88 struct trace_screen *tr_scr = trace_screen(_screen);
89 struct pipe_screen *screen = tr_scr->screen;
90 const char *result;
91
92 trace_dump_call_begin("pipe_screen", "get_device_vendor");
93
94 trace_dump_arg(ptr, screen);
95
96 result = screen->get_device_vendor(screen);
97
98 trace_dump_ret(string, result);
99
100 trace_dump_call_end();
101
102 return result;
103 }
104
105
106 static int
107 trace_screen_get_param(struct pipe_screen *_screen,
108 enum pipe_cap param)
109 {
110 struct trace_screen *tr_scr = trace_screen(_screen);
111 struct pipe_screen *screen = tr_scr->screen;
112 int result;
113
114 trace_dump_call_begin("pipe_screen", "get_param");
115
116 trace_dump_arg(ptr, screen);
117 trace_dump_arg(int, param);
118
119 result = screen->get_param(screen, param);
120
121 trace_dump_ret(int, result);
122
123 trace_dump_call_end();
124
125 return result;
126 }
127
128
129 static int
130 trace_screen_get_shader_param(struct pipe_screen *_screen, unsigned shader,
131 enum pipe_shader_cap param)
132 {
133 struct trace_screen *tr_scr = trace_screen(_screen);
134 struct pipe_screen *screen = tr_scr->screen;
135 int result;
136
137 trace_dump_call_begin("pipe_screen", "get_shader_param");
138
139 trace_dump_arg(ptr, screen);
140 trace_dump_arg(uint, shader);
141 trace_dump_arg(int, param);
142
143 result = screen->get_shader_param(screen, shader, param);
144
145 trace_dump_ret(int, result);
146
147 trace_dump_call_end();
148
149 return result;
150 }
151
152
153 static float
154 trace_screen_get_paramf(struct pipe_screen *_screen,
155 enum pipe_capf param)
156 {
157 struct trace_screen *tr_scr = trace_screen(_screen);
158 struct pipe_screen *screen = tr_scr->screen;
159 float result;
160
161 trace_dump_call_begin("pipe_screen", "get_paramf");
162
163 trace_dump_arg(ptr, screen);
164 trace_dump_arg(int, param);
165
166 result = screen->get_paramf(screen, param);
167
168 trace_dump_ret(float, result);
169
170 trace_dump_call_end();
171
172 return result;
173 }
174
175
176 static int
177 trace_screen_get_compute_param(struct pipe_screen *_screen,
178 enum pipe_shader_ir ir_type,
179 enum pipe_compute_cap param, void *data)
180 {
181 struct trace_screen *tr_scr = trace_screen(_screen);
182 struct pipe_screen *screen = tr_scr->screen;
183 int result;
184
185 trace_dump_call_begin("pipe_screen", "get_compute_param");
186
187 trace_dump_arg(ptr, screen);
188 trace_dump_arg(int, ir_type);
189 trace_dump_arg(int, param);
190 trace_dump_arg(ptr, data);
191
192 result = screen->get_compute_param(screen, ir_type, param, data);
193
194 trace_dump_ret(int, result);
195
196 trace_dump_call_end();
197
198 return result;
199 }
200
201
202 static boolean
203 trace_screen_is_format_supported(struct pipe_screen *_screen,
204 enum pipe_format format,
205 enum pipe_texture_target target,
206 unsigned sample_count,
207 unsigned tex_usage)
208 {
209 struct trace_screen *tr_scr = trace_screen(_screen);
210 struct pipe_screen *screen = tr_scr->screen;
211 boolean result;
212
213 trace_dump_call_begin("pipe_screen", "is_format_supported");
214
215 trace_dump_arg(ptr, screen);
216 trace_dump_arg(format, format);
217 trace_dump_arg(int, target);
218 trace_dump_arg(uint, sample_count);
219 trace_dump_arg(uint, tex_usage);
220
221 result = screen->is_format_supported(screen, format, target, sample_count,
222 tex_usage);
223
224 trace_dump_ret(bool, result);
225
226 trace_dump_call_end();
227
228 return result;
229 }
230
231
232 static struct pipe_context *
233 trace_screen_context_create(struct pipe_screen *_screen, void *priv,
234 unsigned flags)
235 {
236 struct trace_screen *tr_scr = trace_screen(_screen);
237 struct pipe_screen *screen = tr_scr->screen;
238 struct pipe_context *result;
239
240 trace_dump_call_begin("pipe_screen", "context_create");
241
242 trace_dump_arg(ptr, screen);
243 trace_dump_arg(ptr, priv);
244 trace_dump_arg(uint, flags);
245
246 result = screen->context_create(screen, priv, flags);
247
248 trace_dump_ret(ptr, result);
249
250 trace_dump_call_end();
251
252 result = trace_context_create(tr_scr, result);
253
254 return result;
255 }
256
257
258 static void
259 trace_screen_flush_frontbuffer(struct pipe_screen *_screen,
260 struct pipe_resource *_resource,
261 unsigned level, unsigned layer,
262 void *context_private,
263 struct pipe_box *sub_box)
264 {
265 struct trace_screen *tr_scr = trace_screen(_screen);
266 struct trace_resource *tr_res = trace_resource(_resource);
267 struct pipe_screen *screen = tr_scr->screen;
268 struct pipe_resource *resource = tr_res->resource;
269
270 trace_dump_call_begin("pipe_screen", "flush_frontbuffer");
271
272 trace_dump_arg(ptr, screen);
273 trace_dump_arg(ptr, resource);
274 trace_dump_arg(uint, level);
275 trace_dump_arg(uint, layer);
276 /* XXX: hide, as there is nothing we can do with this
277 trace_dump_arg(ptr, context_private);
278 */
279
280 screen->flush_frontbuffer(screen, resource, level, layer, context_private, sub_box);
281
282 trace_dump_call_end();
283 }
284
285
286 /********************************************************************
287 * texture
288 */
289
290
291 static struct pipe_resource *
292 trace_screen_resource_create(struct pipe_screen *_screen,
293 const struct pipe_resource *templat)
294 {
295 struct trace_screen *tr_scr = trace_screen(_screen);
296 struct pipe_screen *screen = tr_scr->screen;
297 struct pipe_resource *result;
298
299 trace_dump_call_begin("pipe_screen", "resource_create");
300
301 trace_dump_arg(ptr, screen);
302 trace_dump_arg(resource_template, templat);
303
304 result = screen->resource_create(screen, templat);
305
306 trace_dump_ret(ptr, result);
307
308 trace_dump_call_end();
309
310 result = trace_resource_create(tr_scr, result);
311
312 return result;
313 }
314
315 static struct pipe_resource *
316 trace_screen_resource_from_handle(struct pipe_screen *_screen,
317 const struct pipe_resource *templ,
318 struct winsys_handle *handle,
319 unsigned usage)
320 {
321 struct trace_screen *tr_screen = trace_screen(_screen);
322 struct pipe_screen *screen = tr_screen->screen;
323 struct pipe_resource *result;
324
325 /* TODO trace call */
326
327 result = screen->resource_from_handle(screen, templ, handle, usage);
328
329 result = trace_resource_create(trace_screen(_screen), result);
330
331 return result;
332 }
333
334 static boolean
335 trace_screen_resource_get_handle(struct pipe_screen *_screen,
336 struct pipe_context *_pipe,
337 struct pipe_resource *_resource,
338 struct winsys_handle *handle,
339 unsigned usage)
340 {
341 struct trace_screen *tr_screen = trace_screen(_screen);
342 struct trace_context *tr_pipe = _pipe ? trace_context(_pipe) : NULL;
343 struct trace_resource *tr_resource = trace_resource(_resource);
344 struct pipe_screen *screen = tr_screen->screen;
345 struct pipe_resource *resource = tr_resource->resource;
346
347 /* TODO trace call */
348
349 return screen->resource_get_handle(screen, tr_pipe ? tr_pipe->pipe : NULL,
350 resource, handle, usage);
351 }
352
353
354
355 static void
356 trace_screen_resource_destroy(struct pipe_screen *_screen,
357 struct pipe_resource *_resource)
358 {
359 struct trace_screen *tr_scr = trace_screen(_screen);
360 struct trace_resource *tr_res = trace_resource(_resource);
361 struct pipe_screen *screen = tr_scr->screen;
362 struct pipe_resource *resource = tr_res->resource;
363
364 assert(resource->screen == screen);
365
366 trace_dump_call_begin("pipe_screen", "resource_destroy");
367
368 trace_dump_arg(ptr, screen);
369 trace_dump_arg(ptr, resource);
370
371 trace_dump_call_end();
372
373 trace_resource_destroy(tr_scr, tr_res);
374 }
375
376
377 /********************************************************************
378 * fence
379 */
380
381
382 static void
383 trace_screen_fence_reference(struct pipe_screen *_screen,
384 struct pipe_fence_handle **pdst,
385 struct pipe_fence_handle *src)
386 {
387 struct trace_screen *tr_scr = trace_screen(_screen);
388 struct pipe_screen *screen = tr_scr->screen;
389 struct pipe_fence_handle *dst;
390
391 assert(pdst);
392 dst = *pdst;
393
394 trace_dump_call_begin("pipe_screen", "fence_reference");
395
396 trace_dump_arg(ptr, screen);
397 trace_dump_arg(ptr, dst);
398 trace_dump_arg(ptr, src);
399
400 screen->fence_reference(screen, pdst, src);
401
402 trace_dump_call_end();
403 }
404
405
406 static boolean
407 trace_screen_fence_finish(struct pipe_screen *_screen,
408 struct pipe_context *_ctx,
409 struct pipe_fence_handle *fence,
410 uint64_t timeout)
411 {
412 struct trace_screen *tr_scr = trace_screen(_screen);
413 struct pipe_screen *screen = tr_scr->screen;
414 struct pipe_context *ctx = _ctx ? trace_context(_ctx)->pipe : NULL;
415 int result;
416
417 trace_dump_call_begin("pipe_screen", "fence_finish");
418
419 trace_dump_arg(ptr, screen);
420 trace_dump_arg(ptr, ctx);
421 trace_dump_arg(ptr, fence);
422 trace_dump_arg(uint, timeout);
423
424 result = screen->fence_finish(screen, ctx, fence, timeout);
425
426 trace_dump_ret(bool, result);
427
428 trace_dump_call_end();
429
430 return result;
431 }
432
433
434 /********************************************************************
435 * screen
436 */
437
438 static uint64_t
439 trace_screen_get_timestamp(struct pipe_screen *_screen)
440 {
441 struct trace_screen *tr_scr = trace_screen(_screen);
442 struct pipe_screen *screen = tr_scr->screen;
443 uint64_t result;
444
445 trace_dump_call_begin("pipe_screen", "get_timestamp");
446 trace_dump_arg(ptr, screen);
447
448 result = screen->get_timestamp(screen);
449
450 trace_dump_ret(uint, result);
451 trace_dump_call_end();
452
453 return result;
454 }
455
456 static void
457 trace_screen_destroy(struct pipe_screen *_screen)
458 {
459 struct trace_screen *tr_scr = trace_screen(_screen);
460 struct pipe_screen *screen = tr_scr->screen;
461
462 trace_dump_call_begin("pipe_screen", "destroy");
463 trace_dump_arg(ptr, screen);
464 trace_dump_call_end();
465
466 screen->destroy(screen);
467
468 FREE(tr_scr);
469 }
470
471 boolean
472 trace_enabled(void)
473 {
474 static boolean firstrun = TRUE;
475
476 if (!firstrun)
477 return trace;
478 firstrun = FALSE;
479
480 if(trace_dump_trace_begin()) {
481 trace_dumping_start();
482 trace = TRUE;
483 }
484
485 return trace;
486 }
487
488 struct pipe_screen *
489 trace_screen_create(struct pipe_screen *screen)
490 {
491 struct trace_screen *tr_scr;
492
493 if (!trace_enabled())
494 goto error1;
495
496 trace_dump_call_begin("", "pipe_screen_create");
497
498 tr_scr = CALLOC_STRUCT(trace_screen);
499 if (!tr_scr)
500 goto error2;
501
502 tr_scr->base.destroy = trace_screen_destroy;
503 tr_scr->base.get_name = trace_screen_get_name;
504 tr_scr->base.get_vendor = trace_screen_get_vendor;
505 tr_scr->base.get_device_vendor = trace_screen_get_device_vendor;
506 tr_scr->base.get_param = trace_screen_get_param;
507 tr_scr->base.get_shader_param = trace_screen_get_shader_param;
508 tr_scr->base.get_paramf = trace_screen_get_paramf;
509 tr_scr->base.get_compute_param = trace_screen_get_compute_param;
510 tr_scr->base.is_format_supported = trace_screen_is_format_supported;
511 assert(screen->context_create);
512 tr_scr->base.context_create = trace_screen_context_create;
513 tr_scr->base.resource_create = trace_screen_resource_create;
514 tr_scr->base.resource_from_handle = trace_screen_resource_from_handle;
515 tr_scr->base.resource_get_handle = trace_screen_resource_get_handle;
516 tr_scr->base.resource_destroy = trace_screen_resource_destroy;
517 tr_scr->base.fence_reference = trace_screen_fence_reference;
518 tr_scr->base.fence_finish = trace_screen_fence_finish;
519 tr_scr->base.flush_frontbuffer = trace_screen_flush_frontbuffer;
520 tr_scr->base.get_timestamp = trace_screen_get_timestamp;
521
522 tr_scr->screen = screen;
523
524 trace_dump_ret(ptr, screen);
525 trace_dump_call_end();
526
527 return &tr_scr->base;
528
529 error2:
530 trace_dump_ret(ptr, screen);
531 trace_dump_call_end();
532 error1:
533 return screen;
534 }
535
536
537 struct trace_screen *
538 trace_screen(struct pipe_screen *screen)
539 {
540 assert(screen);
541 assert(screen->destroy == trace_screen_destroy);
542 return (struct trace_screen *)screen;
543 }