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

LibGL: Implement glDrawBuffer

This commit is contained in:
Stephan Unverwerth 2021-08-31 20:23:29 +02:00 committed by Ali Mohammad Pur
parent b069c1306c
commit 7cbaaf8366
7 changed files with 52 additions and 1 deletions

View file

@ -25,6 +25,7 @@ extern "C" {
// OpenGL related `defines` // OpenGL related `defines`
#define GL_TRUE 1 #define GL_TRUE 1
#define GL_FALSE 0 #define GL_FALSE 0
#define GL_NONE 0
// Matrix Modes // Matrix Modes
#define GL_MODELVIEW 0x0050 #define GL_MODELVIEW 0x0050
@ -352,6 +353,7 @@ GLAPI void glShadeModel(GLenum mode);
GLAPI void glAlphaFunc(GLenum func, GLclampf ref); GLAPI void glAlphaFunc(GLenum func, GLclampf ref);
GLAPI void glHint(GLenum target, GLenum mode); GLAPI void glHint(GLenum target, GLenum mode);
GLAPI void glReadBuffer(GLenum mode); GLAPI void glReadBuffer(GLenum mode);
GLAPI void glDrawBuffer(GLenum buffer);
GLAPI void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); GLAPI void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
GLAPI void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* data); GLAPI void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* data);
GLAPI void glTexCoord2f(GLfloat s, GLfloat t); GLAPI void glTexCoord2f(GLfloat s, GLfloat t);

View file

@ -56,6 +56,7 @@ public:
virtual void gl_alpha_func(GLenum func, GLclampf ref) = 0; virtual void gl_alpha_func(GLenum func, GLclampf ref) = 0;
virtual void gl_hint(GLenum target, GLenum mode) = 0; virtual void gl_hint(GLenum target, GLenum mode) = 0;
virtual void gl_read_buffer(GLenum mode) = 0; virtual void gl_read_buffer(GLenum mode) = 0;
virtual void gl_draw_buffer(GLenum buffer) = 0;
virtual void gl_read_pixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels) = 0; virtual void gl_read_pixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels) = 0;
virtual void gl_tex_image_2d(GLenum target, GLint level, GLint internal_format, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* data) = 0; virtual void gl_tex_image_2d(GLenum target, GLint level, GLint internal_format, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* data) = 0;
virtual void gl_tex_parameter(GLenum target, GLenum pname, GLfloat param) = 0; virtual void gl_tex_parameter(GLenum target, GLenum pname, GLfloat param) = 0;

View file

@ -85,6 +85,11 @@ void glReadBuffer(GLenum mode)
g_gl_context->gl_read_buffer(mode); g_gl_context->gl_read_buffer(mode);
} }
void glDrawBuffer(GLenum buffer)
{
g_gl_context->gl_draw_buffer(buffer);
}
void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels) void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
{ {
g_gl_context->gl_read_pixels(x, y, width, height, format, type, pixels); g_gl_context->gl_read_pixels(x, y, width, height, format, type, pixels);

View file

@ -960,6 +960,46 @@ void SoftwareGLContext::gl_read_buffer(GLenum mode)
m_current_read_buffer = mode; m_current_read_buffer = mode;
} }
void SoftwareGLContext::gl_draw_buffer(GLenum buffer)
{
APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_draw_buffer, buffer);
RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
// FIXME: Also allow aux buffers GL_AUX0 through GL_AUX3 here
// plus any aux buffer between 0 and GL_AUX_BUFFERS
RETURN_WITH_ERROR_IF(buffer != GL_NONE
&& buffer != GL_FRONT_LEFT
&& buffer != GL_FRONT_RIGHT
&& buffer != GL_BACK_LEFT
&& buffer != GL_BACK_RIGHT
&& buffer != GL_FRONT
&& buffer != GL_BACK
&& buffer != GL_LEFT
&& buffer != GL_RIGHT,
GL_INVALID_ENUM);
// FIXME: We do not currently have aux buffers, so make it an invalid
// operation to select anything but front or back buffers. Also we do
// not allow selecting the stereoscopic RIGHT buffers since we do not
// have them configured.
RETURN_WITH_ERROR_IF(buffer != GL_NONE
&& buffer != GL_FRONT_LEFT
&& buffer != GL_FRONT
&& buffer != GL_BACK_LEFT
&& buffer != GL_BACK
&& buffer != GL_FRONT
&& buffer != GL_BACK
&& buffer != GL_LEFT,
GL_INVALID_OPERATION);
m_current_draw_buffer = buffer;
auto rasterizer_options = m_rasterizer.options();
rasterizer_options.draw_buffer = m_current_draw_buffer;
m_rasterizer.set_options(rasterizer_options);
}
void SoftwareGLContext::gl_read_pixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels) void SoftwareGLContext::gl_read_pixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
{ {
RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION); RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);

View file

@ -66,6 +66,7 @@ public:
virtual void gl_alpha_func(GLenum func, GLclampf ref) override; virtual void gl_alpha_func(GLenum func, GLclampf ref) override;
virtual void gl_hint(GLenum target, GLenum mode) override; virtual void gl_hint(GLenum target, GLenum mode) override;
virtual void gl_read_buffer(GLenum mode) override; virtual void gl_read_buffer(GLenum mode) override;
virtual void gl_draw_buffer(GLenum buffer) override;
virtual void gl_read_pixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels) override; virtual void gl_read_pixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels) override;
virtual void gl_tex_image_2d(GLenum target, GLint level, GLint internal_format, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* data) override; virtual void gl_tex_image_2d(GLenum target, GLint level, GLint internal_format, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* data) override;
virtual void gl_tex_parameter(GLenum target, GLenum pname, GLfloat param) override; virtual void gl_tex_parameter(GLenum target, GLenum pname, GLfloat param) override;
@ -152,6 +153,7 @@ private:
GLclampf m_alpha_test_ref_value = 0; GLclampf m_alpha_test_ref_value = 0;
GLenum m_current_read_buffer = GL_BACK; GLenum m_current_read_buffer = GL_BACK;
GLenum m_current_draw_buffer = GL_BACK;
// Client side arrays // Client side arrays
bool m_client_side_vertex_array_enabled = false; bool m_client_side_vertex_array_enabled = false;

View file

@ -334,7 +334,7 @@ static void rasterize_triangle(const RasterizerOptions& options, Gfx::Bitmap& re
} }
// We will not update the color buffer at all // We will not update the color buffer at all
if (!options.color_mask) if (!options.color_mask || options.draw_buffer == GL_NONE)
continue; continue;
// Draw the pixels according to the previously generated mask // Draw the pixels according to the previously generated mask

View file

@ -44,6 +44,7 @@ struct RasterizerOptions {
GLboolean fog_enabled { false }; GLboolean fog_enabled { false };
GLfloat fog_start { 0.0f }; GLfloat fog_start { 0.0f };
GLfloat fog_end { 1.0f }; GLfloat fog_end { 1.0f };
GLenum draw_buffer { GL_BACK };
}; };
class SoftwareRasterizer final { class SoftwareRasterizer final {