2018-11-12 16:00:10 +01:00
|
|
|
// Copyright 2018 The Ebiten Authors
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
2021-08-22 19:01:16 +02:00
|
|
|
#include "ca_darwin.h"
|
2018-11-12 16:00:10 +01:00
|
|
|
#import <QuartzCore/QuartzCore.h>
|
|
|
|
|
|
|
|
void *MakeMetalLayer() {
|
|
|
|
CAMetalLayer *layer = [[CAMetalLayer alloc] init];
|
|
|
|
// TODO: Expose a function to set color space.
|
2019-06-08 22:44:14 +02:00
|
|
|
// TODO: Enable colorspace on iOS: this will be available as of iOS 13.0.
|
|
|
|
#if !TARGET_OS_IPHONE
|
2018-11-12 16:00:10 +01:00
|
|
|
CGColorSpaceRef colorspace =
|
2019-11-25 15:13:44 +01:00
|
|
|
CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3);
|
2018-11-12 16:00:10 +01:00
|
|
|
layer.colorspace = colorspace;
|
|
|
|
CGColorSpaceRelease(colorspace);
|
2019-06-08 22:44:14 +02:00
|
|
|
#endif
|
2018-11-12 16:00:10 +01:00
|
|
|
return layer;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint16_t MetalLayer_PixelFormat(void *metalLayer) {
|
|
|
|
return ((CAMetalLayer *)metalLayer).pixelFormat;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MetalLayer_SetDevice(void *metalLayer, void *device) {
|
|
|
|
((CAMetalLayer *)metalLayer).device = (id<MTLDevice>)device;
|
|
|
|
}
|
|
|
|
|
2019-12-02 16:53:01 +01:00
|
|
|
void MetalLayer_SetOpaque(void *metalLayer, unsigned char opaque) {
|
|
|
|
((CAMetalLayer *)metalLayer).opaque = (BOOL)opaque;
|
2019-11-30 16:07:41 +01:00
|
|
|
}
|
|
|
|
|
2018-11-12 16:00:10 +01:00
|
|
|
const char *MetalLayer_SetPixelFormat(void *metalLayer, uint16_t pixelFormat) {
|
|
|
|
@try {
|
|
|
|
((CAMetalLayer *)metalLayer).pixelFormat = (MTLPixelFormat)pixelFormat;
|
|
|
|
} @catch (NSException *exception) {
|
|
|
|
return exception.reason.UTF8String;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *MetalLayer_SetMaximumDrawableCount(void *metalLayer,
|
|
|
|
uint_t maximumDrawableCount) {
|
2019-01-11 16:33:43 +01:00
|
|
|
// @available syntax is not available for old Xcode (#781)
|
|
|
|
//
|
|
|
|
// If possible, we'd want to write the guard like:
|
|
|
|
//
|
|
|
|
// if (@available(macOS 10.13.2, *)) { ...
|
|
|
|
|
|
|
|
@try {
|
|
|
|
if ([(CAMetalLayer *)metalLayer
|
|
|
|
respondsToSelector:@selector(setMaximumDrawableCount:)]) {
|
|
|
|
[((CAMetalLayer *)metalLayer)
|
|
|
|
setMaximumDrawableCount:(NSUInteger)maximumDrawableCount];
|
2018-11-12 16:00:10 +01:00
|
|
|
}
|
2019-01-11 16:33:43 +01:00
|
|
|
} @catch (NSException *exception) {
|
|
|
|
return exception.reason.UTF8String;
|
2018-11-12 16:00:10 +01:00
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MetalLayer_SetDisplaySyncEnabled(void *metalLayer,
|
2019-06-08 22:44:14 +02:00
|
|
|
uint8_t displaySyncEnabled) {
|
2019-01-11 16:33:43 +01:00
|
|
|
// @available syntax is not available for old Xcode (#781)
|
|
|
|
//
|
|
|
|
// If possible, we'd want to write the guard like:
|
|
|
|
//
|
|
|
|
// if (@available(macOS 10.13, *)) { ...
|
|
|
|
|
2019-06-08 22:44:14 +02:00
|
|
|
#if !TARGET_OS_IPHONE
|
2019-01-11 16:33:43 +01:00
|
|
|
if ([(CAMetalLayer *)metalLayer
|
|
|
|
respondsToSelector:@selector(setDisplaySyncEnabled:)]) {
|
|
|
|
[((CAMetalLayer *)metalLayer) setDisplaySyncEnabled:displaySyncEnabled];
|
2019-01-01 16:08:46 +01:00
|
|
|
}
|
2019-06-08 22:44:14 +02:00
|
|
|
#endif
|
2018-11-12 16:00:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void MetalLayer_SetDrawableSize(void *metalLayer, double width, double height) {
|
|
|
|
((CAMetalLayer *)metalLayer).drawableSize = (CGSize){width, height};
|
|
|
|
}
|
|
|
|
|
2021-08-08 08:13:44 +02:00
|
|
|
void MetalLayer_SetPresentsWithTransaction(void *metalLayer,
|
|
|
|
uint8_t presentsWithTransaction) {
|
|
|
|
[((CAMetalLayer *)metalLayer)
|
|
|
|
setPresentsWithTransaction:presentsWithTransaction];
|
|
|
|
}
|
|
|
|
|
2018-11-12 16:00:10 +01:00
|
|
|
void *MetalLayer_NextDrawable(void *metalLayer) {
|
|
|
|
return [(CAMetalLayer *)metalLayer nextDrawable];
|
|
|
|
}
|
|
|
|
|
|
|
|
void *MetalDrawable_Texture(void *metalDrawable) {
|
|
|
|
return ((id<CAMetalDrawable>)metalDrawable).texture;
|
|
|
|
}
|
2021-07-06 17:38:50 +02:00
|
|
|
|
2021-07-07 21:21:20 +02:00
|
|
|
void MetalDrawable_Present(void *metalDrawable) {
|
|
|
|
[((id<CAMetalDrawable>)metalDrawable) present];
|
|
|
|
}
|
|
|
|
|
2021-07-06 17:38:50 +02:00
|
|
|
void MetalLayer_SetFramebufferOnly(void *metalLayer, uint8_t framebufferOnly) {
|
|
|
|
[((CAMetalLayer *)metalLayer) setFramebufferOnly:framebufferOnly];
|
|
|
|
}
|
2021-07-07 21:21:20 +02:00
|
|
|
|
|
|
|
uint8_t MetalLayer_PresentsWithTransaction(void *metalLayer) {
|
|
|
|
return [((CAMetalLayer *)metalLayer) presentsWithTransaction];
|
|
|
|
}
|