blob: 93b470d8424d9862cd93861aca18fd93d60671a2 [file] [edit]
/*
* GPAC - Multimedia Framework C SDK
*
* Authors: Jean Le Feuvre
* Copyright (c) Telecom ParisTech 2019
* All rights reserved
*
* This file is part of GPAC / WebGL JavaScript extension
*
* GPAC is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* GPAC is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include <gpac/setup.h>
#ifdef GPAC_HAS_QJS
#include "../scenegraph/qjs_common.h"
#include "../compositor/gl_inc.h"
#include <gpac/filters.h>
typedef enum {
WGL_POWER_DEFAULT=0,
WGL_POWER_LOWPOWER,
WGL_POWER_HIGHPERF,
} WebGLPowerPreference;
typedef enum {
WGL_DEPTH_NO=0,
WGL_DEPTH_YES,
WGL_DEPTH_TEXTURE,
} WebGLDepthAttach;
typedef struct
{
Bool alpha;
WebGLDepthAttach depth;
Bool stencil;
Bool antialias;
Bool premultipliedAlpha;
Bool preserveDrawingBuffer;
WebGLPowerPreference powerPreference;
Bool failIfMajorPerformanceCaveat;
Bool desynchronized;
Bool primary;
} GF_WebGLContextAttributes;
typedef struct
{
GF_FilterFrameInterface tex_f_ifce;
GF_FilterFrameInterface depth_f_ifce;
/*internal*/
GF_WebGLContextAttributes creation_attrs;
GF_WebGLContextAttributes actual_attrs;
GLint tex_id, depth_id, stencil_id, fbo_id;
u32 width, height;
JSValue canvas;
JSContext *ctx;
JSValue tex_frame_flush;
JSValue depth_frame_flush;
GF_List *all_objects;
GF_List *named_textures;
GLint active_program;
GLint active_texture;
struct _wgl_named_texture *bound_named_texture;
struct __wgl_object *bound_texture;
u32 bound_texture_target;
u32 fetch_required_pfmt, pix_stride;
u8 *pix_data, *pix_line;
} GF_WebGLContext;
typedef struct __wgl_object
{
GLuint gl_id;
GF_WebGLContext *par_ctx;
JSValue obj; //object reference
JSClassID class_id; //object class
u32 tx_height; //for textures
u8 flip_y; //for textures
} GF_WebGLObject;
typedef struct _wgl_named_texture
{
GF_WebGLContext *par_ctx;
char *tx_name;
GF_GLTextureWrapper tx;
u8 shader_attached;
u8 flip_y;
} GF_WebGLNamedTexture;
Bool js_evg_get_texture_info(JSContext *ctx, JSValue this_obj, u32 *width, u32 *height, u32 *pixfmt, u8 **p_data, u32 *stride, u8 **p_u, u8 **p_v, u32 *stride_uv, u8 **p_a);
Bool js_evg_is_texture(JSContext *ctx, JSValue this_obj);
typedef GLuint WebGLContextAttributes;
typedef GF_WebGLObject *WebGLProgram;
typedef GF_WebGLObject *WebGLShader;
typedef GF_WebGLObject *WebGLBuffer;
typedef GF_WebGLObject *WebGLFramebuffer;
typedef GF_WebGLObject *WebGLRenderbuffer;
typedef GF_WebGLObject *WebGLTexture;
typedef GF_WebGLObject *WebGLUniformLocation;
#define WGL_NO_ERROR 0
#define WGL_INVALID_ENUM 0x0500
#define WGL_INVALID_VALUE 0x0501
#define WGL_INVALID_OPERATION 0x0502
#define WGL_OUT_OF_MEMORY 0x0505
#define GL_UNPACK_FLIP_Y_WEBGL 0x9240
enum
{
WebGLRenderingContextBase_PROP_canvas,
WebGLRenderingContextBase_PROP_drawingBufferWidth,
WebGLRenderingContextBase_PROP_drawingBufferHeight,
};
#define WGL_GET_BOOL(_name, _jsval) _name = JS_ToBool(ctx, _jsval)
#define WGL_GET_U32(_name, _jsval) if (JS_ToInt32(ctx, &_name, _jsval)) return js_throw_err(ctx, WGL_INVALID_VALUE)
#define WGL_GET_S32(_name, _jsval) if (JS_ToInt32(ctx, &_name, _jsval)) return js_throw_err(ctx, WGL_INVALID_VALUE)
#define WGL_GET_U64(_name, _jsval) if (JS_ToInt64(ctx, &_name, _jsval)) return js_throw_err(ctx, WGL_INVALID_VALUE)
#define WGL_GET_S64(_name, _jsval) if (JS_ToInt64(ctx, &_name, _jsval)) return js_throw_err(ctx, WGL_INVALID_VALUE)
#define WGL_GET_S16(_name, _jsval) { s32 _v; if (JS_ToInt32(ctx, &_v, _jsval)) return js_throw_err(ctx, WGL_INVALID_VALUE); _name = (s16) _v; }
#define WGL_GET_U16(_name, _jsval) { s32 _v; if (JS_ToInt32(ctx, &_v, _jsval)) return js_throw_err(ctx, WGL_INVALID_VALUE); _name = (u16) _v; }
#define WGL_GET_FLOAT(_name, _jsval) { Double _v; if (JS_ToFloat64(ctx, &_v, _jsval)) return js_throw_err(ctx, WGL_INVALID_VALUE); _name = (Float) _v; }
#define WGL_GET_FLOAT_CLAMP(_name, _jsval) { Double _v; if (JS_ToFloat64(ctx, &_v, _jsval)) return js_throw_err(ctx, WGL_INVALID_VALUE); _name = (Float) (_v>1.0 ? 1.0 : (_v<0 ? 0.0 : _v) ); }
#define WGL_GET_GLID(_name, _jsval, _class_id) {\
if (!JS_IsNull(_jsval)) {\
GF_WebGLObject *_gl_obj = JS_GetOpaque(_jsval, _class_id);\
if (!_gl_obj) return js_throw_err(ctx, WGL_INVALID_VALUE);\
if (_gl_obj->par_ctx != JS_GetOpaque(this_val, WebGLRenderingContextBase_class_id)) return js_throw_err(ctx, WGL_INVALID_OPERATION);\
_name = _gl_obj->gl_id;\
} else {\
_name = 0;\
}\
}
#define WGL_GET_STRING(_name, _jsval) _name = JS_ToCString(ctx, _jsval)
#define WGL_CHECK_CONTEXT \
if (!JS_GetOpaque(this_val, WebGLRenderingContextBase_class_id)) return js_throw_err(ctx, WGL_INVALID_OPERATION);
#endif