Use explicit stride for framebuffer blit.

Change-Id: I68685932934caba4d9fab7b45014d24316ce45a8
Reviewed-on: https://swiftshader-review.googlesource.com/4293
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Main/FrameBuffer.cpp b/src/Main/FrameBuffer.cpp
index 2492d26..15e7e4d 100644
--- a/src/Main/FrameBuffer.cpp
+++ b/src/Main/FrameBuffer.cpp
@@ -150,7 +150,7 @@
 		cursorPositionY = y;
 	}
 
-	void FrameBuffer::copy(void *source, Format format)
+	void FrameBuffer::copy(void *source, Format format, size_t stride)
 	{
 		if(!source)
 		{
@@ -170,11 +170,7 @@
 		}
 		else
 		{
-			const int width2 = (width + 1) & ~1;
-			const int sBytes = Surface::bytes(sourceFormat);
-			const int sStride = sBytes * width2;
-
-			target = (byte*)source + (height - 1) * sStride;
+			target = (byte*)source + (height - 1) * stride;
 		}
 
 		cursorX = cursorPositionX - cursorHotspotX;
diff --git a/src/Main/FrameBuffer.hpp b/src/Main/FrameBuffer.hpp
index 4ba18c0..faad0d5 100644
--- a/src/Main/FrameBuffer.hpp
+++ b/src/Main/FrameBuffer.hpp
@@ -42,8 +42,8 @@
 		int getHeight() const;

 		int getStride() const;

 

-		virtual void flip(void *source, Format format) = 0;

-		virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format) = 0;

+		virtual void flip(void *source, Format sourceFormat, size_t sourceStride) = 0;

+		virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) = 0;

 

 		virtual void *lock() = 0;

 		virtual void unlock() = 0;

@@ -55,7 +55,7 @@
 		static Routine *copyRoutine(const BlitState &state);

 

 	protected:

-		void copy(void *source, Format format);

+		void copy(void *source, Format format, size_t stride);

 		int width;

 		int height;

 		Format sourceFormat;

diff --git a/src/Main/FrameBufferAndroid.cpp b/src/Main/FrameBufferAndroid.cpp
index 550dfb0..ff1148b 100644
--- a/src/Main/FrameBufferAndroid.cpp
+++ b/src/Main/FrameBufferAndroid.cpp
@@ -28,9 +28,9 @@
         nativeWindow->common.decRef(&nativeWindow->common);
     }
 
-    void FrameBufferAndroid::blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format)
+    void FrameBufferAndroid::blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride)
     {
-        copy(source, format);
+        copy(source, sourceFormat, sourceStride);
 		if (buffer)
 		{
 			nativeWindow->queueBuffer(nativeWindow, buffer, -1);
diff --git a/src/Main/FrameBufferAndroid.hpp b/src/Main/FrameBufferAndroid.hpp
index b1b15b0..7e7acde 100644
--- a/src/Main/FrameBufferAndroid.hpp
+++ b/src/Main/FrameBufferAndroid.hpp
@@ -16,11 +16,11 @@
 
         ~FrameBufferAndroid();
 
-        virtual void flip(void *source, Format format) {blit(source, 0, 0, format);};
-        virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format);
-
-        virtual void *lock();
-        virtual void unlock();
+        void flip(void *source, Format sourceFormat, size_t sourceStride) override {blit(source, 0, 0, sourceFormat, sourceStride);};

+		void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) override;

+

+		void *lock() override;

+		void unlock() override;
 
         bool setSwapRectangle(int l, int t, int w, int h);
 
diff --git a/src/Main/FrameBufferDD.cpp b/src/Main/FrameBufferDD.cpp
index 8d984df..81b2ef2 100644
--- a/src/Main/FrameBufferDD.cpp
+++ b/src/Main/FrameBufferDD.cpp
@@ -247,9 +247,9 @@
 		updateBounds(windowHandle);
 	}
 
-	void FrameBufferDD::flip(void *source, Format format)
+	void FrameBufferDD::flip(void *source, Format sourceFormat, size_t sourceStride)
 	{
-		copy(source, format);
+		copy(source, sourceFormat, sourceStride);
 
 		if(!readySurfaces())
 		{
@@ -278,9 +278,9 @@
 		}
 	}
 
-	void FrameBufferDD::blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format)
+	void FrameBufferDD::blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride)
 	{
-		copy(source, format);
+		copy(source, sourceFormat, sourceStride);
 
 		if(!readySurfaces())
 		{
@@ -317,20 +317,20 @@
 		}
 	}
 
-	void FrameBufferDD::flip(HWND windowOverride, void *source, Format format)
+	void FrameBufferDD::flip(HWND windowOverride, void *source, Format sourceFormat, size_t sourceStride)
 	{
 		updateClipper(windowOverride);
 		updateBounds(windowOverride);
 
-		flip(source, format);
+		flip(source, sourceFormat, sourceStride);
 	}
 
-	void FrameBufferDD::blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format format)
+	void FrameBufferDD::blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride)
 	{
 		updateClipper(windowOverride);
 		updateBounds(windowOverride);
 
-		blit(source, sourceRect, destRect, format);
+		blit(source, sourceRect, destRect, sourceFormat, sourceStride);
 	}
 
 	void FrameBufferDD::screenshot(void *destBuffer)
diff --git a/src/Main/FrameBufferDD.hpp b/src/Main/FrameBufferDD.hpp
index 8fa54f1..1f42552 100644
--- a/src/Main/FrameBufferDD.hpp
+++ b/src/Main/FrameBufferDD.hpp
@@ -25,20 +25,20 @@
 

 		virtual ~FrameBufferDD();

 

-		virtual void flip(void *source, Format format);

-		virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format);

+		void flip(void *source, Format sourceFormat, size_t sourceStride) override;

+		void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) override;

 

-		virtual void flip(HWND windowOverride, void *source, Format format);

-		virtual void blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format format);

+		void flip(HWND windowOverride, void *source, Format sourceFormat, size_t sourceStride) override;

+		void blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) override;

 

-		virtual void *lock();

-		virtual void unlock();

+		void *lock() override;

+		void unlock() override;

 

-		virtual void setGammaRamp(GammaRamp *gammaRamp, bool calibrate);

-		virtual void getGammaRamp(GammaRamp *gammaRamp);

+		void setGammaRamp(GammaRamp *gammaRamp, bool calibrate) override;

+		void getGammaRamp(GammaRamp *gammaRamp) override;

 

-		virtual void screenshot(void *destBuffer);

-		virtual bool getScanline(bool &inVerticalBlank, unsigned int &scanline);

+		void screenshot(void *destBuffer) override;

+		bool getScanline(bool &inVerticalBlank, unsigned int &scanline) override;

 

 		void drawText(int x, int y, const char *string, ...);

 

diff --git a/src/Main/FrameBufferGDI.cpp b/src/Main/FrameBufferGDI.cpp
index 02b5270..9251edb 100644
--- a/src/Main/FrameBufferGDI.cpp
+++ b/src/Main/FrameBufferGDI.cpp
@@ -68,14 +68,14 @@
 	{
 	}
 
-	void FrameBufferGDI::flip(void *source, Format format)
+	void FrameBufferGDI::flip(void *source, Format sourceFormat, size_t sourceStride)
 	{
-		blit(source, 0, 0, format);
+		blit(source, 0, 0, sourceFormat, sourceStride);
 	}
 	
-	void FrameBufferGDI::blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format)
+	void FrameBufferGDI::blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride)
 	{
-		copy(source, format);
+		copy(source, sourceFormat, sourceStride);
 
 		int sourceLeft = sourceRect ? sourceRect->x0 : 0;
 		int sourceTop = sourceRect ? sourceRect->y0 : 0;
@@ -89,12 +89,12 @@
 		StretchBlt(windowContext, destLeft, destTop, destWidth, destHeight, bitmapContext, sourceLeft, sourceTop, sourceWidth, sourceHeight, SRCCOPY);
 	}
 
-	void FrameBufferGDI::flip(HWND windowOverride, void *source, Format format)
+	void FrameBufferGDI::flip(HWND windowOverride, void *source, Format sourceFormat, size_t sourceStride)
 	{
-		blit(windowOverride, source, 0, 0, format);
+		blit(windowOverride, source, 0, 0, sourceFormat, sourceStride);
 	}
 
-	void FrameBufferGDI::blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format format)
+	void FrameBufferGDI::blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride)
 	{
 		if(windowed && windowOverride != 0 && windowOverride != bitmapWindow)
 		{
@@ -102,7 +102,7 @@
 			init(windowOverride);
 		}
 
-		blit(source, sourceRect, destRect, format);
+		blit(source, sourceRect, destRect, sourceFormat, sourceStride);
 	}
 
 	void FrameBufferGDI::setGammaRamp(GammaRamp *gammaRamp, bool calibrate)
diff --git a/src/Main/FrameBufferGDI.hpp b/src/Main/FrameBufferGDI.hpp
index a2afc6c..b4b4976 100644
--- a/src/Main/FrameBufferGDI.hpp
+++ b/src/Main/FrameBufferGDI.hpp
@@ -23,20 +23,20 @@
 

 		virtual ~FrameBufferGDI();

 		

-		virtual void flip(void *source, Format format);

-		virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format);

+		void flip(void *source, Format sourceFormat, size_t sourceStride) override;

+		void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) override;

 

-		virtual void flip(HWND windowOverride, void *source, Format format);

-		virtual void blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format format);

+		void flip(HWND windowOverride, void *source, Format sourceFormat, size_t sourceStride) override;

+		void blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) override;

 

-		virtual void *lock();

-		virtual void unlock();

+		void *lock() override;

+		void unlock() override;

 

-		virtual void setGammaRamp(GammaRamp *gammaRamp, bool calibrate);

-		virtual void getGammaRamp(GammaRamp *gammaRamp);

+		void setGammaRamp(GammaRamp *gammaRamp, bool calibrate) override;

+		void getGammaRamp(GammaRamp *gammaRamp) override;

 

-		virtual void screenshot(void *destBuffer);

-		virtual bool getScanline(bool &inVerticalBlank, unsigned int &scanline);

+		void screenshot(void *destBuffer) override;

+		bool getScanline(bool &inVerticalBlank, unsigned int &scanline) override;

 

 	private:

 		void init(HWND bitmapWindow);

diff --git a/src/Main/FrameBufferWin.hpp b/src/Main/FrameBufferWin.hpp
index 443638d..c0d554d 100644
--- a/src/Main/FrameBufferWin.hpp
+++ b/src/Main/FrameBufferWin.hpp
@@ -30,14 +30,8 @@
 

 		virtual ~FrameBufferWin();

 

-		virtual void flip(void *source, Format format) = 0;

-		virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format) = 0;

-

-		virtual void flip(HWND windowOverride, void *source, Format format) = 0;

-		virtual void blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format format) = 0;

-

-		virtual void *lock() = 0;

-		virtual void unlock() = 0;

+		virtual void flip(HWND windowOverride, void *source, Format sourceFormat, size_t sourceStride) = 0;

+		virtual void blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) = 0;

 

 		virtual void setGammaRamp(GammaRamp *gammaRamp, bool calibrate) = 0;

 		virtual void getGammaRamp(GammaRamp *gammaRamp) = 0;

diff --git a/src/Main/FrameBufferX11.cpp b/src/Main/FrameBufferX11.cpp
index c43a930..d4286f1 100644
--- a/src/Main/FrameBufferX11.cpp
+++ b/src/Main/FrameBufferX11.cpp
@@ -127,9 +127,9 @@
 		locked = 0;

 	}

 

-	void FrameBufferX11::blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format)

+	void FrameBufferX11::blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride)

 	{

-		copy(source, format);

+		copy(source, sourceFormat, sourceStride);

 

 		if(!mit_shm)

 		{

diff --git a/src/Main/FrameBufferX11.hpp b/src/Main/FrameBufferX11.hpp
index 4bd2e0a..c5e8b53 100644
--- a/src/Main/FrameBufferX11.hpp
+++ b/src/Main/FrameBufferX11.hpp
@@ -32,11 +32,11 @@
 

 		~FrameBufferX11();

 

-		virtual void flip(void *source, Format format) {blit(source, 0, 0, format);};

-		virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format);

+		void flip(void *source, Format sourceFormat, size_t sourceStride) override {blit(source, 0, 0, sourceFormat, sourceStride);};

+		void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) override;

 

-		virtual void *lock();

-		virtual void unlock();

+		void *lock() override;

+		void unlock() override;

 

 	private:

 		bool ownX11;

diff --git a/src/OpenGL/libEGL/Surface.cpp b/src/OpenGL/libEGL/Surface.cpp
index 57d9f5a..f85c42d 100644
--- a/src/OpenGL/libEGL/Surface.cpp
+++ b/src/OpenGL/libEGL/Surface.cpp
@@ -257,7 +257,7 @@
 	if(backBuffer && frameBuffer)

     {

 		void *source = backBuffer->lockInternal(0, 0, 0, sw::LOCK_READONLY, sw::PUBLIC);

-		frameBuffer->flip(source, backBuffer->Surface::getInternalFormat());

+		frameBuffer->flip(source, backBuffer->Surface::getInternalFormat(), backBuffer->getInternalPitchB());

 		backBuffer->unlockInternal();

 

         checkForResize();

diff --git a/tests/third_party/PowerVR/Examples/Intermediate/ColourGrading/OGLES2/Build/WindowsVC2010/OGLES2ColourGrading.vcxproj.user b/tests/third_party/PowerVR/Examples/Intermediate/ColourGrading/OGLES2/Build/WindowsVC2010/OGLES2ColourGrading.vcxproj.user
index a2ad25d..d3daaab 100644
--- a/tests/third_party/PowerVR/Examples/Intermediate/ColourGrading/OGLES2/Build/WindowsVC2010/OGLES2ColourGrading.vcxproj.user
+++ b/tests/third_party/PowerVR/Examples/Intermediate/ColourGrading/OGLES2/Build/WindowsVC2010/OGLES2ColourGrading.vcxproj.user
@@ -8,4 +8,12 @@
     <LocalDebuggerEnvironment>PATH=$(SolutionDir)..\lib\$(Configuration)_$(Platform)</LocalDebuggerEnvironment>

     <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>

   </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

+    <LocalDebuggerEnvironment>PATH=$(SolutionDir)..\lib\$(Configuration)_$(Platform)</LocalDebuggerEnvironment>

+    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

+    <LocalDebuggerEnvironment>PATH=$(SolutionDir)..\lib\$(Configuration)_$(Platform)</LocalDebuggerEnvironment>

+    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>

+  </PropertyGroup>

 </Project>
\ No newline at end of file