Path: blob/main/test/browser/glframebufferattachmentinfo.c
7085 views
/*1* Copyright 2018 The Emscripten Authors. All rights reserved.2* Emscripten is available under two separate licenses, the MIT license and the3* University of Illinois/NCSA Open Source License. Both these licenses can be4* found in the LICENSE file.5*/67#include <EGL/egl.h>8#include <GLES2/gl2.h>9#include <stdlib.h>10#include <stdio.h>11#include <string.h>1213int check_equal(int expected, int actual) {14if (expected == actual) {15printf("ok\n");16return 1;17} else {18printf("error: expected = %d, actual = %d\n", expected, actual);19return 0;20}21}2223int main() {24EGLDisplay dpy;25EGLint dpy_attrib_list[] = {26EGL_CONFORMANT, EGL_OPENGL_ES2_BIT,27EGL_DEPTH_SIZE, 16,28EGL_NONE29};30EGLConfig *configs;31EGLint num_config;32EGLNativeWindowType win;33EGLSurface surface;34EGLContext ctx;35EGLint ctx_attrib_list[] = {36EGL_CONTEXT_CLIENT_VERSION, 2,37EGL_NONE38};39dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);40eglInitialize(dpy, NULL, NULL);41eglChooseConfig(dpy, dpy_attrib_list, NULL, 0, &num_config);42configs = malloc(sizeof(EGLConfig) * num_config);43eglChooseConfig(dpy, dpy_attrib_list, configs, num_config, &num_config);44memset(&win, 0, sizeof(EGLNativeWindowType));45#if defined(__EMSCRIPTEN__)46// Simply skip window creation because the handle is ignored by Emscripten.47#else48#error not implemented49#endif50surface = eglCreateWindowSurface(dpy, configs[0], win, NULL);51ctx = eglCreateContext(dpy, configs[0], EGL_NO_CONTEXT, ctx_attrib_list);52eglMakeCurrent(dpy, surface, surface, ctx);5354GLuint fbo;55GLuint tex;56GLuint rbo;57glGenFramebuffers(1, &fbo);58glBindFramebuffer(GL_FRAMEBUFFER, fbo);59glGenTextures(1, &tex);60glBindTexture(GL_TEXTURE_CUBE_MAP, tex);61for (int i = 0; i < 6; i++) {62glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);63glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);64glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);65}66glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, tex, 0);67glGenRenderbuffers(1, &rbo);68glBindRenderbuffer(GL_RENDERBUFFER, rbo);69glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 256, 256);70glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo);7172GLint params;73int result = 1;74printf("check type of GL_COLOR_ATTACHMENT0\n");75glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, ¶ms);76result &= check_equal(GL_TEXTURE, params);77printf("check type of GL_DEPTH_ATTACHMENT\n");78glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, ¶ms);79result &= check_equal(GL_RENDERBUFFER, params);80printf("check name of GL_COLOR_ATTACHMENT0\n");81glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, ¶ms);82result &= check_equal(tex, params);83printf("check name of GL_DEPTH_ATTACHMENT\n");84glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, ¶ms);85result &= check_equal(rbo, params);86printf("check mipmap level of GL_COLOR_ATTACHMENT0\n");87glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, ¶ms);88result &= check_equal(0, params);89printf("check cube map face of GL_COLOR_ATTACHMENT0\n");90glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, ¶ms);91result &= check_equal(GL_TEXTURE_CUBE_MAP_POSITIVE_X, params);9293eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);94eglDestroyContext(dpy, ctx);95eglDestroySurface(dpy, surface);96#if defined(__EMSCRIPTEN__)97// No window needs to be closed/destroyed.98#else99#error not implemented100#endif101free(configs);102eglTerminate(dpy);103104#ifdef REPORT_RESULT105REPORT_RESULT(result);106#endif107return 0;108}109110111