_draw() inconsistencies on older Mac hardware (Firefox, Web export, Compatibility renderer)

Godot Version

4.5.1

Question

Hi everyone,

I’m running into an unexpected rendering issue while using Godot’s native _draw() function on older hardware, and I’d like to understand whether this is a known limitation or something I might be doing incorrectly.

Project context

I’m developing a web-exported application in Godot 4.5.1, using the Compatibility renderer.
The project relies heavily on _draw() to render interactive 2D elements, including:

  • Draggable circular points

  • A bounding box that can be moved and scaled

  • A smile outline drawn by connecting points (curved / polyline style)

All of these elements are drawn using _draw() and respond to user input.

The issue

During testing, I noticed that on Firefox running on macOS with older Intel GPUs, some draw calls fail to appear correctly.

Tested hardware where the issue occurs:

  • Intel Iris 6100

  • Intel Iris Pro 6200

  • Both Macs reported OpenGL 4.1 INTEL-18.8.16

  • Both Firefox versions 132.0.1

On these systems:

  • :white_check_mark: The circle drawings (points) render correctly

  • :cross_mark: The bounding box outline does not render

  • :cross_mark: The smile outline (lines / curves between points) does not render as intended

The same build works correctly on:

  • Newer macOS hardware

  • Windows (multiple GPUs)

  • Other browsers and systems I’ve tested

This makes me suspect a limitation or difference in how _draw() is handled on older macOS + Firefox + Compatibility pipeline combinations.

Code snippets

Drawing the circles

func _draw():
	var circle_pos = Vector2(size.x/2,size.y/2)
	draw_circle(circle_pos,10,Color("404040"),true,-1,true)
	draw_circle(circle_pos,8,Color("fff187"),true,-1,true)

Drawing the bounding box

func _draw() -> void:
	var top_left : Vector2 = Vector2.ZERO
	var top_right : Vector2 = Vector2(size.x,0)
	var bot_left : Vector2 = Vector2(0,size.y)
	var bot_right : Vector2 = size
	
	#_width is 0.8
	#_dash is 5.0
	
	draw_dashed_line(top_left,top_right,_color,_width,_dash,true,true)
	draw_dashed_line(top_right,bot_right,_color,_width,_dash,true,true)
	draw_dashed_line(bot_right,bot_left,_color,_width,_dash,true,true)
	draw_dashed_line(bot_left,top_left,_color,_width,_dash,true,true)

Drawing the dashed curve

###This is a simplified version of the code I use to draw the curve, only illustrating how I use the draw_line function.

###The function draw_dashed_polyline is called inside _draw()

func draw_dashed_polyline(points: PackedVector2Array, color: Color) -> void:
	if points.size() < 2:
		return

	for i in range(points.size() - 1):
		var from := points[i]
		var to   := points[i + 1]

		# Dash logic simplified for illustration
		var dash_start := from
		var dash_end   := from.lerp(to, 0.5)

		# Draw dashed segment
		draw_line(dash_start, dash_end, color, curve_width, true)

Expected result:

Wrong results:

What happens if you draw with default width and color that has alpha 1.0?

1 Like