(svn r4099) -Codechange: [OSX] the cocoa video driver speedup of around 1000% now also applies to Intel macs
This commit is contained in:
		@@ -1464,54 +1464,41 @@ static void QZ_DrawScreen(void)
 | 
				
			|||||||
	uint width;
 | 
						uint width;
 | 
				
			||||||
	uint pitch;
 | 
						uint pitch;
 | 
				
			||||||
	uint y;
 | 
						uint y;
 | 
				
			||||||
 | 
						uint num_dirty_rects;
 | 
				
			||||||
 | 
						uint length_drawn;
 | 
				
			||||||
 | 
						uint left;
 | 
				
			||||||
 | 
						uint i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	src = _cocoa_video_data.pixels;
 | 
						src = _cocoa_video_data.pixels;
 | 
				
			||||||
	dst = (uint8*)_cocoa_video_data.realpixels;
 | 
						dst = (uint8*)_cocoa_video_data.realpixels;
 | 
				
			||||||
	width  = _cocoa_video_data.width;
 | 
						width  = _cocoa_video_data.width;
 | 
				
			||||||
	pitch  = _cocoa_video_data.pitch;
 | 
						pitch  = _cocoa_video_data.pitch;
 | 
				
			||||||
 | 
						num_dirty_rects = _cocoa_video_data.num_dirty_rects;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if 1
 | 
						/* Check if we need to do anything */
 | 
				
			||||||
	// PPC appears to handle updating of rectangles right
 | 
						if (num_dirty_rects == 0 ) return;
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		uint num_dirty_rects;
 | 
					 | 
				
			||||||
		uint length_drawn;
 | 
					 | 
				
			||||||
		uint left;
 | 
					 | 
				
			||||||
		uint i;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		num_dirty_rects = _cocoa_video_data.num_dirty_rects;
 | 
						if (num_dirty_rects >= MAX_DIRTY_RECTS) {
 | 
				
			||||||
 | 
							num_dirty_rects = 1;
 | 
				
			||||||
		/* Check if we need to do anything */
 | 
							_cocoa_video_data.dirty_rects[0].left = 0;
 | 
				
			||||||
		if (num_dirty_rects == 0 ) return;
 | 
							_cocoa_video_data.dirty_rects[0].top = 0;
 | 
				
			||||||
 | 
							_cocoa_video_data.dirty_rects[0].right = _cocoa_video_data.width;
 | 
				
			||||||
		if (num_dirty_rects >= MAX_DIRTY_RECTS) {
 | 
							_cocoa_video_data.dirty_rects[0].bottom = _cocoa_video_data.height;
 | 
				
			||||||
			num_dirty_rects = 1;
 | 
					 | 
				
			||||||
			_cocoa_video_data.dirty_rects[0].left = 0;
 | 
					 | 
				
			||||||
			_cocoa_video_data.dirty_rects[0].top = 0;
 | 
					 | 
				
			||||||
			_cocoa_video_data.dirty_rects[0].right = _cocoa_video_data.width;
 | 
					 | 
				
			||||||
			_cocoa_video_data.dirty_rects[0].bottom = _cocoa_video_data.height;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		QZ_WaitForVerticalBlank();
 | 
					 | 
				
			||||||
		/* Build the region of dirty rectangles */
 | 
					 | 
				
			||||||
		for (i = 0; i < num_dirty_rects; i++) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			y = _cocoa_video_data.dirty_rects[i].top;
 | 
					 | 
				
			||||||
			left = _cocoa_video_data.dirty_rects[i].left;
 | 
					 | 
				
			||||||
			length_drawn = _cocoa_video_data.dirty_rects[i].right - left;
 | 
					 | 
				
			||||||
			height = _cocoa_video_data.dirty_rects[i].bottom;
 | 
					 | 
				
			||||||
			for (; y < height; y++) memcpy(dst + y * pitch + left, src + y * width +left, length_drawn);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		_cocoa_video_data.num_dirty_rects = 0;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#else
 | 
					
 | 
				
			||||||
	// it appears that Intel based macs didn't like to only update parts of the screen at a time, so they still update everything at each frame
 | 
					 | 
				
			||||||
	// we need to switch to use Quartz exclusively (no QuickDraw commands at all) to fix this
 | 
					 | 
				
			||||||
	// to use Quartz exclusively, we should use 16 or 32 bit graphics since 8 bit coloured graphic support sucks
 | 
					 | 
				
			||||||
	height  = _cocoa_video_data.height;
 | 
					 | 
				
			||||||
	QZ_WaitForVerticalBlank();
 | 
						QZ_WaitForVerticalBlank();
 | 
				
			||||||
	for (y = 0; y < height; y++) memcpy(dst + y * pitch, src + y * width, width);
 | 
						/* Build the region of dirty rectangles */
 | 
				
			||||||
#endif
 | 
						for (i = 0; i < num_dirty_rects; i++) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							y = _cocoa_video_data.dirty_rects[i].top;
 | 
				
			||||||
 | 
							left = _cocoa_video_data.dirty_rects[i].left;
 | 
				
			||||||
 | 
							length_drawn = _cocoa_video_data.dirty_rects[i].right - left;
 | 
				
			||||||
 | 
							height = _cocoa_video_data.dirty_rects[i].bottom;
 | 
				
			||||||
 | 
							for (; y < height; y++) memcpy(dst + y * pitch + left, src + y * width +left, length_drawn);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_cocoa_video_data.num_dirty_rects = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int QZ_ListFullscreenModes(OTTDPoint* mode_list, int max_modes)
 | 
					static int QZ_ListFullscreenModes(OTTDPoint* mode_list, int max_modes)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user