2022-06-04 04:22:42 +01:00
/*
* Copyright ( c ) 2022 , Luke Wilde < lukew @ serenityos . org >
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
# pragma once
2022-06-19 19:45:33 +01:00
# include <AK/RefCountForwarder.h>
2022-06-04 04:22:42 +01:00
# include <AK/WeakPtr.h>
# include <AK/Weakable.h>
# include <LibGL/GLContext.h>
# include <LibWeb/Forward.h>
# include <LibWeb/WebGL/WebGLContextAttributes.h>
namespace Web : : WebGL {
class WebGLRenderingContextBase
2022-06-19 19:45:33 +01:00
: public RefCountForwarder < HTML : : HTMLCanvasElement >
2022-06-04 04:22:42 +01:00
, public Weakable < WebGLRenderingContextBase > {
public :
virtual ~ WebGLRenderingContextBase ( ) ;
2022-06-04 04:27:48 +01:00
void present ( ) ;
2022-06-19 20:11:10 +01:00
NonnullRefPtr < HTML : : HTMLCanvasElement > canvas_for_binding ( ) const ;
2022-06-04 04:38:22 +01:00
bool is_context_lost ( ) const ;
2022-06-04 04:33:00 +01:00
Optional < Vector < String > > get_supported_extensions ( ) const ;
JS : : Object * get_extension ( String const & name ) const ;
2022-06-04 04:37:10 +01:00
void active_texture ( GLenum texture ) ;
2022-06-04 04:27:48 +01:00
void clear ( GLbitfield mask ) ;
void clear_color ( GLclampf red , GLclampf green , GLclampf blue , GLclampf alpha ) ;
2022-06-04 04:37:10 +01:00
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 ) ;
2022-06-13 16:55:57 +01:00
void depth_range ( GLclampf z_near , GLclampf z_far ) ;
2022-06-04 04:37:10 +01:00
void finish ( ) ;
void flush ( ) ;
void front_face ( GLenum mode ) ;
2022-06-13 16:54:27 +01:00
GLenum get_error ( ) ;
2022-06-13 16:55:21 +01:00
void line_width ( GLfloat width ) ;
2022-06-04 04:37:10 +01:00
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:27:48 +01:00
2022-06-04 04:22:42 +01:00
protected :
WebGLRenderingContextBase ( HTML : : HTMLCanvasElement & canvas_element , NonnullOwnPtr < GL : : GLContext > context , WebGLContextAttributes context_creation_parameters , WebGLContextAttributes actual_context_parameters ) ;
private :
NonnullOwnPtr < GL : : GLContext > m_context ;
// 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 } ;
2022-06-04 04:27:48 +01:00
2022-06-13 16:54:27 +01:00
GLenum m_error { GL_NO_ERROR } ;
2022-06-19 19:45:33 +01:00
HTML : : HTMLCanvasElement & canvas_element ( ) ;
HTML : : HTMLCanvasElement const & canvas_element ( ) const ;
2022-06-04 04:27:48 +01:00
void needs_to_present ( ) ;
2022-06-13 16:54:27 +01:00
void set_error ( GLenum error ) ;
2022-06-04 04:22:42 +01:00
} ;
}