mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-03-27 09:59:44 +08:00
Initial shot at a renderer target for Apple's Metal API.
This isn't complete, but is enough to run testsprite2. It's currently Mac-only; with a little work to figure out how to properly glue in a Metal layer to a UIView, this will likely work on iOS, too. This is only wired up to the configure script right now, and disabled by default. CMake and Xcode still need their bits filled in as appropriate.
This commit is contained in:
22
configure.in
22
configure.in
@@ -2053,6 +2053,19 @@ AC_HELP_STRING([--enable-video-cocoa], [use Cocoa video driver [[default=yes]]])
|
||||
fi
|
||||
}
|
||||
|
||||
CheckMETAL()
|
||||
{
|
||||
AC_ARG_ENABLE(render-metal,
|
||||
AC_HELP_STRING([--enable-render-metal], [enable the Metal render driver [[default=no]]]),
|
||||
, enable_render_metal=no)
|
||||
if test x$enable_render = xyes -a x$enable_render_metal = xyes; then
|
||||
dnl This should maybe make sure you have a supported SDK version.
|
||||
AC_DEFINE(SDL_VIDEO_RENDER_METAL, 1, [ ])
|
||||
SOURCES="$SOURCES $srcdir/src/render/metal/*.m"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
dnl Find DirectFB
|
||||
CheckDirectFB()
|
||||
{
|
||||
@@ -2103,7 +2116,6 @@ AC_HELP_STRING([--enable-directfb-shared], [dynamically load directfb support [[
|
||||
, enable_directfb_shared=yes)
|
||||
|
||||
AC_DEFINE(SDL_VIDEO_DRIVER_DIRECTFB, 1, [ ])
|
||||
AC_DEFINE(SDL_VIDEO_RENDER_DIRECTFB, 1, [ ])
|
||||
SOURCES="$SOURCES $srcdir/src/video/directfb/*.c"
|
||||
EXTRA_CFLAGS="$EXTRA_CFLAGS $DIRECTFB_CFLAGS"
|
||||
|
||||
@@ -3636,8 +3648,9 @@ AC_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[defau
|
||||
CheckDiskAudio
|
||||
CheckDummyAudio
|
||||
CheckDLOPEN
|
||||
CheckPTHREAD
|
||||
CheckMETAL
|
||||
CheckVulkan
|
||||
CheckPTHREAD
|
||||
|
||||
# Set up files for the audio library
|
||||
if test x$enable_audio = xyes; then
|
||||
@@ -3701,6 +3714,10 @@ AC_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[defau
|
||||
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,OpenGLES"
|
||||
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,QuartzCore"
|
||||
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,UIKit"
|
||||
|
||||
if test x$enable_render = xyes -a x$enable_render_metal = xyes; then
|
||||
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,Metal"
|
||||
fi
|
||||
;;
|
||||
*-*-darwin* )
|
||||
# This could be either full "Mac OS X", or plain "Darwin" which is
|
||||
@@ -3719,6 +3736,7 @@ AC_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[defau
|
||||
CheckDummyAudio
|
||||
CheckDLOPEN
|
||||
CheckCOCOA
|
||||
CheckMETAL
|
||||
CheckX11
|
||||
CheckMacGL
|
||||
CheckOpenGLX11
|
||||
|
||||
@@ -356,6 +356,7 @@
|
||||
#cmakedefine SDL_VIDEO_RENDER_OGL_ES @SDL_VIDEO_RENDER_OGL_ES@
|
||||
#cmakedefine SDL_VIDEO_RENDER_OGL_ES2 @SDL_VIDEO_RENDER_OGL_ES2@
|
||||
#cmakedefine SDL_VIDEO_RENDER_DIRECTFB @SDL_VIDEO_RENDER_DIRECTFB@
|
||||
#cmakedefine SDL_VIDEO_RENDER_METAL @SDL_VIDEO_RENDER_METAL@
|
||||
|
||||
/* Enable OpenGL support */
|
||||
#cmakedefine SDL_VIDEO_OPENGL @SDL_VIDEO_OPENGL@
|
||||
|
||||
@@ -354,6 +354,7 @@
|
||||
#undef SDL_VIDEO_RENDER_OGL_ES
|
||||
#undef SDL_VIDEO_RENDER_OGL_ES2
|
||||
#undef SDL_VIDEO_RENDER_DIRECTFB
|
||||
#undef SDL_VIDEO_RENDER_METAL
|
||||
|
||||
/* Enable OpenGL support */
|
||||
#undef SDL_VIDEO_OPENGL
|
||||
|
||||
@@ -183,6 +183,10 @@
|
||||
#define SDL_VIDEO_RENDER_OGL_ES2 1
|
||||
#endif
|
||||
|
||||
#ifndef SDL_VIDEO_RENDER_METAL
|
||||
#define SDL_VIDEO_RENDER_METAL 1
|
||||
#endif
|
||||
|
||||
/* Enable OpenGL support */
|
||||
#ifndef SDL_VIDEO_OPENGL
|
||||
#define SDL_VIDEO_OPENGL 1
|
||||
|
||||
@@ -92,6 +92,9 @@ static const SDL_RenderDriver *render_drivers[] = {
|
||||
#if SDL_VIDEO_RENDER_DIRECTFB
|
||||
&DirectFB_RenderDriver,
|
||||
#endif
|
||||
#if SDL_VIDEO_RENDER_METAL
|
||||
&METAL_RenderDriver,
|
||||
#endif
|
||||
#if SDL_VIDEO_RENDER_PSP
|
||||
&PSP_RenderDriver,
|
||||
#endif
|
||||
|
||||
@@ -184,6 +184,7 @@ extern SDL_RenderDriver GL_RenderDriver;
|
||||
extern SDL_RenderDriver GLES2_RenderDriver;
|
||||
extern SDL_RenderDriver GLES_RenderDriver;
|
||||
extern SDL_RenderDriver DirectFB_RenderDriver;
|
||||
extern SDL_RenderDriver METAL_RenderDriver;
|
||||
extern SDL_RenderDriver PSP_RenderDriver;
|
||||
extern SDL_RenderDriver SW_RenderDriver;
|
||||
|
||||
|
||||
760
src/render/metal/SDL_render_metal.m
Normal file
760
src/render/metal/SDL_render_metal.m
Normal file
File diff suppressed because it is too large
Load Diff
796
src/render/metal/SDL_shaders_metal.c
Normal file
796
src/render/metal/SDL_shaders_metal.c
Normal file
File diff suppressed because it is too large
Load Diff
34
src/render/metal/SDL_shaders_metal.metal
Normal file
34
src/render/metal/SDL_shaders_metal.metal
Normal file
@@ -0,0 +1,34 @@
|
||||
#include <metal_texture>
|
||||
|
||||
using namespace metal;
|
||||
|
||||
vertex float4 SDL_Simple_vertex(constant float2 *position [[buffer(0)]], uint vid [[vertex_id]])
|
||||
{
|
||||
return float4(position[vid].x, position[vid].y, 0.0f, 1.0f);
|
||||
}
|
||||
|
||||
fragment float4 SDL_Simple_fragment(constant float4 &col [[buffer(0)]])
|
||||
{
|
||||
return col;
|
||||
}
|
||||
|
||||
struct CopyVertex
|
||||
{
|
||||
float4 position [[position]];
|
||||
float2 texcoord;
|
||||
};
|
||||
|
||||
vertex CopyVertex SDL_Copy_vertex(constant float2 *position [[buffer(0)]], constant float2 *texcoords [[buffer(1)]], uint vid [[vertex_id]])
|
||||
{
|
||||
CopyVertex retval;
|
||||
retval.position = float4(position[vid].x, position[vid].y, 0.0f, 1.0f);
|
||||
retval.texcoord = texcoords[vid];
|
||||
return retval;
|
||||
}
|
||||
|
||||
fragment float4 SDL_Copy_fragment(CopyVertex vert [[stage_in]], constant float4 &col [[buffer(0)]], texture2d<float> tex [[texture(0)]])
|
||||
{
|
||||
constexpr sampler samp; // !!! FIXME: linear sampling, etc?
|
||||
return tex.sample(samp, vert.texcoord) * col;
|
||||
}
|
||||
|
||||
13
src/render/metal/build-metal-shaders.sh
Normal file
13
src/render/metal/build-metal-shaders.sh
Normal file
@@ -0,0 +1,13 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -x
|
||||
set -e
|
||||
|
||||
cd `dirname "$0"`
|
||||
rm -f sdl.air sdl.metalar sdl.metallib
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/usr/bin/metal -std=osx-metal1.1 -Wall -O3 -o ./sdl.air ./SDL_shaders_metal.metal
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/usr/bin/metal-ar rc sdl.metalar sdl.air
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/usr/bin/metallib -o sdl.metallib sdl.metalar
|
||||
xxd -i sdl.metallib |perl -w -p -e 's/\Aunsigned /const unsigned /;' >./SDL_shaders_metal.c
|
||||
rm -f sdl.air sdl.metalar sdl.metallib
|
||||
|
||||
Reference in New Issue
Block a user