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;