radeonsi: use current context for DCC feedback-loop decompress, fixes Elemental
[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_resource *_resource,
337 struct winsys_handle *handle,
338 unsigned usage)
339 {
340 struct trace_screen *tr_screen = trace_screen(_screen);
341 struct trace_resource *tr_resource = trace_resource(_resource);
342 struct pipe_screen *screen = tr_screen->screen;
343 struct pipe_resource *resource = tr_resource->resource;
344
345 /* TODO trace call */
346
347 return screen->resource_get_handle(screen, resource, handle, usage);
348 }
349
350
351
352 static void
353 trace_screen_resource_destroy(struct pipe_screen *_screen,
354 struct pipe_resource *_resource)
355 {
356 struct trace_screen *tr_scr = trace_screen(_screen);
357 struct trace_resource *tr_res = trace_resource(_resource);
358 struct pipe_screen *screen = tr_scr->screen;
359 struct pipe_resource *resource = tr_res->resource;
360
361 assert(resource->screen == screen);
362
363 trace_dump_call_begin("pipe_screen", "resource_destroy");
364
365 trace_dump_arg(ptr, screen);
366 trace_dump_arg(ptr, resource);
367
368 trace_dump_call_end();
369
370 trace_resource_destroy(tr_scr, tr_res);
371 }
372
373
374 /********************************************************************
375 * fence
376 */
377
378
379 static void
380 trace_screen_fence_reference(struct pipe_screen *_screen,
381 struct pipe_fence_handle **pdst,
382 struct pipe_fence_handle *src)
383 {
384 struct trace_screen *tr_scr = trace_screen(_screen);
385 struct pipe_screen *screen = tr_scr->screen;
386 struct pipe_fence_handle *dst;
387
388 assert(pdst);
389 dst = *pdst;
390
391 trace_dump_call_begin("pipe_screen", "fence_reference");
392
393 trace_dump_arg(ptr, screen);
394 trace_dump_arg(ptr, dst);
395 trace_dump_arg(ptr, src);
396
397 screen->fence_reference(screen, pdst, src);
398
399 trace_dump_call_end();
400 }
401
402
403 static boolean
404 trace_screen_fence_finish(struct pipe_screen *_screen,
405 struct pipe_context *_ctx,
406 struct pipe_fence_handle *fence,
407 uint64_t timeout)
408 {
409 struct trace_screen *tr_scr = trace_screen(_screen);
410 struct pipe_screen *screen = tr_scr->screen;
411 struct pipe_context *ctx = _ctx ? trace_context(_ctx)->pipe : NULL;
412 int result;
413
414 trace_dump_call_begin("pipe_screen", "fence_finish");
415
416 trace_dump_arg(ptr, screen);
417 trace_dump_arg(ptr, ctx);
418 trace_dump_arg(ptr, fence);
419 trace_dump_arg(uint, timeout);
420
421 result = screen->fence_finish(screen, ctx, fence, timeout);
422
423 trace_dump_ret(bool, result);
424
425 trace_dump_call_end();
426
427 return result;
428 }
429
430
431 /********************************************************************
432 * screen
433 */
434
435 static uint64_t
436 trace_screen_get_timestamp(struct pipe_screen *_screen)
437 {
438 struct trace_screen *tr_scr = trace_screen(_screen);
439 struct pipe_screen *screen = tr_scr->screen;
440 uint64_t result;
441
442 trace_dump_call_begin("pipe_screen", "get_timestamp");
443 trace_dump_arg(ptr, screen);
444
445 result = screen->get_timestamp(screen);
446
447 trace_dump_ret(uint, result);
448 trace_dump_call_end();
449
450 return result;
451 }
452
453 static void
454 trace_screen_destroy(struct pipe_screen *_screen)
455 {
456 struct trace_screen *tr_scr = trace_screen(_screen);
457 struct pipe_screen *screen = tr_scr->screen;
458
459 trace_dump_call_begin("pipe_screen", "destroy");
460 trace_dump_arg(ptr, screen);
461 trace_dump_call_end();
462
463 screen->destroy(screen);
464
465 FREE(tr_scr);
466 }
467
468 boolean
469 trace_enabled(void)
470 {
471 static boolean firstrun = TRUE;
472
473 if (!firstrun)
474 return trace;
475 firstrun = FALSE;
476
477 if(trace_dump_trace_begin()) {
478 trace_dumping_start();
479 trace = TRUE;
480 }
481
482 return trace;
483 }
484
485 struct pipe_screen *
486 trace_screen_create(struct pipe_screen *screen)
487 {
488 struct trace_screen *tr_scr;
489
490 if (!trace_enabled())
491 goto error1;
492
493 trace_dump_call_begin("", "pipe_screen_create");
494
495 tr_scr = CALLOC_STRUCT(trace_screen);
496 if (!tr_scr)
497 goto error2;
498
499 tr_scr->base.destroy = trace_screen_destroy;
500 tr_scr->base.get_name = trace_screen_get_name;
501 tr_scr->base.get_vendor = trace_screen_get_vendor;
502 tr_scr->base.get_device_vendor = trace_screen_get_device_vendor;
503 tr_scr->base.get_param = trace_screen_get_param;
504 tr_scr->base.get_shader_param = trace_screen_get_shader_param;
505 tr_scr->base.get_paramf = trace_screen_get_paramf;
506 tr_scr->base.get_compute_param = trace_screen_get_compute_param;
507 tr_scr->base.is_format_supported = trace_screen_is_format_supported;
508 assert(screen->context_create);
509 tr_scr->base.context_create = trace_screen_context_create;
510 tr_scr->base.resource_create = trace_screen_resource_create;
511 tr_scr->base.resource_from_handle = trace_screen_resource_from_handle;
512 tr_scr->base.resource_get_handle = trace_screen_resource_get_handle;
513 tr_scr->base.resource_destroy = trace_screen_resource_destroy;
514 tr_scr->base.fence_reference = trace_screen_fence_reference;
515 tr_scr->base.fence_finish = trace_screen_fence_finish;
516 tr_scr->base.flush_frontbuffer = trace_screen_flush_frontbuffer;
517 tr_scr->base.get_timestamp = trace_screen_get_timestamp;
518
519 tr_scr->screen = screen;
520
521 trace_dump_ret(ptr, screen);
522 trace_dump_call_end();
523
524 return &tr_scr->base;
525
526 error2:
527 trace_dump_ret(ptr, screen);
528 trace_dump_call_end();
529 error1:
530 return screen;
531 }
532
533
534 struct trace_screen *
535 trace_screen(struct pipe_screen *screen)
536 {
537 assert(screen);
538 assert(screen->destroy == trace_screen_destroy);
539 return (struct trace_screen *)screen;
540 }