mirror of https://github.com/bsnes-emu/bsnes.git
Remove OpenGL specific code from GBView
This commit is contained in:
parent
d95ad1ca54
commit
9a3d53ae51
|
@ -54,10 +54,10 @@
|
|||
<rect key="frame" x="0.0" y="0.0" width="160" height="144"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<openGLView colorSize="5bit_RGB_8bit_Alpha" useAuxiliaryDepthBufferStencil="NO" allowOffline="YES" wantsBestResolutionOpenGLSurface="YES" id="uqf-pe-VAF" customClass="GBView">
|
||||
<view id="uqf-pe-VAF" customClass="GBView">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="144"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
</openGLView>
|
||||
</view>
|
||||
</subviews>
|
||||
</customView>
|
||||
</subviews>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface GBShader : NSObject
|
||||
@interface GBGLShader : NSObject
|
||||
- (instancetype)initWithName:(NSString *) shaderName;
|
||||
- (void) renderBitmap: (void *)bitmap previous:(void*) previous inSize:(NSSize)size scale: (double) scale;
|
||||
@end
|
|
@ -1,4 +1,4 @@
|
|||
#import "GBShader.h"
|
||||
#import "GBGLShader.h"
|
||||
#import <OpenGL/gl3.h>
|
||||
|
||||
/*
|
||||
|
@ -16,7 +16,7 @@ void main(void) {\n\
|
|||
}\n\
|
||||
";
|
||||
|
||||
@implementation GBShader
|
||||
@implementation GBGLShader
|
||||
{
|
||||
GLuint resolution_uniform;
|
||||
GLuint texture_uniform;
|
|
@ -0,0 +1,6 @@
|
|||
#import <Cocoa/Cocoa.h>
|
||||
#import "GBGLShader.h"
|
||||
|
||||
@interface GBOpenGLView : NSOpenGLView
|
||||
@property GBGLShader *shader;
|
||||
@end
|
|
@ -0,0 +1,42 @@
|
|||
#import "GBOpenGLView.h"
|
||||
#import "GBView.h"
|
||||
#include <OpenGL/gl.h>
|
||||
|
||||
@implementation GBOpenGLView
|
||||
|
||||
- (void)drawRect:(NSRect)dirtyRect {
|
||||
if (!self.shader) {
|
||||
self.shader = [[GBGLShader alloc] initWithName:[[NSUserDefaults standardUserDefaults] objectForKey:@"GBFilter"]];
|
||||
}
|
||||
|
||||
GBView *gbview = (GBView *)self.superview;
|
||||
double scale = self.window.backingScaleFactor;
|
||||
glViewport(0, 0, self.bounds.size.width * scale, self.bounds.size.height * scale);
|
||||
|
||||
if (gbview.shouldBlendFrameWithPrevious) {
|
||||
[self.shader renderBitmap:gbview.currentBuffer
|
||||
previous:gbview.previousBuffer
|
||||
inSize:self.bounds.size
|
||||
scale:scale];
|
||||
}
|
||||
else {
|
||||
[self.shader renderBitmap:gbview.currentBuffer
|
||||
previous:NULL
|
||||
inSize:self.bounds.size
|
||||
scale:scale];
|
||||
}
|
||||
glFlush();
|
||||
}
|
||||
|
||||
- (instancetype)initWithFrame:(NSRect)frameRect pixelFormat:(NSOpenGLPixelFormat *)format
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(filterChanged) name:@"GBFilterChanged" object:nil];
|
||||
return [super initWithFrame:frameRect pixelFormat:format];
|
||||
}
|
||||
|
||||
- (void) filterChanged
|
||||
{
|
||||
self.shader = nil;
|
||||
[self setNeedsDisplay:YES];
|
||||
}
|
||||
@end
|
|
@ -1,14 +1,16 @@
|
|||
#import <Cocoa/Cocoa.h>
|
||||
#include <Core/gb.h>
|
||||
#import "GBJoystickListener.h"
|
||||
#import "GBShader.h"
|
||||
|
||||
@interface GBView<GBJoystickListener> : NSOpenGLView
|
||||
@interface GBView<GBJoystickListener> : NSView
|
||||
- (void) flip;
|
||||
- (uint32_t *) pixels;
|
||||
@property GB_gameboy_t *gb;
|
||||
@property (nonatomic) BOOL shouldBlendFrameWithPrevious;
|
||||
@property GBShader *shader;
|
||||
@property (getter=isMouseHidingEnabled) BOOL mouseHidingEnabled;
|
||||
@property bool isRewinding;
|
||||
@property NSView *internalView;
|
||||
- (void) createInternalView;
|
||||
- (uint32_t *)currentBuffer;
|
||||
- (uint32_t *)previousBuffer;
|
||||
@end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#import <OpenGL/gl.h>
|
||||
#import <Carbon/Carbon.h>
|
||||
#import "GBView.h"
|
||||
#import "GBViewGL.h"
|
||||
#import "GBButtons.h"
|
||||
#import "NSString+StringForKey.h"
|
||||
|
||||
|
@ -17,29 +17,26 @@
|
|||
NSEventModifierFlags previousModifiers;
|
||||
}
|
||||
|
||||
- (void) awakeFromNib
|
||||
+ (instancetype)alloc
|
||||
{
|
||||
NSOpenGLPixelFormatAttribute attrs[] =
|
||||
{
|
||||
NSOpenGLPFAOpenGLProfile,
|
||||
NSOpenGLProfileVersion3_2Core,
|
||||
0
|
||||
};
|
||||
|
||||
NSOpenGLPixelFormat *pf = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs] ;
|
||||
|
||||
if (!pf)
|
||||
{
|
||||
NSLog(@"No OpenGL pixel format");
|
||||
if (self == [GBView class]) {
|
||||
return [GBViewGL alloc];
|
||||
}
|
||||
|
||||
NSOpenGLContext* context = [[NSOpenGLContext alloc] initWithFormat:pf shareContext:nil] ;
|
||||
|
||||
[self setPixelFormat:pf];
|
||||
|
||||
[self setOpenGLContext:context];
|
||||
return [super alloc];
|
||||
}
|
||||
|
||||
+ (instancetype)allocWithZone:(struct _NSZone *)zone
|
||||
{
|
||||
if (self == [GBView class]) {
|
||||
return [GBViewGL allocWithZone: zone];
|
||||
}
|
||||
return [super allocWithZone:zone];
|
||||
}
|
||||
|
||||
- (void) createInternalView
|
||||
{
|
||||
assert(false && "createInternalView must not be inherited");
|
||||
}
|
||||
|
||||
- (void) _init
|
||||
{
|
||||
|
@ -47,7 +44,6 @@
|
|||
image_buffers[1] = malloc(160 * 144 * 4);
|
||||
image_buffers[2] = malloc(160 * 144 * 4);
|
||||
_shouldBlendFrameWithPrevious = 1;
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(filterChanged) name:@"GBFilterChanged" object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ratioKeepingChanged) name:@"GBAspectChanged" object:nil];
|
||||
tracking_area = [ [NSTrackingArea alloc] initWithRect:(NSRect){}
|
||||
options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways | NSTrackingInVisibleRect
|
||||
|
@ -55,12 +51,9 @@
|
|||
userInfo:nil];
|
||||
[self addTrackingArea:tracking_area];
|
||||
clockMultiplier = 1.0;
|
||||
}
|
||||
|
||||
- (void) filterChanged
|
||||
{
|
||||
[self setNeedsDisplay:YES];
|
||||
self.shader = nil;
|
||||
[self createInternalView];
|
||||
[self addSubview:self.internalView];
|
||||
self.internalView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
|
||||
}
|
||||
|
||||
- (void) ratioKeepingChanged
|
||||
|
@ -132,29 +125,6 @@
|
|||
[super setFrame:frame];
|
||||
}
|
||||
|
||||
- (void)drawRect:(NSRect)dirtyRect {
|
||||
if (!self.shader) {
|
||||
self.shader = [[GBShader alloc] initWithName:[[NSUserDefaults standardUserDefaults] objectForKey:@"GBFilter"]];
|
||||
}
|
||||
|
||||
double scale = self.window.backingScaleFactor;
|
||||
glViewport(0, 0, self.bounds.size.width * scale, self.bounds.size.height * scale);
|
||||
|
||||
if (_shouldBlendFrameWithPrevious) {
|
||||
[self.shader renderBitmap:image_buffers[current_buffer]
|
||||
previous:image_buffers[(current_buffer + 2) % self.numberOfBuffers]
|
||||
inSize:self.bounds.size
|
||||
scale:scale];
|
||||
}
|
||||
else {
|
||||
[self.shader renderBitmap:image_buffers[current_buffer]
|
||||
previous:NULL
|
||||
inSize:self.bounds.size
|
||||
scale:scale];
|
||||
}
|
||||
glFlush();
|
||||
}
|
||||
|
||||
- (void) flip
|
||||
{
|
||||
if (underclockKeyDown && clockMultiplier > 0.5) {
|
||||
|
@ -362,4 +332,14 @@
|
|||
previousModifiers = event.modifierFlags;
|
||||
}
|
||||
|
||||
- (uint32_t *)currentBuffer
|
||||
{
|
||||
return image_buffers[current_buffer];
|
||||
}
|
||||
|
||||
- (uint32_t *)previousBuffer
|
||||
{
|
||||
return image_buffers[(current_buffer + 2) % self.numberOfBuffers];
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
#import "GBView.h"
|
||||
|
||||
@interface GBViewGL : GBView
|
||||
|
||||
@end
|
|
@ -0,0 +1,26 @@
|
|||
#import "GBViewGL.h"
|
||||
#import "GBOpenGLView.h"
|
||||
|
||||
@implementation GBViewGL
|
||||
|
||||
- (void)createInternalView
|
||||
{
|
||||
NSOpenGLPixelFormatAttribute attrs[] =
|
||||
{
|
||||
NSOpenGLPFAOpenGLProfile,
|
||||
NSOpenGLProfileVersion3_2Core,
|
||||
0
|
||||
};
|
||||
|
||||
NSOpenGLPixelFormat *pf = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
|
||||
|
||||
assert(pf);
|
||||
|
||||
NSOpenGLContext *context = [[NSOpenGLContext alloc] initWithFormat:pf shareContext:nil];
|
||||
|
||||
self.internalView = [[GBOpenGLView alloc] initWithFrame:self.frame pixelFormat:pf];
|
||||
((GBOpenGLView *)self.internalView).wantsBestResolutionOpenGLSurface = YES;
|
||||
((GBOpenGLView *)self.internalView).openGLContext = context;
|
||||
}
|
||||
|
||||
@end
|
Loading…
Reference in New Issue