cleanup; made mutex protection of graphics code a little bit tighter by protecting all of method property(); moved set_palette to OSystem_SDL_Common (it was identical in both normal and GL backend)
svn-id: r8717
This commit is contained in:
parent
5b71113dcb
commit
e1ca5552dd
4 changed files with 34 additions and 57 deletions
|
@ -63,7 +63,7 @@ void OSystem_SDL_Common::init_intern(int gfx_mode, bool full_screen, bool aspect
|
||||||
error("Could not initialize SDL: %s.\n", SDL_GetError());
|
error("Could not initialize SDL: %s.\n", SDL_GetError());
|
||||||
}
|
}
|
||||||
|
|
||||||
_mutex = SDL_CreateMutex();
|
_graphicsMutex = SDL_CreateMutex();
|
||||||
|
|
||||||
SDL_ShowCursor(SDL_DISABLE);
|
SDL_ShowCursor(SDL_DISABLE);
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ OSystem_SDL_Common::OSystem_SDL_Common()
|
||||||
_mouseHotspotX(0), _mouseHotspotY(0),
|
_mouseHotspotX(0), _mouseHotspotY(0),
|
||||||
_currentShakePos(0), _newShakePos(0),
|
_currentShakePos(0), _newShakePos(0),
|
||||||
_paletteDirtyStart(0), _paletteDirtyEnd(0),
|
_paletteDirtyStart(0), _paletteDirtyEnd(0),
|
||||||
_mutex(0) {
|
_graphicsMutex(0) {
|
||||||
|
|
||||||
// allocate palette storage
|
// allocate palette storage
|
||||||
_currentPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256);
|
_currentPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256);
|
||||||
|
@ -113,7 +113,7 @@ OSystem_SDL_Common::~OSystem_SDL_Common() {
|
||||||
free(_dirty_checksums);
|
free(_dirty_checksums);
|
||||||
free(_currentPalette);
|
free(_currentPalette);
|
||||||
free(_mouseBackup);
|
free(_mouseBackup);
|
||||||
SDL_DestroyMutex(_mutex);
|
SDL_DestroyMutex(_graphicsMutex);
|
||||||
|
|
||||||
SDL_ShowCursor(SDL_ENABLE);
|
SDL_ShowCursor(SDL_ENABLE);
|
||||||
#ifdef MACOSX
|
#ifdef MACOSX
|
||||||
|
@ -147,7 +147,7 @@ void OSystem_SDL_Common::copy_rect(const byte *buf, int pitch, int x, int y, int
|
||||||
if (_screen == NULL)
|
if (_screen == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
StackLock lock(_mutex); // Lock the mutex until this function ends
|
StackLock lock(_graphicsMutex); // Lock the mutex until this function ends
|
||||||
|
|
||||||
if (((uint32)buf & 3) == 0 && pitch == _screenWidth && x==0 && y==0 &&
|
if (((uint32)buf & 3) == 0 && pitch == _screenWidth && x==0 && y==0 &&
|
||||||
w==_screenWidth && h==_screenHeight && _mode_flags&DF_WANT_RECT_OPTIM) {
|
w==_screenWidth && h==_screenHeight && _mode_flags&DF_WANT_RECT_OPTIM) {
|
||||||
|
@ -1228,7 +1228,7 @@ void OSystem_SDL_Common::clear_overlay() {
|
||||||
if (!_overlayVisible)
|
if (!_overlayVisible)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
StackLock lock(_mutex); // Lock the mutex until this function ends
|
StackLock lock(_graphicsMutex); // Lock the mutex until this function ends
|
||||||
|
|
||||||
// hide the mouse
|
// hide the mouse
|
||||||
undraw_mouse();
|
undraw_mouse();
|
||||||
|
@ -1327,6 +1327,24 @@ void OSystem_SDL_Common::copy_rect_overlay(const int16 *buf, int pitch, int x, i
|
||||||
SDL_UnlockSurface(_tmpscreen);
|
SDL_UnlockSurface(_tmpscreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OSystem_SDL_Common::set_palette(const byte *colors, uint start, uint num) {
|
||||||
|
const byte *b = colors;
|
||||||
|
uint i;
|
||||||
|
SDL_Color *base = _currentPalette + start;
|
||||||
|
for (i = 0; i < num; i++) {
|
||||||
|
base[i].r = b[0];
|
||||||
|
base[i].g = b[1];
|
||||||
|
base[i].b = b[2];
|
||||||
|
b += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start < _paletteDirtyStart)
|
||||||
|
_paletteDirtyStart = start;
|
||||||
|
|
||||||
|
if (start + num > _paletteDirtyEnd)
|
||||||
|
_paletteDirtyEnd = start + num;
|
||||||
|
}
|
||||||
|
|
||||||
int16 OSystem_SDL_Common::RGBToColor(uint8 r, uint8 g, uint8 b) {
|
int16 OSystem_SDL_Common::RGBToColor(uint8 r, uint8 g, uint8 b) {
|
||||||
return SDL_MapRGB(_tmpscreen->format, r, g, b);
|
return SDL_MapRGB(_tmpscreen->format, r, g, b);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,13 +31,13 @@
|
||||||
|
|
||||||
class OSystem_SDL_Common : public OSystem {
|
class OSystem_SDL_Common : public OSystem {
|
||||||
public:
|
public:
|
||||||
// Set colors of the palette
|
|
||||||
void set_palette(const byte *colors, uint start, uint num) = 0;
|
|
||||||
|
|
||||||
// Set the size of the video bitmap.
|
// Set the size of the video bitmap.
|
||||||
// Typically, 320x200
|
// Typically, 320x200
|
||||||
void init_size(uint w, uint h);
|
void init_size(uint w, uint h);
|
||||||
|
|
||||||
|
// Set colors of the palette
|
||||||
|
void set_palette(const byte *colors, uint start, uint num);
|
||||||
|
|
||||||
// Draw a bitmap to screen.
|
// Draw a bitmap to screen.
|
||||||
// The screen will not be updated to reflect the new bitmap
|
// The screen will not be updated to reflect the new bitmap
|
||||||
void copy_rect(const byte *buf, int pitch, int x, int y, int w, int h);
|
void copy_rect(const byte *buf, int pitch, int x, int y, int w, int h);
|
||||||
|
@ -208,7 +208,7 @@ protected:
|
||||||
|
|
||||||
// Mutex that prevents multiple threads interferring with each other
|
// Mutex that prevents multiple threads interferring with each other
|
||||||
// when accessing the screen.
|
// when accessing the screen.
|
||||||
SDL_mutex *_mutex;
|
SDL_mutex *_graphicsMutex;
|
||||||
|
|
||||||
|
|
||||||
void add_dirty_rgn_auto(const byte *buf);
|
void add_dirty_rgn_auto(const byte *buf);
|
||||||
|
|
|
@ -29,9 +29,6 @@ class OSystem_SDL : public OSystem_SDL_Common {
|
||||||
public:
|
public:
|
||||||
OSystem_SDL();
|
OSystem_SDL();
|
||||||
|
|
||||||
// Set colors of the palette
|
|
||||||
void set_palette(const byte *colors, uint start, uint num);
|
|
||||||
|
|
||||||
// Update the dirty areas of the screen
|
// Update the dirty areas of the screen
|
||||||
void update_screen();
|
void update_screen();
|
||||||
|
|
||||||
|
@ -57,24 +54,6 @@ OSystem_SDL::OSystem_SDL()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void OSystem_SDL::set_palette(const byte *colors, uint start, uint num) {
|
|
||||||
const byte *b = colors;
|
|
||||||
uint i;
|
|
||||||
SDL_Color *base = _currentPalette + start;
|
|
||||||
for (i = 0; i < num; i++) {
|
|
||||||
base[i].r = b[0];
|
|
||||||
base[i].g = b[1];
|
|
||||||
base[i].b = b[2];
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (start < _paletteDirtyStart)
|
|
||||||
_paletteDirtyStart = start;
|
|
||||||
|
|
||||||
if (start + num > _paletteDirtyEnd)
|
|
||||||
_paletteDirtyEnd = start + num;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSystem_SDL::load_gfx_mode() {
|
void OSystem_SDL::load_gfx_mode() {
|
||||||
_forceFull = true;
|
_forceFull = true;
|
||||||
_mode_flags = DF_UPDATE_EXPAND_1_PIXEL;
|
_mode_flags = DF_UPDATE_EXPAND_1_PIXEL;
|
||||||
|
@ -201,8 +180,6 @@ void OSystem_SDL::hotswap_gfx_mode() {
|
||||||
if (!_screen)
|
if (!_screen)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
StackLock lock(_mutex); // Lock the mutex until this function ends
|
|
||||||
|
|
||||||
// Keep around the old _screen & _tmpscreen so we can restore the screen data
|
// Keep around the old _screen & _tmpscreen so we can restore the screen data
|
||||||
// after the mode switch.
|
// after the mode switch.
|
||||||
SDL_Surface *old_screen = _screen;
|
SDL_Surface *old_screen = _screen;
|
||||||
|
@ -233,7 +210,7 @@ void OSystem_SDL::hotswap_gfx_mode() {
|
||||||
void OSystem_SDL::update_screen() {
|
void OSystem_SDL::update_screen() {
|
||||||
assert(_hwscreen != NULL);
|
assert(_hwscreen != NULL);
|
||||||
|
|
||||||
StackLock lock(_mutex); // Lock the mutex until this function ends
|
StackLock lock(_graphicsMutex); // Lock the mutex until this function ends
|
||||||
|
|
||||||
// If the shake position changed, fill the dirty area with blackness
|
// If the shake position changed, fill the dirty area with blackness
|
||||||
if (_currentShakePos != _newShakePos) {
|
if (_currentShakePos != _newShakePos) {
|
||||||
|
@ -357,6 +334,9 @@ void OSystem_SDL::update_screen() {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 OSystem_SDL::property(int param, Property *value) {
|
uint32 OSystem_SDL::property(int param, Property *value) {
|
||||||
|
|
||||||
|
StackLock lock(_graphicsMutex); // Lock the mutex until this function ends
|
||||||
|
|
||||||
if (param == PROP_TOGGLE_FULLSCREEN) {
|
if (param == PROP_TOGGLE_FULLSCREEN) {
|
||||||
assert(_hwscreen != 0);
|
assert(_hwscreen != 0);
|
||||||
_full_screen ^= true;
|
_full_screen ^= true;
|
||||||
|
|
|
@ -36,9 +36,6 @@ class OSystem_SDL_OpenGL : public OSystem_SDL_Common {
|
||||||
public:
|
public:
|
||||||
OSystem_SDL_OpenGL();
|
OSystem_SDL_OpenGL();
|
||||||
|
|
||||||
// Set colors of the palette
|
|
||||||
void set_palette(const byte *colors, uint start, uint num);
|
|
||||||
|
|
||||||
// Update the dirty areas of the screen
|
// Update the dirty areas of the screen
|
||||||
void update_screen();
|
void update_screen();
|
||||||
|
|
||||||
|
@ -87,24 +84,6 @@ OSystem_SDL_OpenGL::OSystem_SDL_OpenGL()
|
||||||
_glWindow.h = 480;
|
_glWindow.h = 480;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OSystem_SDL_OpenGL::set_palette(const byte *colors, uint start, uint num) {
|
|
||||||
const byte *b = colors;
|
|
||||||
uint i;
|
|
||||||
SDL_Color *base = _currentPalette + start;
|
|
||||||
for (i = 0; i < num; i++) {
|
|
||||||
base[i].r = b[0];
|
|
||||||
base[i].g = b[1];
|
|
||||||
base[i].b = b[2];
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (start < _paletteDirtyStart)
|
|
||||||
_paletteDirtyStart = start;
|
|
||||||
|
|
||||||
if (start + num > _paletteDirtyEnd)
|
|
||||||
_paletteDirtyEnd = start + num;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSystem_SDL_OpenGL::load_gfx_mode() {
|
void OSystem_SDL_OpenGL::load_gfx_mode() {
|
||||||
uint32 Rmask, Gmask, Bmask, Amask;
|
uint32 Rmask, Gmask, Bmask, Amask;
|
||||||
// I have to force 16 bit color depth with 565 ordering
|
// I have to force 16 bit color depth with 565 ordering
|
||||||
|
@ -304,8 +283,6 @@ void OSystem_SDL_OpenGL::hotswap_gfx_mode() {
|
||||||
if (!_screen)
|
if (!_screen)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
StackLock lock(_mutex); // Lock the mutex until this function ends
|
|
||||||
|
|
||||||
// Keep around the old _screen & _tmpscreen so we can restore the screen data
|
// Keep around the old _screen & _tmpscreen so we can restore the screen data
|
||||||
// after the mode switch.
|
// after the mode switch.
|
||||||
SDL_Surface *old_screen = _screen;
|
SDL_Surface *old_screen = _screen;
|
||||||
|
@ -342,7 +319,7 @@ void OSystem_SDL_OpenGL::hotswap_gfx_mode() {
|
||||||
|
|
||||||
void OSystem_SDL_OpenGL::update_screen() {
|
void OSystem_SDL_OpenGL::update_screen() {
|
||||||
|
|
||||||
StackLock lock(_mutex); // Lock the mutex until this function ends
|
StackLock lock(_graphicsMutex); // Lock the mutex until this function ends
|
||||||
|
|
||||||
// If the shake position changed, fill the dirty area with blackness
|
// If the shake position changed, fill the dirty area with blackness
|
||||||
if (_currentShakePos != _newShakePos) {
|
if (_currentShakePos != _newShakePos) {
|
||||||
|
@ -541,6 +518,8 @@ bool OSystem_SDL_OpenGL::poll_event(Event *event) {
|
||||||
|
|
||||||
uint32 OSystem_SDL_OpenGL::property(int param, Property *value) {
|
uint32 OSystem_SDL_OpenGL::property(int param, Property *value) {
|
||||||
|
|
||||||
|
StackLock lock(_graphicsMutex); // Lock the mutex until this function ends
|
||||||
|
|
||||||
if (param == PROP_TOGGLE_FULLSCREEN) {
|
if (param == PROP_TOGGLE_FULLSCREEN) {
|
||||||
if (!_usingOpenGL)
|
if (!_usingOpenGL)
|
||||||
assert(_hwscreen != 0);
|
assert(_hwscreen != 0);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue