diff --git a/examples/common/entry/dialog.cpp b/examples/common/entry/dialog.cpp index 0053a0e39..9d009082a 100644 --- a/examples/common/entry/dialog.cpp +++ b/examples/common/entry/dialog.cpp @@ -68,7 +68,7 @@ void openUrl(const bx::StringView& _url) #if BX_PLATFORM_WINDOWS void* result = ShellExecuteA(NULL, NULL, tmp, NULL, NULL, false); BX_UNUSED(result); -#elif !BX_PLATFORM_IOS +#elif !BX_PLATFORM_IOS && !BX_PLATFORM_VISIONOS int32_t result = system(tmp); BX_UNUSED(result); #endif // BX_PLATFORM_* diff --git a/examples/common/entry/entry_sdl.cpp b/examples/common/entry/entry_sdl.cpp index 989004450..3ad4ef978 100644 --- a/examples/common/entry/entry_sdl.cpp +++ b/examples/common/entry/entry_sdl.cpp @@ -68,7 +68,7 @@ namespace entry else # endif // ENTRY_CONFIG_USE_WAYLAND return (void*)wmi.info.x11.window; -# elif BX_PLATFORM_OSX || BX_PLATFORM_IOS +# elif BX_PLATFORM_OSX || BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS return wmi.info.cocoa.window; # elif BX_PLATFORM_WINDOWS return wmi.info.win.window; diff --git a/include/bgfx/embedded_shader.h b/include/bgfx/embedded_shader.h index 2884f413c..01c6bf019 100644 --- a/include/bgfx/embedded_shader.h +++ b/include/bgfx/embedded_shader.h @@ -34,6 +34,7 @@ || BX_PLATFORM_LINUX \ || BX_PLATFORM_OSX \ || BX_PLATFORM_RPI \ + || BX_PLATFORM_VISIONOS \ || BX_PLATFORM_WINDOWS \ ) #define BGFX_PLATFORM_SUPPORTS_GLSL (0 \ @@ -44,6 +45,7 @@ #define BGFX_PLATFORM_SUPPORTS_METAL (0 \ || BX_PLATFORM_IOS \ || BX_PLATFORM_OSX \ + || BX_PLATFORM_VISIONOS \ ) #define BGFX_PLATFORM_SUPPORTS_NVN (0 \ || BX_PLATFORM_NX \ diff --git a/src/bgfx.cpp b/src/bgfx.cpp index 5a8e51a43..e34a71020 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -12,7 +12,7 @@ #include "topology.h" -#if BX_PLATFORM_OSX || BX_PLATFORM_IOS +#if BX_PLATFORM_OSX || BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS # include #elif BX_PLATFORM_WINDOWS # ifndef WIN32_LEAN_AND_MEAN @@ -2413,7 +2413,7 @@ namespace bgfx } } -#if BX_PLATFORM_OSX || BX_PLATFORM_IOS +#if BX_PLATFORM_OSX || BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS struct NSAutoreleasePoolScope { NSAutoreleasePoolScope() @@ -2437,7 +2437,7 @@ namespace bgfx { BGFX_PROFILER_SCOPE("bgfx::renderFrame", 0xff2040ff); -#if BX_PLATFORM_OSX || BX_PLATFORM_IOS +#if BX_PLATFORM_OSX || BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS NSAutoreleasePoolScope pool; #endif // BX_PLATFORM_OSX @@ -2635,11 +2635,11 @@ namespace bgfx { d3d11::rendererCreate, d3d11::rendererDestroy, BGFX_RENDERER_DIRECT3D11_NAME, !!BGFX_CONFIG_RENDERER_DIRECT3D11 }, // Direct3D11 { d3d12::rendererCreate, d3d12::rendererDestroy, BGFX_RENDERER_DIRECT3D12_NAME, !!BGFX_CONFIG_RENDERER_DIRECT3D12 }, // Direct3D12 { gnm::rendererCreate, gnm::rendererDestroy, BGFX_RENDERER_GNM_NAME, !!BGFX_CONFIG_RENDERER_GNM }, // GNM -#if BX_PLATFORM_OSX || BX_PLATFORM_IOS +#if BX_PLATFORM_OSX || BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS { mtl::rendererCreate, mtl::rendererDestroy, BGFX_RENDERER_METAL_NAME, !!BGFX_CONFIG_RENDERER_METAL }, // Metal #else { noop::rendererCreate, noop::rendererDestroy, BGFX_RENDERER_NOOP_NAME, false }, // Noop -#endif // BX_PLATFORM_OSX || BX_PLATFORM_IOS +#endif // BX_PLATFORM_OSX || BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS { nvn::rendererCreate, nvn::rendererDestroy, BGFX_RENDERER_NVN_NAME, !!BGFX_CONFIG_RENDERER_NVN }, // NVN { gl::rendererCreate, gl::rendererDestroy, BGFX_RENDERER_OPENGL_NAME, !!BGFX_CONFIG_RENDERER_OPENGLES }, // OpenGLES { gl::rendererCreate, gl::rendererDestroy, BGFX_RENDERER_OPENGL_NAME, !!BGFX_CONFIG_RENDERER_OPENGL }, // OpenGL @@ -2737,7 +2737,7 @@ namespace bgfx score += RendererType::Metal == renderer ? 20 : 0; score += RendererType::Vulkan == renderer ? 10 : 0; } - else if (BX_ENABLED(BX_PLATFORM_IOS) ) + else if (BX_ENABLED(BX_PLATFORM_IOS) || BX_ENABLED(BX_PLATFORM_VISIONOS)) { score += RendererType::Metal == renderer ? 20 : 0; } diff --git a/src/config.h b/src/config.h index 6f4ec8c3c..b1f580313 100644 --- a/src/config.h +++ b/src/config.h @@ -63,6 +63,7 @@ # define BGFX_CONFIG_RENDERER_METAL (0 \ || BX_PLATFORM_IOS \ || BX_PLATFORM_OSX \ + || BX_PLATFORM_VISIONOS \ ? 1 : 0) # endif // BGFX_CONFIG_RENDERER_METAL diff --git a/src/renderer_mtl.h b/src/renderer_mtl.h index e22875a5f..26de5da33 100644 --- a/src/renderer_mtl.h +++ b/src/renderer_mtl.h @@ -14,10 +14,14 @@ #import #import -#if BX_PLATFORM_IOS +#if BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS # import #endif // BX_PLATFORM_* +#if BX_PLATFORM_VISIONOS +#import +#endif + #define BGFX_MTL_PROFILER_BEGIN(_view, _abgr) \ BX_MACRO_BLOCK_BEGIN \ BGFX_PROFILER_BEGIN(s_viewName[view], _abgr); \ @@ -38,7 +42,7 @@ namespace bgfx { namespace mtl //runtime os check inline bool iOSVersionEqualOrGreater(const char* _version) { -#if BX_PLATFORM_IOS +#if BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS return ([[[UIDevice currentDevice] systemVersion] compare:@(_version) options:NSNumericSearch] != NSOrderedAscending); #else BX_UNUSED(_version); @@ -386,7 +390,7 @@ namespace bgfx { namespace mtl bool supportsTextureSampleCount(int sampleCount) { - if (BX_ENABLED(BX_PLATFORM_IOS) && !iOSVersionEqualOrGreater("9.0.0") ) + if (BX_ENABLED(BX_PLATFORM_VISIONOS) || (BX_ENABLED(BX_PLATFORM_IOS) && !iOSVersionEqualOrGreater("9.0.0")) ) return sampleCount == 1 || sampleCount == 2 || sampleCount == 4; else return [m_obj supportsTextureSampleCount:sampleCount]; @@ -394,11 +398,11 @@ namespace bgfx { namespace mtl bool depth24Stencil8PixelFormatSupported() { -#if BX_PLATFORM_IOS +#if BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS return false; #else return m_obj.depth24Stencil8PixelFormatSupported; -#endif // BX_PLATFORM_IOS +#endif // BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS } MTL_CLASS_END @@ -1032,7 +1036,12 @@ namespace bgfx { namespace mtl struct SwapChainMtl { SwapChainMtl() +#if BX_PLATFORM_VISIONOS + : m_layerRenderer(NULL) + , m_frame(NULL) +#else : m_metalLayer(nil) +#endif , m_drawable(nil) , m_drawableTexture(nil) , m_backBufferColorMsaa() @@ -1049,8 +1058,15 @@ namespace bgfx { namespace mtl id currentDrawableTexture(); + +#if BX_PLATFORM_VISIONOS + cp_layer_renderer_t m_layerRenderer; + cp_frame_t m_frame; + cp_drawable_t m_drawable; +#else CAMetalLayer* m_metalLayer; - id m_drawable; + id m_drawable; +#endif id m_drawableTexture; Texture m_backBufferColorMsaa; Texture m_backBufferDepth; diff --git a/src/renderer_mtl.mm b/src/renderer_mtl.mm index 05a7d2796..03f71149b 100644 --- a/src/renderer_mtl.mm +++ b/src/renderer_mtl.mm @@ -247,7 +247,7 @@ namespace bgfx { namespace mtl { MTLPixelFormatInvalid, MTLPixelFormatInvalid, MTLReadWriteTextureTierNone, { $R, $G, $B, $A }, false }, // ATC { MTLPixelFormatInvalid, MTLPixelFormatInvalid, MTLReadWriteTextureTierNone, { $R, $G, $B, $A }, false }, // ATCE { MTLPixelFormatInvalid, MTLPixelFormatInvalid, MTLReadWriteTextureTierNone, { $R, $G, $B, $A }, false }, // ATCI -#if BX_PLATFORM_IOS && !TARGET_OS_MACCATALYST +#if (BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS) && !TARGET_OS_MACCATALYST { MTLPixelFormatASTC_4x4_LDR, MTLPixelFormatASTC_4x4_sRGB, MTLReadWriteTextureTierNone, { $R, $G, $B, $A }, false }, // ASTC4x4 { MTLPixelFormatASTC_5x4_LDR, MTLPixelFormatASTC_5x4_sRGB, MTLReadWriteTextureTierNone, { $R, $G, $B, $A }, false }, // ASTC5x4 { MTLPixelFormatASTC_5x5_LDR, MTLPixelFormatASTC_5x5_sRGB, MTLReadWriteTextureTierNone, { $R, $G, $B, $A }, false }, // ASTC5x5 @@ -277,7 +277,7 @@ namespace bgfx { namespace mtl { MTLPixelFormatInvalid, MTLPixelFormatInvalid, MTLReadWriteTextureTierNone, { $R, $G, $B, $A }, false }, // ASTC10x10 { MTLPixelFormatInvalid, MTLPixelFormatInvalid, MTLReadWriteTextureTierNone, { $R, $G, $B, $A }, false }, // ASTC12x10 { MTLPixelFormatInvalid, MTLPixelFormatInvalid, MTLReadWriteTextureTierNone, { $R, $G, $B, $A }, false }, // ASTC12x12 -#endif // BX_PLATFORM_IOS && !TARGET_OS_MACCATALYST +#endif // (BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS) && !TARGET_OS_MACCATALYST { MTLPixelFormatInvalid, MTLPixelFormatInvalid, MTLReadWriteTextureTierNone, { $R, $G, $B, $A }, false }, // Unknown { MTLPixelFormatInvalid, MTLPixelFormatInvalid, MTLReadWriteTextureTierNone, { $R, $G, $B, $A }, false }, // R1 { MTLPixelFormatA8Unorm, MTLPixelFormatInvalid, MTLReadWriteTextureTierNone, { $R, $G, $B, $A }, false }, // A8 @@ -524,7 +524,11 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa ); m_numWindows = 1; + #if BX_PLATFORM_VISIONOS + if (NULL == m_mainFrameBuffer.m_swapChain->m_layerRenderer) + #else // BX_PLATFORM_VISIONOS if (NULL == m_mainFrameBuffer.m_swapChain->m_metalLayer) + #endif // BX_PLATFORM_VISIONOS { release(m_device); return false; @@ -588,7 +592,7 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa m_screenshotBlitProgram.create(&m_screenshotBlitProgramVsh, &m_screenshotBlitProgramFsh); reset(m_renderPipelineDescriptor); - m_renderPipelineDescriptor.colorAttachments[0].pixelFormat = m_mainFrameBuffer.m_swapChain->m_metalLayer.pixelFormat; + m_renderPipelineDescriptor.colorAttachments[0].pixelFormat = getSwapChainPixelFormat(m_mainFrameBuffer.m_swapChain); m_renderPipelineDescriptor.vertexFunction = m_screenshotBlitProgram.m_vsh->m_function; m_renderPipelineDescriptor.fragmentFunction = m_screenshotBlitProgram.m_fsh->m_function; m_screenshotBlitRenderPipelineState = m_device.newRenderPipelineStateWithDescriptor(m_renderPipelineDescriptor); @@ -784,7 +788,7 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa g_caps.formats[TextureFormat::RGBA32I] &= ~(BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA); g_caps.formats[TextureFormat::RGBA32U] &= ~(BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA); - if (BX_ENABLED(BX_PLATFORM_IOS) ) + if (BX_ENABLED(BX_PLATFORM_IOS) || BX_ENABLED(BX_PLATFORM_VISIONOS)) { s_textureFormat[TextureFormat::D24S8].m_fmt = MTLPixelFormatDepth32Float_Stencil8; @@ -1025,6 +1029,14 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa { } + MTLPixelFormat getSwapChainPixelFormat(SwapChainMtl *swapChain) { +#if BX_PLATFORM_VISIONOS + return MTLPixelFormatBGRA8Unorm_sRGB; +#else + return swapChain->m_metalLayer.pixelFormat; +#endif + } + void readTexture(TextureHandle _handle, void* _data, uint8_t _mip) override { const TextureMtl& texture = m_textures[_handle.idx]; @@ -1408,8 +1420,14 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa if (NULL != frameBuffer.m_swapChain->m_drawable) { +#if BX_PLATFORM_VISIONOS + cp_frame_start_submission(frameBuffer.m_swapChain->m_frame); + cp_drawable_encode_present(frameBuffer.m_swapChain->m_drawable, m_commandBuffer); + cp_frame_end_submission(frameBuffer.m_swapChain->m_frame); +#else // BX_PLATFORM_VISIONOS m_commandBuffer.presentDrawable(frameBuffer.m_swapChain->m_drawable); MTL_RELEASE(frameBuffer.m_swapChain->m_drawable); +#endif // BX_PLATFORM_VISIONOS } } } @@ -1435,8 +1453,7 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa || m_resolution.height != _resolution.height || (m_resolution.reset&maskFlags) != (_resolution.reset&maskFlags) ) { - MTLPixelFormat prevMetalLayerPixelFormat = m_mainFrameBuffer.m_swapChain->m_metalLayer.pixelFormat; - + MTLPixelFormat prevMetalLayerPixelFormat = getSwapChainPixelFormat(m_mainFrameBuffer.m_swapChain); m_resolution = _resolution; if (m_resolution.reset & BGFX_RESET_INTERNAL_FORCE @@ -1458,12 +1475,13 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa m_textVideoMem.resize(false, _resolution.width, _resolution.height); m_textVideoMem.clear(); - if (prevMetalLayerPixelFormat != m_mainFrameBuffer.m_swapChain->m_metalLayer.pixelFormat) + + if (prevMetalLayerPixelFormat != getSwapChainPixelFormat(m_mainFrameBuffer.m_swapChain)) { MTL_RELEASE(m_screenshotBlitRenderPipelineState) reset(m_renderPipelineDescriptor); - m_renderPipelineDescriptor.colorAttachments[0].pixelFormat = m_mainFrameBuffer.m_swapChain->m_metalLayer.pixelFormat; + m_renderPipelineDescriptor.colorAttachments[0].pixelFormat = getSwapChainPixelFormat(m_mainFrameBuffer.m_swapChain); m_renderPipelineDescriptor.vertexFunction = m_screenshotBlitProgram.m_vsh->m_function; m_renderPipelineDescriptor.fragmentFunction = m_screenshotBlitProgram.m_fsh->m_function; m_screenshotBlitRenderPipelineState = m_device.newRenderPipelineStateWithDescriptor(m_renderPipelineDescriptor); @@ -3005,7 +3023,7 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa || writeOnly || bimg::isDepth(bimg::TextureFormat::Enum(m_textureFormat) ) ? 2 /* MTLStorageModePrivate */ - : (BX_ENABLED(BX_PLATFORM_IOS) + : (BX_ENABLED(BX_PLATFORM_IOS) || BX_ENABLED(BX_PLATFORM_VISIONOS) ? 0 /* MTLStorageModeShared */ : 1 /* MTLStorageModeManaged */ ) ); @@ -3198,7 +3216,7 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa if (s_renderMtl->m_hasCPUCacheModesAndStorageModes) { desc.cpuCacheMode = MTLCPUCacheModeDefaultCache; - desc.storageMode = BX_ENABLED(BX_PLATFORM_IOS) + desc.storageMode = BX_ENABLED(BX_PLATFORM_IOS) || BX_ENABLED(BX_PLATFORM_VISIONOS) ? (MTLStorageMode)0 // MTLStorageModeShared : (MTLStorageMode)1 // MTLStorageModeManaged ; @@ -3286,8 +3304,12 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa SwapChainMtl::~SwapChainMtl() { +#if BX_PLATFORM_VISIONOS + MTL_RELEASE(m_layerRenderer); +#else // BX_PLATFORM_VISIONOS MTL_RELEASE(m_metalLayer); MTL_RELEASE(m_drawable); +#endif // BX_PLATFORM_VISIONOS MTL_RELEASE(m_drawableTexture); MTL_RELEASE(m_backBufferDepth); @@ -3302,6 +3324,7 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa void SwapChainMtl::init(void* _nwh) { +#if !BX_PLATFORM_VISIONOS if (m_metalLayer) { release(m_metalLayer); @@ -3402,8 +3425,15 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa m_metalLayer.device = s_renderMtl->m_device; m_metalLayer.pixelFormat = MTLPixelFormatBGRA8Unorm; m_metalLayer.magnificationFilter = kCAFilterNearest; - m_nwh = _nwh; retain(m_metalLayer); +#else // BX_PLATFORM_VISIONOS + { + cp_layer_renderer_t layerRenderer = (cp_layer_renderer_t)_nwh; + m_layerRenderer = layerRenderer; + retain(m_layerRenderer); + } +#endif // BX_PLATFORM_VISIONOS + m_nwh = _nwh; } void SwapChainMtl::resize(FrameBufferMtl &_frameBuffer, uint32_t _width, uint32_t _height, uint32_t _flags, uint32_t _maximumDrawableCount) @@ -3428,11 +3458,13 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa # endif // __MAC_OS_X_VERSION_MAX_ALLOWED >= 101300 #endif // BX_PLATFORM_OSX +#if !BX_PLATFORM_VISIONOS m_metalLayer.drawableSize = CGSizeMake(_width, _height); m_metalLayer.pixelFormat = (_flags & BGFX_RESET_SRGB_BACKBUFFER) ? MTLPixelFormatBGRA8Unorm_sRGB : MTLPixelFormatBGRA8Unorm ; +#endif // BX_PLATFORM_VISIONOS TextureDescriptor desc = s_renderMtl->m_textureDescriptor; @@ -3492,14 +3524,20 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa if (sampleCount > 1) { +#if BX_PLATFORM_VISIONOS + desc.pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB; +#else desc.pixelFormat = m_metalLayer.pixelFormat; +#endif m_backBufferColorMsaa = s_renderMtl->m_device.newTextureWithDescriptor(desc); } bx::HashMurmur2A murmur; murmur.begin(); murmur.add(1); +#if !BX_PLATFORM_VISIONOS murmur.add( (uint32_t)m_metalLayer.pixelFormat); +#endif // BX_PLATFORM_VISIONOS murmur.add( (uint32_t)m_backBufferDepth.pixelFormat() ); murmur.add( (uint32_t)m_backBufferStencil.pixelFormat() ); murmur.add( (uint32_t)sampleCount); @@ -3510,20 +3548,35 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa { if (NULL == m_drawableTexture) { +#if BX_PLATFORM_VISIONOS + m_frame = cp_layer_renderer_query_next_frame(m_layerRenderer); + if (m_frame) { + m_drawable = cp_frame_query_drawable(m_frame); + } +#else // BX_PLATFORM_VISIONOS m_drawable = m_metalLayer.nextDrawable; +#endif // BX_PLATFORM_VISIONOS if (m_drawable != NULL) { +#if BX_PLATFORM_VISIONOS + m_drawableTexture = cp_drawable_get_color_texture(m_drawable, 0); +#else // BX_PLATFORM_VISIONOS m_drawableTexture = m_drawable.texture; - retain(m_drawableTexture); retain(m_drawable); // keep alive to be useable at 'flip' +#endif // BX_PLATFORM_VISIONOS + retain(m_drawableTexture); } else { TextureDescriptor desc = s_renderMtl->m_textureDescriptor; desc.textureType = MTLTextureType2D; +#if !BX_PLATFORM_VISIONOS desc.pixelFormat = m_metalLayer.pixelFormat; desc.width = m_metalLayer.drawableSize.width; desc.height = m_metalLayer.drawableSize.height; +#else // BX_PLATFORM_VISIONOS + desc.pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB; +#endif // BX_PLATFORM_VISIONOS desc.depth = 1; desc.mipmapLevelCount = 1; desc.sampleCount = 1; @@ -3532,7 +3585,7 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa if (s_renderMtl->m_hasCPUCacheModesAndStorageModes) { desc.cpuCacheMode = MTLCPUCacheModeDefaultCache; - desc.storageMode = BX_ENABLED(BX_PLATFORM_IOS) + desc.storageMode = BX_ENABLED(BX_PLATFORM_IOS) || BX_ENABLED(BX_PLATFORM_VISIONOS) ? (MTLStorageMode)0 // MTLStorageModeShared : (MTLStorageMode)1 // MTLStorageModeManaged ; @@ -3998,7 +4051,7 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa if (NULL == m_screenshotTarget) { m_textureDescriptor.textureType = MTLTextureType2D; - m_textureDescriptor.pixelFormat = m_mainFrameBuffer.m_swapChain->m_metalLayer.pixelFormat; + m_textureDescriptor.pixelFormat = getSwapChainPixelFormat(m_mainFrameBuffer.m_swapChain); m_textureDescriptor.width = m_resolution.width; m_textureDescriptor.height = m_resolution.height; m_textureDescriptor.depth = 1; @@ -4009,7 +4062,7 @@ BX_STATIC_ASSERT(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNa if (s_renderMtl->m_hasCPUCacheModesAndStorageModes) { m_textureDescriptor.cpuCacheMode = MTLCPUCacheModeDefaultCache; - m_textureDescriptor.storageMode = BX_ENABLED(BX_PLATFORM_IOS) + m_textureDescriptor.storageMode = BX_ENABLED(BX_PLATFORM_IOS) || BX_ENABLED(BX_PLATFORM_VISIONOS) ? (MTLStorageMode)0 // MTLStorageModeShared : (MTLStorageMode)1 // MTLStorageModeManaged ; diff --git a/tools/shaderc/shaderc.cpp b/tools/shaderc/shaderc.cpp index e21148fb7..34480f00d 100644 --- a/tools/shaderc/shaderc.cpp +++ b/tools/shaderc/shaderc.cpp @@ -1163,6 +1163,7 @@ namespace bgfx preprocessor.setDefaultDefine("BX_PLATFORM_ANDROID"); preprocessor.setDefaultDefine("BX_PLATFORM_EMSCRIPTEN"); preprocessor.setDefaultDefine("BX_PLATFORM_IOS"); + preprocessor.setDefaultDefine("BX_PLATFORM_VISIONOS"); preprocessor.setDefaultDefine("BX_PLATFORM_LINUX"); preprocessor.setDefaultDefine("BX_PLATFORM_OSX"); preprocessor.setDefaultDefine("BX_PLATFORM_PS4"); @@ -1228,12 +1229,19 @@ namespace bgfx preprocessor.setDefine(glslDefine); } } - else if (0 == bx::strCmpI(platform, "ios") || (0 == bx::strCmpI(platform, "osx")) ) + else if ( + 0 == bx::strCmpI(platform, "ios") || + 0 == bx::strCmpI(platform, "osx") || + 0 == bx::strCmpI(platform, "visionos") + ) { if (0 == bx::strCmpI(platform, "osx")) { preprocessor.setDefine("BX_PLATFORM_OSX=1"); } + else if (0 == bx::strCmpI(platform, "visionos")) { + preprocessor.setDefine("BX_PLATFORM_VISIONOS=1"); + } else { preprocessor.setDefine("BX_PLATFORM_IOS=1");