| // Copyright 2016 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef GPU_IPC_COMMON_GPU_PREFERENCES_MOJOM_TRAITS_H_ |
| #define GPU_IPC_COMMON_GPU_PREFERENCES_MOJOM_TRAITS_H_ |
| |
| #include <vector> |
| |
| #include "base/notreached.h" |
| #include "build/build_config.h" |
| #include "build/chromeos_buildflags.h" |
| #include "gpu/config/gpu_preferences.h" |
| #include "gpu/gpu_export.h" |
| #include "gpu/ipc/common/gpu_preferences.mojom-shared.h" |
| #include "ui/gfx/mojom/buffer_types_mojom_traits.h" |
| |
| #if BUILDFLAG(IS_OZONE) |
| #include "base/message_loop/message_pump_type.h" |
| #include "mojo/public/cpp/base/message_pump_type_mojom_traits.h" |
| #endif |
| |
| namespace mojo { |
| |
| template <> |
| struct GPU_EXPORT EnumTraits<gpu::mojom::GrContextType, gpu::GrContextType> { |
| static gpu::mojom::GrContextType ToMojom(gpu::GrContextType input) { |
| switch (input) { |
| case gpu::GrContextType::kGL: |
| return gpu::mojom::GrContextType::kGL; |
| case gpu::GrContextType::kVulkan: |
| return gpu::mojom::GrContextType::kVulkan; |
| case gpu::GrContextType::kGraphiteDawn: |
| return gpu::mojom::GrContextType::kGraphiteDawn; |
| case gpu::GrContextType::kGraphiteMetal: |
| return gpu::mojom::GrContextType::kGraphiteMetal; |
| } |
| NOTREACHED(); |
| return gpu::mojom::GrContextType::kGL; |
| } |
| static bool FromMojom(gpu::mojom::GrContextType input, |
| gpu::GrContextType* out) { |
| switch (input) { |
| case gpu::mojom::GrContextType::kGL: |
| *out = gpu::GrContextType::kGL; |
| return true; |
| case gpu::mojom::GrContextType::kVulkan: |
| *out = gpu::GrContextType::kVulkan; |
| return true; |
| case gpu::mojom::GrContextType::kGraphiteDawn: |
| *out = gpu::GrContextType::kGraphiteDawn; |
| return true; |
| case gpu::mojom::GrContextType::kGraphiteMetal: |
| *out = gpu::GrContextType::kGraphiteMetal; |
| return true; |
| } |
| return false; |
| } |
| }; |
| |
| template <> |
| struct GPU_EXPORT EnumTraits<gpu::mojom::VulkanImplementationName, |
| gpu::VulkanImplementationName> { |
| static gpu::mojom::VulkanImplementationName ToMojom( |
| gpu::VulkanImplementationName input) { |
| switch (input) { |
| case gpu::VulkanImplementationName::kNone: |
| return gpu::mojom::VulkanImplementationName::kNone; |
| case gpu::VulkanImplementationName::kNative: |
| return gpu::mojom::VulkanImplementationName::kNative; |
| case gpu::VulkanImplementationName::kForcedNative: |
| return gpu::mojom::VulkanImplementationName::kForcedNative; |
| case gpu::VulkanImplementationName::kSwiftshader: |
| return gpu::mojom::VulkanImplementationName::kSwiftshader; |
| } |
| NOTREACHED(); |
| return gpu::mojom::VulkanImplementationName::kNone; |
| } |
| static bool FromMojom(gpu::mojom::VulkanImplementationName input, |
| gpu::VulkanImplementationName* out) { |
| switch (input) { |
| case gpu::mojom::VulkanImplementationName::kNone: |
| *out = gpu::VulkanImplementationName::kNone; |
| return true; |
| case gpu::mojom::VulkanImplementationName::kNative: |
| *out = gpu::VulkanImplementationName::kNative; |
| return true; |
| case gpu::mojom::VulkanImplementationName::kForcedNative: |
| *out = gpu::VulkanImplementationName::kForcedNative; |
| return true; |
| case gpu::mojom::VulkanImplementationName::kSwiftshader: |
| *out = gpu::VulkanImplementationName::kSwiftshader; |
| return true; |
| } |
| return false; |
| } |
| }; |
| |
| template <> |
| struct GPU_EXPORT |
| EnumTraits<gpu::mojom::WebGPUAdapterName, gpu::WebGPUAdapterName> { |
| static gpu::mojom::WebGPUAdapterName ToMojom(gpu::WebGPUAdapterName input) { |
| switch (input) { |
| case gpu::WebGPUAdapterName::kDefault: |
| return gpu::mojom::WebGPUAdapterName::kDefault; |
| case gpu::WebGPUAdapterName::kCompat: |
| return gpu::mojom::WebGPUAdapterName::kCompat; |
| case gpu::WebGPUAdapterName::kSwiftShader: |
| return gpu::mojom::WebGPUAdapterName::kSwiftShader; |
| } |
| NOTREACHED(); |
| return gpu::mojom::WebGPUAdapterName::kDefault; |
| } |
| static bool FromMojom(gpu::mojom::WebGPUAdapterName input, |
| gpu::WebGPUAdapterName* out) { |
| switch (input) { |
| case gpu::mojom::WebGPUAdapterName::kDefault: |
| *out = gpu::WebGPUAdapterName::kDefault; |
| return true; |
| case gpu::mojom::WebGPUAdapterName::kCompat: |
| *out = gpu::WebGPUAdapterName::kCompat; |
| return true; |
| case gpu::mojom::WebGPUAdapterName::kSwiftShader: |
| *out = gpu::WebGPUAdapterName::kSwiftShader; |
| return true; |
| } |
| return false; |
| } |
| }; |
| |
| template <> |
| struct GPU_EXPORT |
| EnumTraits<gpu::mojom::WebGPUPowerPreference, gpu::WebGPUPowerPreference> { |
| static gpu::mojom::WebGPUPowerPreference ToMojom( |
| gpu::WebGPUPowerPreference input) { |
| switch (input) { |
| case gpu::WebGPUPowerPreference::kDefaultLowPower: |
| return gpu::mojom::WebGPUPowerPreference::kDefaultLowPower; |
| case gpu::WebGPUPowerPreference::kDefaultHighPerformance: |
| return gpu::mojom::WebGPUPowerPreference::kDefaultHighPerformance; |
| case gpu::WebGPUPowerPreference::kForceLowPower: |
| return gpu::mojom::WebGPUPowerPreference::kForceLowPower; |
| case gpu::WebGPUPowerPreference::kForceHighPerformance: |
| return gpu::mojom::WebGPUPowerPreference::kForceHighPerformance; |
| } |
| NOTREACHED(); |
| return gpu::mojom::WebGPUPowerPreference::kDefaultHighPerformance; |
| } |
| |
| static bool FromMojom(gpu::mojom::WebGPUPowerPreference input, |
| gpu::WebGPUPowerPreference* out) { |
| switch (input) { |
| case gpu::mojom::WebGPUPowerPreference::kDefaultLowPower: |
| *out = gpu::WebGPUPowerPreference::kDefaultLowPower; |
| return true; |
| case gpu::mojom::WebGPUPowerPreference::kDefaultHighPerformance: |
| *out = gpu::WebGPUPowerPreference::kDefaultHighPerformance; |
| return true; |
| case gpu::mojom::WebGPUPowerPreference::kForceLowPower: |
| *out = gpu::WebGPUPowerPreference::kForceLowPower; |
| return true; |
| case gpu::mojom::WebGPUPowerPreference::kForceHighPerformance: |
| *out = gpu::WebGPUPowerPreference::kForceHighPerformance; |
| return true; |
| } |
| return false; |
| } |
| }; |
| |
| template <> |
| struct GPU_EXPORT EnumTraits<gpu::mojom::DawnBackendValidationLevel, |
| gpu::DawnBackendValidationLevel> { |
| static gpu::mojom::DawnBackendValidationLevel ToMojom( |
| gpu::DawnBackendValidationLevel input) { |
| switch (input) { |
| case gpu::DawnBackendValidationLevel::kDisabled: |
| return gpu::mojom::DawnBackendValidationLevel::kDisabled; |
| case gpu::DawnBackendValidationLevel::kPartial: |
| return gpu::mojom::DawnBackendValidationLevel::kPartial; |
| case gpu::DawnBackendValidationLevel::kFull: |
| return gpu::mojom::DawnBackendValidationLevel::kFull; |
| } |
| NOTREACHED(); |
| return gpu::mojom::DawnBackendValidationLevel::kDisabled; |
| } |
| static bool FromMojom(gpu::mojom::DawnBackendValidationLevel input, |
| gpu::DawnBackendValidationLevel* out) { |
| switch (input) { |
| case gpu::mojom::DawnBackendValidationLevel::kDisabled: |
| *out = gpu::DawnBackendValidationLevel::kDisabled; |
| return true; |
| case gpu::mojom::DawnBackendValidationLevel::kPartial: |
| *out = gpu::DawnBackendValidationLevel::kPartial; |
| return true; |
| case gpu::mojom::DawnBackendValidationLevel::kFull: |
| *out = gpu::DawnBackendValidationLevel::kFull; |
| return true; |
| } |
| return false; |
| } |
| }; |
| |
| template <> |
| struct GPU_EXPORT |
| StructTraits<gpu::mojom::GpuPreferencesDataView, gpu::GpuPreferences> { |
| static bool Read(gpu::mojom::GpuPreferencesDataView prefs, |
| gpu::GpuPreferences* out) { |
| out->disable_accelerated_video_decode = |
| prefs.disable_accelerated_video_decode(); |
| out->disable_accelerated_video_encode = |
| prefs.disable_accelerated_video_encode(); |
| out->gpu_startup_dialog = prefs.gpu_startup_dialog(); |
| out->disable_gpu_watchdog = prefs.disable_gpu_watchdog(); |
| out->gpu_sandbox_start_early = prefs.gpu_sandbox_start_early(); |
| out->enable_low_latency_dxva = prefs.enable_low_latency_dxva(); |
| out->enable_zero_copy_dxgi_video = prefs.enable_zero_copy_dxgi_video(); |
| out->enable_nv12_dxgi_video = prefs.enable_nv12_dxgi_video(); |
| out->disable_software_rasterizer = prefs.disable_software_rasterizer(); |
| out->log_gpu_control_list_decisions = |
| prefs.log_gpu_control_list_decisions(); |
| out->compile_shader_always_succeeds = |
| prefs.compile_shader_always_succeeds(); |
| out->disable_gl_error_limit = prefs.disable_gl_error_limit(); |
| out->disable_glsl_translator = prefs.disable_glsl_translator(); |
| out->disable_shader_name_hashing = prefs.disable_shader_name_hashing(); |
| out->enable_gpu_command_logging = prefs.enable_gpu_command_logging(); |
| out->enable_gpu_debugging = prefs.enable_gpu_debugging(); |
| out->enable_gpu_service_logging_gpu = |
| prefs.enable_gpu_service_logging_gpu(); |
| out->enable_gpu_driver_debug_logging = |
| prefs.enable_gpu_driver_debug_logging(); |
| out->disable_gpu_program_cache = prefs.disable_gpu_program_cache(); |
| out->enforce_gl_minimums = prefs.enforce_gl_minimums(); |
| out->force_gpu_mem_available_bytes = prefs.force_gpu_mem_available_bytes(); |
| out->force_gpu_mem_discardable_limit_bytes = |
| prefs.force_gpu_mem_discardable_limit_bytes(); |
| out->force_max_texture_size = prefs.force_max_texture_size(); |
| out->gpu_program_cache_size = prefs.gpu_program_cache_size(); |
| out->disable_gpu_shader_disk_cache = prefs.disable_gpu_shader_disk_cache(); |
| out->enable_threaded_texture_mailboxes = |
| prefs.enable_threaded_texture_mailboxes(); |
| out->gl_shader_interm_output = prefs.gl_shader_interm_output(); |
| out->enable_android_surface_control = |
| prefs.enable_android_surface_control(); |
| out->enable_gpu_service_logging = prefs.enable_gpu_service_logging(); |
| out->enable_gpu_service_tracing = prefs.enable_gpu_service_tracing(); |
| out->use_passthrough_cmd_decoder = prefs.use_passthrough_cmd_decoder(); |
| out->disable_biplanar_gpu_memory_buffers_for_video_frames = |
| prefs.disable_biplanar_gpu_memory_buffers_for_video_frames(); |
| |
| mojo::ArrayDataView<gfx::mojom::BufferUsageAndFormatDataView> |
| usage_and_format_list; |
| prefs.GetTextureTargetExceptionListDataView(&usage_and_format_list); |
| for (size_t i = 0; i < usage_and_format_list.size(); ++i) { |
| gfx::BufferUsageAndFormat usage_format; |
| if (!usage_and_format_list.Read(i, &usage_format)) |
| return false; |
| out->texture_target_exception_list.push_back(usage_format); |
| } |
| |
| out->ignore_gpu_blocklist = prefs.ignore_gpu_blocklist(); |
| out->watchdog_starts_backgrounded = prefs.watchdog_starts_backgrounded(); |
| if (!prefs.ReadGrContextType(&out->gr_context_type)) { |
| return false; |
| } |
| if (!prefs.ReadUseVulkan(&out->use_vulkan)) { |
| return false; |
| } |
| out->enable_vulkan_protected_memory = |
| prefs.enable_vulkan_protected_memory(); |
| out->disable_vulkan_surface = prefs.disable_vulkan_surface(); |
| out->disable_vulkan_fallback_to_gl_for_testing = |
| prefs.disable_vulkan_fallback_to_gl_for_testing(); |
| out->vulkan_heap_memory_limit = prefs.vulkan_heap_memory_limit(); |
| out->vulkan_sync_cpu_memory_limit = prefs.vulkan_sync_cpu_memory_limit(); |
| out->enable_gpu_benchmarking_extension = |
| prefs.enable_gpu_benchmarking_extension(); |
| out->enable_webgpu = prefs.enable_webgpu(); |
| out->enable_unsafe_webgpu = prefs.enable_unsafe_webgpu(); |
| if (!prefs.ReadUseWebgpuAdapter(&out->use_webgpu_adapter)) |
| return false; |
| if (!prefs.ReadUseWebgpuPowerPreference( |
| &out->use_webgpu_power_preference)) { |
| return false; |
| } |
| if (!prefs.ReadEnableDawnBackendValidation( |
| &out->enable_dawn_backend_validation)) |
| return false; |
| if (!prefs.ReadEnabledDawnFeaturesList(&out->enabled_dawn_features_list)) |
| return false; |
| if (!prefs.ReadDisabledDawnFeaturesList(&out->disabled_dawn_features_list)) |
| return false; |
| |
| out->enable_gpu_blocked_time_metric = |
| prefs.enable_gpu_blocked_time_metric(); |
| out->enable_perf_data_collection = prefs.enable_perf_data_collection(); |
| |
| #if BUILDFLAG(IS_OZONE) |
| if (!prefs.ReadMessagePumpType(&out->message_pump_type)) |
| return false; |
| #endif |
| |
| out->enable_native_gpu_memory_buffers = |
| prefs.enable_native_gpu_memory_buffers(); |
| |
| #if BUILDFLAG(IS_CHROMEOS) |
| out->enable_chromeos_direct_video_decoder = |
| prefs.enable_chromeos_direct_video_decoder(); |
| #endif |
| |
| out->force_separate_egl_display_for_webgl_testing = |
| prefs.force_separate_egl_display_for_webgl_testing(); |
| |
| return true; |
| } |
| |
| static bool disable_accelerated_video_decode( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.disable_accelerated_video_decode; |
| } |
| static bool disable_accelerated_video_encode( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.disable_accelerated_video_encode; |
| } |
| static bool gpu_startup_dialog(const gpu::GpuPreferences& prefs) { |
| return prefs.gpu_startup_dialog; |
| } |
| static bool disable_gpu_watchdog(const gpu::GpuPreferences& prefs) { |
| return prefs.disable_gpu_watchdog; |
| } |
| static bool gpu_sandbox_start_early(const gpu::GpuPreferences& prefs) { |
| return prefs.gpu_sandbox_start_early; |
| } |
| static bool enable_low_latency_dxva(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_low_latency_dxva; |
| } |
| static bool enable_zero_copy_dxgi_video(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_zero_copy_dxgi_video; |
| } |
| static bool enable_nv12_dxgi_video(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_nv12_dxgi_video; |
| } |
| static bool disable_software_rasterizer(const gpu::GpuPreferences& prefs) { |
| return prefs.disable_software_rasterizer; |
| } |
| static bool log_gpu_control_list_decisions(const gpu::GpuPreferences& prefs) { |
| return prefs.log_gpu_control_list_decisions; |
| } |
| static bool compile_shader_always_succeeds(const gpu::GpuPreferences& prefs) { |
| return prefs.compile_shader_always_succeeds; |
| } |
| static bool disable_gl_error_limit(const gpu::GpuPreferences& prefs) { |
| return prefs.disable_gl_error_limit; |
| } |
| static bool disable_glsl_translator(const gpu::GpuPreferences& prefs) { |
| return prefs.disable_glsl_translator; |
| } |
| static bool disable_shader_name_hashing(const gpu::GpuPreferences& prefs) { |
| return prefs.disable_shader_name_hashing; |
| } |
| static bool enable_gpu_command_logging(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_gpu_command_logging; |
| } |
| static bool enable_gpu_debugging(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_gpu_debugging; |
| } |
| static bool enable_gpu_service_logging_gpu(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_gpu_service_logging_gpu; |
| } |
| static bool enable_gpu_driver_debug_logging( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.enable_gpu_driver_debug_logging; |
| } |
| static bool disable_gpu_program_cache(const gpu::GpuPreferences& prefs) { |
| return prefs.disable_gpu_program_cache; |
| } |
| static bool enforce_gl_minimums(const gpu::GpuPreferences& prefs) { |
| return prefs.enforce_gl_minimums; |
| } |
| static uint32_t force_gpu_mem_available_bytes( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.force_gpu_mem_available_bytes; |
| } |
| static uint32_t force_gpu_mem_discardable_limit_bytes( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.force_gpu_mem_discardable_limit_bytes; |
| } |
| static uint32_t force_max_texture_size(const gpu::GpuPreferences& prefs) { |
| return prefs.force_max_texture_size; |
| } |
| static uint32_t gpu_program_cache_size(const gpu::GpuPreferences& prefs) { |
| return prefs.gpu_program_cache_size; |
| } |
| static bool disable_gpu_shader_disk_cache(const gpu::GpuPreferences& prefs) { |
| return prefs.disable_gpu_shader_disk_cache; |
| } |
| static bool enable_threaded_texture_mailboxes( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.enable_threaded_texture_mailboxes; |
| } |
| static bool gl_shader_interm_output(const gpu::GpuPreferences& prefs) { |
| return prefs.gl_shader_interm_output; |
| } |
| static bool enable_android_surface_control(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_android_surface_control; |
| } |
| static bool enable_gpu_service_logging(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_gpu_service_logging; |
| } |
| static bool enable_gpu_service_tracing(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_gpu_service_tracing; |
| } |
| static bool use_passthrough_cmd_decoder(const gpu::GpuPreferences& prefs) { |
| return prefs.use_passthrough_cmd_decoder; |
| } |
| static bool disable_biplanar_gpu_memory_buffers_for_video_frames( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.disable_biplanar_gpu_memory_buffers_for_video_frames; |
| } |
| static const std::vector<gfx::BufferUsageAndFormat>& |
| texture_target_exception_list(const gpu::GpuPreferences& prefs) { |
| return prefs.texture_target_exception_list; |
| } |
| static bool ignore_gpu_blocklist(const gpu::GpuPreferences& prefs) { |
| return prefs.ignore_gpu_blocklist; |
| } |
| static bool watchdog_starts_backgrounded(const gpu::GpuPreferences& prefs) { |
| return prefs.watchdog_starts_backgrounded; |
| } |
| static gpu::GrContextType gr_context_type(const gpu::GpuPreferences& prefs) { |
| return prefs.gr_context_type; |
| } |
| static gpu::VulkanImplementationName use_vulkan( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.use_vulkan; |
| } |
| static bool enable_vulkan_protected_memory(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_vulkan_protected_memory; |
| } |
| static bool disable_vulkan_surface(const gpu::GpuPreferences& prefs) { |
| return prefs.disable_vulkan_surface; |
| } |
| static bool disable_vulkan_fallback_to_gl_for_testing( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.disable_vulkan_fallback_to_gl_for_testing; |
| } |
| static uint32_t vulkan_heap_memory_limit(const gpu::GpuPreferences& prefs) { |
| return prefs.vulkan_heap_memory_limit; |
| } |
| static uint32_t vulkan_sync_cpu_memory_limit( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.vulkan_sync_cpu_memory_limit; |
| } |
| static bool enable_gpu_benchmarking_extension( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.enable_gpu_benchmarking_extension; |
| } |
| static bool enable_webgpu(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_webgpu; |
| } |
| static bool enable_unsafe_webgpu(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_unsafe_webgpu; |
| } |
| static gpu::WebGPUAdapterName use_webgpu_adapter( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.use_webgpu_adapter; |
| } |
| static gpu::WebGPUPowerPreference use_webgpu_power_preference( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.use_webgpu_power_preference; |
| } |
| static gpu::DawnBackendValidationLevel enable_dawn_backend_validation( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.enable_dawn_backend_validation; |
| } |
| static const std::vector<std::string>& enabled_dawn_features_list( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.enabled_dawn_features_list; |
| } |
| static const std::vector<std::string>& disabled_dawn_features_list( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.disabled_dawn_features_list; |
| } |
| static bool enable_gpu_blocked_time_metric(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_gpu_blocked_time_metric; |
| } |
| static bool enable_perf_data_collection(const gpu::GpuPreferences& prefs) { |
| return prefs.enable_perf_data_collection; |
| } |
| #if BUILDFLAG(IS_OZONE) |
| static base::MessagePumpType message_pump_type( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.message_pump_type; |
| } |
| #endif |
| static bool enable_native_gpu_memory_buffers( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.enable_native_gpu_memory_buffers; |
| } |
| #if BUILDFLAG(IS_CHROMEOS) |
| static bool enable_chromeos_direct_video_decoder( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.enable_chromeos_direct_video_decoder; |
| } |
| #endif |
| static bool force_separate_egl_display_for_webgl_testing( |
| const gpu::GpuPreferences& prefs) { |
| return prefs.force_separate_egl_display_for_webgl_testing; |
| } |
| }; |
| |
| } // namespace mojo |
| |
| #endif // GPU_IPC_COMMON_GPU_PREFERENCES_MOJOM_TRAITS_H_ |