1+ package com.mapbox.maps.renderer
2+
3+ import android.view.Surface
4+ import com.mapbox.maps.IVulkanManager
5+ import com.mapbox.maps.RenderCallback
6+ import com.mapbox.maps.logI
7+ import com.mapbox.maps.logW
8+
9+ /* *
10+ * Vulkan-based implementation of MapboxRenderThread.
11+ */
12+ internal class VulkanMapboxRenderThread (mapboxRenderer : MapboxRenderer , mapName : String ) :
13+ MapboxRenderThread (
14+ mapboxRenderer = mapboxRenderer,
15+ widgetRenderer = null ,
16+ mapName = mapName,
17+ rendererName = " Vulkan"
18+ ) {
19+
20+ private var nativeVulkanManager: IVulkanManager ? = null
21+ private val surfaceWrapper: SurfaceWrapper = SurfaceWrapper ()
22+
23+ init {
24+ logI(TAG , " VulkanMapboxRenderThread created" )
25+ }
26+
27+ override fun detachSurfaceFromRenderer (creatingSurface : Boolean ) {
28+ // no-op for now
29+ }
30+
31+ /* *
32+ * For Vulkan renderer there's not much to prepare, just get the [IVulkanManager].
33+ * Preparations will be done in [attachSurfaceToRenderer].
34+ */
35+ override fun prepareRenderer (): Boolean {
36+ logI(TAG , " prepareRenderer called" )
37+ // TODO: How to handle vulkan not supported in the device?
38+ if (nativeVulkanManager == null ) {
39+ nativeVulkanManager = mapboxRenderer.map?.getVulkanManager()
40+ }
41+ val result = nativeVulkanManager != null
42+ return result
43+ }
44+
45+ override fun attachSurfaceToRenderer (surface : Surface ): Boolean {
46+ logI(TAG , " attachSurfaceToRenderer called" )
47+
48+ surfaceWrapper.setSurface(surface)
49+ val nativeWindowPtr = surfaceWrapper.aNativeWindow
50+
51+ if (nativeWindowPtr == 0L ) {
52+ logW(TAG , " Failed to get native window pointer" )
53+ return false
54+ }
55+
56+ logI(TAG , " Vulkan pre-init" )
57+ val result = nativeVulkanManager?.init (nativeWindowPtr) ? : run {
58+ // TODO cache surface until nativeVulkanManager is set via setMap
59+ false
60+ }
61+
62+ logI(TAG , " Vulkan init result: $result " )
63+ return result
64+ }
65+
66+ private val renderCallback: RenderCallback = RenderCallback (mapboxRenderer::render)
67+
68+ override fun renderWithoutWidgets () {
69+ nativeVulkanManager?.render(renderCallback)
70+ }
71+
72+ override fun presentFrame () {
73+ // no-op as presentFrame is called from native side as part of `render { }`
74+ }
75+
76+ override fun preRenderWithSharedContext () {
77+ // no-op for now
78+ }
79+
80+ override fun renderWithWidgets () {
81+ TODO (" Not yet supported in Vulkan" )
82+ }
83+
84+ override fun releaseResources () {
85+ logI(TAG , " releaseResources called" )
86+ isRendererReady = false
87+ surfaceWrapper.releaseSurface()
88+ nativeVulkanManager?.release()
89+ }
90+
91+ override fun prepareWidgetRender () {
92+ // no-op for now
93+ }
94+
95+ override fun releaseRenderSurface () {
96+ logI(TAG , " releaseRenderSurface called" )
97+ nativeVulkanManager?.releaseSurface()
98+ }
99+
100+ override fun clearRendererStateListeners () {
101+ // no-op for now
102+ }
103+
104+ override fun addRendererStateListener (listener : RendererSetupErrorListener ) {
105+ // no-op for now
106+ }
107+
108+ override fun removeRendererStateListener (listener : RendererSetupErrorListener ) {
109+ // no-op for now
110+ }
111+
112+ override fun resize (width : Int , height : Int ) {
113+ logI(TAG , " resize to ${width} x${height} called" )
114+ // TODO cache width/height if NULL
115+ nativeVulkanManager?.resize(width, height)
116+ }
117+
118+ override fun flushCommands () {
119+ // no-op for now
120+ }
121+ }
0 commit comments