Fix NesKit bindings

This commit is contained in:
Selim Mustafaev 2025-09-27 15:46:00 +03:00
parent 3d8b37aff4
commit ab0e00e390
5 changed files with 31 additions and 68 deletions

2
.gitignore vendored
View File

@ -4,3 +4,5 @@ cmake-build-debug/
out/ out/
build/ build/
CMakeLists.txt.user CMakeLists.txt.user
**/.DS_Store
.swiftpm/

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@ -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>

View File

@ -25,34 +25,6 @@
_system = std::make_unique<nes::System>(); _system = std::make_unique<nes::System>();
_condition = [NSCondition new]; _condition = [NSCondition new];
_runEmulation = YES; _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; return self;
} }
@ -67,7 +39,11 @@
} }
while(_runEmulation) { while(_runEmulation) {
_system->tick(); auto frameBuffer = _system->tick();
if(frameBuffer) {
_runEmulation = NO;
[self generateFrame:frameBuffer];
}
} }
[_condition unlock]; [_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 { - (void)stepToNextFrame {
[_condition lock]; [_condition lock];
_runEmulation = YES; _runEmulation = YES;