add limited-scope compatability glPolygonMode state for GL_TRIANGLES + GL_LINE/GL_POINT

This commit is contained in:
iann 2026-04-16 19:27:19 +09:00
parent 105e3253e2
commit fca24d106f
3 changed files with 61 additions and 5 deletions

View File

@ -546,8 +546,12 @@ static void generate(SubmissionTarget* target, const GLenum mode, const GLsizei
generateArraysFastPath_QUADS(target, first, count);
return; // Don't need to do any more processing
case GL_TRIANGLES:
generateArraysFastPath_TRIS(target, first, count);
return; // Don't need to do any more processing
if(_glGetPolygonMode() == GL_FILL) {
generateArraysFastPath_TRIS(target, first, count);
return; // Don't need to do any more processing
}
generateArraysFastPath_ALL(target, first, count);
break;
default:
generateArraysFastPath_ALL(target, first, count);
}
@ -564,7 +568,23 @@ static void generate(SubmissionTarget* target, const GLenum mode, const GLsizei
// Drawing arrays
switch(mode) {
case GL_TRIANGLES:
genTriangles(it, count);
GLenum polygon_mode = _glGetPolygonMode();
if(polygon_mode == GL_POINT) {
genPoints(it, count);
} else if(polygon_mode == GL_LINE) {
Vertex* src = it + count - 1;
Vertex* dst = it + target->count - 1;
GLuint remaining_count = count;
while(remaining_count) {
dst = draw_line(dst, src, src - 2);
dst = draw_line(dst, src, src - 1);
dst = draw_line(dst, src - 1, src - 2);
src -= 3;
remaining_count -= 3;
}
} else {
genTriangles(it, count);
}
break;
case GL_QUADS:
genQuads(it, count);
@ -751,6 +771,14 @@ GL_FORCE_INLINE GLuint calcFinalVertices(GLenum mode, GLuint count) {
return LINE_STRIP_COUNT(count);
case GL_LINES:
return LINES_COUNT(count);
case GL_TRIANGLES:
GLenum polygon_mode = _glGetPolygonMode();
if(polygon_mode == GL_POINT) {
return POINTS_COUNT(count);
} else if(polygon_mode == GL_LINE) {
return LINES_COUNT(count * 2);
}
return count;
case GL_TRIANGLE_FAN:
return TRIFAN_COUNT(count);
case GL_QUAD_STRIP:
@ -769,6 +797,9 @@ GL_FORCE_INLINE void submitVertices(GLenum mode, GLsizei first, GLuint count, GL
if(!(ATTRIB_LIST.enabled & VERTEX_ENABLED_FLAG)) return;
if(ATTRIB_LIST.dirty) _glUpdateAttributes();
if(mode == GL_TRIANGLES) {
count -= (count % 3);
}
/* No vertices? Do nothing */
if(!count) return;

View File

@ -407,6 +407,7 @@ GLboolean _glIsFogEnabled();
GLenum _glGetDepthFunc();
GLenum _glGetCullFace();
GLenum _glGetFrontFace();
GLenum _glGetPolygonMode();
GLenum _glGetGpuBlendSrcFactor();
GLenum _glGetGpuBlendDstFactor();

View File

@ -42,6 +42,7 @@ static struct {
GLboolean blend_enabled;
GLfloat offset_factor;
GLfloat offset_units;
GLenum polygon_mode;
GLfloat scene_ambient[4];
GLboolean viewer_in_eye_coords;
@ -77,6 +78,7 @@ static struct {
.blend_enabled = GL_FALSE,
.offset_factor = 0.0f,
.offset_units = 0.0f,
.polygon_mode = GL_FILL,
.scene_ambient = {0.2f, 0.2f, 0.2f, 1.0f},
.viewer_in_eye_coords = GL_TRUE,
.color_control = GL_SINGLE_COLOR,
@ -155,6 +157,10 @@ GLenum _glGetFrontFace() {
return GPUState.front_face;
}
GLenum _glGetPolygonMode() {
return GPUState.polygon_mode;
}
GLboolean _glIsFogEnabled() {
return GPUState.fog_enabled;
}
@ -724,8 +730,26 @@ GLAPI void APIENTRY glHint(GLenum target, GLenum mode) {
/* Polygon Rasterization Mode */
GLAPI void APIENTRY glPolygonMode(GLenum face, GLenum mode) {
_GL_UNUSED(face);
_GL_UNUSED(mode);
GLint validModes[] = {
GL_FILL,
GL_LINE,
GL_POINT,
0
};
GLint validFaces[] = {
GL_FRONT_AND_BACK,
0
};
if(_glCheckValidEnum(mode, validModes, __func__) != 0) {
return;
}
if(_glCheckValidEnum(face, validFaces, __func__) != 0) {
return;
}
GPUState.polygon_mode = mode;
}
/* Culling */