/* SPDX-FileCopyrightText: 2013 Blender Authors
 *
 * SPDX-License-Identifier: GPL-2.0-or-later */

/** \file
 * \ingroup gpu
 */

#include "BKE_material.hh"

#include "GPU_batch.hh"
#include "GPU_init_exit.hh" /* interface */
#include "GPU_pass.hh"

#include "intern/gpu_private.hh"
#include "intern/gpu_shader_create_info_private.hh"
#include "intern/gpu_shader_dependency_private.hh"

/**
 * although the order of initialization and shutdown should not matter
 * (except for the extensions), I chose alphabetical and reverse alphabetical order
 */
static bool initialized = false;

void GPU_init()
{
  /* can't avoid calling this multiple times, see wm_window_ghostwindow_add */
  if (initialized) {
    return;
  }

  initialized = true;

  gpu_backend_init_resources();

  gpu_shader_dependency_init();
  gpu_shader_create_info_init();

  GPU_pass_cache_init();

  gpu_batch_init();
}

void GPU_exit()
{
  gpu_batch_exit();

  GPU_pass_cache_free();

  BKE_material_defaults_free_gpu();
  GPU_shader_free_builtin_shaders();

  gpu_backend_delete_resources();

  gpu_shader_dependency_exit();
  gpu_shader_create_info_exit();

  initialized = false;
}

bool GPU_is_init()
{
  return initialized;
}
