1 #include "tr_public.h"
2 #include "tr_dump.h"
3 #include "tr_dump_state.h"
4 #include "tr_texture.h"
5 #include "u_inlines.h"
6 #include "u_video.h"
7 #include "tr_video.h"
8 #include "pipe/p_video_codec.h"
9 #include "pipe/p_video_enums.h"
10 #include "util/macros.h"
11 #include "util/u_memory.h"
12 #include "vl/vl_defines.h"
13
14 static void
trace_video_codec_destroy(struct pipe_video_codec * _codec)15 trace_video_codec_destroy(struct pipe_video_codec *_codec)
16 {
17 struct trace_video_codec *tr_vcodec = trace_video_codec(_codec);
18 struct pipe_video_codec *video_codec = tr_vcodec->video_codec;
19
20 trace_dump_call_begin("pipe_video_codec", "destroy");
21 trace_dump_arg(ptr, video_codec);
22 trace_dump_call_end();
23
24 video_codec->destroy(video_codec);
25
26 ralloc_free(tr_vcodec);
27 }
28
29 static void
unwrap_refrence_frames_in_place(struct pipe_video_buffer ** refrence_frames,unsigned max_num_refrence_frame)30 unwrap_refrence_frames_in_place(struct pipe_video_buffer **refrence_frames, unsigned max_num_refrence_frame)
31 {
32 for (unsigned i=0; i < max_num_refrence_frame; i++) {
33 if (refrence_frames[i]) {
34 struct trace_video_buffer *tr_buffer = trace_video_buffer(refrence_frames[i]);
35 refrence_frames[i] = tr_buffer->video_buffer;
36 }
37 }
38 }
39
40 static bool
unwrap_refrence_frames(struct pipe_picture_desc ** picture)41 unwrap_refrence_frames(struct pipe_picture_desc **picture)
42 {
43 // only decode pictures use video buffers for refrences
44 if ((*picture)->entry_point != PIPE_VIDEO_ENTRYPOINT_BITSTREAM)
45 return false;
46 switch (u_reduce_video_profile((*picture)->profile)) {
47 case PIPE_VIDEO_FORMAT_MPEG12: {
48 struct pipe_mpeg12_picture_desc *copied = mem_dup(*picture, sizeof(struct pipe_mpeg12_picture_desc));
49 assert(copied);
50 unwrap_refrence_frames_in_place(copied->ref, ARRAY_SIZE(copied->ref));
51 *picture = (struct pipe_picture_desc*)copied;
52 return true;
53 }
54 case PIPE_VIDEO_FORMAT_MPEG4: {
55 struct pipe_mpeg4_picture_desc *copied = mem_dup(*picture, sizeof(struct pipe_mpeg4_picture_desc));
56 assert(copied);
57 unwrap_refrence_frames_in_place(copied->ref, ARRAY_SIZE(copied->ref));
58 *picture = (struct pipe_picture_desc*)copied;
59 return true;
60 }
61 case PIPE_VIDEO_FORMAT_VC1:{
62 struct pipe_vc1_picture_desc *copied = mem_dup(*picture, sizeof(struct pipe_vc1_picture_desc));
63 assert(copied);
64 unwrap_refrence_frames_in_place(copied->ref, ARRAY_SIZE(copied->ref));
65 *picture = (struct pipe_picture_desc*)copied;
66 return true;
67 }
68 case PIPE_VIDEO_FORMAT_MPEG4_AVC: {
69 struct pipe_h264_picture_desc *copied = mem_dup(*picture, sizeof(struct pipe_h264_picture_desc));
70 assert(copied);
71 unwrap_refrence_frames_in_place(copied->ref, ARRAY_SIZE(copied->ref));
72 *picture = (struct pipe_picture_desc*)copied;
73 return true;
74 }
75 case PIPE_VIDEO_FORMAT_HEVC:{
76 struct pipe_h265_picture_desc *copied = mem_dup(*picture, sizeof(struct pipe_h265_picture_desc));
77 assert(copied);
78 unwrap_refrence_frames_in_place(copied->ref, ARRAY_SIZE(copied->ref));
79 *picture = (struct pipe_picture_desc*)copied;
80 return true;
81 }
82 case PIPE_VIDEO_FORMAT_JPEG:
83 return false;
84 case PIPE_VIDEO_FORMAT_VP9:{
85 struct pipe_vp9_picture_desc *copied = mem_dup(*picture, sizeof(struct pipe_vp9_picture_desc));
86 assert(copied);
87 unwrap_refrence_frames_in_place(copied->ref, ARRAY_SIZE(copied->ref));
88 *picture = (struct pipe_picture_desc*)copied;
89 return true;
90 }
91 case PIPE_VIDEO_FORMAT_AV1:{
92 struct pipe_av1_picture_desc *copied = mem_dup(*picture, sizeof(struct pipe_av1_picture_desc));
93 assert(copied);
94 unwrap_refrence_frames_in_place(copied->ref, ARRAY_SIZE(copied->ref));
95 unwrap_refrence_frames_in_place(&copied->film_grain_target, 1);
96 *picture = (struct pipe_picture_desc*)copied;
97 return true;
98 }
99 case PIPE_VIDEO_FORMAT_UNKNOWN:
100 default:
101 unreachable("unknown video format");
102 }
103 }
104
105 static void
trace_video_codec_begin_frame(struct pipe_video_codec * _codec,struct pipe_video_buffer * _target,struct pipe_picture_desc * picture)106 trace_video_codec_begin_frame(struct pipe_video_codec *_codec,
107 struct pipe_video_buffer *_target,
108 struct pipe_picture_desc *picture)
109 {
110 struct trace_video_codec *tr_vcodec = trace_video_codec(_codec);
111 struct pipe_video_codec *codec = tr_vcodec->video_codec;
112 struct trace_video_buffer *tr_target = trace_video_buffer(_target);
113 struct pipe_video_buffer *target = tr_target->video_buffer;
114
115 trace_dump_call_begin("pipe_video_codec", "begin_frame");
116 trace_dump_arg(ptr, codec);
117 trace_dump_arg(ptr, target);
118 trace_dump_arg(pipe_picture_desc, picture);
119 trace_dump_call_end();
120
121 bool copied = unwrap_refrence_frames(&picture);
122 codec->begin_frame(codec, target, picture);
123 if (copied)
124 FREE(picture);
125 }
126
127 static void
trace_video_codec_decode_macroblock(struct pipe_video_codec * _codec,struct pipe_video_buffer * _target,struct pipe_picture_desc * picture,const struct pipe_macroblock * macroblocks,unsigned num_macroblocks)128 trace_video_codec_decode_macroblock(struct pipe_video_codec *_codec,
129 struct pipe_video_buffer *_target,
130 struct pipe_picture_desc *picture,
131 const struct pipe_macroblock *macroblocks,
132 unsigned num_macroblocks)
133 {
134 struct trace_video_codec *tr_vcodec = trace_video_codec(_codec);
135 struct pipe_video_codec *codec = tr_vcodec->video_codec;
136 struct trace_video_buffer *tr_target = trace_video_buffer(_target);
137 struct pipe_video_buffer *target = tr_target->video_buffer;
138
139 trace_dump_call_begin("pipe_video_codec", "decode_macroblock");
140 trace_dump_arg(ptr, codec);
141 trace_dump_arg(ptr, target);
142 trace_dump_arg(pipe_picture_desc, picture);
143 // TODO: how to dump pipe_macroblocks? It's only a single pointer,
144 // but each struct has codec dependent size, so can't use generic trace_dump_arg_array
145 trace_dump_arg(ptr, macroblocks);
146 trace_dump_arg(uint, num_macroblocks);
147 trace_dump_call_end();
148
149 bool copied = unwrap_refrence_frames(&picture);
150 codec->decode_macroblock(codec, target, picture, macroblocks, num_macroblocks);
151 if (copied)
152 FREE(picture);
153 }
154
155 static void
trace_video_codec_decode_bitstream(struct pipe_video_codec * _codec,struct pipe_video_buffer * _target,struct pipe_picture_desc * picture,unsigned num_buffers,const void * const * buffers,const unsigned * sizes)156 trace_video_codec_decode_bitstream(struct pipe_video_codec *_codec,
157 struct pipe_video_buffer *_target,
158 struct pipe_picture_desc *picture,
159 unsigned num_buffers,
160 const void * const *buffers,
161 const unsigned *sizes)
162 {
163 struct trace_video_codec *tr_vcodec = trace_video_codec(_codec);
164 struct pipe_video_codec *codec = tr_vcodec->video_codec;
165 struct trace_video_buffer *tr_target = trace_video_buffer(_target);
166 struct pipe_video_buffer *target = tr_target->video_buffer;
167
168 trace_dump_call_begin("pipe_video_codec", "decode_bitstream");
169 trace_dump_arg(ptr, codec);
170 trace_dump_arg(ptr, target);
171 trace_dump_arg(pipe_picture_desc, picture);
172
173 trace_dump_arg(uint, num_buffers);
174 trace_dump_arg_array(ptr, buffers, num_buffers);
175 trace_dump_arg_array(uint, sizes, num_buffers);
176 trace_dump_call_end();
177
178 bool copied = unwrap_refrence_frames(&picture);
179 codec->decode_bitstream(codec, target, picture, num_buffers, buffers, sizes);
180 if (copied)
181 FREE(picture);
182 }
183
184 static void
trace_video_codec_encode_bitstream(struct pipe_video_codec * _codec,struct pipe_video_buffer * _source,struct pipe_resource * destination,void ** feedback)185 trace_video_codec_encode_bitstream(struct pipe_video_codec *_codec,
186 struct pipe_video_buffer *_source,
187 struct pipe_resource *destination,
188 void **feedback)
189 {
190 struct trace_video_codec *tr_vcodec = trace_video_codec(_codec);
191 struct pipe_video_codec *codec = tr_vcodec->video_codec;
192 struct trace_video_buffer *tr_source = trace_video_buffer(_source);
193 struct pipe_video_buffer *source = tr_source->video_buffer;
194
195 trace_dump_call_begin("pipe_video_codec", "encode_bitstream");
196 trace_dump_arg(ptr, codec);
197 trace_dump_arg(ptr, source);
198 trace_dump_arg(ptr, destination);
199 trace_dump_arg(ptr, feedback);
200 trace_dump_call_end();
201
202 codec->encode_bitstream(codec, source, destination, feedback);
203 }
204
205 static void
trace_video_codec_process_frame(struct pipe_video_codec * _codec,struct pipe_video_buffer * _source,const struct pipe_vpp_desc * process_properties)206 trace_video_codec_process_frame(struct pipe_video_codec *_codec,
207 struct pipe_video_buffer *_source,
208 const struct pipe_vpp_desc *process_properties)
209 {
210 struct trace_video_codec *tr_vcodec = trace_video_codec(_codec);
211 struct pipe_video_codec *codec = tr_vcodec->video_codec;
212 struct trace_video_buffer *tr_source = trace_video_buffer(_source);
213 struct pipe_video_buffer *source = tr_source->video_buffer;
214
215 trace_dump_call_begin("pipe_video_codec", "process_frame");
216 trace_dump_arg(ptr, codec);
217 trace_dump_arg(ptr, source);
218 trace_dump_arg(pipe_vpp_desc, process_properties);
219 trace_dump_call_end();
220
221 codec->process_frame(codec, source, process_properties);
222 }
223
224 static int
trace_video_codec_end_frame(struct pipe_video_codec * _codec,struct pipe_video_buffer * _target,struct pipe_picture_desc * picture)225 trace_video_codec_end_frame(struct pipe_video_codec *_codec,
226 struct pipe_video_buffer *_target,
227 struct pipe_picture_desc *picture)
228 {
229 struct trace_video_codec *tr_vcodec = trace_video_codec(_codec);
230 struct pipe_video_codec *codec = tr_vcodec->video_codec;
231 struct trace_video_buffer *tr_target = trace_video_buffer(_target);
232 struct pipe_video_buffer *target = tr_target->video_buffer;
233
234 trace_dump_call_begin("pipe_video_codec", "end_frame");
235 trace_dump_arg(ptr, codec);
236 trace_dump_arg(ptr, target);
237 trace_dump_arg(pipe_picture_desc, picture);
238 trace_dump_call_end();
239
240 bool copied = unwrap_refrence_frames(&picture);
241 codec->end_frame(codec, target, picture);
242 if (copied)
243 FREE(picture);
244 return 0;
245 }
246
247 static void
trace_video_codec_flush(struct pipe_video_codec * _codec)248 trace_video_codec_flush(struct pipe_video_codec *_codec)
249 {
250 struct trace_video_codec *tr_vcodec = trace_video_codec(_codec);
251 struct pipe_video_codec *codec = tr_vcodec->video_codec;
252
253 trace_dump_call_begin("pipe_video_codec", "flush");
254 trace_dump_arg(ptr, codec);
255 trace_dump_call_end();
256
257 codec->flush(codec);
258 }
259
260 static void
trace_video_codec_get_feedback(struct pipe_video_codec * _codec,void * feedback,unsigned * size,struct pipe_enc_feedback_metadata * metadata)261 trace_video_codec_get_feedback(struct pipe_video_codec *_codec,
262 void *feedback,
263 unsigned *size,
264 struct pipe_enc_feedback_metadata* metadata)
265 {
266 struct trace_video_codec *tr_vcodec = trace_video_codec(_codec);
267 struct pipe_video_codec *codec = tr_vcodec->video_codec;
268
269 trace_dump_call_begin("pipe_video_codec", "get_feedback");
270 trace_dump_arg(ptr, codec);
271 trace_dump_arg(ptr, feedback);
272 trace_dump_arg(ptr, size);
273 trace_dump_call_end();
274
275 codec->get_feedback(codec, feedback, size, metadata);
276 }
277
278 static int
trace_video_codec_get_decoder_fence(struct pipe_video_codec * _codec,struct pipe_fence_handle * fence,uint64_t timeout)279 trace_video_codec_get_decoder_fence(struct pipe_video_codec *_codec,
280 struct pipe_fence_handle *fence,
281 uint64_t timeout)
282 {
283 struct trace_video_codec *tr_vcodec = trace_video_codec(_codec);
284 struct pipe_video_codec *codec = tr_vcodec->video_codec;
285
286 trace_dump_call_begin("pipe_video_codec", "get_decoder_fence");
287 trace_dump_arg(ptr, codec);
288 trace_dump_arg(ptr, fence);
289 trace_dump_arg(uint, timeout);
290
291 int ret = codec->get_decoder_fence(codec, fence, timeout);
292
293 trace_dump_ret(int, ret);
294 trace_dump_call_end();
295
296 return ret;
297 }
298
299 static int
trace_video_codec_get_processor_fence(struct pipe_video_codec * _codec,struct pipe_fence_handle * fence,uint64_t timeout)300 trace_video_codec_get_processor_fence(struct pipe_video_codec *_codec,
301 struct pipe_fence_handle *fence,
302 uint64_t timeout)
303 {
304 struct trace_video_codec *tr_vcodec = trace_video_codec(_codec);
305 struct pipe_video_codec *codec = tr_vcodec->video_codec;
306
307 trace_dump_call_begin("pipe_video_codec", "get_processor_fence");
308 trace_dump_arg(ptr, codec);
309 trace_dump_arg(ptr, fence);
310 trace_dump_arg(uint, timeout);
311
312 int ret = codec->get_processor_fence(codec, fence, timeout);
313
314 trace_dump_ret(int, ret);
315 trace_dump_call_end();
316
317 return ret;
318 }
319
320 static void
trace_video_codec_update_decoder_target(struct pipe_video_codec * _codec,struct pipe_video_buffer * _old,struct pipe_video_buffer * _updated)321 trace_video_codec_update_decoder_target(struct pipe_video_codec *_codec,
322 struct pipe_video_buffer *_old,
323 struct pipe_video_buffer *_updated)
324 {
325 struct trace_video_codec *tr_vcodec = trace_video_codec(_codec);
326 struct pipe_video_codec *codec = tr_vcodec->video_codec;
327 struct trace_video_buffer *tr_old = trace_video_buffer(_old);
328 struct pipe_video_buffer *old = tr_old->video_buffer;
329 struct trace_video_buffer *tr_updated = trace_video_buffer(_updated);
330 struct pipe_video_buffer *updated = tr_updated->video_buffer;
331
332 trace_dump_call_begin("pipe_video_codec", "update_decoder_target");
333 trace_dump_arg(ptr, codec);
334 trace_dump_arg(ptr, old);
335 trace_dump_arg(ptr, updated);
336 trace_dump_call_end();
337
338 codec->update_decoder_target(codec, old, updated);
339 }
340
341 struct pipe_video_codec *
trace_video_codec_create(struct trace_context * tr_ctx,struct pipe_video_codec * video_codec)342 trace_video_codec_create(struct trace_context *tr_ctx,
343 struct pipe_video_codec *video_codec)
344 {
345 struct trace_video_codec *tr_vcodec;
346
347 if (!video_codec)
348 goto error1;
349
350 if (!trace_enabled())
351 goto error1;
352
353 tr_vcodec = rzalloc(NULL, struct trace_video_codec);
354 if (!tr_vcodec)
355 goto error1;
356
357 memcpy(&tr_vcodec->base, video_codec, sizeof(struct pipe_video_codec));
358 tr_vcodec->base.context = &tr_ctx->base;
359
360 #define TR_VC_INIT(_member) \
361 tr_vcodec->base . _member = video_codec -> _member ? trace_video_codec_ ## _member : NULL
362
363 TR_VC_INIT(destroy);
364 TR_VC_INIT(begin_frame);
365 TR_VC_INIT(decode_macroblock);
366 TR_VC_INIT(decode_bitstream);
367 TR_VC_INIT(encode_bitstream);
368 TR_VC_INIT(process_frame);
369 TR_VC_INIT(end_frame);
370 TR_VC_INIT(flush);
371 TR_VC_INIT(get_feedback);
372 TR_VC_INIT(get_decoder_fence);
373 TR_VC_INIT(get_processor_fence);
374 TR_VC_INIT(update_decoder_target);
375
376 #undef TR_VC_INIT
377
378 tr_vcodec->video_codec = video_codec;
379
380 return &tr_vcodec->base;
381
382 error1:
383 return video_codec;
384 }
385
386
387 static void
trace_video_buffer_destroy(struct pipe_video_buffer * _buffer)388 trace_video_buffer_destroy(struct pipe_video_buffer *_buffer)
389 {
390 struct trace_video_buffer *tr_vbuffer = trace_video_buffer(_buffer);
391 struct pipe_video_buffer *video_buffer = tr_vbuffer->video_buffer;
392
393 trace_dump_call_begin("pipe_video_buffer", "destroy");
394 trace_dump_arg(ptr, video_buffer);
395 trace_dump_call_end();
396
397 for (int i=0; i < VL_NUM_COMPONENTS; i++) {
398 pipe_sampler_view_reference(&tr_vbuffer->sampler_view_planes[i], NULL);
399 pipe_sampler_view_reference(&tr_vbuffer->sampler_view_components[i], NULL);
400 }
401 for (int i=0; i < VL_MAX_SURFACES; i++) {
402 pipe_surface_reference(&tr_vbuffer->surfaces[i], NULL);
403 }
404 video_buffer->destroy(video_buffer);
405
406 ralloc_free(tr_vbuffer);
407 }
408
409 static void
trace_video_buffer_get_resources(struct pipe_video_buffer * _buffer,struct pipe_resource ** resources)410 trace_video_buffer_get_resources(struct pipe_video_buffer *_buffer, struct pipe_resource **resources)
411 {
412 struct trace_video_buffer *tr_vbuffer = trace_video_buffer(_buffer);
413 struct pipe_video_buffer *buffer = tr_vbuffer->video_buffer;
414
415 trace_dump_call_begin("pipe_video_buffer", "get_resources");
416 trace_dump_arg(ptr, buffer);
417
418 buffer->get_resources(buffer, resources);
419
420 // TODO: A `trace_dump_ret_arg` style of function would be more appropriate
421 trace_dump_arg_array(ptr, resources, VL_NUM_COMPONENTS);
422 trace_dump_call_end();
423 }
424
425 static struct pipe_sampler_view **
trace_video_buffer_get_sampler_view_planes(struct pipe_video_buffer * _buffer)426 trace_video_buffer_get_sampler_view_planes(struct pipe_video_buffer *_buffer)
427 {
428 struct trace_context *tr_ctx = trace_context(_buffer->context);
429 struct trace_video_buffer *tr_vbuffer = trace_video_buffer(_buffer);
430 struct pipe_video_buffer *buffer = tr_vbuffer->video_buffer;
431
432 trace_dump_call_begin("pipe_video_buffer", "get_sampler_view_planes");
433 trace_dump_arg(ptr, buffer);
434
435 struct pipe_sampler_view **view_planes = buffer->get_sampler_view_planes(buffer);
436
437 trace_dump_ret_array(ptr, view_planes, VL_NUM_COMPONENTS);
438 trace_dump_call_end();
439
440 for (int i=0; i < VL_NUM_COMPONENTS; i++) {
441 if (!view_planes || !view_planes[i]) {
442 pipe_sampler_view_reference(&tr_vbuffer->sampler_view_planes[i], NULL);
443 } else if (tr_vbuffer->sampler_view_planes[i] == NULL || (trace_sampler_view(tr_vbuffer->sampler_view_planes[i])->sampler_view != view_planes[i])) {
444 pipe_sampler_view_reference(&tr_vbuffer->sampler_view_planes[i], trace_sampler_view_create(tr_ctx, view_planes[i]->texture, view_planes[i]));
445 }
446 }
447
448 return view_planes ? tr_vbuffer->sampler_view_planes : NULL;
449 }
450
451 static struct pipe_sampler_view **
trace_video_buffer_get_sampler_view_components(struct pipe_video_buffer * _buffer)452 trace_video_buffer_get_sampler_view_components(struct pipe_video_buffer *_buffer)
453 {
454 struct trace_context *tr_ctx = trace_context(_buffer->context);
455 struct trace_video_buffer *tr_vbuffer = trace_video_buffer(_buffer);
456 struct pipe_video_buffer *buffer = tr_vbuffer->video_buffer;
457
458 trace_dump_call_begin("pipe_video_buffer", "get_sampler_view_components");
459 trace_dump_arg(ptr, buffer);
460
461 struct pipe_sampler_view **view_components = buffer->get_sampler_view_components(buffer);
462
463 trace_dump_ret_array(ptr, view_components, VL_NUM_COMPONENTS);
464 trace_dump_call_end();
465
466 for (int i=0; i < VL_NUM_COMPONENTS; i++) {
467 if (!view_components || !view_components[i]) {
468 pipe_sampler_view_reference(&tr_vbuffer->sampler_view_components[i], NULL);
469 } else if (tr_vbuffer->sampler_view_components[i] == NULL || (trace_sampler_view(tr_vbuffer->sampler_view_components[i])->sampler_view != view_components[i])) {
470 pipe_sampler_view_reference(&tr_vbuffer->sampler_view_components[i], trace_sampler_view_create(tr_ctx, view_components[i]->texture, view_components[i]));
471 }
472 }
473
474 return view_components ? tr_vbuffer->sampler_view_components : NULL;
475 }
476
477 static struct pipe_surface **
trace_video_buffer_get_surfaces(struct pipe_video_buffer * _buffer)478 trace_video_buffer_get_surfaces(struct pipe_video_buffer *_buffer)
479 {
480 struct trace_context *tr_ctx = trace_context(_buffer->context);
481 struct trace_video_buffer *tr_vbuffer = trace_video_buffer(_buffer);
482 struct pipe_video_buffer *buffer = tr_vbuffer->video_buffer;
483
484 trace_dump_call_begin("pipe_video_buffer", "get_surfaces");
485 trace_dump_arg(ptr, buffer);
486
487 struct pipe_surface **surfaces = buffer->get_surfaces(buffer);
488
489 trace_dump_ret_array(ptr, surfaces, VL_MAX_SURFACES);
490 trace_dump_call_end();
491
492 for (int i=0; i < VL_MAX_SURFACES; i++) {
493 if (!surfaces || !surfaces[i]) {
494 pipe_surface_reference(&tr_vbuffer->surfaces[i], NULL);
495 } else if (tr_vbuffer->surfaces[i] == NULL || (trace_surface(tr_vbuffer->surfaces[i])->surface != surfaces[i])){
496 pipe_surface_reference(&tr_vbuffer->surfaces[i], trace_surf_create(tr_ctx, surfaces[i]->texture, surfaces[i]));
497 }
498 }
499
500 return surfaces ? tr_vbuffer->surfaces : NULL;
501 }
502
503
504 struct pipe_video_buffer *
trace_video_buffer_create(struct trace_context * tr_ctx,struct pipe_video_buffer * video_buffer)505 trace_video_buffer_create(struct trace_context *tr_ctx,
506 struct pipe_video_buffer *video_buffer)
507 {
508 struct trace_video_buffer *tr_vbuffer;
509
510 if (!video_buffer)
511 goto error1;
512
513 if (!trace_enabled())
514 goto error1;
515
516 tr_vbuffer = rzalloc(NULL, struct trace_video_buffer);
517 if (!tr_vbuffer)
518 goto error1;
519
520 memcpy(&tr_vbuffer->base, video_buffer, sizeof(struct pipe_video_buffer));
521 tr_vbuffer->base.context = &tr_ctx->base;
522
523 #define TR_VB_INIT(_member) \
524 tr_vbuffer->base . _member = video_buffer -> _member ? trace_video_buffer_ ## _member : NULL
525
526 TR_VB_INIT(destroy);
527 TR_VB_INIT(get_resources);
528 TR_VB_INIT(get_sampler_view_planes);
529 TR_VB_INIT(get_sampler_view_components);
530 TR_VB_INIT(get_surfaces);
531
532 #undef TR_VB_INIT
533
534 tr_vbuffer->video_buffer = video_buffer;
535
536 return &tr_vbuffer->base;
537
538 error1:
539 return video_buffer;
540 }
541