/*
 * Copyright 2017 The Cobalt Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef COBALT_BROWSER_MEMORY_SETTINGS_AUTO_MEM_SETTINGS_H_
#define COBALT_BROWSER_MEMORY_SETTINGS_AUTO_MEM_SETTINGS_H_

#include "base/command_line.h"
#include "base/optional.h"
#include "cobalt/browser/memory_settings/texture_dimensions.h"
#include "cobalt/math/size.h"
#include "starboard/types.h"

namespace cobalt {
namespace browser {
namespace memory_settings {

struct AutoMemSettings {
  enum Type {
    kTypeBuild,
    kTypeCommandLine,
  };

  explicit AutoMemSettings(Type type) : type(type), has_blitter(false) {
    if (type == kTypeBuild) {
      max_cpu_in_bytes = 0;
    }
  }

  Type type;
  bool has_blitter;
  base::optional<int64_t> cobalt_image_cache_size_in_bytes;
  base::optional<int64_t> javascript_garbage_collection_threshold_in_bytes;
  base::optional<int64_t> remote_typeface_cache_capacity_in_bytes;
  base::optional<int64_t> skia_cache_size_in_bytes;
  base::optional<TextureDimensions> skia_texture_atlas_dimensions;
  base::optional<int64_t> software_surface_cache_size_in_bytes;
  base::optional<int64_t> offscreen_target_cache_size_in_bytes;

  base::optional<int64_t> max_cpu_in_bytes;
  base::optional<int64_t> max_gpu_in_bytes;
  base::optional<int64_t> reduce_cpu_memory_by;
  base::optional<int64_t> reduce_gpu_memory_by;
};

AutoMemSettings GetDefaultBuildSettings();
AutoMemSettings GetSettings(const CommandLine& command_line);

}  // namespace memory_settings
}  // namespace browser
}  // namespace cobalt

#endif  // COBALT_BROWSER_MEMORY_SETTINGS_AUTO_MEM_SETTINGS_H_
