2022-06-04 04:22:42 +01:00
/*
* Copyright ( c ) 2022 , Luke Wilde < lukew @ serenityos . org >
2024-01-18 20:29:09 +01:00
* Copyright ( c ) 2024 , Aliaksandr Kalenik < kalenik . aliaksandr @ gmail . com >
2022-06-04 04:22:42 +01:00
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
# pragma once
2024-11-15 04:01:23 +13:00
# include <LibGC/Ptr.h>
2022-09-13 16:02:25 +02:00
# include <LibWeb/Bindings/PlatformObject.h>
2024-11-29 20:49:59 +01:00
# include <LibWeb/Forward.h>
# include <LibWeb/WebGL/OpenGLContext.h>
# include <LibWeb/WebGL/Types.h>
# include <LibWeb/WebGL/WebGLContextAttributes.h>
2022-06-04 04:22:42 +01:00
namespace Web : : WebGL {
2024-11-29 20:49:59 +01:00
class WebGLRenderingContext : public Bindings : : PlatformObject {
WEB_PLATFORM_OBJECT ( WebGLRenderingContext , Bindings : : PlatformObject ) ;
2024-11-15 04:01:23 +13:00
GC_DECLARE_ALLOCATOR ( WebGLRenderingContext ) ;
2022-06-04 04:22:42 +01:00
2022-09-02 15:53:02 +02:00
public :
2024-11-15 04:01:23 +13:00
static JS : : ThrowCompletionOr < GC : : Ptr < WebGLRenderingContext > > create ( JS : : Realm & , HTML : : HTMLCanvasElement & canvas_element , JS : : Value options ) ;
2022-06-04 04:22:42 +01:00
2022-09-02 15:53:02 +02:00
virtual ~ WebGLRenderingContext ( ) override ;
2022-06-04 04:22:42 +01:00
2024-11-29 20:49:59 +01:00
void present ( ) ;
void needs_to_present ( ) ;
GC : : Ref < HTML : : HTMLCanvasElement > canvas_for_binding ( ) const ;
bool is_context_lost ( ) const ;
RefPtr < Gfx : : PaintingSurface > surface ( ) ;
void set_size ( Gfx : : IntSize const & ) ;
void reset_to_default_state ( ) ;
Optional < Vector < String > > get_supported_extensions ( ) const ;
JS : : Object * get_extension ( String const & name ) const ;
void active_texture ( GLenum texture ) ;
void clear ( GLbitfield mask ) ;
void clear_color ( GLclampf red , GLclampf green , GLclampf blue , GLclampf alpha ) ;
void clear_depth ( GLclampf depth ) ;
void clear_stencil ( GLint s ) ;
void color_mask ( GLboolean red , GLboolean green , GLboolean blue , GLboolean alpha ) ;
void cull_face ( GLenum mode ) ;
void depth_func ( GLenum func ) ;
void depth_mask ( GLboolean mask ) ;
void depth_range ( GLclampf z_near , GLclampf z_far ) ;
void finish ( ) ;
void flush ( ) ;
void front_face ( GLenum mode ) ;
GLenum get_error ( ) ;
void line_width ( GLfloat width ) ;
void polygon_offset ( GLfloat factor , GLfloat units ) ;
void scissor ( GLint x , GLint y , GLsizei width , GLsizei height ) ;
void stencil_op ( GLenum fail , GLenum zfail , GLenum zpass ) ;
void stencil_op_separate ( GLenum face , GLenum fail , GLenum zfail , GLenum zpass ) ;
void viewport ( GLint x , GLint y , GLsizei width , GLsizei height ) ;
2022-06-04 04:22:42 +01:00
private :
2023-08-07 08:41:28 +02:00
virtual void initialize ( JS : : Realm & ) override ;
2023-01-10 06:28:20 -05:00
2024-01-18 20:29:09 +01:00
WebGLRenderingContext ( JS : : Realm & , HTML : : HTMLCanvasElement & , NonnullOwnPtr < OpenGLContext > context , WebGLContextAttributes context_creation_parameters , WebGLContextAttributes actual_context_parameters ) ;
2024-11-29 20:49:59 +01:00
virtual void visit_edges ( Cell : : Visitor & ) override ;
OwnPtr < OpenGLContext > m_context ;
GC : : Ref < HTML : : HTMLCanvasElement > m_canvas_element ;
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#context-creation-parameters
// Each WebGLRenderingContext has context creation parameters, set upon creation, in a WebGLContextAttributes object.
WebGLContextAttributes m_context_creation_parameters { } ;
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#actual-context-parameters
// Each WebGLRenderingContext has actual context parameters, set each time the drawing buffer is created, in a WebGLContextAttributes object.
WebGLContextAttributes m_actual_context_parameters { } ;
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#webgl-context-lost-flag
// Each WebGLRenderingContext has a webgl context lost flag, which is initially unset.
bool m_context_lost { false } ;
// WebGL presents its drawing buffer to the HTML page compositor immediately before a compositing operation, but only if at least one of the following has occurred since the previous compositing operation:
// - Context creation
// - Canvas resize
// - clear, drawArrays, or drawElements has been called while the drawing buffer is the currently bound framebuffer
bool m_should_present { true } ;
GLenum m_error { 0 } ;
void set_error ( GLenum error ) ;
2022-06-04 04:22:42 +01:00
} ;
}