1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 08:27:46 +00:00

LibGL: Add defines and stubs for glBlendFunc()

This commit is contained in:
Stephan Unverwerth 2021-05-15 22:45:05 +02:00 committed by Linus Groh
parent 1b358d3b94
commit 279737642c
6 changed files with 92 additions and 0 deletions

View file

@ -1,5 +1,6 @@
set(SOURCES
Clipper.cpp
GLBlend.cpp
GLColor.cpp
GLContext.cpp
GLLists.cpp

View file

@ -42,6 +42,19 @@ extern "C" {
#define GL_RENDERER 0x1F01
#define GL_VERSION 0x1F02
/* Blend factors */
#define GL_ZERO 0
#define GL_ONE 1
#define GL_SRC_COLOR 0x0300
#define GL_ONE_MINUS_SRC_COLOR 0x0301
#define GL_SRC_ALPHA 0x0302
#define GL_ONE_MINUS_SRC_ALPHA 0x0303
#define GL_DST_ALPHA 0x0304
#define GL_ONE_MINUS_DST_ALPHA 0x0305
#define GL_DST_COLOR 0x0306
#define GL_ONE_MINUS_DST_COLOR 0x0307
#define GL_SRC_ALPHA_SATURATE 0x0308
// Culled face side
#define GL_FRONT 0x0404
#define GL_BACK 0x0405
@ -65,6 +78,12 @@ extern "C" {
#define GL_COMPILE 0x1300
#define GL_COMPILE_AND_EXECUTE 0x1301
// More blend factors
#define GL_CONSTANT_COLOR 0x8001
#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
#define GL_CONSTANT_ALPHA 0x8003
#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
//
// OpenGL typedefs
//
@ -126,6 +145,7 @@ GLAPI void glEndList(void);
GLAPI void glNewList(GLuint list, GLenum mode);
GLAPI void glFlush();
GLAPI void glFinish();
GLAPI void glBlendFunc(GLenum sfactor, GLenum dfactor);
#ifdef __cplusplus
}

View file

@ -0,0 +1,15 @@
/*
* Copyright (c) 2021, Stephan Unverwerth <s.unverwerth@gmx.de>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "GL/gl.h"
#include "GLContext.h"
extern GL::GLContext* g_gl_context;
void glBlendFunc(GLenum sfactor, GLenum dfactor)
{
return g_gl_context->gl_blend_func(sfactor, dfactor);
}

View file

@ -49,6 +49,7 @@ public:
virtual void gl_new_list(GLuint list, GLenum mode) = 0;
virtual void gl_flush() = 0;
virtual void gl_finish() = 0;
virtual void gl_blend_func(GLenum src_factor, GLenum dst_factor) = 0;
virtual void present() = 0;
};

View file

@ -859,6 +859,57 @@ void SoftwareGLContext::gl_finish()
// No-op since SoftwareGLContext is completely synchronous at the moment
}
void SoftwareGLContext::gl_blend_func(GLenum src_factor, GLenum dst_factor)
{
if (m_in_draw_state) {
m_error = GL_INVALID_OPERATION;
return;
}
// FIXME: The list of allowed enums differs between API versions
// This was taken from the 2.0 spec on https://docs.gl/gl2/glBlendFunc
if (!(src_factor == GL_ZERO
|| src_factor == GL_ONE
|| src_factor == GL_SRC_COLOR
|| src_factor == GL_ONE_MINUS_SRC_COLOR
|| src_factor == GL_DST_COLOR
|| src_factor == GL_ONE_MINUS_DST_COLOR
|| src_factor == GL_SRC_ALPHA
|| src_factor == GL_ONE_MINUS_SRC_ALPHA
|| src_factor == GL_DST_ALPHA
|| src_factor == GL_ONE_MINUS_DST_ALPHA
|| src_factor == GL_CONSTANT_COLOR
|| src_factor == GL_ONE_MINUS_CONSTANT_COLOR
|| src_factor == GL_CONSTANT_ALPHA
|| src_factor == GL_ONE_MINUS_CONSTANT_ALPHA
|| src_factor == GL_SRC_ALPHA_SATURATE)) {
m_error = GL_INVALID_ENUM;
return;
}
if (!(dst_factor == GL_ZERO
|| dst_factor == GL_ONE
|| dst_factor == GL_SRC_COLOR
|| dst_factor == GL_ONE_MINUS_SRC_COLOR
|| dst_factor == GL_DST_COLOR
|| dst_factor == GL_ONE_MINUS_DST_COLOR
|| dst_factor == GL_SRC_ALPHA
|| dst_factor == GL_ONE_MINUS_SRC_ALPHA
|| dst_factor == GL_DST_ALPHA
|| dst_factor == GL_ONE_MINUS_DST_ALPHA
|| dst_factor == GL_CONSTANT_COLOR
|| dst_factor == GL_ONE_MINUS_CONSTANT_COLOR
|| dst_factor == GL_CONSTANT_ALPHA
|| dst_factor == GL_ONE_MINUS_CONSTANT_ALPHA)) {
m_error = GL_INVALID_ENUM;
return;
}
m_blend_source_factor = src_factor;
m_blend_destination_factor = dst_factor;
}
void SoftwareGLContext::present()
{
m_rasterizer.blit_to(*m_frontbuffer);

View file

@ -55,6 +55,7 @@ public:
virtual void gl_new_list(GLuint list, GLenum mode) override;
virtual void gl_flush() override;
virtual void gl_finish() override;
virtual void gl_blend_func(GLenum src_factor, GLenum dst_factor) override;
virtual void present() override;
@ -105,6 +106,9 @@ private:
GLenum m_front_face = GL_CCW;
GLenum m_culled_sides = GL_BACK;
GLenum m_blend_source_factor = GL_ONE;
GLenum m_blend_destination_factor = GL_ZERO;
NonnullRefPtr<Gfx::Bitmap> m_frontbuffer;
Clipper m_clipper;