blob: 37d479bf7445e25ecf44cbf1241b776f543010a2 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gpu/ipc/common/gpu_info_mojom_traits.h"
#include "build/build_config.h"
#include "base/notreached.h"
#include "mojo/public/cpp/base/time_mojom_traits.h"
#if BUILDFLAG(ENABLE_VULKAN)
#include "gpu/ipc/common/vulkan_info_mojom_traits.h"
#endif
namespace mojo {
// static
bool StructTraits<gpu::mojom::GpuDeviceDataView, gpu::GPUInfo::GPUDevice>::Read(
gpu::mojom::GpuDeviceDataView data,
gpu::GPUInfo::GPUDevice* out) {
out->vendor_id = data.vendor_id();
out->device_id = data.device_id();
#if defined(OS_WIN)
out->sub_sys_id = data.sub_sys_id();
out->revision = data.revision();
#endif // OS_WIN
out->active = data.active();
out->cuda_compute_capability_major = data.cuda_compute_capability_major();
return data.ReadVendorString(&out->vendor_string) &&
data.ReadDeviceString(&out->device_string) &&
#if defined(OS_WIN)
data.ReadLuid(&out->luid) &&
#endif // OS_WIN
data.ReadDriverVendor(&out->driver_vendor) &&
data.ReadDriverVersion(&out->driver_version);
}
// static
gpu::mojom::VideoCodecProfile
EnumTraits<gpu::mojom::VideoCodecProfile, gpu::VideoCodecProfile>::ToMojom(
gpu::VideoCodecProfile video_codec_profile) {
switch (video_codec_profile) {
case gpu::VideoCodecProfile::VIDEO_CODEC_PROFILE_UNKNOWN:
return gpu::mojom::VideoCodecProfile::VIDEO_CODEC_PROFILE_UNKNOWN;
case gpu::VideoCodecProfile::H264PROFILE_BASELINE:
return gpu::mojom::VideoCodecProfile::H264PROFILE_BASELINE;
case gpu::VideoCodecProfile::H264PROFILE_MAIN:
return gpu::mojom::VideoCodecProfile::H264PROFILE_MAIN;
case gpu::VideoCodecProfile::H264PROFILE_EXTENDED:
return gpu::mojom::VideoCodecProfile::H264PROFILE_EXTENDED;
case gpu::VideoCodecProfile::H264PROFILE_HIGH:
return gpu::mojom::VideoCodecProfile::H264PROFILE_HIGH;
case gpu::VideoCodecProfile::H264PROFILE_HIGH10PROFILE:
return gpu::mojom::VideoCodecProfile::H264PROFILE_HIGH10PROFILE;
case gpu::VideoCodecProfile::H264PROFILE_HIGH422PROFILE:
return gpu::mojom::VideoCodecProfile::H264PROFILE_HIGH422PROFILE;
case gpu::VideoCodecProfile::H264PROFILE_HIGH444PREDICTIVEPROFILE:
return gpu::mojom::VideoCodecProfile::
H264PROFILE_HIGH444PREDICTIVEPROFILE;
case gpu::VideoCodecProfile::H264PROFILE_SCALABLEBASELINE:
return gpu::mojom::VideoCodecProfile::H264PROFILE_SCALABLEBASELINE;
case gpu::VideoCodecProfile::H264PROFILE_SCALABLEHIGH:
return gpu::mojom::VideoCodecProfile::H264PROFILE_SCALABLEHIGH;
case gpu::VideoCodecProfile::H264PROFILE_STEREOHIGH:
return gpu::mojom::VideoCodecProfile::H264PROFILE_STEREOHIGH;
case gpu::VideoCodecProfile::H264PROFILE_MULTIVIEWHIGH:
return gpu::mojom::VideoCodecProfile::H264PROFILE_MULTIVIEWHIGH;
case gpu::VideoCodecProfile::VP8PROFILE_ANY:
return gpu::mojom::VideoCodecProfile::VP8PROFILE_ANY;
case gpu::VideoCodecProfile::VP9PROFILE_PROFILE0:
return gpu::mojom::VideoCodecProfile::VP9PROFILE_PROFILE0;
case gpu::VideoCodecProfile::VP9PROFILE_PROFILE1:
return gpu::mojom::VideoCodecProfile::VP9PROFILE_PROFILE1;
case gpu::VideoCodecProfile::VP9PROFILE_PROFILE2:
return gpu::mojom::VideoCodecProfile::VP9PROFILE_PROFILE2;
case gpu::VideoCodecProfile::VP9PROFILE_PROFILE3:
return gpu::mojom::VideoCodecProfile::VP9PROFILE_PROFILE3;
case gpu::VideoCodecProfile::HEVCPROFILE_MAIN:
return gpu::mojom::VideoCodecProfile::HEVCPROFILE_MAIN;
case gpu::VideoCodecProfile::HEVCPROFILE_MAIN10:
return gpu::mojom::VideoCodecProfile::HEVCPROFILE_MAIN10;
case gpu::VideoCodecProfile::HEVCPROFILE_MAIN_STILL_PICTURE:
return gpu::mojom::VideoCodecProfile::HEVCPROFILE_MAIN_STILL_PICTURE;
case gpu::VideoCodecProfile::DOLBYVISION_PROFILE0:
return gpu::mojom::VideoCodecProfile::DOLBYVISION_PROFILE0;
case gpu::VideoCodecProfile::DOLBYVISION_PROFILE4:
return gpu::mojom::VideoCodecProfile::DOLBYVISION_PROFILE4;
case gpu::VideoCodecProfile::DOLBYVISION_PROFILE5:
return gpu::mojom::VideoCodecProfile::DOLBYVISION_PROFILE5;
case gpu::VideoCodecProfile::DOLBYVISION_PROFILE7:
return gpu::mojom::VideoCodecProfile::DOLBYVISION_PROFILE7;
case gpu::VideoCodecProfile::DOLBYVISION_PROFILE8:
return gpu::mojom::VideoCodecProfile::DOLBYVISION_PROFILE8;
case gpu::VideoCodecProfile::DOLBYVISION_PROFILE9:
return gpu::mojom::VideoCodecProfile::DOLBYVISION_PROFILE9;
case gpu::VideoCodecProfile::THEORAPROFILE_ANY:
return gpu::mojom::VideoCodecProfile::THEORAPROFILE_ANY;
case gpu::VideoCodecProfile::AV1PROFILE_PROFILE_MAIN:
return gpu::mojom::VideoCodecProfile::AV1PROFILE_PROFILE_MAIN;
case gpu::VideoCodecProfile::AV1PROFILE_PROFILE_HIGH:
return gpu::mojom::VideoCodecProfile::AV1PROFILE_PROFILE_HIGH;
case gpu::VideoCodecProfile::AV1PROFILE_PROFILE_PRO:
return gpu::mojom::VideoCodecProfile::AV1PROFILE_PROFILE_PRO;
}
NOTREACHED() << "Invalid VideoCodecProfile:" << video_codec_profile;
return gpu::mojom::VideoCodecProfile::VIDEO_CODEC_PROFILE_UNKNOWN;
}
// static
bool EnumTraits<gpu::mojom::VideoCodecProfile, gpu::VideoCodecProfile>::
FromMojom(gpu::mojom::VideoCodecProfile input,
gpu::VideoCodecProfile* out) {
switch (input) {
case gpu::mojom::VideoCodecProfile::VIDEO_CODEC_PROFILE_UNKNOWN:
*out = gpu::VideoCodecProfile::VIDEO_CODEC_PROFILE_UNKNOWN;
return true;
case gpu::mojom::VideoCodecProfile::H264PROFILE_BASELINE:
*out = gpu::VideoCodecProfile::H264PROFILE_BASELINE;
return true;
case gpu::mojom::VideoCodecProfile::H264PROFILE_MAIN:
*out = gpu::VideoCodecProfile::H264PROFILE_MAIN;
return true;
case gpu::mojom::VideoCodecProfile::H264PROFILE_EXTENDED:
*out = gpu::VideoCodecProfile::H264PROFILE_EXTENDED;
return true;
case gpu::mojom::VideoCodecProfile::H264PROFILE_HIGH:
*out = gpu::VideoCodecProfile::H264PROFILE_HIGH;
return true;
case gpu::mojom::VideoCodecProfile::H264PROFILE_HIGH10PROFILE:
*out = gpu::VideoCodecProfile::H264PROFILE_HIGH10PROFILE;
return true;
case gpu::mojom::VideoCodecProfile::H264PROFILE_HIGH422PROFILE:
*out = gpu::VideoCodecProfile::H264PROFILE_HIGH422PROFILE;
return true;
case gpu::mojom::VideoCodecProfile::H264PROFILE_HIGH444PREDICTIVEPROFILE:
*out = gpu::VideoCodecProfile::H264PROFILE_HIGH444PREDICTIVEPROFILE;
return true;
case gpu::mojom::VideoCodecProfile::H264PROFILE_SCALABLEBASELINE:
*out = gpu::VideoCodecProfile::H264PROFILE_SCALABLEBASELINE;
return true;
case gpu::mojom::VideoCodecProfile::H264PROFILE_SCALABLEHIGH:
*out = gpu::VideoCodecProfile::H264PROFILE_SCALABLEHIGH;
return true;
case gpu::mojom::VideoCodecProfile::H264PROFILE_STEREOHIGH:
*out = gpu::VideoCodecProfile::H264PROFILE_STEREOHIGH;
return true;
case gpu::mojom::VideoCodecProfile::H264PROFILE_MULTIVIEWHIGH:
*out = gpu::VideoCodecProfile::H264PROFILE_MULTIVIEWHIGH;
return true;
case gpu::mojom::VideoCodecProfile::VP8PROFILE_ANY:
*out = gpu::VideoCodecProfile::VP8PROFILE_ANY;
return true;
case gpu::mojom::VideoCodecProfile::VP9PROFILE_PROFILE0:
*out = gpu::VideoCodecProfile::VP9PROFILE_PROFILE0;
return true;
case gpu::mojom::VideoCodecProfile::VP9PROFILE_PROFILE1:
*out = gpu::VideoCodecProfile::VP9PROFILE_PROFILE1;
return true;
case gpu::mojom::VideoCodecProfile::VP9PROFILE_PROFILE2:
*out = gpu::VideoCodecProfile::VP9PROFILE_PROFILE2;
return true;
case gpu::mojom::VideoCodecProfile::VP9PROFILE_PROFILE3:
*out = gpu::VideoCodecProfile::VP9PROFILE_PROFILE3;
return true;
case gpu::mojom::VideoCodecProfile::HEVCPROFILE_MAIN:
*out = gpu::VideoCodecProfile::HEVCPROFILE_MAIN;
return true;
case gpu::mojom::VideoCodecProfile::HEVCPROFILE_MAIN10:
*out = gpu::VideoCodecProfile::HEVCPROFILE_MAIN10;
return true;
case gpu::mojom::VideoCodecProfile::HEVCPROFILE_MAIN_STILL_PICTURE:
*out = gpu::VideoCodecProfile::HEVCPROFILE_MAIN_STILL_PICTURE;
return true;
case gpu::mojom::VideoCodecProfile::DOLBYVISION_PROFILE0:
*out = gpu::VideoCodecProfile::DOLBYVISION_PROFILE0;
return true;
case gpu::mojom::VideoCodecProfile::DOLBYVISION_PROFILE4:
*out = gpu::VideoCodecProfile::DOLBYVISION_PROFILE4;
return true;
case gpu::mojom::VideoCodecProfile::DOLBYVISION_PROFILE5:
*out = gpu::VideoCodecProfile::DOLBYVISION_PROFILE5;
return true;
case gpu::mojom::VideoCodecProfile::DOLBYVISION_PROFILE7:
*out = gpu::VideoCodecProfile::DOLBYVISION_PROFILE7;
return true;
case gpu::mojom::VideoCodecProfile::DOLBYVISION_PROFILE8:
*out = gpu::VideoCodecProfile::DOLBYVISION_PROFILE8;
return true;
case gpu::mojom::VideoCodecProfile::DOLBYVISION_PROFILE9:
*out = gpu::VideoCodecProfile::DOLBYVISION_PROFILE9;
return true;
case gpu::mojom::VideoCodecProfile::THEORAPROFILE_ANY:
*out = gpu::VideoCodecProfile::THEORAPROFILE_ANY;
return true;
case gpu::mojom::VideoCodecProfile::AV1PROFILE_PROFILE_MAIN:
*out = gpu::VideoCodecProfile::AV1PROFILE_PROFILE_MAIN;
return true;
case gpu::mojom::VideoCodecProfile::AV1PROFILE_PROFILE_HIGH:
*out = gpu::VideoCodecProfile::AV1PROFILE_PROFILE_HIGH;
return true;
case gpu::mojom::VideoCodecProfile::AV1PROFILE_PROFILE_PRO:
*out = gpu::VideoCodecProfile::AV1PROFILE_PROFILE_PRO;
return true;
}
NOTREACHED() << "Invalid VideoCodecProfile: " << input;
return false;
}
// static
bool StructTraits<gpu::mojom::VideoDecodeAcceleratorSupportedProfileDataView,
gpu::VideoDecodeAcceleratorSupportedProfile>::
Read(gpu::mojom::VideoDecodeAcceleratorSupportedProfileDataView data,
gpu::VideoDecodeAcceleratorSupportedProfile* out) {
out->encrypted_only = data.encrypted_only();
return data.ReadProfile(&out->profile) &&
data.ReadMaxResolution(&out->max_resolution) &&
data.ReadMinResolution(&out->min_resolution);
}
// static
bool StructTraits<gpu::mojom::VideoDecodeAcceleratorCapabilitiesDataView,
gpu::VideoDecodeAcceleratorCapabilities>::
Read(gpu::mojom::VideoDecodeAcceleratorCapabilitiesDataView data,
gpu::VideoDecodeAcceleratorCapabilities* out) {
if (!data.ReadSupportedProfiles(&out->supported_profiles))
return false;
out->flags = data.flags();
return true;
}
// static
bool StructTraits<gpu::mojom::VideoEncodeAcceleratorSupportedProfileDataView,
gpu::VideoEncodeAcceleratorSupportedProfile>::
Read(gpu::mojom::VideoEncodeAcceleratorSupportedProfileDataView data,
gpu::VideoEncodeAcceleratorSupportedProfile* out) {
out->max_framerate_numerator = data.max_framerate_numerator();
out->max_framerate_denominator = data.max_framerate_denominator();
return data.ReadMinResolution(&out->min_resolution) &&
data.ReadMaxResolution(&out->max_resolution) &&
data.ReadProfile(&out->profile);
}
// static
gpu::mojom::ImageDecodeAcceleratorType EnumTraits<
gpu::mojom::ImageDecodeAcceleratorType,
gpu::ImageDecodeAcceleratorType>::ToMojom(gpu::ImageDecodeAcceleratorType
image_type) {
switch (image_type) {
case gpu::ImageDecodeAcceleratorType::kJpeg:
return gpu::mojom::ImageDecodeAcceleratorType::kJpeg;
case gpu::ImageDecodeAcceleratorType::kWebP:
return gpu::mojom::ImageDecodeAcceleratorType::kWebP;
case gpu::ImageDecodeAcceleratorType::kUnknown:
return gpu::mojom::ImageDecodeAcceleratorType::kUnknown;
}
}
// static
bool EnumTraits<gpu::mojom::ImageDecodeAcceleratorType,
gpu::ImageDecodeAcceleratorType>::
FromMojom(gpu::mojom::ImageDecodeAcceleratorType input,
gpu::ImageDecodeAcceleratorType* out) {
switch (input) {
case gpu::mojom::ImageDecodeAcceleratorType::kJpeg:
*out = gpu::ImageDecodeAcceleratorType::kJpeg;
return true;
case gpu::mojom::ImageDecodeAcceleratorType::kWebP:
*out = gpu::ImageDecodeAcceleratorType::kWebP;
return true;
case gpu::mojom::ImageDecodeAcceleratorType::kUnknown:
*out = gpu::ImageDecodeAcceleratorType::kUnknown;
return true;
}
NOTREACHED() << "Invalid ImageDecodeAcceleratorType: " << input;
return false;
}
// static
gpu::mojom::ImageDecodeAcceleratorSubsampling
EnumTraits<gpu::mojom::ImageDecodeAcceleratorSubsampling,
gpu::ImageDecodeAcceleratorSubsampling>::
ToMojom(gpu::ImageDecodeAcceleratorSubsampling subsampling) {
switch (subsampling) {
case gpu::ImageDecodeAcceleratorSubsampling::k420:
return gpu::mojom::ImageDecodeAcceleratorSubsampling::k420;
case gpu::ImageDecodeAcceleratorSubsampling::k422:
return gpu::mojom::ImageDecodeAcceleratorSubsampling::k422;
case gpu::ImageDecodeAcceleratorSubsampling::k444:
return gpu::mojom::ImageDecodeAcceleratorSubsampling::k444;
}
}
// static
bool EnumTraits<gpu::mojom::ImageDecodeAcceleratorSubsampling,
gpu::ImageDecodeAcceleratorSubsampling>::
FromMojom(gpu::mojom::ImageDecodeAcceleratorSubsampling input,
gpu::ImageDecodeAcceleratorSubsampling* out) {
switch (input) {
case gpu::mojom::ImageDecodeAcceleratorSubsampling::k420:
*out = gpu::ImageDecodeAcceleratorSubsampling::k420;
return true;
case gpu::mojom::ImageDecodeAcceleratorSubsampling::k422:
*out = gpu::ImageDecodeAcceleratorSubsampling::k422;
return true;
case gpu::mojom::ImageDecodeAcceleratorSubsampling::k444:
*out = gpu::ImageDecodeAcceleratorSubsampling::k444;
return true;
}
NOTREACHED() << "Invalid ImageDecodeAcceleratorSubsampling: " << input;
return false;
}
// static
bool StructTraits<gpu::mojom::ImageDecodeAcceleratorSupportedProfileDataView,
gpu::ImageDecodeAcceleratorSupportedProfile>::
Read(gpu::mojom::ImageDecodeAcceleratorSupportedProfileDataView data,
gpu::ImageDecodeAcceleratorSupportedProfile* out) {
return data.ReadImageType(&out->image_type) &&
data.ReadMinEncodedDimensions(&out->min_encoded_dimensions) &&
data.ReadMaxEncodedDimensions(&out->max_encoded_dimensions) &&
data.ReadSubsamplings(&out->subsamplings);
}
#if defined(OS_WIN)
// static
gpu::mojom::OverlaySupport
EnumTraits<gpu::mojom::OverlaySupport, gpu::OverlaySupport>::ToMojom(
gpu::OverlaySupport support) {
switch (support) {
case gpu::OverlaySupport::kNone:
return gpu::mojom::OverlaySupport::NONE;
case gpu::OverlaySupport::kDirect:
return gpu::mojom::OverlaySupport::DIRECT;
case gpu::OverlaySupport::kScaling:
return gpu::mojom::OverlaySupport::SCALING;
case gpu::OverlaySupport::kSoftware:
return gpu::mojom::OverlaySupport::SOFTWARE;
}
}
bool EnumTraits<gpu::mojom::OverlaySupport, gpu::OverlaySupport>::FromMojom(
gpu::mojom::OverlaySupport input,
gpu::OverlaySupport* out) {
switch (input) {
case gpu::mojom::OverlaySupport::NONE:
*out = gpu::OverlaySupport::kNone;
break;
case gpu::mojom::OverlaySupport::DIRECT:
*out = gpu::OverlaySupport::kDirect;
break;
case gpu::mojom::OverlaySupport::SCALING:
*out = gpu::OverlaySupport::kScaling;
break;
case gpu::mojom::OverlaySupport::SOFTWARE:
*out = gpu::OverlaySupport::kSoftware;
break;
}
return true;
}
bool StructTraits<gpu::mojom::OverlayInfoDataView, gpu::OverlayInfo>::Read(
gpu::mojom::OverlayInfoDataView data,
gpu::OverlayInfo* out) {
out->direct_composition = data.direct_composition();
out->supports_overlays = data.supports_overlays();
return data.ReadYuy2OverlaySupport(&out->yuy2_overlay_support) &&
data.ReadNv12OverlaySupport(&out->nv12_overlay_support) &&
data.ReadBgra8OverlaySupport(&out->bgra8_overlay_support) &&
data.ReadRgb10a2OverlaySupport(&out->rgb10a2_overlay_support);
}
#endif
bool StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo>::Read(
gpu::mojom::GpuInfoDataView data,
gpu::GPUInfo* out) {
out->optimus = data.optimus();
out->amd_switchable = data.amd_switchable();
out->gl_reset_notification_strategy = data.gl_reset_notification_strategy();
out->software_rendering = data.software_rendering();
out->sandboxed = data.sandboxed();
out->in_process_gpu = data.in_process_gpu();
out->passthrough_cmd_decoder = data.passthrough_cmd_decoder();
out->can_support_threaded_texture_mailbox =
data.can_support_threaded_texture_mailbox();
#if defined(OS_MAC)
if (!gpu::ValidateMacOSSpecificTextureTarget(
data.macos_specific_texture_target())) {
return false;
}
out->macos_specific_texture_target = data.macos_specific_texture_target();
#endif // OS_MAC
out->jpeg_decode_accelerator_supported =
data.jpeg_decode_accelerator_supported();
out->oop_rasterization_supported = data.oop_rasterization_supported();
out->subpixel_font_rendering = data.subpixel_font_rendering();
#if defined(OS_WIN)
out->d3d12_feature_level = data.d3d12_feature_level();
out->vulkan_version = data.vulkan_version();
#endif
return data.ReadInitializationTime(&out->initialization_time) &&
data.ReadGpu(&out->gpu) &&
data.ReadSecondaryGpus(&out->secondary_gpus) &&
data.ReadPixelShaderVersion(&out->pixel_shader_version) &&
data.ReadVertexShaderVersion(&out->vertex_shader_version) &&
data.ReadMaxMsaaSamples(&out->max_msaa_samples) &&
data.ReadMachineModelName(&out->machine_model_name) &&
data.ReadMachineModelVersion(&out->machine_model_version) &&
data.ReadGlVersion(&out->gl_version) &&
data.ReadGlVendor(&out->gl_vendor) &&
data.ReadGlRenderer(&out->gl_renderer) &&
data.ReadGlExtensions(&out->gl_extensions) &&
data.ReadGlWsVendor(&out->gl_ws_vendor) &&
data.ReadGlWsVersion(&out->gl_ws_version) &&
data.ReadGlWsExtensions(&out->gl_ws_extensions) &&
data.ReadDirectRenderingVersion(&out->direct_rendering_version) &&
#if defined(OS_WIN)
data.ReadOverlayInfo(&out->overlay_info) &&
data.ReadDxDiagnostics(&out->dx_diagnostics) &&
#endif
data.ReadVideoDecodeAcceleratorCapabilities(
&out->video_decode_accelerator_capabilities) &&
data.ReadVideoEncodeAcceleratorSupportedProfiles(
&out->video_encode_accelerator_supported_profiles) &&
data.ReadImageDecodeAcceleratorSupportedProfiles(
&out->image_decode_accelerator_supported_profiles) &&
#if BUILDFLAG(ENABLE_VULKAN)
data.ReadVulkanInfo(&out->vulkan_info) &&
#endif
true;
}
} // namespace mojo