// Copyright 2014 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 "content/browser/compositor/image_transport_factory.h"

#include "base/command_line.h"
#include "content/browser/compositor/gpu_process_transport_factory.h"
#include "ui/compositor/compositor.h"
#include "ui/compositor/compositor_switches.h"
#include "ui/gl/gl_implementation.h"

namespace content {

namespace {
ImageTransportFactory* g_factory = NULL;
bool g_initialized_for_unit_tests = false;
static gfx::DisableNullDrawGLBindings* g_disable_null_draw = NULL;

void SetFactory(ImageTransportFactory* factory) {
  g_factory = factory;
}

}

// static
void ImageTransportFactory::Initialize() {
  DCHECK(!g_factory || g_initialized_for_unit_tests);
  if (g_initialized_for_unit_tests)
    return;
  SetFactory(new GpuProcessTransportFactory);
}

void ImageTransportFactory::InitializeForUnitTests(
    scoped_ptr<ImageTransportFactory> factory) {
  DCHECK(!g_factory);
  DCHECK(!g_initialized_for_unit_tests);
  g_initialized_for_unit_tests = true;

  const base::CommandLine* command_line =
      base::CommandLine::ForCurrentProcess();
  if (command_line->HasSwitch(switches::kEnablePixelOutputInTests))
    g_disable_null_draw = new gfx::DisableNullDrawGLBindings;

  SetFactory(factory.release());
}

// static
void ImageTransportFactory::Terminate() {
  delete g_factory;
  g_factory = NULL;
  delete g_disable_null_draw;
  g_disable_null_draw = NULL;
  g_initialized_for_unit_tests = false;
}

// static
ImageTransportFactory* ImageTransportFactory::GetInstance() {
  return g_factory;
}

}  // namespace content
