summaryrefslogtreecommitdiff
path: root/trace/vdpau_trace.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trace/vdpau_trace.cpp')
-rw-r--r--trace/vdpau_trace.cpp4293
1 files changed, 4293 insertions, 0 deletions
diff --git a/trace/vdpau_trace.cpp b/trace/vdpau_trace.cpp
new file mode 100644
index 0000000..ae43973
--- /dev/null
+++ b/trace/vdpau_trace.cpp
@@ -0,0 +1,4293 @@
+/*
+ * Copyright (c) 2008-2009 NVIDIA, Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#define __STDC_FORMAT_MACROS
+#define __STDC_LIMIT_MACROS
+#include <inttypes.h>
+
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <vdpau/vdpau_x11.h>
+
+#define _VDP_TRACE_ARSIZE(_x_) ((sizeof (_x_)) / (sizeof ((_x_)[0])))
+
+#if DEBUG
+
+static void _vdp_trace_error_breakpoint(char const * file, int line, char const * function)
+{
+ fprintf(stderr, "VDPAU trace:: Error detected at %s:%d %s()\n", file, line, function);
+}
+
+#define _VDP_TRACE_ERROR_BREAKPOINT() _vdp_trace_error_breakpoint(__FILE__, __LINE__, __FUNCTION__)
+
+#else
+
+#define _VDP_TRACE_ERROR_BREAKPOINT()
+
+#endif
+
+#define LEVEL_PARAMS 1
+#define LEVEL_DATA 2
+
+struct _VdpCapData {
+ void * dll;
+
+ int level;
+ FILE * fp;
+
+ VdpDevice vdp_device;
+ VdpGetProcAddress * vdp_get_proc_address;
+
+ VdpGetErrorString * vdp_get_error_string;
+ VdpGetApiVersion * vdp_get_api_version;
+ VdpGetInformationString * vdp_get_information_string;
+ VdpDeviceDestroy * vdp_device_destroy;
+ VdpGenerateCSCMatrix * vdp_generate_csc_matrix;
+ VdpVideoSurfaceQueryCapabilities * vdp_video_surface_query_capabilities;
+ VdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities * vdp_video_surface_query_get_put_bits_y_cb_cr_capabilities;
+ VdpVideoSurfaceCreate * vdp_video_surface_create;
+ VdpVideoSurfaceDestroy * vdp_video_surface_destroy;
+ VdpVideoSurfaceGetParameters * vdp_video_surface_get_parameters;
+ VdpVideoSurfaceGetBitsYCbCr * vdp_video_surface_get_bits_y_cb_cr;
+ VdpVideoSurfacePutBitsYCbCr * vdp_video_surface_put_bits_y_cb_cr;
+ VdpOutputSurfaceQueryCapabilities * vdp_output_surface_query_capabilities;
+ VdpOutputSurfaceQueryGetPutBitsNativeCapabilities * vdp_output_surface_query_get_put_bits_native_capabilities;
+ VdpOutputSurfaceQueryPutBitsIndexedCapabilities * vdp_output_surface_query_put_bits_indexed_capabilities;
+ VdpOutputSurfaceQueryPutBitsYCbCrCapabilities * vdp_output_surface_query_put_bits_y_cb_cr_capabilities;
+ VdpOutputSurfaceCreate * vdp_output_surface_create;
+ VdpOutputSurfaceDestroy * vdp_output_surface_destroy;
+ VdpOutputSurfaceGetParameters * vdp_output_surface_get_parameters;
+ VdpOutputSurfaceGetBitsNative * vdp_output_surface_get_bits_native;
+ VdpOutputSurfacePutBitsNative * vdp_output_surface_put_bits_native;
+ VdpOutputSurfacePutBitsIndexed * vdp_output_surface_put_bits_indexed;
+ VdpOutputSurfacePutBitsYCbCr * vdp_output_surface_put_bits_y_cb_cr;
+ VdpBitmapSurfaceQueryCapabilities * vdp_bitmap_surface_query_capabilities;
+ VdpBitmapSurfaceCreate * vdp_bitmap_surface_create;
+ VdpBitmapSurfaceDestroy * vdp_bitmap_surface_destroy;
+ VdpBitmapSurfaceGetParameters * vdp_bitmap_surface_get_parameters;
+ VdpBitmapSurfacePutBitsNative * vdp_bitmap_surface_put_bits_native;
+ VdpOutputSurfaceRenderOutputSurface * vdp_output_surface_render_output_surface;
+ VdpOutputSurfaceRenderBitmapSurface * vdp_output_surface_render_bitmap_surface;
+ VdpDecoderQueryCapabilities * vdp_decoder_query_capabilities;
+ VdpDecoderCreate * vdp_decoder_create;
+ VdpDecoderDestroy * vdp_decoder_destroy;
+ VdpDecoderGetParameters * vdp_decoder_get_parameters;
+ VdpDecoderRender * vdp_decoder_render;
+ VdpVideoMixerQueryFeatureSupport * vdp_video_mixer_query_feature_support;
+ VdpVideoMixerQueryParameterSupport * vdp_video_mixer_query_parameter_support;
+ VdpVideoMixerQueryAttributeSupport * vdp_video_mixer_query_attribute_support;
+ VdpVideoMixerQueryParameterValueRange * vdp_video_mixer_query_parameter_value_range;
+ VdpVideoMixerQueryAttributeValueRange * vdp_video_mixer_query_attribute_value_range;
+ VdpVideoMixerCreate * vdp_video_mixer_create;
+ VdpVideoMixerSetFeatureEnables * vdp_video_mixer_set_feature_enables;
+ VdpVideoMixerSetAttributeValues * vdp_video_mixer_set_attribute_values;
+ VdpVideoMixerGetFeatureSupport * vdp_video_mixer_get_feature_support;
+ VdpVideoMixerGetFeatureEnables * vdp_video_mixer_get_feature_enables;
+ VdpVideoMixerGetParameterValues * vdp_video_mixer_get_parameter_values;
+ VdpVideoMixerGetAttributeValues * vdp_video_mixer_get_attribute_values;
+ VdpVideoMixerDestroy * vdp_video_mixer_destroy;
+ VdpVideoMixerRender * vdp_video_mixer_render;
+ VdpPresentationQueueTargetDestroy * vdp_presentation_queue_target_destroy;
+ VdpPresentationQueueCreate * vdp_presentation_queue_create;
+ VdpPresentationQueueDestroy * vdp_presentation_queue_destroy;
+ VdpPresentationQueueSetBackgroundColor * vdp_presentation_queue_set_background_color;
+ VdpPresentationQueueGetBackgroundColor * vdp_presentation_queue_get_background_color;
+ VdpPresentationQueueGetTime * vdp_presentation_queue_get_time;
+ VdpPresentationQueueDisplay * vdp_presentation_queue_display;
+ VdpPresentationQueueBlockUntilSurfaceIdle * vdp_presentation_queue_block_until_surface_idle;
+ VdpPresentationQueueQuerySurfaceStatus * vdp_presentation_queue_query_surface_status;
+ VdpPreemptionCallbackRegister * vdp_preemption_callback_register;
+ VdpPresentationQueueTargetCreateX11 * vdp_presentation_queue_target_create_x11;
+};
+
+static _VdpCapData _vdp_cap_data;
+
+template<class T> static inline T const delta(T const & a, T const & b)
+{
+ if (a < b) {
+ return b - a;
+ }
+ else {
+ return a - b;
+ }
+}
+
+static void _vdp_cap_dump_procamp(VdpProcamp * procamp)
+{
+ if (!procamp) {
+ fprintf(_vdp_cap_data.fp, "NULL");
+ return;
+ }
+
+ fprintf(
+ _vdp_cap_data.fp,
+ "{(ver=%d)%s %f, %f, %f, %f}",
+ procamp->struct_version,
+ (procamp->struct_version > 0)
+ ? "(unsupported; cannot dump all fields)"
+ : "",
+ procamp->brightness,
+ procamp->contrast,
+ procamp->saturation,
+ procamp->hue
+ );
+}
+
+static void _vdp_cap_dump_color(
+ VdpColor const * color
+)
+{
+ if (!color) {
+ fputs("NULL", _vdp_cap_data.fp);
+ return;
+ }
+
+ fprintf(
+ _vdp_cap_data.fp,
+ "{%f, %f, %f, %f}",
+ color->red,
+ color->green,
+ color->blue,
+ color->alpha
+ );
+}
+
+static void _vdp_cap_dump_point(
+ VdpPoint const * point
+)
+{
+ if (!point) {
+ fprintf(_vdp_cap_data.fp, "NULL");
+ return;
+ }
+
+ fprintf(
+ _vdp_cap_data.fp,
+ "{%u, %u}",
+ point->x,
+ point->y
+ );
+}
+
+static void _vdp_cap_dump_rect(
+ VdpRect const * rect
+)
+{
+ if (!rect) {
+ fprintf(_vdp_cap_data.fp, "NULL");
+ return;
+ }
+
+ fprintf(
+ _vdp_cap_data.fp,
+ "{%u, %u, %u, %u}",
+ rect->x0,
+ rect->y0,
+ rect->x1,
+ rect->y1
+ );
+}
+
+static void _vdp_cap_dump_csc_matrix(
+ VdpCSCMatrix const * matrix
+)
+{
+ if (!matrix) {
+ fprintf(_vdp_cap_data.fp, "NULL");
+ return;
+ }
+
+ fprintf(
+ _vdp_cap_data.fp,
+ "{{%f, %f, %f, %f}, {%f, %f, %f, %f}, {%f, %f, %f, %f}}",
+ (*matrix)[0][0],
+ (*matrix)[0][1],
+ (*matrix)[0][2],
+ (*matrix)[0][3],
+ (*matrix)[1][0],
+ (*matrix)[1][1],
+ (*matrix)[1][2],
+ (*matrix)[1][3],
+ (*matrix)[2][0],
+ (*matrix)[2][1],
+ (*matrix)[2][2],
+ (*matrix)[2][3]
+ );
+}
+
+static void _vdp_cap_dump_blend_state(
+ VdpOutputSurfaceRenderBlendState const * blend_state
+)
+{
+ if (!blend_state) {
+ fprintf(_vdp_cap_data.fp, "NULL");
+ return;
+ }
+
+ fprintf(
+ _vdp_cap_data.fp,
+ "{(ver=%d)%s %u, %u, %u, %u, %u, %u, ",
+ blend_state->struct_version,
+ (blend_state->struct_version > 0)
+ ? "(unsupported; cannot dump all fields)"
+ : "",
+ blend_state->blend_factor_source_color,
+ blend_state->blend_factor_destination_color,
+ blend_state->blend_factor_source_alpha,
+ blend_state->blend_factor_destination_alpha,
+ blend_state->blend_equation_color,
+ blend_state->blend_equation_alpha
+ );
+ _vdp_cap_dump_color(&(blend_state->blend_constant));
+ fputs("}", _vdp_cap_data.fp);
+}
+
+static void _vdp_cap_dump_picture_info(
+ VdpDecoderProfile profile,
+ VdpPictureInfo const * picture_info
+)
+{
+ VdpPictureInfoMPEG1Or2 const * picture_info_mpeg1or2;
+
+ switch (profile) {
+ case VDP_DECODER_PROFILE_MPEG1:
+ case VDP_DECODER_PROFILE_MPEG2_SIMPLE:
+ case VDP_DECODER_PROFILE_MPEG2_MAIN:
+ picture_info_mpeg1or2 = (VdpPictureInfoMPEG1Or2 const *)picture_info;
+
+ fprintf(
+ _vdp_cap_data.fp,
+ "{%u, %u, %u, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, {{%d, %d}, {%d, %d}}, {",
+ picture_info_mpeg1or2->forward_reference,
+ picture_info_mpeg1or2->backward_reference,
+ picture_info_mpeg1or2->slice_count,
+ picture_info_mpeg1or2->picture_structure,
+ picture_info_mpeg1or2->picture_coding_type,
+ picture_info_mpeg1or2->intra_dc_precision,
+ picture_info_mpeg1or2->frame_pred_frame_dct,
+ picture_info_mpeg1or2->concealment_motion_vectors,
+ picture_info_mpeg1or2->intra_vlc_format,
+ picture_info_mpeg1or2->alternate_scan,
+ picture_info_mpeg1or2->q_scale_type,
+ picture_info_mpeg1or2->top_field_first,
+ picture_info_mpeg1or2->full_pel_forward_vector,
+ picture_info_mpeg1or2->full_pel_backward_vector,
+ picture_info_mpeg1or2->f_code[0][0],
+ picture_info_mpeg1or2->f_code[0][1],
+ picture_info_mpeg1or2->f_code[1][0],
+ picture_info_mpeg1or2->f_code[1][1]
+ );
+ for (uint32_t i = 0; i < _VDP_TRACE_ARSIZE(picture_info_mpeg1or2->intra_quantizer_matrix); ++i) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%s%d",
+ (i == 0) ? "" : ", ",
+ picture_info_mpeg1or2->intra_quantizer_matrix[i]
+ );
+ }
+ fputs("}, {", _vdp_cap_data.fp);
+ for (uint32_t i = 0; i < _VDP_TRACE_ARSIZE(picture_info_mpeg1or2->non_intra_quantizer_matrix); ++i) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%s%d",
+ (i == 0) ? "" : ", ",
+ picture_info_mpeg1or2->non_intra_quantizer_matrix[i]
+ );
+ }
+ fputs("}}", _vdp_cap_data.fp);
+ break;
+ case VDP_DECODER_PROFILE_H264_BASELINE:
+ case VDP_DECODER_PROFILE_H264_MAIN:
+ case VDP_DECODER_PROFILE_H264_HIGH:
+ case VDP_DECODER_PROFILE_VC1_SIMPLE:
+ case VDP_DECODER_PROFILE_VC1_MAIN:
+ case VDP_DECODER_PROFILE_VC1_ADVANCED:
+ // FIXME: Dump all the other types too.
+ // For now, just deliberately fall through
+ default:
+ fputs("{...}", _vdp_cap_data.fp);
+ break;
+ }
+}
+
+static void _vdp_cap_dump_video_mixer_parameter_value(
+ VdpVideoMixerParameter parameter,
+ void const * value
+)
+{
+ switch (parameter) {
+ case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH:
+ case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT:
+ case VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE:
+ case VDP_VIDEO_MIXER_PARAMETER_LAYERS:
+ if (!value) {
+ fputs("???", _vdp_cap_data.fp);
+ }
+ else {
+ fprintf(_vdp_cap_data.fp, "%u", *(uint32_t const *)value);
+ }
+ break;
+ default:
+ fputs("???", _vdp_cap_data.fp);
+ break;
+ }
+}
+
+static void _vdp_cap_dump_video_mixer_attribute_value(
+ VdpVideoMixerAttribute attribute,
+ void const * value,
+ bool get_operation
+)
+{
+ if (!value) {
+ fputs("NULL", _vdp_cap_data.fp);
+ return;
+ }
+
+ switch (attribute) {
+ case VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR:
+ _vdp_cap_dump_color((VdpColor const *)value);
+ break;
+ case VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX:
+ {
+ // We don't really need/want to cast away the const here,
+ // but the buggy compiler thinks we are, even when we don't.
+ // The const_cast tells it to quit complaining.
+ VdpCSCMatrix * ptr;
+
+ // For some objects, the "default" value is a NULL pointer.
+ // So, VdpVideoMixerGetAttributeValues expects a double pointer to
+ // the value, so it can either fill in the value, or NULL out the
+ // pointer.
+ if (get_operation) {
+ VdpCSCMatrix * * dptr = (VdpCSCMatrix * *)const_cast<void *>(value);
+ if (!dptr) {
+ return;
+ }
+ ptr = *dptr;
+ }
+ else {
+ ptr = (VdpCSCMatrix *)const_cast<void *>(value);
+ }
+ _vdp_cap_dump_csc_matrix(ptr);
+ }
+ break;
+ case VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL:
+ case VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL:
+ case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA:
+ case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA:
+ fprintf(_vdp_cap_data.fp, "%f", *(float const *)value);
+ break;
+ default:
+ fputs("???", _vdp_cap_data.fp);
+ break;
+ }
+}
+
+static void _vdp_cap_dump_uint8_t_stream(
+ uint32_t count,
+ uint8_t const * values
+)
+{
+ if (!values) {
+ fputs("NULL", _vdp_cap_data.fp);
+ return;
+ }
+
+ fputs("{", _vdp_cap_data.fp);
+ while (count) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%02x",
+ values[0]
+ );
+
+ --count;
+ ++values;
+ }
+ fputs("}", _vdp_cap_data.fp);
+}
+
+static void _vdp_cap_dump_uint32_t_stream(
+ uint32_t count,
+ uint32_t const * values
+)
+{
+ if (!values) {
+ fputs("NULL", _vdp_cap_data.fp);
+ return;
+ }
+
+ fputs("{", _vdp_cap_data.fp);
+ while (count) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%08x%s",
+ values[0],
+ (count > 1) ? " " : ""
+ );
+
+ --count;
+ ++values;
+ }
+ fputs("}", _vdp_cap_data.fp);
+}
+
+struct _VdpcapPlane {
+ void const * data;
+ uint32_t pitch;
+ uint32_t item_count;
+ uint32_t item_size;
+ uint32_t lines;
+};
+
+typedef void _VdpcapPlaneDumper(uint32_t count, void const * values);
+
+static void _vdp_cap_dump_plane_list(
+ uint32_t plane_count,
+ _VdpcapPlane const * planes
+)
+{
+ if (!planes) {
+ fputs("NULL", _vdp_cap_data.fp);
+ return;
+ }
+
+ fputs("{", _vdp_cap_data.fp);
+ while (plane_count) {
+ uint32_t lines = planes[0].lines;
+
+ _VdpcapPlaneDumper * dumper;
+ if (planes[0].item_size == 4) {
+ dumper = (_VdpcapPlaneDumper*)_vdp_cap_dump_uint32_t_stream;
+ }
+ else {
+ dumper = (_VdpcapPlaneDumper*)_vdp_cap_dump_uint8_t_stream;
+ }
+
+ fputs("{", _vdp_cap_data.fp);
+ uint8_t const * ptr = (uint8_t const *)planes[0].data;
+ while (lines) {
+ dumper(planes[0].item_count, ptr);
+ if (lines > 1) {
+ fputs(", ", _vdp_cap_data.fp);
+ }
+
+ ptr += planes[0].pitch;
+ --lines;
+ }
+ fputs("}", _vdp_cap_data.fp);
+
+ if (plane_count > 1) {
+ fputs(", ", _vdp_cap_data.fp);
+ }
+
+ --plane_count;
+ ++planes;
+ }
+ fputs("}", _vdp_cap_data.fp);
+}
+
+static bool _vdp_cap_init_planes_for_ycbcr_format(
+ uint32_t * plane_count,
+ _VdpcapPlane * planes,
+ VdpYCbCrFormat format,
+ uint32_t region_width,
+ uint32_t region_height
+)
+{
+ switch (format) {
+ case VDP_YCBCR_FORMAT_NV12:
+ if (*plane_count < 2) {
+ return false;
+ }
+ *plane_count = 2;
+ planes[0].item_size = 1;
+ planes[0].item_count = region_width;
+ planes[0].lines = region_height;
+ planes[1].item_size = 1;
+ planes[1].item_count = region_width;
+ planes[1].lines = region_height / 2;
+ break;
+ case VDP_YCBCR_FORMAT_YV12:
+ if (*plane_count < 3) {
+ return false;
+ }
+ *plane_count = 3;
+ planes[0].item_size = 1;
+ planes[0].item_count = region_width;
+ planes[0].lines = region_height;
+ planes[1].item_size = 1;
+ planes[1].item_count = region_width / 2;
+ planes[1].lines = region_height / 2;
+ planes[2].item_size = 1;
+ planes[2].item_count = region_width / 2;
+ planes[2].lines = region_height / 2;
+ break;
+ case VDP_YCBCR_FORMAT_UYVY:
+ case VDP_YCBCR_FORMAT_YUYV:
+ if (*plane_count < 1) {
+ return false;
+ }
+ *plane_count = 1;
+ planes[0].item_size = 1;
+ planes[0].item_count = region_width * 2;
+ planes[0].lines = region_height;
+ break;
+ case VDP_YCBCR_FORMAT_Y8U8V8A8:
+ case VDP_YCBCR_FORMAT_V8U8Y8A8:
+ if (*plane_count < 1) {
+ return false;
+ }
+ *plane_count = 1;
+ planes[0].item_size = 4;
+ planes[0].item_count = region_width;
+ planes[0].lines = region_height;
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+}
+
+static bool _vdp_cap_init_planes_for_rgba_format(
+ uint32_t * plane_count,
+ _VdpcapPlane * planes,
+ VdpRGBAFormat format,
+ uint32_t region_width,
+ uint32_t region_height
+)
+{
+ switch (format) {
+ case VDP_RGBA_FORMAT_B8G8R8A8:
+ case VDP_RGBA_FORMAT_R8G8B8A8:
+ case VDP_RGBA_FORMAT_R10G10B10A2:
+ case VDP_RGBA_FORMAT_B10G10R10A2:
+ if (*plane_count < 1) {
+ return false;
+ }
+ *plane_count = 1;
+ planes[0].item_size = 4;
+ break;
+ case VDP_RGBA_FORMAT_A8:
+ if (*plane_count < 1) {
+ return false;
+ }
+ *plane_count = 1;
+ planes[0].item_size = 1;
+ break;
+ default:
+ return false;
+ }
+ planes[0].item_count = region_width;
+ planes[0].lines = region_height;
+
+ return true;
+}
+
+static bool _vdp_cap_init_planes_for_indexed_format(
+ uint32_t * plane_count,
+ _VdpcapPlane * planes,
+ VdpIndexedFormat format,
+ uint32_t region_width,
+ uint32_t region_height
+)
+{
+ uint32_t width_multiplier;
+
+ switch (format) {
+ case VDP_INDEXED_FORMAT_A4I4:
+ case VDP_INDEXED_FORMAT_I4A4:
+ width_multiplier = 1;
+ break;
+ case VDP_INDEXED_FORMAT_A8I8:
+ case VDP_INDEXED_FORMAT_I8A8:
+ width_multiplier = 2;
+ break;
+ default:
+ return false;
+ }
+
+ if (*plane_count < 1) {
+ return false;
+ }
+ *plane_count = 1;
+ planes[0].item_size = 1;
+ planes[0].item_count = region_width * width_multiplier;
+ planes[0].lines = region_height;
+
+ return true;
+}
+
+static bool _vdp_cap_init_planes_adapt_format_bits_ycbcr(
+ uint32_t * plane_count,
+ _VdpcapPlane * planes,
+ uint32_t surface_format,
+ uint32_t bits_format,
+ uint32_t region_width,
+ uint32_t region_height
+)
+{
+ return _vdp_cap_init_planes_for_ycbcr_format(
+ plane_count,
+ planes,
+ bits_format,
+ region_width,
+ region_height
+ );
+}
+
+static bool _vdp_cap_init_planes_adapt_format_surface_rgba(
+ uint32_t * plane_count,
+ _VdpcapPlane * planes,
+ uint32_t surface_format,
+ uint32_t bits_format,
+ uint32_t region_width,
+ uint32_t region_height
+)
+{
+ return _vdp_cap_init_planes_for_rgba_format(
+ plane_count,
+ planes,
+ surface_format,
+ region_width,
+ region_height
+ );
+}
+
+static bool _vdp_cap_init_planes_adapt_format_bits_indexed(
+ uint32_t * plane_count,
+ _VdpcapPlane * planes,
+ uint32_t surface_format,
+ uint32_t bits_format,
+ uint32_t region_width,
+ uint32_t region_height
+)
+{
+ return _vdp_cap_init_planes_for_indexed_format(
+ plane_count,
+ planes,
+ bits_format,
+ region_width,
+ region_height
+ );
+}
+
+bool _vdp_cap_init_planes_adapt_surface_video(
+ uint32_t surface,
+ uint32_t * surface_format,
+ uint32_t * width,
+ uint32_t * height
+)
+{
+ VdpStatus ret;
+
+ VdpChromaType chroma_type;
+ ret = _vdp_cap_data.vdp_video_surface_get_parameters(
+ surface,
+ &chroma_type,
+ width,
+ height
+ );
+ if (ret != VDP_STATUS_OK) {
+ return false;
+ }
+
+ *surface_format = chroma_type;
+
+ return true;
+}
+
+bool _vdp_cap_init_planes_adapt_surface_output(
+ uint32_t surface,
+ uint32_t * surface_format,
+ uint32_t * width,
+ uint32_t * height
+)
+{
+ VdpStatus ret;
+
+ VdpRGBAFormat rgba_format;
+ ret = _vdp_cap_data.vdp_output_surface_get_parameters(
+ surface,
+ &rgba_format,
+ width,
+ height
+ );
+ if (ret != VDP_STATUS_OK) {
+ return false;
+ }
+
+ *surface_format = rgba_format;
+
+ return true;
+}
+
+bool _vdp_cap_init_planes_adapt_surface_bitmap(
+ uint32_t surface,
+ uint32_t * surface_format,
+ uint32_t * width,
+ uint32_t * height
+)
+{
+ VdpStatus ret;
+
+ VdpRGBAFormat rgba_format;
+ VdpBool frequently_accessed;
+ ret = _vdp_cap_data.vdp_bitmap_surface_get_parameters(
+ surface,
+ &rgba_format,
+ width,
+ height,
+ &frequently_accessed
+ );
+ if (ret != VDP_STATUS_OK) {
+ return false;
+ }
+
+ *surface_format = rgba_format;
+
+ return true;
+}
+
+typedef bool _Vdpcap_Init_Planes_Adapt_Format(
+ uint32_t * plane_count,
+ _VdpcapPlane * planes,
+ uint32_t surface_format,
+ uint32_t bits_format,
+ uint32_t region_width,
+ uint32_t region_height
+);
+
+typedef bool _Vdpcap_Init_Planes_Adapt_Surface(
+ uint32_t surface,
+ uint32_t * surface_format,
+ uint32_t * width,
+ uint32_t * height
+);
+
+static bool _vdp_cap_init_planes(
+ uint32_t surface,
+ void const * const * source_data,
+ uint32_t const * source_pitches,
+ VdpRect const * destination_rect,
+ uint32_t * plane_count,
+ _VdpcapPlane * planes,
+ _Vdpcap_Init_Planes_Adapt_Surface * adapt_surface,
+ _Vdpcap_Init_Planes_Adapt_Format * adapt_format,
+ uint32_t adapt_format_bits_format
+)
+{
+ bool ok;
+
+ if (!source_data || !source_pitches) {
+ return false;
+ }
+
+ if (_vdp_cap_data.level < LEVEL_PARAMS) {
+ return false;
+ }
+
+ uint32_t surface_format;
+ uint32_t width;
+ uint32_t height;
+ ok = adapt_surface(
+ surface,
+ &surface_format,
+ &width,
+ &height
+ );
+ if (!ok) {
+ return false;
+ }
+
+ if (destination_rect) {
+ width = delta<uint32_t>(destination_rect->x0, destination_rect->x1);
+ height = delta<uint32_t>(destination_rect->y0, destination_rect->y1);
+ }
+
+ ok = adapt_format(
+ plane_count,
+ planes,
+ surface_format,
+ adapt_format_bits_format,
+ width,
+ height
+ );
+ if (!ok) {
+ return false;
+ }
+
+ for (uint32_t i = 0; i < *plane_count; ++i) {
+ planes[i].data = source_data[i];
+ planes[i].pitch = source_pitches[i];
+ }
+
+ return true;
+}
+
+static void _vdp_cap_dump_bool_list(
+ uint32_t count,
+ VdpBool const * values
+)
+{
+ if (!values) {
+ fputs("NULL", _vdp_cap_data.fp);
+ return;
+ }
+
+ fputs("{", _vdp_cap_data.fp);
+ while (count) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%d%s",
+ (int)values[0],
+ (count > 1) ? ", " : ""
+ );
+
+ --count;
+ ++values;
+ }
+ fputs("}", _vdp_cap_data.fp);
+}
+
+static void _vdp_cap_dump_void_pointer_list(
+ uint32_t count,
+ void const * const * values,
+ bool zero_count_question_marks
+)
+{
+ if (!values) {
+ fputs("NULL", _vdp_cap_data.fp);
+ return;
+ }
+
+ fputs("{", _vdp_cap_data.fp);
+ if (!count && zero_count_question_marks) {
+ fputs("???", _vdp_cap_data.fp);
+ }
+ while (count) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%p%s",
+ values[0],
+ (count > 1) ? ", " : ""
+ );
+
+ --count;
+ ++values;
+ }
+ fputs("}", _vdp_cap_data.fp);
+}
+
+static void _vdp_cap_dump_uint32_t_list(
+ uint32_t count,
+ uint32_t const * values,
+ bool zero_count_question_marks
+)
+{
+ if (!values) {
+ fputs("NULL", _vdp_cap_data.fp);
+ return;
+ }
+
+ fputs("{", _vdp_cap_data.fp);
+ if (!count && zero_count_question_marks) {
+ fputs("???", _vdp_cap_data.fp);
+ }
+ while (count) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u%s",
+ values[0],
+ (count > 1) ? ", " : ""
+ );
+
+ --count;
+ ++values;
+ }
+ fputs("}", _vdp_cap_data.fp);
+}
+
+static void _vdp_cap_dump_color_list(
+ uint32_t count,
+ VdpColor const * colors
+)
+{
+ if (!colors) {
+ fputs("NULL", _vdp_cap_data.fp);
+ return;
+ }
+
+ fputs("{", _vdp_cap_data.fp);
+ while (count) {
+ _vdp_cap_dump_color(&colors[0]);
+ fputs(
+ (count > 1) ? ", " : "",
+ _vdp_cap_data.fp
+ );
+
+ --count;
+ ++colors;
+ }
+ fputs("}", _vdp_cap_data.fp);
+}
+
+static void _vdp_cap_dump_color_table(
+ VdpIndexedFormat indexed_format,
+ VdpColorTableFormat format,
+ void const * table
+)
+{
+ if (!table) {
+ fprintf(_vdp_cap_data.fp, "NULL");
+ return;
+ }
+
+ uint32_t count;
+ switch (indexed_format) {
+ case VDP_INDEXED_FORMAT_A4I4:
+ case VDP_INDEXED_FORMAT_I4A4:
+ count = 1 << 4;
+ break;
+ case VDP_INDEXED_FORMAT_A8I8:
+ case VDP_INDEXED_FORMAT_I8A8:
+ count = 1 << 8;
+ break;
+ default:
+ fprintf(_vdp_cap_data.fp, "???");
+ return;
+ }
+
+ switch (format) {
+ case VDP_COLOR_TABLE_FORMAT_B8G8R8X8:
+ break;
+ default:
+ fprintf(_vdp_cap_data.fp, "???");
+ return;
+ }
+
+ _vdp_cap_dump_uint32_t_list(
+ count,
+ (uint32_t const *)table,
+ true
+ );
+}
+
+static void _vdp_cap_dump_bitstream_buffer_list(
+ uint32_t count,
+ VdpBitstreamBuffer const * buffers
+)
+{
+ if (!buffers) {
+ fputs("NULL", _vdp_cap_data.fp);
+ return;
+ }
+
+ fputs("{", _vdp_cap_data.fp);
+ while (count) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "{(ver %d)%s %u, ",
+ buffers[0].struct_version,
+ (buffers[0].struct_version > 0)
+ ? "(unsupported; cannot dump all fields)"
+ : "",
+ buffers[0].bitstream_bytes
+ );
+ if (_vdp_cap_data.level >= LEVEL_DATA) {
+ uint8_t * ptr = (uint8_t * )buffers[0].bitstream;
+ for (uint32_t i = 0; i < buffers[0].bitstream_bytes; ++i) {
+ fprintf(_vdp_cap_data.fp, "%02x ", ptr[i]);
+ }
+ }
+ else {
+ fputs("...", _vdp_cap_data.fp);
+ }
+ fputs(
+ (count > 1) ? "}, " : "}",
+ _vdp_cap_data.fp
+ );
+
+ --count;
+ ++buffers;
+ }
+ fputs("}", _vdp_cap_data.fp);
+}
+
+static void _vdp_cap_dump_video_mixer_feature_list(
+ uint32_t feature_count,
+ VdpVideoMixerFeature const * features
+)
+{
+ _vdp_cap_dump_uint32_t_list(
+ feature_count,
+ features,
+ false
+ );
+}
+
+static void _vdp_cap_dump_video_mixer_parameter_list(
+ uint32_t parameter_count,
+ VdpVideoMixerParameter const * parameters
+)
+{
+ _vdp_cap_dump_uint32_t_list(
+ parameter_count,
+ parameters,
+ false
+ );
+}
+
+static void _vdp_cap_dump_video_mixer_attribute_list(
+ uint32_t attribute_count,
+ VdpVideoMixerAttribute const * attributes
+)
+{
+ _vdp_cap_dump_uint32_t_list(
+ attribute_count,
+ attributes,
+ false
+ );
+}
+
+static void _vdp_cap_dump_video_mixer_parameter_value_list(
+ uint32_t parameter_count,
+ VdpVideoMixerParameter const * parameters,
+ void const * const * parameter_values
+)
+{
+ if (!parameters || !parameter_values) {
+ fputs("NULL", _vdp_cap_data.fp);
+ return;
+ }
+
+ fputs("{", _vdp_cap_data.fp);
+ while (parameter_count) {
+ _vdp_cap_dump_video_mixer_parameter_value(parameters[0], parameter_values[0]);
+ fputs((parameter_count > 1) ? ", " : "", _vdp_cap_data.fp);
+
+ --parameter_count;
+ ++parameters;
+ ++parameter_values;
+ }
+ fputs("}", _vdp_cap_data.fp);
+}
+
+static void _vdp_cap_dump_video_mixer_attribute_value_list(
+ uint32_t attribute_count,
+ VdpVideoMixerAttribute const * attributes,
+ void const * const * attribute_values,
+ bool get_operation
+)
+{
+ if (!attributes || !attribute_values) {
+ fputs("NULL", _vdp_cap_data.fp);
+ return;
+ }
+
+ fputs("{", _vdp_cap_data.fp);
+ while (attribute_count) {
+ _vdp_cap_dump_video_mixer_attribute_value(
+ attributes[0],
+ attribute_values[0],
+ get_operation
+ );
+ fputs((attribute_count > 1) ? ", " : "", _vdp_cap_data.fp);
+
+ --attribute_count;
+ ++attributes;
+ ++attribute_values;
+ }
+ fputs("}", _vdp_cap_data.fp);
+}
+
+static void _vdp_cap_dump_layers_list(
+ uint32_t layer_count,
+ VdpLayer const * layers
+)
+{
+ if (!layers) {
+ fputs("NULL", _vdp_cap_data.fp);
+ return;
+ }
+
+ fputs("{", _vdp_cap_data.fp);
+ while (layer_count) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "{(ver %d)%s %u,",
+ layers[0].struct_version,
+ (layers[0].struct_version > 0)
+ ? "(unsupported; cannot dump all fields)"
+ : "",
+ layers[0].source_surface
+ );
+
+ _vdp_cap_dump_rect(layers[0].source_rect);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_rect(layers[0].destination_rect);
+
+ fputs((layer_count > 1) ? "}, " : "}", _vdp_cap_data.fp);
+
+ --layer_count;
+ ++layers;
+ }
+ fputs("}", _vdp_cap_data.fp);
+}
+
+static char const * _vdp_cap_get_error_string(
+ VdpStatus status
+)
+{
+ char const * ret;
+
+ fputs("vdp_get_error_string(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%d",
+ status
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_get_error_string(
+ status
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ if (ret) {
+ fprintf(_vdp_cap_data.fp, " -> '%s'\n", ret);
+ }
+ else {
+ fprintf(_vdp_cap_data.fp, " -> NULL\n");
+ }
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_get_api_version(
+ /* output parameters follow */
+ uint32_t * api_version
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_get_api_version(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%s",
+ api_version ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_get_api_version(
+ api_version
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u",
+ *api_version
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_get_information_string(
+ /* output parameters follow */
+ char const * * information_string
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_get_information_string(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%s",
+ information_string ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_get_information_string(
+ information_string
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(_vdp_cap_data.fp, ", \"%s\"", *information_string);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_device_destroy(
+ VdpDevice device
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_device_destroy(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u",
+ device
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_device_destroy(
+ device
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_generate_csc_matrix(
+ VdpProcamp * procamp,
+ VdpColorStandard standard,
+ /* output parameters follow */
+ VdpCSCMatrix * csc_matrix
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_generate_csc_matrix(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ _vdp_cap_dump_procamp(procamp);
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u, %s",
+ standard,
+ csc_matrix ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_generate_csc_matrix(
+ procamp,
+ standard,
+ csc_matrix
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_csc_matrix(csc_matrix);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_surface_query_capabilities(
+ VdpDevice device,
+ VdpChromaType surface_chroma_type,
+ /* output parameters follow */
+ VdpBool * is_supported,
+ uint32_t * max_width,
+ uint32_t * max_height
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_surface_query_capabilities(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s, %s, %s",
+ device,
+ surface_chroma_type,
+ is_supported ? "-" : "NULL",
+ max_width ? "-" : "NULL",
+ max_height ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_surface_query_capabilities(
+ device,
+ surface_chroma_type,
+ is_supported,
+ max_width,
+ max_height
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %d, %u, %u",
+ *is_supported,
+ *max_width,
+ *max_height
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_surface_query_get_put_bits_y_cb_cr_capabilities(
+ VdpDevice device,
+ VdpChromaType surface_chroma_type,
+ VdpYCbCrFormat bits_ycbcr_format,
+ /* output parameters follow */
+ VdpBool * is_supported
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_surface_query_get_put_bits_y_cb_cr_capabilities(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %u, %s",
+ device,
+ surface_chroma_type,
+ bits_ycbcr_format,
+ is_supported ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_surface_query_get_put_bits_y_cb_cr_capabilities(
+ device,
+ surface_chroma_type,
+ bits_ycbcr_format,
+ is_supported
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %d",
+ *is_supported
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_surface_create(
+ VdpDevice device,
+ VdpChromaType chroma_type,
+ uint32_t width,
+ uint32_t height,
+ /* output parameters follow */
+ VdpVideoSurface * surface
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_surface_create(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %u, %u, %s",
+ device,
+ chroma_type,
+ width,
+ height,
+ surface ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_surface_create(
+ device,
+ chroma_type,
+ width,
+ height,
+ surface
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u",
+ *surface
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_surface_destroy(
+ VdpVideoSurface surface
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_surface_destroy(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u",
+ surface
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_surface_destroy(
+ surface
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_surface_get_parameters(
+ VdpVideoSurface surface,
+ /* output parameters follow */
+ VdpChromaType * chroma_type,
+ uint32_t * width,
+ uint32_t * height
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_surface_get_parameters(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %s, %s, %s",
+ surface,
+ chroma_type ? "-" : "NULL",
+ width ? "-" : "NULL",
+ height ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_surface_get_parameters(
+ surface,
+ chroma_type,
+ width,
+ height
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u, %u, %u",
+ *chroma_type,
+ *width,
+ *height
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_surface_get_bits_y_cb_cr(
+ VdpVideoSurface surface,
+ VdpYCbCrFormat destination_ycbcr_format,
+ void * const * destination_data,
+ uint32_t const * destination_pitches
+)
+{
+ VdpStatus ret;
+
+ _VdpcapPlane planes[3];
+ uint32_t plane_count = _VDP_TRACE_ARSIZE(planes);
+ bool dump_data = _vdp_cap_init_planes(
+ surface,
+ destination_data,
+ destination_pitches,
+ 0,
+ &plane_count,
+ planes,
+ _vdp_cap_init_planes_adapt_surface_video,
+ _vdp_cap_init_planes_adapt_format_bits_ycbcr,
+ destination_ycbcr_format
+ );
+ if (!dump_data) {
+ plane_count = 0;
+ }
+
+ fputs("vdp_video_surface_get_bits_y_cb_cr(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, ",
+ surface,
+ destination_ycbcr_format
+ );
+ _vdp_cap_dump_void_pointer_list(plane_count, destination_data, true);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_uint32_t_list(plane_count, destination_pitches, true);
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_surface_get_bits_y_cb_cr(
+ surface,
+ destination_ycbcr_format,
+ destination_data,
+ destination_pitches
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+ if (_vdp_cap_data.level >= LEVEL_DATA) {
+ fputs(" ... Data: ", _vdp_cap_data.fp);
+ if (dump_data) {
+ _vdp_cap_dump_plane_list(plane_count, planes);
+ }
+ else {
+ fputs("???", _vdp_cap_data.fp);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_surface_put_bits_y_cb_cr(
+ VdpVideoSurface surface,
+ VdpYCbCrFormat source_ycbcr_format,
+ void const * const * source_data,
+ uint32_t const * source_pitches
+)
+{
+ VdpStatus ret;
+
+ _VdpcapPlane planes[3];
+ uint32_t plane_count = _VDP_TRACE_ARSIZE(planes);
+ bool dump_data = _vdp_cap_init_planes(
+ surface,
+ source_data,
+ source_pitches,
+ 0,
+ &plane_count,
+ planes,
+ _vdp_cap_init_planes_adapt_surface_video,
+ _vdp_cap_init_planes_adapt_format_bits_ycbcr,
+ source_ycbcr_format
+ );
+ if (!dump_data) {
+ plane_count = 0;
+ }
+
+ fputs("vdp_video_surface_put_bits_y_cb_cr(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, ",
+ surface,
+ source_ycbcr_format
+ );
+ _vdp_cap_dump_void_pointer_list(plane_count, source_data, true);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_uint32_t_list(plane_count, source_pitches, true);
+ fputs(", ", _vdp_cap_data.fp);
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_DATA) {
+ fputs(" ... Data: ", _vdp_cap_data.fp);
+ if (dump_data) {
+ _vdp_cap_dump_plane_list(plane_count, planes);
+ }
+ else {
+ fputs("???", _vdp_cap_data.fp);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ ret = _vdp_cap_data.vdp_video_surface_put_bits_y_cb_cr(
+ surface,
+ source_ycbcr_format,
+ source_data,
+ source_pitches
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_output_surface_query_capabilities(
+ VdpDevice device,
+ VdpRGBAFormat surface_rgba_format,
+ /* output parameters follow */
+ VdpBool * is_supported,
+ uint32_t * max_width,
+ uint32_t * max_height
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_output_surface_query_capabilities(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s, %s, %s",
+ device,
+ surface_rgba_format,
+ is_supported ? "-" : "NULL",
+ max_width ? "-" : "NULL",
+ max_height ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_output_surface_query_capabilities(
+ device,
+ surface_rgba_format,
+ is_supported,
+ max_width,
+ max_height
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %d, %u, %u",
+ *is_supported,
+ *max_width,
+ *max_height
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_output_surface_query_get_put_bits_native_capabilities(
+ VdpDevice device,
+ VdpRGBAFormat surface_rgba_format,
+ /* output parameters follow */
+ VdpBool * is_supported
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_output_surface_query_get_put_bits_native_capabilities(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s",
+ device,
+ surface_rgba_format,
+ is_supported ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_output_surface_query_get_put_bits_native_capabilities(
+ device,
+ surface_rgba_format,
+ is_supported
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %d",
+ *is_supported
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_output_surface_query_put_bits_indexed_capabilities(
+ VdpDevice device,
+ VdpRGBAFormat surface_rgba_format,
+ VdpIndexedFormat bits_indexed_format,
+ VdpColorTableFormat color_table_format,
+ /* output parameters follow */
+ VdpBool * is_supported
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_output_surface_query_put_bits_indexed_capabilities(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %u, %u, %s",
+ device,
+ surface_rgba_format,
+ bits_indexed_format,
+ color_table_format,
+ is_supported ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_output_surface_query_put_bits_indexed_capabilities(
+ device,
+ surface_rgba_format,
+ bits_indexed_format,
+ color_table_format,
+ is_supported
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %d",
+ *is_supported
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_output_surface_query_put_bits_y_cb_cr_capabilities(
+ VdpDevice device,
+ VdpRGBAFormat surface_rgba_format,
+ VdpYCbCrFormat bits_ycbcr_format,
+ /* output parameters follow */
+ VdpBool * is_supported
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_output_surface_query_put_bits_y_cb_cr_capabilities(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %u, %s",
+ device,
+ surface_rgba_format,
+ bits_ycbcr_format,
+ is_supported ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_output_surface_query_put_bits_y_cb_cr_capabilities(
+ device,
+ surface_rgba_format,
+ bits_ycbcr_format,
+ is_supported
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %d",
+ *is_supported
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_output_surface_create(
+ VdpDevice device,
+ VdpRGBAFormat rgba_format,
+ uint32_t width,
+ uint32_t height,
+ /* output parameters follow */
+ VdpOutputSurface * surface
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_output_surface_create(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %u, %u, %s",
+ device,
+ rgba_format,
+ width,
+ height,
+ surface ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_output_surface_create(
+ device,
+ rgba_format,
+ width,
+ height,
+ surface
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u",
+ *surface
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_output_surface_destroy(
+ VdpOutputSurface surface
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_output_surface_destroy(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u",
+ surface
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_output_surface_destroy(
+ surface
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_output_surface_get_parameters(
+ VdpOutputSurface surface,
+ /* output parameters follow */
+ VdpRGBAFormat * rgba_format,
+ uint32_t * width,
+ uint32_t * height
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_output_surface_get_parameters(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %s, %s, %s",
+ surface,
+ rgba_format ? "-" : "NULL",
+ width ? "-" : "NULL",
+ height ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_output_surface_get_parameters(
+ surface,
+ rgba_format,
+ width,
+ height
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u, %u, %u",
+ *rgba_format,
+ *width,
+ *height
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_output_surface_get_bits_native(
+ VdpOutputSurface surface,
+ VdpRect const * source_rect,
+ void * const * destination_data,
+ uint32_t const * destination_pitches
+)
+{
+ VdpStatus ret;
+
+ _VdpcapPlane planes[1];
+ uint32_t plane_count = _VDP_TRACE_ARSIZE(planes);
+ bool dump_data = _vdp_cap_init_planes(
+ surface,
+ destination_data,
+ destination_pitches,
+ source_rect,
+ &plane_count,
+ planes,
+ _vdp_cap_init_planes_adapt_surface_output,
+ _vdp_cap_init_planes_adapt_format_surface_rgba,
+ 0
+ );
+ if (!dump_data) {
+ plane_count = 0;
+ }
+
+ fputs("vdp_output_surface_get_bits_native(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, ",
+ surface
+ );
+ _vdp_cap_dump_rect(source_rect);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_void_pointer_list(plane_count, destination_data, true);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_uint32_t_list(plane_count, destination_pitches, true);
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_output_surface_get_bits_native(
+ surface,
+ source_rect,
+ destination_data,
+ destination_pitches
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+ if (_vdp_cap_data.level >= LEVEL_DATA) {
+ fputs(" ... Data: ", _vdp_cap_data.fp);
+ if (dump_data) {
+ _vdp_cap_dump_plane_list(plane_count, planes);
+ }
+ else {
+ fputs("???", _vdp_cap_data.fp);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_output_surface_put_bits_native(
+ VdpOutputSurface surface,
+ void const * const * source_data,
+ uint32_t const * source_pitches,
+ VdpRect const * destination_rect
+)
+{
+ VdpStatus ret;
+
+ _VdpcapPlane planes[1];
+ uint32_t plane_count = _VDP_TRACE_ARSIZE(planes);
+ bool dump_data = _vdp_cap_init_planes(
+ surface,
+ source_data,
+ source_pitches,
+ destination_rect,
+ &plane_count,
+ planes,
+ _vdp_cap_init_planes_adapt_surface_output,
+ _vdp_cap_init_planes_adapt_format_surface_rgba,
+ 0
+ );
+ if (!dump_data) {
+ plane_count = 0;
+ }
+
+ fputs("vdp_output_surface_put_bits_native(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, ",
+ surface
+ );
+ _vdp_cap_dump_void_pointer_list(plane_count, source_data, true);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_uint32_t_list(plane_count, source_pitches, true);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_rect(destination_rect);
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_DATA) {
+ fputs(" ... Data: ", _vdp_cap_data.fp);
+ if (dump_data) {
+ _vdp_cap_dump_plane_list(plane_count, planes);
+ }
+ else {
+ fputs("???", _vdp_cap_data.fp);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ ret = _vdp_cap_data.vdp_output_surface_put_bits_native(
+ surface,
+ source_data,
+ source_pitches,
+ destination_rect
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_output_surface_put_bits_indexed(
+ VdpOutputSurface surface,
+ VdpIndexedFormat source_indexed_format,
+ void const * const * source_data,
+ uint32_t const * source_pitches,
+ VdpRect const * destination_rect,
+ VdpColorTableFormat color_table_format,
+ void const * color_table
+)
+{
+ VdpStatus ret;
+
+ _VdpcapPlane planes[1];
+ uint32_t plane_count = _VDP_TRACE_ARSIZE(planes);
+ bool dump_data = _vdp_cap_init_planes(
+ surface,
+ source_data,
+ source_pitches,
+ destination_rect,
+ &plane_count,
+ planes,
+ _vdp_cap_init_planes_adapt_surface_output,
+ _vdp_cap_init_planes_adapt_format_bits_indexed,
+ source_indexed_format
+ );
+ if (!dump_data) {
+ plane_count = 0;
+ }
+
+ fputs("vdp_output_surface_put_bits_indexed(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, ",
+ surface,
+ source_indexed_format
+ );
+ _vdp_cap_dump_void_pointer_list(plane_count, source_data, true);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_uint32_t_list(plane_count, source_pitches, true);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_rect(destination_rect);
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u, ",
+ color_table_format
+ );
+ _vdp_cap_dump_color_table(
+ source_indexed_format,
+ color_table_format,
+ color_table
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_DATA) {
+ fputs(" ... Data: ", _vdp_cap_data.fp);
+ if (dump_data) {
+ _vdp_cap_dump_plane_list(plane_count, planes);
+ }
+ else {
+ fputs("???", _vdp_cap_data.fp);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ ret = _vdp_cap_data.vdp_output_surface_put_bits_indexed(
+ surface,
+ source_indexed_format,
+ source_data,
+ source_pitches,
+ destination_rect,
+ color_table_format,
+ color_table
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_output_surface_put_bits_y_cb_cr(
+ VdpOutputSurface surface,
+ VdpYCbCrFormat source_ycbcr_format,
+ void const * const * source_data,
+ uint32_t const * source_pitches,
+ VdpRect const * destination_rect,
+ VdpCSCMatrix const * csc_matrix
+)
+{
+ VdpStatus ret;
+
+ _VdpcapPlane planes[1];
+ uint32_t plane_count = _VDP_TRACE_ARSIZE(planes);
+ bool dump_data = _vdp_cap_init_planes(
+ surface,
+ source_data,
+ source_pitches,
+ destination_rect,
+ &plane_count,
+ planes,
+ _vdp_cap_init_planes_adapt_surface_output,
+ _vdp_cap_init_planes_adapt_format_bits_ycbcr,
+ source_ycbcr_format
+ );
+ if (!dump_data) {
+ plane_count = 0;
+ }
+
+ fputs("vdp_output_surface_put_bits_y_cb_cr(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, ",
+ surface,
+ source_ycbcr_format
+ );
+ _vdp_cap_dump_void_pointer_list(plane_count, source_data, true);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_uint32_t_list(plane_count, source_pitches, true);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_rect(destination_rect);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_csc_matrix(csc_matrix);
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_DATA) {
+ fputs(" ... Data: ", _vdp_cap_data.fp);
+ if (dump_data) {
+ _vdp_cap_dump_plane_list(plane_count, planes);
+ }
+ else {
+ fputs("???", _vdp_cap_data.fp);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ ret = _vdp_cap_data.vdp_output_surface_put_bits_y_cb_cr(
+ surface,
+ source_ycbcr_format,
+ source_data,
+ source_pitches,
+ destination_rect,
+ csc_matrix
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_bitmap_surface_query_capabilities(
+ VdpDevice device,
+ VdpRGBAFormat surface_rgba_format,
+ /* output parameters follow */
+ VdpBool * is_supported,
+ uint32_t * max_width,
+ uint32_t * max_height
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_bitmap_surface_query_capabilities(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s, %s, %s",
+ device,
+ surface_rgba_format,
+ is_supported ? "-" : "NULL",
+ max_width ? "-" : "NULL",
+ max_height ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_bitmap_surface_query_capabilities(
+ device,
+ surface_rgba_format,
+ is_supported,
+ max_width,
+ max_height
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %d, %u, %u",
+ *is_supported,
+ *max_width,
+ *max_height
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_bitmap_surface_create(
+ VdpDevice device,
+ VdpRGBAFormat rgba_format,
+ uint32_t width,
+ uint32_t height,
+ VdpBool frequently_accessed,
+ /* output parameters follow */
+ VdpBitmapSurface * surface
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_bitmap_surface_create(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %u, %u, %d, %s",
+ device,
+ rgba_format,
+ width,
+ height,
+ frequently_accessed,
+ surface ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_bitmap_surface_create(
+ device,
+ rgba_format,
+ width,
+ height,
+ frequently_accessed,
+ surface
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u",
+ *surface
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_bitmap_surface_destroy(
+ VdpBitmapSurface surface
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_bitmap_surface_destroy(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u",
+ surface
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_bitmap_surface_destroy(
+ surface
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_bitmap_surface_get_parameters(
+ VdpBitmapSurface surface,
+ /* output parameters follow */
+ VdpRGBAFormat * rgba_format,
+ uint32_t * width,
+ uint32_t * height,
+ VdpBool * frequently_accessed
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_bitmap_surface_get_parameters(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %s, %s, %s, %s",
+ surface,
+ rgba_format ? "-" : "NULL",
+ width ? "-" : "NULL",
+ height ? "-" : "NULL",
+ frequently_accessed ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_bitmap_surface_get_parameters(
+ surface,
+ rgba_format,
+ width,
+ height,
+ frequently_accessed
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u, %u, %u, %d",
+ *rgba_format,
+ *width,
+ *height,
+ *frequently_accessed
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_bitmap_surface_put_bits_native(
+ VdpBitmapSurface surface,
+ void const * const * source_data,
+ uint32_t const * source_pitches,
+ VdpRect const * destination_rect
+)
+{
+ VdpStatus ret;
+
+ _VdpcapPlane planes[1];
+ uint32_t plane_count = _VDP_TRACE_ARSIZE(planes);
+ bool dump_data = _vdp_cap_init_planes(
+ surface,
+ source_data,
+ source_pitches,
+ destination_rect,
+ &plane_count,
+ planes,
+ _vdp_cap_init_planes_adapt_surface_bitmap,
+ _vdp_cap_init_planes_adapt_format_surface_rgba,
+ 0
+ );
+ if (!dump_data) {
+ plane_count = 0;
+ }
+
+ fputs("vdp_bitmap_surface_put_bits_native(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, ",
+ surface
+ );
+ _vdp_cap_dump_void_pointer_list(plane_count, source_data, true);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_uint32_t_list(plane_count, source_pitches, true);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_rect(destination_rect);
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_DATA) {
+ fputs(" ... Data: ", _vdp_cap_data.fp);
+ if (dump_data) {
+ _vdp_cap_dump_plane_list(plane_count, planes);
+ }
+ else {
+ fputs("???", _vdp_cap_data.fp);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ ret = _vdp_cap_data.vdp_bitmap_surface_put_bits_native(
+ surface,
+ source_data,
+ source_pitches,
+ destination_rect
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_output_surface_render_output_surface(
+ VdpOutputSurface destination_surface,
+ VdpRect const * destination_rect,
+ VdpOutputSurface source_surface,
+ VdpRect const * source_rect,
+ VdpColor const * colors,
+ VdpOutputSurfaceRenderBlendState const * blend_state,
+ uint32_t flags
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_output_surface_render_output_surface(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, ",
+ destination_surface
+ );
+ _vdp_cap_dump_rect(destination_rect);
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u, ",
+ source_surface
+ );
+ _vdp_cap_dump_rect(source_rect);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_color_list((flags & VDP_OUTPUT_SURFACE_RENDER_COLOR_PER_VERTEX) ? 4 : 1, colors);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_blend_state(blend_state);
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u",
+ flags
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_output_surface_render_output_surface(
+ destination_surface,
+ destination_rect,
+ source_surface,
+ source_rect,
+ colors,
+ blend_state,
+ flags
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_output_surface_render_bitmap_surface(
+ VdpOutputSurface destination_surface,
+ VdpRect const * destination_rect,
+ VdpBitmapSurface source_surface,
+ VdpRect const * source_rect,
+ VdpColor const * colors,
+ VdpOutputSurfaceRenderBlendState const * blend_state,
+ uint32_t flags
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_output_surface_render_bitmap_surface(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, ",
+ destination_surface
+ );
+ _vdp_cap_dump_rect(destination_rect);
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u, ",
+ source_surface
+ );
+ _vdp_cap_dump_rect(source_rect);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_color_list((flags & VDP_OUTPUT_SURFACE_RENDER_COLOR_PER_VERTEX) ? 4 : 1, colors);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_blend_state(blend_state);
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u",
+ flags
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_output_surface_render_bitmap_surface(
+ destination_surface,
+ destination_rect,
+ source_surface,
+ source_rect,
+ colors,
+ blend_state,
+ flags
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_decoder_query_capabilities(
+ VdpDevice device,
+ VdpDecoderProfile profile,
+ /* output parameters follow */
+ VdpBool * is_supported,
+ uint32_t * max_level,
+ uint32_t * max_macroblocks,
+ uint32_t * max_width,
+ uint32_t * max_height
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_decoder_query_capabilities(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s, %s, %s, %s, %s",
+ device,
+ profile,
+ is_supported ? "-" : "NULL",
+ max_level ? "-" : "NULL",
+ max_macroblocks ? "-" : "NULL",
+ max_width ? "-" : "NULL",
+ max_height ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_decoder_query_capabilities(
+ device,
+ profile,
+ is_supported,
+ max_level,
+ max_macroblocks,
+ max_width,
+ max_height
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %d, %u, %u, %u, %u",
+ *is_supported,
+ *max_level,
+ *max_macroblocks,
+ *max_width,
+ *max_height
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_decoder_create(
+ VdpDevice device,
+ VdpDecoderProfile profile,
+ uint32_t width,
+ uint32_t height,
+ uint32_t max_references,
+ /* output parameters follow */
+ VdpDecoder * decoder
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_decoder_create(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %u, %u, %u, %s",
+ device,
+ profile,
+ width,
+ height,
+ max_references,
+ decoder ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_decoder_create(
+ device,
+ profile,
+ width,
+ height,
+ max_references,
+ decoder
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u",
+ *decoder
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_decoder_destroy(
+ VdpDecoder decoder
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_decoder_destroy(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u",
+ decoder
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_decoder_destroy(
+ decoder
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_decoder_get_parameters(
+ VdpDecoder decoder,
+ /* output parameters follow */
+ VdpDecoderProfile * profile,
+ uint32_t * width,
+ uint32_t * height
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_decoder_get_parameters(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %s, %s, %s",
+ decoder,
+ profile ? "-" : "NULL",
+ width ? "-" : "NULL",
+ height ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_decoder_get_parameters(
+ decoder,
+ profile,
+ width,
+ height
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u, %u, %u",
+ *profile,
+ *width,
+ *height
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_decoder_render(
+ VdpDecoder decoder,
+ VdpVideoSurface target,
+ VdpPictureInfo const * picture_info,
+ uint32_t bitstream_buffer_count,
+ VdpBitstreamBuffer const * bitstream_buffers
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_decoder_render(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ VdpDecoderProfile profile;
+ uint32_t width;
+ uint32_t height;
+
+ ret = _vdp_cap_data.vdp_decoder_get_parameters(
+ decoder,
+ &profile,
+ &width,
+ &height
+ );
+
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, ",
+ decoder,
+ target
+ );
+ _vdp_cap_dump_picture_info(profile, picture_info);
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u, ",
+ bitstream_buffer_count
+ );
+ _vdp_cap_dump_bitstream_buffer_list(bitstream_buffer_count, bitstream_buffers);
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_decoder_render(
+ decoder,
+ target,
+ picture_info,
+ bitstream_buffer_count,
+ bitstream_buffers
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+
+static VdpStatus _vdp_cap_video_mixer_query_feature_support(
+ VdpDevice device,
+ VdpVideoMixerFeature feature,
+ /* output parameters follow */
+ VdpBool * is_supported
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_query_feature_support(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s",
+ device,
+ feature,
+ is_supported ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_query_feature_support(
+ device,
+ feature,
+ is_supported
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(_vdp_cap_data.fp, ", %d", *is_supported);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_mixer_query_parameter_support(
+ VdpDevice device,
+ VdpVideoMixerParameter parameter,
+ /* output parameters follow */
+ VdpBool * is_supported
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_query_parameter_support(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s",
+ device,
+ parameter,
+ is_supported ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_query_parameter_support(
+ device,
+ parameter,
+ is_supported
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(_vdp_cap_data.fp, ", %d", *is_supported);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_mixer_query_attribute_support(
+ VdpDevice device,
+ VdpVideoMixerAttribute attribute,
+ /* output parameters follow */
+ VdpBool * is_supported
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_query_attribute_support(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s",
+ device,
+ attribute,
+ is_supported ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_query_attribute_support(
+ device,
+ attribute,
+ is_supported
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(_vdp_cap_data.fp, ", %d", *is_supported);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_mixer_query_parameter_value_range(
+ VdpDevice device,
+ VdpVideoMixerParameter parameter,
+ /* output parameters follow */
+ void * min_value,
+ void * max_value
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_query_parameter_value_range(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s, %s",
+ device,
+ parameter,
+ min_value ? "-" : "NULL",
+ max_value ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_query_parameter_value_range(
+ device,
+ parameter,
+ min_value,
+ max_value
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_video_mixer_parameter_value(parameter, min_value);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_video_mixer_parameter_value(parameter, max_value);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_mixer_query_attribute_value_range(
+ VdpDevice device,
+ VdpVideoMixerAttribute attribute,
+ /* output parameters follow */
+ void * min_value,
+ void * max_value
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_query_attribute_value_range(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s, %s",
+ device,
+ attribute,
+ min_value ? "-" : "NULL",
+ max_value ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_query_attribute_value_range(
+ device,
+ attribute,
+ min_value,
+ max_value
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_video_mixer_attribute_value(attribute, min_value, false);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_video_mixer_attribute_value(attribute, max_value, false);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_mixer_create(
+ VdpDevice device,
+ uint32_t feature_count,
+ VdpVideoMixerFeature const * features,
+ uint32_t parameter_count,
+ VdpVideoMixerParameter const * parameters,
+ void const * const * parameter_values,
+ /* output parameters follow */
+ VdpVideoMixer * mixer
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_create(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, "%u, %u, ", device, feature_count);
+ _vdp_cap_dump_video_mixer_feature_list(feature_count, features);
+ fprintf(_vdp_cap_data.fp, ", %u, ", parameter_count);
+ _vdp_cap_dump_video_mixer_parameter_list(parameter_count, parameters);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_video_mixer_parameter_value_list(
+ parameter_count,
+ parameters,
+ parameter_values
+ );
+ fprintf(_vdp_cap_data.fp, ", %s", mixer ? "-" : "NULL");
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_create(
+ device,
+ feature_count,
+ features,
+ parameter_count,
+ parameters,
+ parameter_values,
+ mixer
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u",
+ *mixer
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_mixer_set_feature_enables(
+ VdpVideoMixer mixer,
+ uint32_t feature_count,
+ VdpVideoMixerFeature const * features,
+ VdpBool const * feature_enables
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_set_feature_enables(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, "%u, %u, ", mixer, feature_count);
+ _vdp_cap_dump_video_mixer_feature_list(feature_count, features);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_bool_list(feature_count, feature_enables);
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_set_feature_enables(
+ mixer,
+ feature_count,
+ features,
+ feature_enables
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_mixer_set_attribute_values(
+ VdpVideoMixer mixer,
+ uint32_t attribute_count,
+ VdpVideoMixerAttribute const * attributes,
+ void const * const * attribute_values
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_set_attribute_values(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, "%u, %u, ", mixer, attribute_count);
+ _vdp_cap_dump_video_mixer_attribute_list(attribute_count, attributes);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_video_mixer_attribute_value_list(
+ attribute_count,
+ attributes,
+ attribute_values,
+ false
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_set_attribute_values(
+ mixer,
+ attribute_count,
+ attributes,
+ attribute_values
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_mixer_get_feature_support(
+ VdpVideoMixer mixer,
+ uint32_t feature_count,
+ VdpVideoMixerFeature const * features,
+ /* output parameters follow */
+ VdpBool * feature_supports
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_get_feature_support(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, "%u, %u, ", mixer, feature_count);
+ _vdp_cap_dump_video_mixer_feature_list(feature_count, features);
+ fputs(feature_supports ? "-" : "NULL", _vdp_cap_data.fp);
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_get_feature_support(
+ mixer,
+ feature_count,
+ features,
+ feature_supports
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_bool_list(feature_count, feature_supports);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_mixer_get_feature_enables(
+ VdpVideoMixer mixer,
+ uint32_t feature_count,
+ VdpVideoMixerFeature const * features,
+ /* output parameters follow */
+ VdpBool * feature_enables
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_get_feature_enables(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, "%u, %u, ", mixer, feature_count);
+ _vdp_cap_dump_video_mixer_feature_list(feature_count, features);
+ fprintf(_vdp_cap_data.fp, ", %s", feature_enables ? "-" : "NULL");
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_get_feature_enables(
+ mixer,
+ feature_count,
+ features,
+ feature_enables
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_bool_list(feature_count, feature_enables);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_mixer_get_parameter_values(
+ VdpVideoMixer mixer,
+ uint32_t parameter_count,
+ VdpVideoMixerParameter const * parameters,
+ /* output parameters follow */
+ void * const * parameter_values
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_get_parameter_values(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, "%u, %u, ", mixer, parameter_count);
+ _vdp_cap_dump_video_mixer_parameter_list(parameter_count, parameters);
+ fprintf(_vdp_cap_data.fp, ", %s", parameter_values ? "-" : "NULL");
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_get_parameter_values(
+ mixer,
+ parameter_count,
+ parameters,
+ parameter_values
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_video_mixer_parameter_value_list(
+ parameter_count,
+ parameters,
+ parameter_values
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_mixer_get_attribute_values(
+ VdpVideoMixer mixer,
+ uint32_t attribute_count,
+ VdpVideoMixerAttribute const * attributes,
+ /* output parameters follow */
+ void * const * attribute_values
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_get_attribute_values(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, "%u, %u, ", mixer, attribute_count);
+ _vdp_cap_dump_video_mixer_attribute_list(attribute_count, attributes);
+ fprintf(_vdp_cap_data.fp, ", %s", attribute_values ? "-" : "NULL");
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_get_attribute_values(
+ mixer,
+ attribute_count,
+ attributes,
+ attribute_values
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_video_mixer_attribute_value_list(
+ attribute_count,
+ attributes,
+ attribute_values,
+ true
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_mixer_destroy(
+ VdpVideoMixer mixer
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_destroy(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u",
+ mixer
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_destroy(
+ mixer
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_video_mixer_render(
+ VdpVideoMixer mixer,
+ VdpOutputSurface background_surface,
+ VdpRect const * background_source_rect,
+ VdpVideoMixerPictureStructure current_picture_structure,
+ uint32_t video_surface_past_count,
+ VdpVideoSurface const * video_surface_past,
+ VdpVideoSurface video_surface_current,
+ uint32_t video_surface_future_count,
+ VdpVideoSurface const * video_surface_future,
+ VdpRect const * video_source_rect,
+ VdpOutputSurface destination_surface,
+ VdpRect const * destination_rect,
+ VdpRect const * destination_video_rect,
+ uint32_t layer_count,
+ VdpLayer const * layers
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_video_mixer_render(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, ",
+ mixer,
+ background_surface
+ );
+ _vdp_cap_dump_rect(background_source_rect);
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %d, %u, ",
+ current_picture_structure,
+ video_surface_past_count
+ );
+ _vdp_cap_dump_uint32_t_list(video_surface_past_count, video_surface_past, false);
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u, %u, ",
+ video_surface_current,
+ video_surface_future_count
+ );
+ _vdp_cap_dump_uint32_t_list(video_surface_future_count, video_surface_future, false);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_rect(video_source_rect);
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u, ",
+ destination_surface
+ );
+ _vdp_cap_dump_rect(destination_rect);
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_rect(destination_video_rect);
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u, ",
+ layer_count
+ );
+ _vdp_cap_dump_layers_list(layer_count, layers);
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_video_mixer_render(
+ mixer,
+ background_surface,
+ background_source_rect,
+ current_picture_structure,
+ video_surface_past_count,
+ video_surface_past,
+ video_surface_current,
+ video_surface_future_count,
+ video_surface_future,
+ video_source_rect,
+ destination_surface,
+ destination_rect,
+ destination_video_rect,
+ layer_count,
+ layers
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_presentation_queue_target_destroy(
+ VdpPresentationQueueTarget presentation_queue_target
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_presentation_queue_target_destroy(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u",
+ presentation_queue_target
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_presentation_queue_target_destroy(
+ presentation_queue_target
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_presentation_queue_create(
+ VdpDevice device,
+ VdpPresentationQueueTarget presentation_queue_target,
+ /* output parameters follow */
+ VdpPresentationQueue * presentation_queue
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_presentation_queue_create(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s",
+ device,
+ presentation_queue_target,
+ presentation_queue ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_presentation_queue_create(
+ device,
+ presentation_queue_target,
+ presentation_queue
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u",
+ *presentation_queue
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_presentation_queue_destroy(
+ VdpPresentationQueue presentation_queue
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_presentation_queue_destroy(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u",
+ presentation_queue
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_presentation_queue_destroy(
+ presentation_queue
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_presentation_queue_set_background_color(
+ VdpPresentationQueue presentation_queue,
+ VdpColor * const background_color
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_presentation_queue_set_background_color(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, ",
+ presentation_queue
+ );
+ _vdp_cap_dump_color(background_color);
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_presentation_queue_set_background_color(
+ presentation_queue,
+ background_color
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_presentation_queue_get_background_color(
+ VdpPresentationQueue presentation_queue,
+ VdpColor * background_color
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_presentation_queue_get_background_color(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %s",
+ presentation_queue,
+ background_color ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_presentation_queue_get_background_color(
+ presentation_queue,
+ background_color
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fputs(", ", _vdp_cap_data.fp);
+ _vdp_cap_dump_color(background_color);
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_presentation_queue_get_time(
+ VdpPresentationQueue presentation_queue,
+ /* output parameters follow */
+ VdpTime * current_time
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_presentation_queue_get_time(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %s",
+ presentation_queue,
+ current_time ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_presentation_queue_get_time(
+ presentation_queue,
+ current_time
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %" PRIu64,
+ *current_time
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_presentation_queue_display(
+ VdpPresentationQueue presentation_queue,
+ VdpOutputSurface surface,
+ uint32_t clip_width,
+ uint32_t clip_height,
+ VdpTime earliest_presentation_time
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_presentation_queue_display(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %u, %u, %" PRIu64,
+ presentation_queue,
+ surface,
+ clip_width,
+ clip_height,
+ earliest_presentation_time
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_presentation_queue_display(
+ presentation_queue,
+ surface,
+ clip_width,
+ clip_height,
+ earliest_presentation_time
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_presentation_queue_block_until_surface_idle(
+ VdpPresentationQueue presentation_queue,
+ VdpOutputSurface surface,
+ /* output parameters follow */
+ VdpTime * first_presentation_time
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_presentation_queue_block_until_surface_idle(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s",
+ presentation_queue,
+ surface,
+ first_presentation_time ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_presentation_queue_block_until_surface_idle(
+ presentation_queue,
+ surface,
+ first_presentation_time
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %" PRIu64,
+ *first_presentation_time
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_presentation_queue_query_surface_status(
+ VdpPresentationQueue presentation_queue,
+ VdpOutputSurface surface,
+ /* output parameters follow */
+ VdpPresentationQueueStatus * status,
+ VdpTime * first_presentation_time
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_presentation_queue_query_surface_status(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s, %s",
+ presentation_queue,
+ surface,
+ status ? "-" : "NULL",
+ first_presentation_time ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_presentation_queue_query_surface_status(
+ presentation_queue,
+ surface,
+ status,
+ first_presentation_time
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %d, %" PRIu64,
+ *status,
+ *first_presentation_time
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_preemption_callback_register(
+ VdpDevice device,
+ VdpPreemptionCallback callback,
+ void * context
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_preemption_callback_register(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %p, %p",
+ device,
+ callback,
+ context
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_preemption_callback_register(
+ device,
+ callback,
+ context
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d\n", ret);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_presentation_queue_target_create_x11(
+ VdpDevice device,
+ Drawable drawable,
+ /* output parameters follow */
+ VdpPresentationQueueTarget * target
+)
+{
+ VdpStatus ret;
+
+ fprintf(_vdp_cap_data.fp, "vdp_presentation_queue_target_create_x11(");
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %lu, %s",
+ device,
+ drawable,
+ target ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ ret = _vdp_cap_data.vdp_presentation_queue_target_create_x11(
+ device,
+ drawable,
+ target
+ );
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %u",
+ *target
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+static VdpStatus _vdp_cap_get_proc_address(
+ VdpDevice device,
+ VdpFuncId function_id,
+ /* output parameters follow */
+ void * * function_pointer
+)
+{
+ VdpStatus ret;
+
+ fputs("vdp_get_proc_address(", _vdp_cap_data.fp);
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%u, %u, %s",
+ device,
+ function_id,
+ function_pointer ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ if (device != _vdp_cap_data.vdp_device) {
+ _VDP_TRACE_ERROR_BREAKPOINT();
+ ret = VDP_STATUS_ERROR;
+ }
+ else if (!function_pointer) {
+ _VDP_TRACE_ERROR_BREAKPOINT();
+ ret = VDP_STATUS_ERROR;
+ }
+ else {
+ ret = VDP_STATUS_OK;
+
+ switch (function_id) {
+ case VDP_FUNC_ID_GET_ERROR_STRING:
+ *function_pointer = (void *)&_vdp_cap_get_error_string;
+ break;
+ case VDP_FUNC_ID_GET_PROC_ADDRESS:
+ *function_pointer = (void *)&_vdp_cap_get_proc_address;
+ break;
+ case VDP_FUNC_ID_GET_API_VERSION:
+ *function_pointer = (void *)&_vdp_cap_get_api_version;
+ break;
+ case VDP_FUNC_ID_GET_INFORMATION_STRING:
+ *function_pointer = (void *)&_vdp_cap_get_information_string;
+ break;
+ case VDP_FUNC_ID_DEVICE_DESTROY:
+ *function_pointer = (void *)&_vdp_cap_device_destroy;
+ break;
+ case VDP_FUNC_ID_GENERATE_CSC_MATRIX:
+ *function_pointer = (void *)&_vdp_cap_generate_csc_matrix;
+ break;
+ case VDP_FUNC_ID_VIDEO_SURFACE_QUERY_CAPABILITIES:
+ *function_pointer = (void *)&_vdp_cap_video_surface_query_capabilities;
+ break;
+ case VDP_FUNC_ID_VIDEO_SURFACE_QUERY_GET_PUT_BITS_Y_CB_CR_CAPABILITIES:
+ *function_pointer = (void *)&_vdp_cap_video_surface_query_get_put_bits_y_cb_cr_capabilities;
+ break;
+ case VDP_FUNC_ID_VIDEO_SURFACE_CREATE:
+ *function_pointer = (void *)&_vdp_cap_video_surface_create;
+ break;
+ case VDP_FUNC_ID_VIDEO_SURFACE_DESTROY:
+ *function_pointer = (void *)&_vdp_cap_video_surface_destroy;
+ break;
+ case VDP_FUNC_ID_VIDEO_SURFACE_GET_PARAMETERS:
+ *function_pointer = (void *)&_vdp_cap_video_surface_get_parameters;
+ break;
+ case VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR:
+ *function_pointer = (void *)&_vdp_cap_video_surface_get_bits_y_cb_cr;
+ break;
+ case VDP_FUNC_ID_VIDEO_SURFACE_PUT_BITS_Y_CB_CR:
+ *function_pointer = (void *)&_vdp_cap_video_surface_put_bits_y_cb_cr;
+ break;
+ case VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_CAPABILITIES:
+ *function_pointer = (void *)&_vdp_cap_output_surface_query_capabilities;
+ break;
+ case VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_GET_PUT_BITS_NATIVE_CAPABILITIES:
+ *function_pointer = (void *)&_vdp_cap_output_surface_query_get_put_bits_native_capabilities;
+ break;
+ case VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_PUT_BITS_INDEXED_CAPABILITIES:
+ *function_pointer = (void *)&_vdp_cap_output_surface_query_put_bits_indexed_capabilities;
+ break;
+ case VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_PUT_BITS_Y_CB_CR_CAPABILITIES:
+ *function_pointer = (void *)&_vdp_cap_output_surface_query_put_bits_y_cb_cr_capabilities;
+ break;
+ case VDP_FUNC_ID_OUTPUT_SURFACE_CREATE:
+ *function_pointer = (void *)&_vdp_cap_output_surface_create;
+ break;
+ case VDP_FUNC_ID_OUTPUT_SURFACE_DESTROY:
+ *function_pointer = (void *)&_vdp_cap_output_surface_destroy;
+ break;
+ case VDP_FUNC_ID_OUTPUT_SURFACE_GET_PARAMETERS:
+ *function_pointer = (void *)&_vdp_cap_output_surface_get_parameters;
+ break;
+ case VDP_FUNC_ID_OUTPUT_SURFACE_GET_BITS_NATIVE:
+ *function_pointer = (void *)&_vdp_cap_output_surface_get_bits_native;
+ break;
+ case VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_NATIVE:
+ *function_pointer = (void *)&_vdp_cap_output_surface_put_bits_native;
+ break;
+ case VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_INDEXED:
+ *function_pointer = (void *)&_vdp_cap_output_surface_put_bits_indexed;
+ break;
+ case VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_Y_CB_CR:
+ *function_pointer = (void *)&_vdp_cap_output_surface_put_bits_y_cb_cr;
+ break;
+ case VDP_FUNC_ID_BITMAP_SURFACE_QUERY_CAPABILITIES:
+ *function_pointer = (void *)&_vdp_cap_bitmap_surface_query_capabilities;
+ break;
+ case VDP_FUNC_ID_BITMAP_SURFACE_CREATE:
+ *function_pointer = (void *)&_vdp_cap_bitmap_surface_create;
+ break;
+ case VDP_FUNC_ID_BITMAP_SURFACE_DESTROY:
+ *function_pointer = (void *)&_vdp_cap_bitmap_surface_destroy;
+ break;
+ case VDP_FUNC_ID_BITMAP_SURFACE_GET_PARAMETERS:
+ *function_pointer = (void *)&_vdp_cap_bitmap_surface_get_parameters;
+ break;
+ case VDP_FUNC_ID_BITMAP_SURFACE_PUT_BITS_NATIVE:
+ *function_pointer = (void *)&_vdp_cap_bitmap_surface_put_bits_native;
+ break;
+ case VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_OUTPUT_SURFACE:
+ *function_pointer = (void *)&_vdp_cap_output_surface_render_output_surface;
+ break;
+ case VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_BITMAP_SURFACE:
+ *function_pointer = (void *)&_vdp_cap_output_surface_render_bitmap_surface;
+ break;
+ case VDP_FUNC_ID_DECODER_QUERY_CAPABILITIES:
+ *function_pointer = (void *)&_vdp_cap_decoder_query_capabilities;
+ break;
+ case VDP_FUNC_ID_DECODER_CREATE:
+ *function_pointer = (void *)&_vdp_cap_decoder_create;
+ break;
+ case VDP_FUNC_ID_DECODER_DESTROY:
+ *function_pointer = (void *)&_vdp_cap_decoder_destroy;
+ break;
+ case VDP_FUNC_ID_DECODER_GET_PARAMETERS:
+ *function_pointer = (void *)&_vdp_cap_decoder_get_parameters;
+ break;
+ case VDP_FUNC_ID_DECODER_RENDER:
+ *function_pointer = (void *)&_vdp_cap_decoder_render;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_QUERY_FEATURE_SUPPORT:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_query_feature_support;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_SUPPORT:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_query_parameter_support;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_QUERY_ATTRIBUTE_SUPPORT:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_query_attribute_support;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_VALUE_RANGE:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_query_parameter_value_range;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_QUERY_ATTRIBUTE_VALUE_RANGE:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_query_attribute_value_range;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_CREATE:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_create;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_set_feature_enables;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_set_attribute_values;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_GET_FEATURE_SUPPORT:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_get_feature_support;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_GET_FEATURE_ENABLES:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_get_feature_enables;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_GET_PARAMETER_VALUES:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_get_parameter_values;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_GET_ATTRIBUTE_VALUES:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_get_attribute_values;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_DESTROY:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_destroy;
+ break;
+ case VDP_FUNC_ID_VIDEO_MIXER_RENDER:
+ *function_pointer = (void *)&_vdp_cap_video_mixer_render;
+ break;
+ case VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY:
+ *function_pointer = (void *)&_vdp_cap_presentation_queue_target_destroy;
+ break;
+ case VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE:
+ *function_pointer = (void *)&_vdp_cap_presentation_queue_create;
+ break;
+ case VDP_FUNC_ID_PRESENTATION_QUEUE_DESTROY:
+ *function_pointer = (void *)&_vdp_cap_presentation_queue_destroy;
+ break;
+ case VDP_FUNC_ID_PRESENTATION_QUEUE_SET_BACKGROUND_COLOR:
+ *function_pointer = (void *)&_vdp_cap_presentation_queue_set_background_color;
+ break;
+ case VDP_FUNC_ID_PRESENTATION_QUEUE_GET_BACKGROUND_COLOR:
+ *function_pointer = (void *)&_vdp_cap_presentation_queue_get_background_color;
+ break;
+ case VDP_FUNC_ID_PRESENTATION_QUEUE_GET_TIME:
+ *function_pointer = (void *)&_vdp_cap_presentation_queue_get_time;
+ break;
+ case VDP_FUNC_ID_PRESENTATION_QUEUE_DISPLAY:
+ *function_pointer = (void *)&_vdp_cap_presentation_queue_display;
+ break;
+ case VDP_FUNC_ID_PRESENTATION_QUEUE_BLOCK_UNTIL_SURFACE_IDLE:
+ *function_pointer = (void *)&_vdp_cap_presentation_queue_block_until_surface_idle;
+ break;
+ case VDP_FUNC_ID_PRESENTATION_QUEUE_QUERY_SURFACE_STATUS:
+ *function_pointer = (void *)&_vdp_cap_presentation_queue_query_surface_status;
+ break;
+ case VDP_FUNC_ID_PREEMPTION_CALLBACK_REGISTER:
+ *function_pointer = (void *)&_vdp_cap_preemption_callback_register;
+ break;
+ case VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_CREATE_X11:
+ *function_pointer = (void *)&_vdp_cap_presentation_queue_target_create_x11;
+ break;
+ default:
+ fprintf(
+ _vdp_cap_data.fp,
+ "VDPAU capture: Not able to proxy function %d",
+ function_id
+ );
+ ret = _vdp_cap_data.vdp_get_proc_address(device, function_id, function_pointer);
+ break;
+ }
+
+ if ((ret == VDP_STATUS_OK) && !*function_pointer) {
+ ret = VDP_STATUS_INVALID_FUNC_ID;
+ }
+ }
+
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", ret);
+ if (ret == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %p",
+ *function_pointer
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return ret;
+}
+
+extern "C" void vdp_trace_set_backend_handle(
+ void * driver_dll_handle
+)
+{
+ _vdp_cap_data.dll = driver_dll_handle;
+}
+
+extern "C" VdpDeviceCreateX11 vdp_trace_device_create_x11;
+
+VdpStatus vdp_trace_device_create_x11(
+ Display * display,
+ int screen,
+ /* output parameters follow */
+ VdpDevice * device,
+ VdpGetProcAddress * * get_proc_address
+)
+{
+ if (!device || !get_proc_address) {
+ _VDP_TRACE_ERROR_BREAKPOINT();
+ return VDP_STATUS_INVALID_POINTER;
+ }
+
+ // For now, the capture library only allows a single VdpDevice
+ // This could probably be fixed by dynamically associating most of
+ // _vdp_cap_data with a VdpDevice handle.
+ if (_vdp_cap_data.fp) {
+ fprintf(_vdp_cap_data.fp,
+ "VDPAU trace: Multiple devices created; "
+ "will return get_proc_address results from the latest only\n"
+ );
+ }
+ else {
+ _vdp_cap_data.level = 0;
+ char const * vdpau_trace = getenv("VDPAU_TRACE");
+ if (vdpau_trace) {
+ _vdp_cap_data.level = atoi(vdpau_trace);
+ }
+
+ _vdp_cap_data.fp = 0;
+ char const * vdpau_trace_file = getenv("VDPAU_TRACE_FILE");
+ if (vdpau_trace_file && strlen(vdpau_trace_file)) {
+ if (vdpau_trace_file[0] == '&') {
+ int fd = atoi(&vdpau_trace_file[1]);
+ _vdp_cap_data.fp = fdopen(fd, "wt");
+ }
+ else {
+ _vdp_cap_data.fp = fopen(vdpau_trace_file, "wt");
+ }
+ if (!_vdp_cap_data.fp) {
+ fprintf(
+ stderr,
+ "VDPAU capture: ERROR: Can't open '%s' for writing, defaulting to stderr\n",
+ vdpau_trace_file
+ );
+ }
+ }
+ if (!_vdp_cap_data.fp) {
+ _vdp_cap_data.fp = stderr;
+ }
+ fprintf(_vdp_cap_data.fp, "VDPAU capture: Enabled\n");
+ }
+
+ fprintf(_vdp_cap_data.fp, "vdp_imp_device_create_x11(");
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(
+ _vdp_cap_data.fp,
+ "%p, %d, %s, %s",
+ display,
+ screen,
+ device ? "-" : "NULL",
+ get_proc_address ? "-" : "NULL"
+ );
+ }
+ fputs(")\n", _vdp_cap_data.fp);
+
+ VdpStatus vdp_st = VDP_STATUS_ERROR;
+
+ VdpDeviceCreateX11 * vdp_imp_device_create_x11;
+ vdp_imp_device_create_x11 = (VdpDeviceCreateX11*)dlsym(
+ _vdp_cap_data.dll,
+ "vdp_imp_device_create_x11"
+ );
+ if (!vdp_imp_device_create_x11) {
+ _VDP_TRACE_ERROR_BREAKPOINT();
+ vdp_st = VDP_STATUS_NO_IMPLEMENTATION;
+ goto done;
+ }
+
+ vdp_st = vdp_imp_device_create_x11(
+ display,
+ screen,
+ &_vdp_cap_data.vdp_device,
+ &_vdp_cap_data.vdp_get_proc_address
+ );
+ if (vdp_st != VDP_STATUS_OK) {
+ _VDP_TRACE_ERROR_BREAKPOINT();
+ goto done;
+ }
+
+ *device = _vdp_cap_data.vdp_device;
+ *get_proc_address = _vdp_cap_get_proc_address;
+
+#define GET_POINTER(_id_, _var_) \
+ vdp_st = _vdp_cap_data.vdp_get_proc_address( \
+ _vdp_cap_data.vdp_device, \
+ (_id_), \
+ (void * *)&_vdp_cap_data._var_ \
+ ); \
+ if (vdp_st != VDP_STATUS_OK) { \
+ _vdp_cap_data._var_ = 0; \
+ }
+
+ GET_POINTER(VDP_FUNC_ID_PREEMPTION_CALLBACK_REGISTER, vdp_preemption_callback_register);
+ GET_POINTER(VDP_FUNC_ID_GET_ERROR_STRING, vdp_get_error_string);
+ GET_POINTER(VDP_FUNC_ID_GET_API_VERSION, vdp_get_api_version);
+ GET_POINTER(VDP_FUNC_ID_GET_INFORMATION_STRING, vdp_get_information_string);
+ GET_POINTER(VDP_FUNC_ID_DEVICE_DESTROY, vdp_device_destroy);
+ GET_POINTER(VDP_FUNC_ID_GENERATE_CSC_MATRIX, vdp_generate_csc_matrix);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_SURFACE_QUERY_CAPABILITIES, vdp_video_surface_query_capabilities);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_SURFACE_QUERY_GET_PUT_BITS_Y_CB_CR_CAPABILITIES, vdp_video_surface_query_get_put_bits_y_cb_cr_capabilities);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_SURFACE_CREATE, vdp_video_surface_create);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_SURFACE_DESTROY, vdp_video_surface_destroy);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_SURFACE_GET_PARAMETERS, vdp_video_surface_get_parameters);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR, vdp_video_surface_get_bits_y_cb_cr);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_SURFACE_PUT_BITS_Y_CB_CR, vdp_video_surface_put_bits_y_cb_cr);
+ GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_CAPABILITIES, vdp_output_surface_query_capabilities);
+ GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_GET_PUT_BITS_NATIVE_CAPABILITIES, vdp_output_surface_query_get_put_bits_native_capabilities);
+ GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_PUT_BITS_INDEXED_CAPABILITIES, vdp_output_surface_query_put_bits_indexed_capabilities);
+ GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_PUT_BITS_Y_CB_CR_CAPABILITIES, vdp_output_surface_query_put_bits_y_cb_cr_capabilities);
+ GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_CREATE, vdp_output_surface_create);
+ GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_DESTROY, vdp_output_surface_destroy);
+ GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_GET_PARAMETERS, vdp_output_surface_get_parameters);
+ GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_GET_BITS_NATIVE, vdp_output_surface_get_bits_native);
+ GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_NATIVE, vdp_output_surface_put_bits_native);
+ GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_INDEXED, vdp_output_surface_put_bits_indexed);
+ GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_Y_CB_CR, vdp_output_surface_put_bits_y_cb_cr);
+ GET_POINTER(VDP_FUNC_ID_BITMAP_SURFACE_QUERY_CAPABILITIES, vdp_bitmap_surface_query_capabilities);
+ GET_POINTER(VDP_FUNC_ID_BITMAP_SURFACE_CREATE, vdp_bitmap_surface_create);
+ GET_POINTER(VDP_FUNC_ID_BITMAP_SURFACE_DESTROY, vdp_bitmap_surface_destroy);
+ GET_POINTER(VDP_FUNC_ID_BITMAP_SURFACE_GET_PARAMETERS, vdp_bitmap_surface_get_parameters);
+ GET_POINTER(VDP_FUNC_ID_BITMAP_SURFACE_PUT_BITS_NATIVE, vdp_bitmap_surface_put_bits_native);
+ GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_OUTPUT_SURFACE, vdp_output_surface_render_output_surface);
+ GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_BITMAP_SURFACE, vdp_output_surface_render_bitmap_surface);
+ GET_POINTER(VDP_FUNC_ID_DECODER_QUERY_CAPABILITIES, vdp_decoder_query_capabilities);
+ GET_POINTER(VDP_FUNC_ID_DECODER_CREATE, vdp_decoder_create);
+ GET_POINTER(VDP_FUNC_ID_DECODER_DESTROY, vdp_decoder_destroy);
+ GET_POINTER(VDP_FUNC_ID_DECODER_GET_PARAMETERS, vdp_decoder_get_parameters);
+ GET_POINTER(VDP_FUNC_ID_DECODER_RENDER, vdp_decoder_render);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_QUERY_FEATURE_SUPPORT, vdp_video_mixer_query_feature_support);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_SUPPORT, vdp_video_mixer_query_parameter_support);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_QUERY_ATTRIBUTE_SUPPORT, vdp_video_mixer_query_attribute_support);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_VALUE_RANGE, vdp_video_mixer_query_parameter_value_range);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_QUERY_ATTRIBUTE_VALUE_RANGE, vdp_video_mixer_query_attribute_value_range);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_CREATE, vdp_video_mixer_create);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES, vdp_video_mixer_set_feature_enables);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES, vdp_video_mixer_set_attribute_values);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_GET_FEATURE_SUPPORT, vdp_video_mixer_get_feature_support);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_GET_FEATURE_ENABLES, vdp_video_mixer_get_feature_enables);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_GET_PARAMETER_VALUES, vdp_video_mixer_get_parameter_values);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_GET_ATTRIBUTE_VALUES, vdp_video_mixer_get_attribute_values);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_DESTROY, vdp_video_mixer_destroy);
+ GET_POINTER(VDP_FUNC_ID_VIDEO_MIXER_RENDER, vdp_video_mixer_render);
+ GET_POINTER(VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY, vdp_presentation_queue_target_destroy);
+ GET_POINTER(VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE, vdp_presentation_queue_create);
+ GET_POINTER(VDP_FUNC_ID_PRESENTATION_QUEUE_DESTROY, vdp_presentation_queue_destroy);
+ GET_POINTER(VDP_FUNC_ID_PRESENTATION_QUEUE_SET_BACKGROUND_COLOR, vdp_presentation_queue_set_background_color);
+ GET_POINTER(VDP_FUNC_ID_PRESENTATION_QUEUE_GET_BACKGROUND_COLOR, vdp_presentation_queue_get_background_color);
+ GET_POINTER(VDP_FUNC_ID_PRESENTATION_QUEUE_GET_TIME, vdp_presentation_queue_get_time);
+ GET_POINTER(VDP_FUNC_ID_PRESENTATION_QUEUE_DISPLAY, vdp_presentation_queue_display);
+ GET_POINTER(VDP_FUNC_ID_PRESENTATION_QUEUE_BLOCK_UNTIL_SURFACE_IDLE, vdp_presentation_queue_block_until_surface_idle);
+ GET_POINTER(VDP_FUNC_ID_PRESENTATION_QUEUE_QUERY_SURFACE_STATUS, vdp_presentation_queue_query_surface_status);
+ GET_POINTER(VDP_FUNC_ID_PREEMPTION_CALLBACK_REGISTER, vdp_preemption_callback_register);
+ GET_POINTER(VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_CREATE_X11, vdp_presentation_queue_target_create_x11);
+
+ vdp_st = VDP_STATUS_OK;
+
+done:
+ if (_vdp_cap_data.level >= LEVEL_PARAMS) {
+ fprintf(_vdp_cap_data.fp, " -> %d", vdp_st);
+ if (vdp_st == VDP_STATUS_OK) {
+ fprintf(
+ _vdp_cap_data.fp,
+ ", %x, %p",
+ _vdp_cap_data.vdp_device,
+ _vdp_cap_data.vdp_get_proc_address
+ );
+ }
+ fputs("\n", _vdp_cap_data.fp);
+ }
+
+ return vdp_st;
+}
+