 													debugName: "POI primitive")
 }
 
-fileprivate func generatePoiMarkerGeometry(poiGroups: [PoiGroup], visibilities: [Int : PoiRenderer.Visibility], maxMarkers: Int) -> Array<InstanceUniforms> {
-	return []
-}
+fileprivate func generatePoiMarkerGeometry(poiGroups: [PoiGroup], visibilities: [Int : PoiRenderer.Visibility], maxMarkers: Int) -> Array<InstanceUniform> {
+	let markerCount = poiGroups.reduce(0) { $0 + $1.locations.count }
+	var markers = Array<InstanceUniform>()
+	markers.reserveCapacity(markerCount)
+	for group in poiGroups {
+		for marker in group.locations {
+			markers.append(InstanceUniform(
+				position: simd_float2(x: marker.x, y: marker.y),
+				progress: 1.0	// $ lookup in visibility + small offset of .2 bias, max
+			))
+		}
+	}
+	return markers
+}

	let rankedPlaces = bucketPlaceMarkers(places: placeMarkers)
	let rankedAreas = bucketPlaceMarkers(places: areaMarkers )
	
	for (rank, place) in rankedPlaces {
		
	}
	
	for (rank, place) in rankedAreas {
	}
	
	let poiGroups: [PoiGroup] = []
	return poiGroups
}


	return bins
}

// $ remove
func buildPlaceMarkers(places: Set<GeoPlace>) -> ([ScaleVertex], [UInt16]) {
	let vertices = places.reduce([]) { (accumulator: [ScaleVertex], place: GeoPlace) in
		let size = 1.0 / Float(place.rank > 0 ? place.rank : 1)
