// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_VIZ_COMMON_DISPLAY_RENDERER_SETTINGS_H_
#define COMPONENTS_VIZ_COMMON_DISPLAY_RENDERER_SETTINGS_H_

#include <stddef.h>

#include <vector>

#include "build/build_config.h"
#include "components/viz/common/display/overlay_strategy.h"
#include "components/viz/common/viz_common_export.h"
#include "ui/display/types/display_constants.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/size.h"

namespace viz {

class VIZ_COMMON_EXPORT RendererSettings {
 public:
  RendererSettings();
  RendererSettings(const RendererSettings& other);
  ~RendererSettings();

  bool allow_antialiasing = true;
  bool force_antialiasing = false;
  bool force_blending_with_shaders = false;
  bool partial_swap_enabled = false;
  bool should_clear_root_render_pass = true;
  bool release_overlay_resources_after_gpu_query = false;
  bool dont_round_texture_sizes_for_pixel_tests = false;
  int highp_threshold_min = 0;
  bool auto_resize_output_surface = true;
  bool requires_alpha_channel = false;
  bool disable_render_pass_bypassing = false;
  // Force render pass backings to allocate shared images without the scanout
  // usage. The render pass backing will still claim the backing is scanout.
  bool force_non_scanout_backing_for_pixel_tests = false;

  int slow_down_compositing_scale_factor = 1;

  struct VIZ_COMMON_EXPORT OcclusionCullerSettings {
    // The maximum number of occluding rects to track during occlusion culling.
    int maximum_occluder_complexity = 10;
    // The maximum number (exclusive) of quads one draw quad may be split into
    // during occlusion culling. e.g. an L-shaped visible region split into two
    // quads
    int quad_split_limit = 5;
    // The minimum number of fragments that would not be drawn if a quads was
    // split into multiple quads during occlusion culling.
    int minimum_fragments_reduced = 128 * 128;
    // The minimum visible quad size to be considered an occluder.
    int occluder_minium_visible_quad_size = 32 * 32;
    // If true, complex occluders are generated for quads with rounded corners,
    bool generate_complex_occluder_for_rounded_corners = false;
    // The minimum size of quads with rounded corners to qualify for generating
    // complex occluders.
    int minumum_quad_size_with_rounded_corners = 128 * 128;
  };

  OcclusionCullerSettings occlusion_culler_settings;

#if BUILDFLAG(IS_OZONE)
  // A list of overlay strategies that should be tried. If the list is empty
  // then overlays aren't supported.
  std::vector<OverlayStrategy> overlay_strategies;
#endif
#if BUILDFLAG(IS_MAC)
  // CGDirectDisplayID for the screen on which the browser is currently
  // displayed.
  int64_t display_id = display::kInvalidDisplayId;
#endif
};

// This is a set of debug flags that can be changed at runtime, so that we can
// trigger developer features. (The above RendererSettings cannot be changed in
// viz after initialization.) It has a single instance in viz (basically a
// singleton, owned by FrameSinkManagerImpl), while other objects keep a
// reference to it. On the host size the single instance is owned by
// HostFrameSinkManager.
struct VIZ_COMMON_EXPORT DebugRendererSettings {
  bool tint_composited_content = false;
  bool tint_composited_content_modulate = false;
  bool show_overdraw_feedback = false;
  bool show_dc_layer_debug_borders = false;
  bool show_aggregated_damage = false;
};

}  // namespace viz

#endif  // COMPONENTS_VIZ_COMMON_DISPLAY_RENDERER_SETTINGS_H_
