 													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
+}

	return bins
}

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)

		let frameRenderList = RenderList(poiGroupsInFrame.map { $0 })
		frameSwitchSemaphore.wait()
			self.renderLists[bufferIndex] = frameRenderList
			self.instanceUniforms[bufferIndex].contents().copyMemory(from: poiBuffer, byteCount: MemoryLayout<InstanceUniform>.stride * poiBuffer.count)
			self.framePoiMarkerCount[bufferIndex] = poiBuffer.count
			self.poiBaseSize = poiScreenSize
			self.rankThreshold = newRankThreshold
