[Scummvm-cvs-logs] SF.net SVN: scummvm:[44251] scummvm/trunk/backends/platform/psp/osys_psp. cpp

joostp at users.sourceforge.net joostp at users.sourceforge.net
Tue Sep 22 11:31:21 CEST 2009


Revision: 44251
          http://scummvm.svn.sourceforge.net/scummvm/?rev=44251&view=rev
Author:   joostp
Date:     2009-09-22 09:31:19 +0000 (Tue, 22 Sep 2009)

Log Message:
-----------
Apply patch #2863653: "PSP: Flickering problem fix" + some formatting changes and fixing several incorrect depth values.

Modified Paths:
--------------
    scummvm/trunk/backends/platform/psp/osys_psp.cpp

Modified: scummvm/trunk/backends/platform/psp/osys_psp.cpp
===================================================================
--- scummvm/trunk/backends/platform/psp/osys_psp.cpp	2009-09-22 09:16:16 UTC (rev 44250)
+++ scummvm/trunk/backends/platform/psp/osys_psp.cpp	2009-09-22 09:31:19 UTC (rev 44251)
@@ -408,25 +408,43 @@
 	sceGuAmbientColor(0xFFFFFFFF);
 	sceGuColor(0xFFFFFFFF);
 
-	struct Vertex* vertices = (struct Vertex*)sceGuGetMemory(2 * sizeof(struct Vertex));
-	vertices[0].u = 0.5; vertices[0].v = 0.5;
-	vertices[1].u = _screenWidth - 0.5; vertices[1].v = _screenHeight - 0.5;
-	switch(_graphicMode) {
+	struct Vertex *vertices = (struct Vertex *)sceGuGetMemory(2 * sizeof(struct Vertex));
+	vertices[0].u = 0.5f;
+	vertices[0].v = 0.5f;
+	vertices[1].u = _screenWidth - 0.5f;
+	vertices[1].v = _screenHeight - 0.5f;
+
+	switch (_graphicMode) {
 		case CENTERED_320X200:
-			vertices[0].x = (PSP_SCREEN_WIDTH - 320) / 2; vertices[0].y = (PSP_SCREEN_HEIGHT - 200) / 2; vertices[0].z = 0;
-			vertices[1].x = PSP_SCREEN_WIDTH - (PSP_SCREEN_WIDTH - 320) / 2; vertices[1].y = PSP_SCREEN_HEIGHT - (PSP_SCREEN_HEIGHT - 200) / 2; vertices[1].z = 0;
+			vertices[0].x = (PSP_SCREEN_WIDTH - 320) / 2; 
+			vertices[0].y = (PSP_SCREEN_HEIGHT - 200) / 2;
+			vertices[0].z = 0;
+			vertices[1].x = PSP_SCREEN_WIDTH - (PSP_SCREEN_WIDTH - 320) / 2;
+			vertices[1].y = PSP_SCREEN_HEIGHT - (PSP_SCREEN_HEIGHT - 200) / 2;
+			vertices[1].z = 0;
 		break;
 		case CENTERED_435X272:
-			vertices[0].x = (PSP_SCREEN_WIDTH - 435) / 2; vertices[0].y = 0; vertices[0].z = 0;
-			vertices[1].x = PSP_SCREEN_WIDTH - (PSP_SCREEN_WIDTH - 435) / 2; vertices[1].y = PSP_SCREEN_HEIGHT; vertices[1].z = 0;
+			vertices[0].x = (PSP_SCREEN_WIDTH - 435) / 2;
+			vertices[0].y = 0; vertices[0].z = 0;
+			vertices[1].x = PSP_SCREEN_WIDTH - (PSP_SCREEN_WIDTH - 435) / 2;
+			vertices[1].y = PSP_SCREEN_HEIGHT;
+			vertices[1].z = 0;
 		break;
 		case STRETCHED_480X272:
-			vertices[0].x = 0; vertices[0].y = 0; vertices[0].z = 0;
-			vertices[1].x = PSP_SCREEN_WIDTH; vertices[1].y = PSP_SCREEN_HEIGHT; vertices[1].z = 0;
+			vertices[0].x = 0;
+			vertices[0].y = 0;
+			vertices[0].z = 0;
+			vertices[1].x = PSP_SCREEN_WIDTH;
+			vertices[1].y = PSP_SCREEN_HEIGHT;
+			vertices[1].z = 0;
 		break;
 		case CENTERED_362X272:
-			vertices[0].x = (PSP_SCREEN_WIDTH - 362) / 2; vertices[0].y = 0; vertices[0].z = 0;
-			vertices[1].x = PSP_SCREEN_WIDTH - (PSP_SCREEN_WIDTH - 362) / 2; vertices[1].y = PSP_SCREEN_HEIGHT; vertices[1].z = 0;
+			vertices[0].x = (PSP_SCREEN_WIDTH - 362) / 2;
+			vertices[0].y = 0;
+			vertices[0].z = 0;
+			vertices[1].x = PSP_SCREEN_WIDTH - (PSP_SCREEN_WIDTH - 362) / 2;
+			vertices[1].y = PSP_SCREEN_HEIGHT;
+			vertices[1].z = 0;
 		break;
 	}
 
@@ -437,19 +455,36 @@
 
 	sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
 	if (_screenWidth == 640) {
+		// 2nd draw
+		struct Vertex *vertices2 = (struct Vertex *)sceGuGetMemory(2 * sizeof(struct Vertex));
 		sceGuTexImage(0, 512, 512, _screenWidth, _offscreen+512);
-		vertices[0].u = 512 + 0.5; vertices[1].v = _screenHeight - 0.5;
-		vertices[0].x += (vertices[1].x - vertices[0].x) * 511 / 640; vertices[0].y = 0; vertices[0].z = 0;
-		sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
+		vertices2[0].u = 512 + 0.5f;
+		vertices2[0].v = vertices[0].v;
+		vertices2[1].u = vertices[1].u; 
+		vertices2[1].v = _screenHeight - 0.5f;
+		vertices2[0].x = vertices[0].x + (vertices[1].x - vertices[0].x) * 511 / 640; 
+		vertices2[0].y = 0; 
+		vertices2[0].z = 0;
+		vertices2[1].x = vertices[1].x; 
+		vertices2[1].y = vertices[1].y; 
+		vertices2[1].z = 0;
+		sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices2);
 	}
 
 
 	// draw overlay
 	if (_overlayVisible) {
-		vertices[0].x = 0; vertices[0].y = 0; vertices[0].z = 0;
-		vertices[1].x = PSP_SCREEN_WIDTH; vertices[1].y = PSP_SCREEN_HEIGHT; vertices[1].z = 0;
-		vertices[0].u = 0.5; vertices[0].v = 0.5;
-		vertices[1].u = _overlayWidth - 0.5; vertices[1].v = _overlayHeight - 0.5;
+		struct Vertex *vertOverlay = (struct Vertex *)sceGuGetMemory(2 * sizeof(struct Vertex));
+		vertOverlay[0].x = 0; 
+		vertOverlay[0].y = 0; 
+		vertOverlay[0].z = 0;
+		vertOverlay[1].x = PSP_SCREEN_WIDTH; 
+		vertOverlay[1].y = PSP_SCREEN_HEIGHT; 
+		vertOverlay[1].z = 0;
+		vertOverlay[0].u = 0.5f;
+		vertOverlay[0].v = 0.5f;
+		vertOverlay[1].u = _overlayWidth - 0.5f;
+		vertOverlay[1].v = _overlayHeight - 0.5f;
 		sceGuTexMode(GU_PSM_4444, 0, 0, 0); // 16-bit image
 		sceGuDisable(GU_ALPHA_TEST);
 		sceGuEnable(GU_BLEND);
@@ -463,13 +498,22 @@
 			sceGuTexImage(0, 512, 256, _overlayWidth, _overlayBuffer);
 
 		sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
-		sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertices);
+		sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertOverlay);
 		// need to render twice for textures > 512
 		if ( _overlayWidth > 512) {
+			struct Vertex *vertOverlay2 = (struct Vertex *)sceGuGetMemory(2 * sizeof(struct Vertex));
 			sceGuTexImage(0, 512, 512, _overlayWidth, _overlayBuffer + 512);
-			vertices[0].u = 512 + 0.5; vertices[1].v = _overlayHeight - 0.5;
-			vertices[0].x = PSP_SCREEN_WIDTH * 512 / 640; vertices[0].y = 0; vertices[0].z = 0;
-			sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
+			vertOverlay2[0].u = 512 + 0.5f;
+			vertOverlay2[0].v = vertOverlay[0].v;
+			vertOverlay2[1].u = vertOverlay[1].u; 
+			vertOverlay2[1].v = _overlayHeight - 0.5f;
+			vertOverlay2[0].x = PSP_SCREEN_WIDTH * 512 / 640; 
+			vertOverlay2[0].y = 0; 
+			vertOverlay2[0].z = 0;
+			vertOverlay2[1].x = PSP_SCREEN_WIDTH; 
+			vertOverlay2[1].y = PSP_SCREEN_HEIGHT; 
+			vertOverlay2[1].z = 0;			
+			sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertOverlay2);
 		}
 		sceGuDisable(GU_BLEND);
 	}
@@ -484,8 +528,11 @@
 		sceGuTexImage(0, MOUSE_SIZE, MOUSE_SIZE, MOUSE_SIZE, _mouseBuf);
 		sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
 
-		vertices[0].u = 0.5; vertices[0].v = 0.5;
-		vertices[1].u = _mouseWidth - 0.5; vertices[1].v = _mouseHeight - 0.5;
+		struct Vertex *vertMouse = (struct Vertex *)sceGuGetMemory(2 * sizeof(struct Vertex));
+		vertMouse[0].u = 0.5f;
+		vertMouse[0].v = 0.5f;
+		vertMouse[1].u = _mouseWidth - 0.5f;
+		vertMouse[1].v = _mouseHeight - 0.5f;
 
 		//adjust cursor position
 		int mX = _mouseX - _mouseHotspotX;
@@ -497,13 +544,21 @@
 			scalex = (float)PSP_SCREEN_WIDTH /_overlayWidth;
 			scaley = (float)PSP_SCREEN_HEIGHT /_overlayHeight;
 
-			vertices[0].x = mX * scalex; vertices[0].y = mY * scaley; vertices[0].z = 0;
-			vertices[1].x = vertices[0].x + _mouseWidth * scalex; vertices[1].y = vertices[0].y + _mouseHeight * scaley; vertices[0].z = 0;
+			vertMouse[0].x = mX * scalex;
+			vertMouse[0].y = mY * scaley;
+			vertMouse[0].z = 0;
+			vertMouse[1].x = vertMouse[0].x + _mouseWidth * scalex;
+			vertMouse[1].y = vertMouse[0].y + _mouseHeight * scaley;
+			vertMouse[1].z = 0;
 		} else
-			switch(_graphicMode) {
+			switch (_graphicMode) {
 			case CENTERED_320X200:
-				vertices[0].x = (PSP_SCREEN_WIDTH - 320) / 2 + mX; vertices[0].y = (PSP_SCREEN_HEIGHT - 200) / 2 + mY; vertices[0].z = 0;
-				vertices[1].x = vertices[0].x+_mouseWidth; vertices[1].y = vertices[0].y + _mouseHeight; vertices[1].z = 0;
+				vertMouse[0].x = (PSP_SCREEN_WIDTH - 320) / 2 + mX;
+				vertMouse[0].y = (PSP_SCREEN_HEIGHT - 200) / 2 + mY;
+				vertMouse[0].z = 0;
+				vertMouse[1].x = vertMouse[0].x + _mouseWidth;
+				vertMouse[1].y = vertMouse[0].y + _mouseHeight;
+				vertMouse[1].z = 0;
 			break;
 			case CENTERED_435X272:
 			{
@@ -512,9 +567,12 @@
 				scalex = 435.0f / _screenWidth;
 				scaley = 272.0f / _screenHeight;
 
-				vertices[0].x = (PSP_SCREEN_WIDTH - 435) / 2 + mX * scalex; vertices[0].y = mY * scaley; vertices[0].z = 0;
-				vertices[1].x = vertices[0].x + _mouseWidth * scalex; vertices[1].y = vertices[0].y + _mouseHeight * scaley; vertices[0].z = 0;
-
+				vertMouse[0].x = (PSP_SCREEN_WIDTH - 435) / 2 + mX * scalex;
+				vertMouse[0].y = mY * scaley;
+				vertMouse[0].z = 0;
+				vertMouse[1].x = vertMouse[0].x + _mouseWidth * scalex;
+				vertMouse[1].y = vertMouse[0].y + _mouseHeight * scaley;
+				vertMouse[1].z = 0;
 			}
 			break;
 			case CENTERED_362X272:
@@ -524,8 +582,12 @@
 				scalex = 362.0f / _screenWidth;
 				scaley = 272.0f / _screenHeight;
 
-				vertices[0].x = (PSP_SCREEN_WIDTH - 362) / 2 + mX * scalex; vertices[0].y = mY * scaley; vertices[0].z = 0;
-				vertices[1].x = vertices[0].x + _mouseWidth * scalex; vertices[1].y = vertices[0].y + _mouseHeight * scaley; vertices[0].z = 0;
+				vertMouse[0].x = (PSP_SCREEN_WIDTH - 362) / 2 + mX * scalex;
+				vertMouse[0].y = mY * scaley;
+				vertMouse[0].z = 0;
+				vertMouse[1].x = vertMouse[0].x + _mouseWidth * scalex;
+				vertMouse[1].y = vertMouse[0].y + _mouseHeight * scaley;
+				vertMouse[1].z = 0;
 			}
 			break;
 			case STRETCHED_480X272:
@@ -535,12 +597,16 @@
 				scalex = (float)PSP_SCREEN_WIDTH / _screenWidth;
 				scaley = (float)PSP_SCREEN_HEIGHT / _screenHeight;
 
-				vertices[0].x = mX * scalex; vertices[0].y = mY * scaley; vertices[0].z = 0;
-				vertices[1].x = vertices[0].x + _mouseWidth * scalex; vertices[1].y = vertices[0].y + _mouseHeight * scaley; vertices[0].z = 0;
+				vertMouse[0].x = mX * scalex;
+				vertMouse[0].y = mY * scaley;
+				vertMouse[0].z = 0;
+				vertMouse[1].x = vertMouse[0].x + _mouseWidth * scalex;
+				vertMouse[1].y = vertMouse[0].y + _mouseHeight * scaley;
+				vertMouse[1].z = 0;
 			}
 			break;
 		}
-		sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
+		sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertMouse);
 	}
 
 	if (_keyboardVisible) {
@@ -566,14 +632,21 @@
 		}
 		sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
 
-		vertices[0].u = 0.5; vertices[0].v = 0.5;
-		vertices[1].u = PSP_SCREEN_WIDTH-0.5; vertices[1].v = PSP_SCREEN_HEIGHT-0.5;
-		vertices[0].x = 0; vertices[0].y = 0; vertices[0].z = 0;
-		vertices[1].x = PSP_SCREEN_WIDTH; vertices[1].y = PSP_SCREEN_HEIGHT; vertices[0].z = 0;
-		sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertices);
+		struct Vertex *vertKB = (struct Vertex *)sceGuGetMemory(2 * sizeof(struct Vertex));
+		vertKB[0].u = 0.5f;
+		vertKB[0].v = 0.5f;
+		vertKB[1].u = PSP_SCREEN_WIDTH - 0.5f;
+		vertKB[1].v = PSP_SCREEN_HEIGHT - 0.5f;
+		vertKB[0].x = 0;
+		vertKB[0].y = 0;
+		vertKB[0].z = 0;
+		vertKB[1].x = PSP_SCREEN_WIDTH;
+		vertKB[1].y = PSP_SCREEN_HEIGHT;
+		vertKB[1].z = 0;
+		sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertKB);
 		sceGuDisable(GU_BLEND);
 	}
-	sceKernelDcacheWritebackAll();
+	//sceKernelDcacheWritebackAll();
 
 	sceGuFinish();
 	sceGuSync(0,0);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list