mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2024-11-16 17:21:24 +00:00
Cleaned up software rendering internals in Cocoa back-end
This commit is contained in:
parent
1dab120e15
commit
b6f829979a
1 changed files with 57 additions and 46 deletions
|
@ -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;
|
||||||
|
@ -1575,21 +1622,10 @@ SDL_Surface* SDL_SetVideoMode(int width, int height, int, Uint32 flags)
|
||||||
|
|
||||||
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;
|
||||||
|
@ -1597,7 +1633,7 @@ SDL_Surface* SDL_SetVideoMode(int width, int height, int, Uint32 flags)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue