| // 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; |
| } |