- split base and OpenGL Cocoa framebuffers properly

This commit is contained in:
alexey.lysiuk 2019-03-08 14:39:00 +02:00
parent ca1d8191aa
commit c30b1a1f4a
2 changed files with 122 additions and 104 deletions

View file

@ -51,15 +51,14 @@ public:
SystemBaseFrameBuffer(void *hMonitor, bool fullscreen);
~SystemBaseFrameBuffer();
virtual bool IsFullscreen();
virtual void SetVSync(bool vsync);
bool IsFullscreen() override;
int GetClientWidth() override;
int GetClientHeight() override;
void ToggleFullscreen(bool yes) override;
void SetWindowSize(int width, int height) override;
void SetMode(bool fullscreen, bool hiDPI);
virtual void SetMode(bool fullscreen, bool hiDPI);
static void UseHiDPI(bool hiDPI);
static void SetCursor(NSCursor* cursor);
@ -69,12 +68,6 @@ public:
protected:
SystemBaseFrameBuffer() {}
void SwapBuffers();
void SetGammaTable(uint16_t* table);
void ResetGammaTable();
private:
void SetFullscreenMode();
void SetWindowedMode();
@ -83,12 +76,6 @@ private:
CocoaWindow* m_window;
static const uint32_t GAMMA_CHANNEL_SIZE = 256;
static const uint32_t GAMMA_CHANNEL_COUNT = 3;
static const uint32_t GAMMA_TABLE_SIZE = GAMMA_CHANNEL_SIZE * GAMMA_CHANNEL_COUNT;
uint16_t m_originalGamma[GAMMA_TABLE_SIZE];
int GetTitleBarHeight() const;
static const int MINIMUM_WIDTH = 320;
@ -100,11 +87,15 @@ class SystemGLFrameBuffer : public SystemBaseFrameBuffer
typedef SystemBaseFrameBuffer Super;
public:
SystemGLFrameBuffer(void *hMonitor, bool fullscreen)
: SystemBaseFrameBuffer(hMonitor, fullscreen)
{}
SystemGLFrameBuffer(void *hMonitor, bool fullscreen);
void SetVSync(bool vsync) override;
void SetMode(bool fullscreen, bool hiDPI) override;
protected:
void SwapBuffers();
SystemGLFrameBuffer() {}
};

View file

@ -165,19 +165,17 @@ namespace
// ---------------------------------------------------------------------------
@interface CocoaView : NSOpenGLView
@interface OpenGLCocoaView : NSOpenGLView
{
NSCursor* m_cursor;
}
- (void)resetCursorRects;
- (void)setCursor:(NSCursor*)cursor;
@end
@implementation CocoaView
@implementation OpenGLCocoaView
- (void)resetCursorRects
{
@ -220,11 +218,6 @@ public:
// ---------------------------------------------------------------------------
EXTERN_CVAR(Float, Gamma)
// ---------------------------------------------------------------------------
extern id appCtrl;
@ -297,28 +290,9 @@ SystemBaseFrameBuffer::SystemBaseFrameBuffer(void*, const bool fullscreen)
{
SetFlash(0, 0);
NSOpenGLPixelFormat* pixelFormat = CreatePixelFormat();
if (nil == pixelFormat)
{
I_FatalError("Cannot create OpenGL pixel format, graphics hardware is not supported");
}
// Create OpenGL context and view
const NSRect contentRect = [m_window contentRectForFrameRect:[m_window frame]];
NSOpenGLView* glView = [[CocoaView alloc] initWithFrame:contentRect
pixelFormat:pixelFormat];
[[glView openGLContext] makeCurrentContext];
[m_window setContentView:glView];
assert(frameBuffer == nullptr);
frameBuffer = this;
// To be able to use OpenGL functions in SetMode()
ogl_LoadFunctions();
FConsoleWindow::GetInstance().Show(false);
}
@ -334,6 +308,8 @@ SystemBaseFrameBuffer::~SystemBaseFrameBuffer()
[nc removeObserver:m_window
name:NSWindowDidEndLiveResizeNotification
object:nil];
[m_window dealloc];
}
bool SystemBaseFrameBuffer::IsFullscreen()
@ -378,20 +354,6 @@ int SystemBaseFrameBuffer::GetTitleBarHeight() const
}
void SystemBaseFrameBuffer::SetVSync(bool vsync)
{
const GLint value = vsync ? 1 : 0;
[[NSOpenGLContext currentContext] setValues:&value
forParameter:NSOpenGLCPSwapInterval];
}
void SystemBaseFrameBuffer::SwapBuffers()
{
[[NSOpenGLContext currentContext] flushBuffer];
}
int SystemBaseFrameBuffer::GetClientWidth()
{
const int clientWidth = I_GetContentViewSize(m_window).width;
@ -453,6 +415,113 @@ void SystemBaseFrameBuffer::SetWindowedMode()
}
void SystemBaseFrameBuffer::SetMode(const bool fullscreen, const bool hiDPI)
{
if (fullscreen)
{
SetFullscreenMode();
}
else
{
SetWindowedMode();
}
[m_window updateTitle];
if (![m_window isKeyWindow])
{
[m_window makeKeyAndOrderFront:nil];
}
m_fullscreen = fullscreen;
m_hiDPI = hiDPI;
}
void SystemBaseFrameBuffer::UseHiDPI(const bool hiDPI)
{
if (frameBuffer != nullptr)
{
frameBuffer->SetMode(frameBuffer->m_fullscreen, hiDPI);
}
}
void SystemBaseFrameBuffer::SetCursor(NSCursor* cursor)
{
if (frameBuffer != nullptr)
{
NSWindow* const window = frameBuffer->m_window;
id view = [window contentView];
[view setCursor:cursor];
[window invalidateCursorRectsForView:view];
}
}
void SystemBaseFrameBuffer::SetWindowVisible(bool visible)
{
if (frameBuffer != nullptr)
{
if (visible)
{
[frameBuffer->m_window orderFront:nil];
}
else
{
[frameBuffer->m_window orderOut:nil];
}
I_SetNativeMouse(!visible);
}
}
void SystemBaseFrameBuffer::SetWindowTitle(const char* title)
{
if (frameBuffer != nullptr)
{
NSString* const nsTitle = nullptr == title ? nil :
[NSString stringWithCString:title encoding:NSISOLatin1StringEncoding];
[frameBuffer->m_window setTitle:nsTitle];
}
}
// ---------------------------------------------------------------------------
SystemGLFrameBuffer::SystemGLFrameBuffer(void *hMonitor, bool fullscreen)
: SystemBaseFrameBuffer(hMonitor, fullscreen)
{
NSOpenGLPixelFormat* pixelFormat = CreatePixelFormat();
if (nil == pixelFormat)
{
I_FatalError("Cannot create OpenGL pixel format, graphics hardware is not supported");
}
// Create OpenGL context and view
const NSRect contentRect = [m_window contentRectForFrameRect:[m_window frame]];
OpenGLCocoaView* glView = [[OpenGLCocoaView alloc] initWithFrame:contentRect
pixelFormat:pixelFormat];
[[glView openGLContext] makeCurrentContext];
[m_window setContentView:glView];
// To be able to use OpenGL functions in SetMode()
ogl_LoadFunctions();
}
void SystemGLFrameBuffer::SetVSync(bool vsync)
{
const GLint value = vsync ? 1 : 0;
[[NSOpenGLContext currentContext] setValues:&value
forParameter:NSOpenGLCPSwapInterval];
}
void SystemGLFrameBuffer::SetMode(const bool fullscreen, const bool hiDPI)
{
NSOpenGLView* const glView = [m_window contentView];
[glView setWantsBestResolutionOpenGLSurface:hiDPI];
@ -486,51 +555,9 @@ void SystemBaseFrameBuffer::SetMode(const bool fullscreen, const bool hiDPI)
}
void SystemBaseFrameBuffer::UseHiDPI(const bool hiDPI)
void SystemGLFrameBuffer::SwapBuffers()
{
if (frameBuffer != nullptr)
{
frameBuffer->SetMode(frameBuffer->m_fullscreen, hiDPI);
}
}
void SystemBaseFrameBuffer::SetCursor(NSCursor* cursor)
{
if (frameBuffer != nullptr)
{
NSWindow* const window = frameBuffer->m_window;
CocoaView* const view = [window contentView];
[view setCursor:cursor];
[window invalidateCursorRectsForView:view];
}
}
void SystemBaseFrameBuffer::SetWindowVisible(bool visible)
{
if (frameBuffer != nullptr)
{
if (visible)
{
[frameBuffer->m_window orderFront:nil];
}
else
{
[frameBuffer->m_window orderOut:nil];
}
I_SetNativeMouse(!visible);
}
}
void SystemBaseFrameBuffer::SetWindowTitle(const char* title)
{
if (frameBuffer != nullptr)
{
NSString* const nsTitle = nullptr == title ? nil :
[NSString stringWithCString:title encoding:NSISOLatin1StringEncoding];
[frameBuffer->m_window setTitle:nsTitle];
}
[[NSOpenGLContext currentContext] flushBuffer];
}