xref: /aosp_15_r20/external/mesa3d/src/gallium/auxiliary/driver_trace/tr_video.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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