Pārlūkot izejas kodu

LibGL+LibGPU: Implement `glPointSize`

Jelle Raaijmakers 3 gadi atpakaļ
vecāks
revīzija
0dcb23ee96

+ 2 - 0
Userland/Libraries/LibGL/ContextParameter.cpp

@@ -78,6 +78,8 @@ Optional<ContextParameter> GLContext::get_context_parameter(GLenum name)
         return ContextParameter { .type = GL_INT, .value = { .integer_value = 0 } };
     case GL_PACK_SWAP_BYTES:
         return ContextParameter { .type = GL_BOOL, .value = { .boolean_value = false } };
+    case GL_POINT_SIZE:
+        return ContextParameter { .type = GL_DOUBLE, .value = { .double_value = static_cast<GLdouble>(m_point_size) } };
     case GL_POLYGON_OFFSET_FILL:
         return ContextParameter { .type = GL_BOOL, .is_capability = true, .value = { .boolean_value = m_depth_offset_enabled } };
     case GL_RED_BITS:

+ 1 - 0
Userland/Libraries/LibGL/GL/gl.h

@@ -301,6 +301,7 @@ extern "C" {
 
 // Points
 #define GL_POINT_SMOOTH 0x0B10
+#define GL_POINT_SIZE 0x0B11
 #define GL_POINT_SIZE_MIN_EXT 0x8126
 #define GL_POINT_SIZE_MAX_EXT 0x8127
 #define GL_DISTANCE_ATTENUATION_EXT 0x8129

+ 1 - 2
Userland/Libraries/LibGL/GLAPI.cpp

@@ -673,8 +673,7 @@ void glPixelStorei(GLenum pname, GLint param)
 
 void glPointSize(GLfloat size)
 {
-    // FIXME: implement
-    dbgln_if(GL_DEBUG, "glPointSize({}): unimplemented", size);
+    g_gl_context->gl_point_size(size);
 }
 
 void glPolygonMode(GLenum face, GLenum mode)

+ 12 - 0
Userland/Libraries/LibGL/GLContext.cpp

@@ -1192,6 +1192,18 @@ void GLContext::gl_rect(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
     gl_end();
 }
 
+void GLContext::gl_point_size(GLfloat size)
+{
+    APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_point_size, size);
+    RETURN_WITH_ERROR_IF(size <= 0.f, GL_INVALID_VALUE);
+
+    m_point_size = size;
+
+    auto rasterizer_options = m_rasterizer->options();
+    rasterizer_options.point_size = size;
+    m_rasterizer->set_options(rasterizer_options);
+}
+
 void GLContext::present()
 {
     m_rasterizer->blit_color_buffer_to(*m_frontbuffer);

+ 8 - 2
Userland/Libraries/LibGL/GLContext.h

@@ -199,6 +199,7 @@ public:
     void gl_clip_plane(GLenum plane, GLdouble const* equation);
     void gl_array_element(GLint i);
     void gl_copy_tex_sub_image_2d(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+    void gl_point_size(GLfloat size);
 
 private:
     void sync_device_config();
@@ -442,7 +443,8 @@ private:
             decltype(&GLContext::gl_get_light),
             decltype(&GLContext::gl_clip_plane),
             decltype(&GLContext::gl_array_element),
-            decltype(&GLContext::gl_copy_tex_sub_image_2d)>;
+            decltype(&GLContext::gl_copy_tex_sub_image_2d),
+            decltype(&GLContext::gl_point_size)>;
 
         using ExtraSavedArguments = Variant<
             FloatMatrix4x4>;
@@ -481,7 +483,11 @@ private:
     GLsizei m_unpack_row_length { 0 };
     u8 m_unpack_alignment { 4 };
 
-    float m_line_width { 1.0f };
+    // Point drawing configuration
+    float m_point_size { 1.f };
+
+    // Line drawing configuration
+    float m_line_width { 1.f };
 
     // Lighting configuration
     bool m_lighting_enabled { false };

+ 1 - 0
Userland/Libraries/LibGPU/RasterizerOptions.h

@@ -38,6 +38,7 @@ struct RasterizerOptions {
     bool fog_enabled { false };
     float fog_start { 0.0f };
     float fog_end { 1.0f };
+    float point_size { 1.f };
     bool scissor_enabled { false };
     bool normalization_enabled { false };
     Gfx::IntRect scissor_box;