// Copyright (c) 2010 The Chromium OS 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 <stdio.h>

#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>

#include "glbench/egl_stuff.h"
#include "glbench/teartest.h"


class PixmapToTextureTestEGL : public Test {
 public:
  PixmapToTextureTestEGL();
  virtual bool Start();
  virtual bool Loop(int shift);
  virtual void Stop();

 private:
  Pixmap pixmap_;

  PFNEGLCREATEIMAGEKHRPROC egl_create_image_khr_;
  PFNEGLDESTROYIMAGEKHRPROC egl_destroy_image_khr_;
  PFNGLEGLIMAGETARGETTEXTURE2DOESPROC gl_egl_image_target_texture_2d_oes_;
  EGLImageKHR egl_image_;
  EGLInterface* interface_;
};

PixmapToTextureTestEGL::PixmapToTextureTestEGL()
    : egl_image_(EGL_NO_IMAGE_KHR),
      interface_(static_cast<EGLInterface*>(g_main_gl_interface.get())) {
}

bool PixmapToTextureTestEGL::Start() {
  printf("# Info: Attaching pixmap to EGL texture.\n");

  // Get extension entrypoints
  egl_create_image_khr_ =
      reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(
      eglGetProcAddress("eglCreateImageKHR"));
  if (!egl_create_image_khr_)
    return false;
  egl_destroy_image_khr_ = reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(
      eglGetProcAddress("eglDestroyImageKHR"));
  if (!egl_destroy_image_khr_)
    return false;
  gl_egl_image_target_texture_2d_oes_ =
      reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURE2DOESPROC>(
      eglGetProcAddress("glEGLImageTargetTexture2DOES"));
  if (!gl_egl_image_target_texture_2d_oes_)
    return false;

  pixmap_ = AllocatePixmap();

  static const EGLint egl_image_attributes[] = {
    EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,
    EGL_NONE
  };

  egl_image_ = egl_create_image_khr_(
      interface_->display(), EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR,
      reinterpret_cast<EGLClientBuffer>(pixmap_), egl_image_attributes);
  if (egl_image_ == EGL_NO_IMAGE_KHR)
    return false;
  gl_egl_image_target_texture_2d_oes_(GL_TEXTURE_2D,
                                      static_cast<GLeglImageOES>(egl_image_));

  return true;
}

bool PixmapToTextureTestEGL::Loop(int shift) {
  UpdatePixmap(pixmap_, shift);
  return true;
}

void PixmapToTextureTestEGL::Stop() {
  egl_destroy_image_khr_(interface_->display(), egl_image_);
}

Test* GetPixmapToTextureTestEGL() {
  return new PixmapToTextureTestEGL();
}
