// Copyright 2018 The Emscripten Authors.  All rights reserved.
// Emscripten is available under two separate licenses, the MIT license and the
// University of Illinois/NCSA Open Source License.  Both these licenses can be
// found in the LICENSE file.

#define GL_GLEXT_PROTOTYPES
#include <GLES/gl.h>
#include <GLES/glext.h>
#include <GLES3/gl3.h>
#include <stdio.h>
#include <stdlib.h>
#include <emscripten.h>
#include <emscripten/html5.h>
#include <assert.h>

#include <string>

int result = 0;

#define GL_CALL( x ) \
    { \
        x; \
        GLenum error = glGetError(); \
        if( error != GL_NO_ERROR ) { \
            printf( "GL ERROR: %d,  %s\n", (int)error, #x ); \
            result = 1; \
        } \
    } \


int main()
{
  EmscriptenWebGLContextAttributes attrs;
  emscripten_webgl_init_context_attributes(&attrs);

  attrs.enableExtensionsByDefault = 1;
  attrs.majorVersion = 2;
  attrs.minorVersion = 0;

  EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context = emscripten_webgl_create_context( 0, &attrs );
  if (!context)
  {
    printf("Skipped: WebGL 2 is not supported.\n");
#ifdef REPORT_RESULT
    REPORT_RESULT(result);
#endif
    return 0;
  }
  emscripten_webgl_make_context_current(context);

  /* Two textures */
  GLuint tex[2];
  glGenTextures(2, tex);

  /* Verify that unpack buffer binding is not used after the buffer gets destroyed */
  glBindTexture(GL_TEXTURE_2D, tex[0]);
  {
    const int pixels[16] = {}; /* 4*1 all-black RGBA pixels */

    GLuint buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
    glBufferData(GL_PIXEL_UNPACK_BUFFER, 4*4, pixels, GL_STATIC_DRAW);

    /* This should use the unpack buffer */
    GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr));

    glDeleteBuffers(1, &buffer);

    /* This not anymore */
    GL_CALL(glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels));
  }

  /* Verify that unpack buffer is used for compressed image upload as well */
  const std::string exts = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
  if(exts.find("WEBGL_compressed_texture_s3tc") != std::string::npos)
  {
    printf("WEBGL_compressed_texture_s3tc is supported, testing ...\n");

    glBindTexture(GL_TEXTURE_2D, tex[1]);
    const char pixels[8] = {}; /* 4*4 all-black S3TC DXT1 pixels */

    GLuint buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
    glBufferData(GL_PIXEL_UNPACK_BUFFER, 8, pixels, GL_STATIC_DRAW);

    /* This should all use the unpack buffer */
    GL_CALL(glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 4, 4, 0, 8, nullptr));
    GL_CALL(glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, nullptr));

    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);

    /* This not anymore */
    GL_CALL(glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, pixels));

    glDeleteBuffers(1, &buffer);
  }
  else printf("WEBGL_compressed_texture_s3tc is NOT supported\n");

  glDeleteTextures(2, tex);

#ifdef REPORT_RESULT
  REPORT_RESULT(result);
#endif
  return 0;
}
