Fix NesKit bindings
This commit is contained in:
parent
3d8b37aff4
commit
ab0e00e390
2
.gitignore
vendored
2
.gitignore
vendored
@ -4,3 +4,5 @@ cmake-build-debug/
|
||||
out/
|
||||
build/
|
||||
CMakeLists.txt.user
|
||||
**/.DS_Store
|
||||
.swiftpm/
|
||||
|
||||
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
Binary file not shown.
@ -1,32 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>SchemeUserState</key>
|
||||
<dict>
|
||||
<key>NesKit.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>nes-Package.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>SuppressBuildableAutocreation</key>
|
||||
<dict>
|
||||
<key>NesKit</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>nes</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -25,34 +25,6 @@
|
||||
_system = std::make_unique<nes::System>();
|
||||
_condition = [NSCondition new];
|
||||
_runEmulation = YES;
|
||||
|
||||
size_t frameBufferSize = nes::Ppu::SCREEN_WIDTH * nes::Ppu::SCREEN_HEIGHT * sizeof(nes::Pixel);
|
||||
|
||||
_system->setNewFrameCallback([frameBufferSize, self](auto frameBuffer) {
|
||||
_runEmulation = NO;
|
||||
|
||||
CGImageRelease(_frame);
|
||||
|
||||
CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, (void*)frameBuffer, frameBufferSize, NULL);
|
||||
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
|
||||
CGImageRef image = CGImageCreate(nes::Ppu::SCREEN_WIDTH,
|
||||
nes::Ppu::SCREEN_HEIGHT,
|
||||
8,
|
||||
sizeof(nes::Pixel)*8,
|
||||
nes::Ppu::SCREEN_WIDTH * sizeof(nes::Pixel),
|
||||
colorspace,
|
||||
kCGImageAlphaPremultipliedLast,
|
||||
dataProvider,
|
||||
NULL,
|
||||
false,
|
||||
kCGRenderingIntentDefault);
|
||||
CGDataProviderRelease(dataProvider);
|
||||
CGColorSpaceRelease(colorspace);
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
_frame = image;
|
||||
});
|
||||
});
|
||||
}
|
||||
return self;
|
||||
}
|
||||
@ -67,7 +39,11 @@
|
||||
}
|
||||
|
||||
while(_runEmulation) {
|
||||
_system->tick();
|
||||
auto frameBuffer = _system->tick();
|
||||
if(frameBuffer) {
|
||||
_runEmulation = NO;
|
||||
[self generateFrame:frameBuffer];
|
||||
}
|
||||
}
|
||||
|
||||
[_condition unlock];
|
||||
@ -75,6 +51,30 @@
|
||||
});
|
||||
}
|
||||
|
||||
- (void)generateFrame:(const nes::Pixel*)buffer {
|
||||
size_t frameBufferSize = nes::Ppu::SCREEN_WIDTH * nes::Ppu::SCREEN_HEIGHT * sizeof(nes::Pixel);
|
||||
CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, (void*)buffer, frameBufferSize, NULL);
|
||||
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
|
||||
CGImageRef image = CGImageCreate(nes::Ppu::SCREEN_WIDTH,
|
||||
nes::Ppu::SCREEN_HEIGHT,
|
||||
8,
|
||||
sizeof(nes::Pixel)*8,
|
||||
nes::Ppu::SCREEN_WIDTH * sizeof(nes::Pixel),
|
||||
colorspace,
|
||||
kCGImageAlphaPremultipliedLast,
|
||||
dataProvider,
|
||||
NULL,
|
||||
false,
|
||||
kCGRenderingIntentDefault);
|
||||
CGDataProviderRelease(dataProvider);
|
||||
CGColorSpaceRelease(colorspace);
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
CGImageRelease(_frame);
|
||||
_frame = image;
|
||||
});
|
||||
}
|
||||
|
||||
- (void)stepToNextFrame {
|
||||
[_condition lock];
|
||||
_runEmulation = YES;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user