Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
b783ef0
Metal
IsaacMarovitz May 20, 2025
7bbec8d
Hopefully fix build
IsaacMarovitz May 20, 2025
31d07f7
Remove explicit releases
IsaacMarovitz May 21, 2025
9f6272b
Fix call
IsaacMarovitz May 21, 2025
5aa293b
Fix some mistakes
IsaacMarovitz May 21, 2025
23b9555
Fix texture imgui cast
IsaacMarovitz May 21, 2025
c6bdb54
Include vector, rename conflicting types
IsaacMarovitz May 21, 2025
1100747
Update imgui metal backend + Fix texture handles
IsaacMarovitz May 21, 2025
f112c3e
Get Metal window size (not scaled properly)
IsaacMarovitz May 21, 2025
b689dbc
Fix explicit cast
IsaacMarovitz May 21, 2025
8e8ebc1
Hack to fix metal_context.h
IsaacMarovitz May 21, 2025
a3db31a
Clamp imgui sampler to border
IsaacMarovitz May 21, 2025
5fb1d7d
Fix iOS SDL include
IsaacMarovitz May 21, 2025
cce33de
Rendering again
IsaacMarovitz May 21, 2025
a65cf12
Fix missing NSString -> char*
IsaacMarovitz May 21, 2025
640c206
Gouraud Interpolation
IsaacMarovitz May 21, 2025
28dc00f
Fix ModVolShader function constant
IsaacMarovitz May 23, 2025
cd46d18
Fix offset
IsaacMarovitz May 23, 2025
e835e2e
Fix missing symbol
IsaacMarovitz May 27, 2025
ceee78b
Resolve buffer packer symbol conflict
IsaacMarovitz May 28, 2025
49a8b40
Fix push constant alignment
IsaacMarovitz May 28, 2025
8b875d6
Fix div_pos_z typo
IsaacMarovitz May 28, 2025
d4c9045
Stop resources from becoming corrupted in flight
IsaacMarovitz May 28, 2025
86b8363
Fix texture memory usage
IsaacMarovitz May 29, 2025
e9e6050
Set first provoking vertex on Metal
IsaacMarovitz May 29, 2025
cc484d1
Make metal_context hack better
IsaacMarovitz May 29, 2025
13aa73c
Update dither
IsaacMarovitz May 29, 2025
d7f1622
Force Metal off on not Apple
IsaacMarovitz May 29, 2025
6147524
Fix Palette Texture Format
IsaacMarovitz May 29, 2025
291be28
Texture Rework + Mipmaps
IsaacMarovitz May 29, 2025
aa1fd75
Update copyright
IsaacMarovitz May 29, 2025
e2e0a7a
Major Refactor
IsaacMarovitz May 30, 2025
7641b43
GetLastFrame
IsaacMarovitz Jun 2, 2025
6842785
Uncomment unsorted translucent draw
IsaacMarovitz Jun 2, 2025
d7e6b33
Don’t advetise as per pixel rn
IsaacMarovitz Jun 2, 2025
17fdbab
Last Metal driver fixes
IsaacMarovitz Jun 2, 2025
f5e0d3a
isolate mac only api
IsaacMarovitz Jun 2, 2025
60f1b2c
Fix mipmap upload
IsaacMarovitz Jun 2, 2025
6653b2d
Initial Naomi 2 Support
IsaacMarovitz Jun 14, 2025
84c1baf
Fix some Naomi 2 typos
IsaacMarovitz Jun 14, 2025
434107c
Fix more shader typos
IsaacMarovitz Jun 16, 2025
c92bc54
Fixes, but still broken and i dont know why
IsaacMarovitz Jun 16, 2025
c4a7007
Fix normal attribute
IsaacMarovitz Jun 17, 2025
269f7ad
Cleanup + Enable fast math
IsaacMarovitz Jun 17, 2025
8b6b132
Fix cull mode and winding
IsaacMarovitz Jun 17, 2025
12a318a
Command Buffer Restructure + RTT Fixes
IsaacMarovitz Jun 18, 2025
6132a06
Rtt
IsaacMarovitz Jun 18, 2025
17eb7a5
Disable anistropic filtering on linear and punchThrough
IsaacMarovitz Jun 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 47 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ else()
project(flycast)
endif()

if(APPLE)
enable_language(OBJC OBJCXX)
endif()

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(CMAKE_SYSTEM_NAME STREQUAL "NetBSD" OR NINTENDO_SWITCH)
Expand Down Expand Up @@ -62,6 +66,7 @@ option(USE_HOST_SDL "Use host SDL library" ${USE_HOST_SDL_DEFAULT})
option(USE_HOST_LIBCHDR "Use host libchdr" OFF)
option(USE_OPENMP "Use OpenMP if available" ON)
option(USE_VULKAN "Build with Vulkan support" ON)
option(USE_METAL "Build with Metal support" ON)
option(USE_DX9 "Build with Direct3D 9 support" ON)
option(USE_DX11 "Build with Direct3D 11 support" ON)
option(LIBRETRO "Build libretro core" OFF)
Expand All @@ -71,7 +76,7 @@ option(USE_ALSA "Build with ALSA support" ON)
option(USE_LIBAO "Build with AO support" ON)
option(USE_OSS "Build with OSS support" OFF)
option(USE_PULSEAUDIO "Build with PulseAudio support" ON)
option(USE_BREAKPAD "Build and link with breakpad library" ON)
option(USE_BREAKPAD "Build and link with breakpad library" OFF)
option(USE_LUA "Build with Lua support" ON)
option(ENABLE_GDB_SERVER "Build with GDB debugging support" OFF)
option(ENABLE_DC_PROFILER "Build with support for target machine (SH4) profiler" OFF)
Expand All @@ -83,6 +88,10 @@ if(IOS AND NOT LIBRETRO)
set(USE_VULKAN OFF CACHE BOOL "Force vulkan off" FORCE)
endif()

if(NOT APPLE)
set(USE_METAL OFF CACHE BOOL "Force metal off" FORCE)
endif()

include(GNUInstallDirs)
include(CMakeRC)

Expand Down Expand Up @@ -1337,8 +1346,15 @@ endif()
target_sources(${PROJECT_NAME} PRIVATE
core/wsi/context.h
core/wsi/libretro.cpp
core/wsi/libretro.h
core/wsi/libretro.h)

if(USE_METAL)
target_sources(${PROJECT_NAME} PRIVATE
core/wsi/switcher.mm)
else()
target_sources(${PROJECT_NAME} PRIVATE
core/wsi/switcher.cpp)
endif()

if(USE_OPENGL)
target_compile_definitions(${PROJECT_NAME} PRIVATE USE_OPENGL)
Expand Down Expand Up @@ -1511,6 +1527,35 @@ if(USE_VULKAN)
endif()
endif()

if(APPLE AND USE_METAL)
target_link_libraries(${PROJECT_NAME} PRIVATE "-framework Metal -framework QuartzCore -framework CoreGraphics")

target_compile_definitions(${PROJECT_NAME} PRIVATE USE_METAL HAVE_METAL)
target_sources(${PROJECT_NAME} PRIVATE
core/rend/metal/metal_renderer.h
core/rend/metal/metal_renderer.mm
core/rend/metal/metal_context.h
core/rend/metal/metal_context.mm
core/rend/metal/metal_shaders.h
core/rend/metal/metal_shaders.mm
core/rend/metal/metal_texture.h
core/rend/metal/metal_texture.mm
core/rend/metal/metal_pipeline.h
core/rend/metal/metal_pipeline.mm
core/rend/metal/metal_buffer.h
core/rend/metal/metal_buffer.mm
core/rend/metal/metal_drawer.h
core/rend/metal/metal_drawer.mm
core/rend/metal/metal_quad.h
core/rend/metal/metal_quad.mm
core/rend/metal/metal_commandpool.h
core/rend/metal/metal_commandpool.mm
core/rend/metal/metal.h
core/rend/metal/metal_driver.h
core/deps/imgui/backends/imgui_impl_metal.h
core/deps/imgui/backends/imgui_impl_metal.mm)
endif()

if(WIN32 AND USE_DX9 AND NOT LIBRETRO AND NOT WINDOWS_STORE AND ("x86" IN_LIST ARCHITECTURE OR "x86_64" IN_LIST ARCHITECTURE))
set(REND_DX9_FILES
core/rend/dx9/d3d_overlay.h
Expand Down
2 changes: 2 additions & 0 deletions core/cfg/option.h
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,8 @@ class RendererOption : public Option<RenderType> {
RenderType::DirectX11
#elif defined(USE_DX9)
RenderType::DirectX9
#elif defined(USE_METAL)
RenderType::Metal
#elif !defined(USE_OPENGL)
RenderType::Vulkan
#else
Expand Down
75 changes: 75 additions & 0 deletions core/deps/imgui/backends/imgui_impl_metal.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// dear imgui: Renderer Backend for Metal
// This needs to be used along with a Platform Backend (e.g. OSX)

// Implemented features:
// [X] Renderer: User texture binding. Use 'MTLTexture' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Renderer: Large meshes support (64k+ vertices) even with 16-bit indices (ImGuiBackendFlags_RendererHasVtxOffset).

// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// Learn about Dear ImGui:
// - FAQ https://dearimgui.com/faq
// - Getting Started https://dearimgui.com/getting-started
// - Documentation https://dearimgui.com/docs (same as your local docs/ folder).
// - Introduction, links and more at the top of imgui.cpp

#pragma once
#include "imgui.h" // IMGUI_IMPL_API
#ifndef IMGUI_DISABLE

//-----------------------------------------------------------------------------
// ObjC API
//-----------------------------------------------------------------------------

#ifdef __OBJC__

@class MTLRenderPassDescriptor;
@protocol MTLDevice, MTLCommandBuffer, MTLRenderCommandEncoder;

// Follow "Getting Started" link and check examples/ folder to learn about using backends!
IMGUI_IMPL_API bool ImGui_ImplMetal_Init(id<MTLDevice> device);
IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown();
IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor);
IMGUI_IMPL_API void ImGui_ImplMetal_RenderDrawData(ImDrawData* drawData,
id<MTLCommandBuffer> commandBuffer,
id<MTLRenderCommandEncoder> commandEncoder);

// Called by Init/NewFrame/Shutdown
IMGUI_IMPL_API bool ImGui_ImplMetal_CreateFontsTexture(id<MTLDevice> device);
IMGUI_IMPL_API void ImGui_ImplMetal_DestroyFontsTexture();
IMGUI_IMPL_API bool ImGui_ImplMetal_CreateDeviceObjects(id<MTLDevice> device);
IMGUI_IMPL_API void ImGui_ImplMetal_DestroyDeviceObjects();

#endif

//-----------------------------------------------------------------------------
// C++ API
//-----------------------------------------------------------------------------

// Enable Metal C++ binding support with '#define IMGUI_IMPL_METAL_CPP' in your imconfig.h file
// More info about using Metal from C++: https://developer.apple.com/metal/cpp/

#ifdef IMGUI_IMPL_METAL_CPP
#include <Metal/Metal.hpp>
#ifndef __OBJC__

// Follow "Getting Started" link and check examples/ folder to learn about using backends!
IMGUI_IMPL_API bool ImGui_ImplMetal_Init(MTL::Device* device);
IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown();
IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor);
IMGUI_IMPL_API void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data,
MTL::CommandBuffer* commandBuffer,
MTL::RenderCommandEncoder* commandEncoder);

// Called by Init/NewFrame/Shutdown
IMGUI_IMPL_API bool ImGui_ImplMetal_CreateFontsTexture(MTL::Device* device);
IMGUI_IMPL_API void ImGui_ImplMetal_DestroyFontsTexture();
IMGUI_IMPL_API bool ImGui_ImplMetal_CreateDeviceObjects(MTL::Device* device);
IMGUI_IMPL_API void ImGui_ImplMetal_DestroyDeviceObjects();

#endif
#endif

//-----------------------------------------------------------------------------

#endif // #ifndef IMGUI_DISABLE
Loading