commit - 3197719090b3fd0a038767f7e8e15e771b1515be
commit + cc9ecfbee7b1c346bd6b35bf1b9501bdf7eb9c21
blob - 94ae95e5afcde1a53cbb146a4ac2cecf0768449f
blob + 091fd351f6860c02c3e03b21549aad949af93d52
--- .travis.yml
+++ .travis.yml
matrix:
include:
- os: osx
+ osx_image: xcode10.2
+ - os: osx
+ osx_image: xcode9.4
+ - os: osx
osx_image: xcode9
- os: osx
osx_image: xcode8.3
blob - 5fc031728bc64134f6b3a00039a03ebc4035dd85
blob + 09b346352623d7979e265ffd0dc8d207f4cf366f
--- src/cmd/devdraw/cocoa-screen-metal.m
+++ src/cmd/devdraw/cocoa-screen-metal.m
static NSCursor *currentCursor = NULL;
static DrawLayer *layer;
-static MTLRenderPassDescriptor *renderPass;
static id<MTLDevice> device;
-static id<MTLRenderPipelineState> pipelineState;
static id<MTLCommandQueue> commandQueue;
static id<MTLTexture> texture;
static QLock snarfl;
-static NSString *const metal =
-@"#include<metal_stdlib>\n"
-"using namespace metal;\n"
-"typedef struct {\n"
-" float4 rCoord [[position]];\n"
-" float2 tCoord;\n"
-"} VertexOut;\n"
-"vertex VertexOut\n"
-"renderVertex(unsigned int vid [[ vertex_id ]])\n"
-"{\n"
-" const VertexOut fixedV[] = {\n"
-" {{ -1.0f, -1.0f, 0.0f, 1.0f }, { 0.0f, 1.0f }},\n"
-" {{ 1.0f, -1.0f, 0.0f, 1.0f }, { 1.0f, 1.0f }},\n"
-" {{ -1.0f, 1.0f, 0.0f, 1.0f }, { 0.0f, 0.0f }},\n"
-" {{ 1.0f, 1.0f, 0.0f, 1.0f }, { 1.0f, 0.0f }},\n"
-" };\n"
-" return fixedV[vid];\n"
-"}\n"
-"fragment half4\n"
-"renderFragment(VertexOut in [[ stage_in ]],\n"
-" texture2d<half> texture [[ texture(0) ]]) {\n"
-" constexpr sampler s;\n"
-" return texture.sample(s, in.tCoord);\n"
-"}";
-
-
void
threadmain(int argc, char **argv)
{
Rectangle wr;
int set;
char *s;
- id<MTLLibrary> library;
- MTLRenderPipelineDescriptor *pipelineDesc;
- NSError *error;
NSArray *allDevices;
const NSWindowStyleMask Winstyle = NSWindowStyleMaskTitled
[win center];
[win setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
[win setContentMinSize:NSMakeSize(64,64)];
-
+ [win setOpaque:YES];
[win setRestorable:NO];
[win setAcceptsMouseMovedEvents:YES];
[win setDelegate:myApp];
}
if(!device)
device = MTLCreateSystemDefaultDevice();
-
+
commandQueue = [device newCommandQueue];
layer = (DrawLayer *)[myContent layer];
layer.framebufferOnly = YES;
layer.opaque = YES;
- renderPass = [MTLRenderPassDescriptor renderPassDescriptor];
- renderPass.colorAttachments[0].loadAction = MTLLoadActionDontCare;
- renderPass.colorAttachments[0].storeAction = MTLStoreActionDontCare;
-
- library = [device newLibraryWithSource:metal options:nil error:&error];
- if(!library)
- sysfatal((char *)[[error localizedDescription] UTF8String]);
-
- pipelineDesc = [MTLRenderPipelineDescriptor new];
- pipelineDesc.alphaToOneEnabled = YES;
- pipelineDesc.inputPrimitiveTopology = MTLPrimitiveTopologyClassTriangle;
- pipelineDesc.rasterSampleCount = 1;
- pipelineDesc.colorAttachments[0].pixelFormat = MTLPixelFormatBGRA8Unorm;
- [pipelineDesc setVertexFunction: [library newFunctionWithName: @"renderVertex"]];
- [pipelineDesc setFragmentFunction: [library newFunctionWithName: @"renderFragment"]];
-
- pipelineState = [device newRenderPipelineStateWithDescriptor:pipelineDesc error:&error];
- if(!pipelineState)
- sysfatal((char *)[[error localizedDescription] UTF8String]);
+ // We use a default transparent layer on top of the CAMetalLayer.
+ // This seems to make fullscreen applications behave.
+ {
+ CALayer *stub = [CALayer layer];
+ stub.frame = CGRectMake(0, 0, 1, 1);
+ [stub setNeedsDisplay];
+ [layer addSublayer:stub];
+ }
[NSEvent setMouseCoalescingEnabled:NO];
NSImage *i;
NSPoint p;
uchar *plane[5], *plane2[5];
- int b;
+ uint b;
cs = [v pointerValue];
c = cs->c;
- (void)viewDidEndLiveResize
{
[super viewDidEndLiveResize];
- resizeimg();
+ if(img)
+ resizeimg();
}
- (void)viewDidChangeBackingProperties
{
[super viewDidChangeBackingProperties];
- resizeimg();
+ if(img)
+ resizeimg();
}
// conforms to protocol NSTextInputClient
- (void)display
{
id<MTLCommandBuffer> cbuf;
- id<MTLRenderCommandEncoder> cmd;
+ id<MTLBlitCommandEncoder> blit;
LOG(@"display");
LOG(@"display got drawable");
- renderPass.colorAttachments[0].texture = drawable.texture;
-
- cmd = [cbuf renderCommandEncoderWithDescriptor:renderPass];
- [cmd setRenderPipelineState:pipelineState];
- [cmd setFragmentTexture:texture atIndex:0];
- [cmd drawPrimitives:MTLPrimitiveTypeTriangleStrip vertexStart:0 vertexCount:4];
- [cmd endEncoding];
+ blit = [cbuf blitCommandEncoder];
+ [blit copyFromTexture:texture
+ sourceSlice:0
+ sourceLevel:0
+ sourceOrigin:MTLOriginMake(0, 0, 0)
+ sourceSize:MTLSizeMake(texture.width, texture.height, texture.depth)
+ toTexture:drawable.texture
+ destinationSlice:0
+ destinationLevel:0
+ destinationOrigin:MTLOriginMake(0, 0, 0)];
+ [blit endEncoding];
[cbuf presentDrawable:drawable];
drawable = nil;