Cleaned up software rendering internals in Cocoa back-end

This commit is contained in:
alexey.lysiuk 2014-09-13 11:16:23 +03:00
parent 1dab120e15
commit b6f829979a
1 changed files with 57 additions and 46 deletions

View File

@ -770,6 +770,9 @@ void ProcessMouseWheelEvent(NSEvent* theEvent)
D_PostEvent(&event); D_PostEvent(&event);
} }
const Uint16 BYTES_PER_PIXEL = 4;
} // unnamed namespace } // unnamed namespace
@ -844,6 +847,9 @@ void ProcessMouseWheelEvent(NSEvent* theEvent)
@private @private
FullscreenWindow* m_window; FullscreenWindow* m_window;
uint8_t* m_softwareRenderingBuffer;
GLuint m_softwareRenderingTexture;
int m_multisample; int m_multisample;
int m_width; int m_width;
@ -875,6 +881,9 @@ void ProcessMouseWheelEvent(NSEvent* theEvent)
- (void)changeVideoResolution:(bool)fullscreen width:(int)width height:(int)height useHiDPI:(bool)hiDPI; - (void)changeVideoResolution:(bool)fullscreen width:(int)width height:(int)height useHiDPI:(bool)hiDPI;
- (void)useHiDPI:(bool)hiDPI; - (void)useHiDPI:(bool)hiDPI;
- (void)setupSoftwareRenderingWithWidth:(int)width height:(int)height;
- (void*)softwareRenderingBuffer;
- (void)processEvents:(NSTimer*)timer; - (void)processEvents:(NSTimer*)timer;
- (void)invalidateCursorRects; - (void)invalidateCursorRects;
@ -893,6 +902,11 @@ static ApplicationDelegate* s_applicationDelegate;
{ {
self = [super init]; self = [super init];
m_window = nil;
m_softwareRenderingBuffer = NULL;
m_softwareRenderingTexture = 0;
m_multisample = 0; m_multisample = 0;
m_width = -1; m_width = -1;
@ -907,6 +921,11 @@ static ApplicationDelegate* s_applicationDelegate;
- (void)dealloc - (void)dealloc
{ {
delete[] m_softwareRenderingBuffer;
glBindTexture(GL_TEXTURE_2D, 0);
glDeleteTextures(1, &m_softwareRenderingTexture);
[m_window release]; [m_window release];
[super dealloc]; [super dealloc];
@ -1190,6 +1209,38 @@ static ApplicationDelegate* s_applicationDelegate;
} }
- (void)setupSoftwareRenderingWithWidth:(int)width height:(int)height
{
if (0 == m_softwareRenderingTexture)
{
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &m_softwareRenderingTexture);
glBindTexture(GL_TEXTURE_2D, m_softwareRenderingTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
delete[] m_softwareRenderingBuffer;
m_softwareRenderingBuffer = new uint8_t[width * height * BYTES_PER_PIXEL];
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, width, height, 0.0, -1.0, 1.0);
}
- (void*)softwareRenderingBuffer
{
return m_softwareRenderingBuffer;
}
- (void)processEvents:(NSTimer*)timer - (void)processEvents:(NSTimer*)timer
{ {
ZD_UNUSED(timer); ZD_UNUSED(timer);
@ -1536,10 +1587,6 @@ int SDL_ShowCursor(int)
} }
static GLuint s_frameBufferTexture = 0;
static const Uint16 BYTES_PER_PIXEL = 4;
static SDL_PixelFormat* GetPixelFormat() static SDL_PixelFormat* GetPixelFormat()
{ {
static SDL_PixelFormat result; static SDL_PixelFormat result;
@ -1574,30 +1621,19 @@ SDL_Surface* SDL_SetVideoMode(int width, int height, int, Uint32 flags)
useHiDPI:vid_hidpi]; useHiDPI:vid_hidpi];
static SDL_Surface result; static SDL_Surface result;
const bool isSoftwareRenderer = !(SDL_OPENGL & flags); if (!(SDL_OPENGL & flags))
if (isSoftwareRenderer)
{ {
if (NULL != result.pixels) [s_applicationDelegate setupSoftwareRenderingWithWidth:width
{ height:height];
free(result.pixels);
}
if (0 != s_frameBufferTexture)
{
glBindTexture(GL_TEXTURE_2D, 0);
glDeleteTextures(1, &s_frameBufferTexture);
s_frameBufferTexture = 0;
}
} }
result.flags = flags; result.flags = flags;
result.format = GetPixelFormat(); result.format = GetPixelFormat();
result.w = width; result.w = width;
result.h = height; result.h = height;
result.pitch = width * BYTES_PER_PIXEL; result.pitch = width * BYTES_PER_PIXEL;
result.pixels = isSoftwareRenderer ? malloc(width * height * BYTES_PER_PIXEL) : NULL; result.pixels = [s_applicationDelegate softwareRenderingBuffer];
result.refcount = 1; result.refcount = 1;
result.clip_rect.x = 0; result.clip_rect.x = 0;
@ -1678,35 +1714,10 @@ int SDL_BlitSurface(SDL_Surface* src, SDL_Rect* srcrect, SDL_Surface* dst, SDL_R
} }
static void SetupSoftwareRendering(SDL_Surface* screen)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, screen->w, screen->h, 0.0, -1.0, 1.0);
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &s_frameBufferTexture);
glBindTexture(GL_TEXTURE_2D, s_frameBufferTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
int SDL_Flip(SDL_Surface* screen) int SDL_Flip(SDL_Surface* screen)
{ {
assert(NULL != screen); assert(NULL != screen);
if (0 == s_frameBufferTexture)
{
SetupSoftwareRendering(screen);
}
if (rbOpts.dirty) if (rbOpts.dirty)
{ {
glViewport(rbOpts.shiftX, rbOpts.shiftY, rbOpts.width, rbOpts.height); glViewport(rbOpts.shiftX, rbOpts.shiftY, rbOpts.width, rbOpts.height);