diff --git a/src/hardware/r_opengl/ogl_win.c b/src/hardware/r_opengl/ogl_win.c
index 90376f276595e87ac66edde7667fd73d760bb7a9..e4a71734be199bc7180e6be48f8c0dcd9aaa6fd8 100644
--- a/src/hardware/r_opengl/ogl_win.c
+++ b/src/hardware/r_opengl/ogl_win.c
@@ -566,18 +566,13 @@ EXPORT void HWRAPI(FinishUpdate) (INT32 waitvbl)
 // -----------------+
 EXPORT void HWRAPI(SetPalette) (RGBA_t *pal)
 {
-	INT32 i;
-
-	for (i = 0; i < 256; i++)
+	size_t palsize = (sizeof(RGBA_t) * 256);
+	// on a palette change, you have to reload all of the textures
+	if (memcmp(&myPaletteData, pal, palsize))
 	{
-		myPaletteData[i].s.red   = pal[i].s.red;
-		myPaletteData[i].s.green = pal[i].s.green;
-		myPaletteData[i].s.blue  = pal[i].s.blue;
-		myPaletteData[i].s.alpha = pal[i].s.alpha;
+		memcpy(&myPaletteData, pal, palsize);
+		Flush();
 	}
-
-	// on a palette change, you have to reload all of the textures
-	Flush();
 }
 
 #endif
diff --git a/src/sdl/ogl_sdl.c b/src/sdl/ogl_sdl.c
index 66980f1adfdd56e6f75e4af78e9b6d0af9a84cbb..6c0dd35a59bef2ecbd1ca524cd8b474f71608edc 100644
--- a/src/sdl/ogl_sdl.c
+++ b/src/sdl/ogl_sdl.c
@@ -224,16 +224,13 @@ void OglSdlFinishUpdate(boolean waitvbl)
 
 EXPORT void HWRAPI( OglSdlSetPalette) (RGBA_t *palette)
 {
-	INT32 i;
-
-	for (i = 0; i < 256; i++)
+	size_t palsize = (sizeof(RGBA_t) * 256);
+	// on a palette change, you have to reload all of the textures
+	if (memcmp(&myPaletteData, palette, palsize))
 	{
-		myPaletteData[i].s.red   = palette[i].s.red;
-		myPaletteData[i].s.green = palette[i].s.green;
-		myPaletteData[i].s.blue  = palette[i].s.blue;
-		myPaletteData[i].s.alpha = palette[i].s.alpha;
+		memcpy(&myPaletteData, palette, palsize);
+		Flush();
 	}
-	Flush();
 }
 
 #endif //HWRENDER