// 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 "gpu/command_buffer/service/image_factory.h"

#include "ui/gl/gl_bindings.h"

namespace gpu {

ImageFactory::ImageFactory() {
}

ImageFactory::~ImageFactory() {
}

// static
gfx::GpuMemoryBuffer::Format ImageFactory::ImageFormatToGpuMemoryBufferFormat(
    unsigned internalformat) {
  switch (internalformat) {
    case GL_RGB:
      return gfx::GpuMemoryBuffer::RGBX_8888;
    case GL_RGBA:
      return gfx::GpuMemoryBuffer::RGBA_8888;
    case GL_ATC_RGB_AMD:
      return gfx::GpuMemoryBuffer::ATC;
    case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
      return gfx::GpuMemoryBuffer::ATCIA;
    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
      return gfx::GpuMemoryBuffer::DXT1;
    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
      return gfx::GpuMemoryBuffer::DXT5;
    case GL_ETC1_RGB8_OES:
      return gfx::GpuMemoryBuffer::ETC1;
    default:
      NOTREACHED();
      return gfx::GpuMemoryBuffer::RGBA_8888;
  }
}

// static
gfx::GpuMemoryBuffer::Usage ImageFactory::ImageUsageToGpuMemoryBufferUsage(
    unsigned usage) {
  switch (usage) {
    case GL_MAP_CHROMIUM:
      return gfx::GpuMemoryBuffer::MAP;
    case GL_SCANOUT_CHROMIUM:
      return gfx::GpuMemoryBuffer::SCANOUT;
    default:
      NOTREACHED();
      return gfx::GpuMemoryBuffer::MAP;
  }
}

// static
bool ImageFactory::IsImageFormatCompatibleWithGpuMemoryBufferFormat(
    unsigned internalformat,
    gfx::GpuMemoryBuffer::Format format) {
  switch (internalformat) {
    case GL_RGB:
      switch (format) {
        case gfx::GpuMemoryBuffer::ATC:
        case gfx::GpuMemoryBuffer::ATCIA:
        case gfx::GpuMemoryBuffer::DXT1:
        case gfx::GpuMemoryBuffer::DXT5:
        case gfx::GpuMemoryBuffer::ETC1:
        case gfx::GpuMemoryBuffer::RGBX_8888:
          return true;
        case gfx::GpuMemoryBuffer::RGBA_8888:
        case gfx::GpuMemoryBuffer::BGRA_8888:
          return false;
      }
      NOTREACHED();
      return false;
    case GL_RGBA:
      switch (format) {
        case gfx::GpuMemoryBuffer::RGBX_8888:
          return false;
        case gfx::GpuMemoryBuffer::ATC:
        case gfx::GpuMemoryBuffer::ATCIA:
        case gfx::GpuMemoryBuffer::DXT1:
        case gfx::GpuMemoryBuffer::DXT5:
        case gfx::GpuMemoryBuffer::ETC1:
        case gfx::GpuMemoryBuffer::RGBA_8888:
        case gfx::GpuMemoryBuffer::BGRA_8888:
          return true;
      }
      NOTREACHED();
      return false;
    default:
      NOTREACHED();
      return false;
  }
}

}  // namespace gpu
