Commit 22bc79c2 by Nicolas Capens

Use explicit stride for framebuffer blit.

Change-Id: I68685932934caba4d9fab7b45014d24316ce45a8 Reviewed-on: https://swiftshader-review.googlesource.com/4293Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 925c2827
...@@ -150,7 +150,7 @@ namespace sw ...@@ -150,7 +150,7 @@ namespace sw
cursorPositionY = y; cursorPositionY = y;
} }
void FrameBuffer::copy(void *source, Format format) void FrameBuffer::copy(void *source, Format format, size_t stride)
{ {
if(!source) if(!source)
{ {
...@@ -170,11 +170,7 @@ namespace sw ...@@ -170,11 +170,7 @@ namespace sw
} }
else else
{ {
const int width2 = (width + 1) & ~1; target = (byte*)source + (height - 1) * stride;
const int sBytes = Surface::bytes(sourceFormat);
const int sStride = sBytes * width2;
target = (byte*)source + (height - 1) * sStride;
} }
cursorX = cursorPositionX - cursorHotspotX; cursorX = cursorPositionX - cursorHotspotX;
......
...@@ -42,8 +42,8 @@ namespace sw ...@@ -42,8 +42,8 @@ namespace sw
int getHeight() const; int getHeight() const;
int getStride() const; int getStride() const;
virtual void flip(void *source, 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 format) = 0; virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) = 0;
virtual void *lock() = 0; virtual void *lock() = 0;
virtual void unlock() = 0; virtual void unlock() = 0;
...@@ -55,7 +55,7 @@ namespace sw ...@@ -55,7 +55,7 @@ namespace sw
static Routine *copyRoutine(const BlitState &state); static Routine *copyRoutine(const BlitState &state);
protected: protected:
void copy(void *source, Format format); void copy(void *source, Format format, size_t stride);
int width; int width;
int height; int height;
Format sourceFormat; Format sourceFormat;
......
...@@ -28,9 +28,9 @@ namespace sw ...@@ -28,9 +28,9 @@ namespace sw
nativeWindow->common.decRef(&nativeWindow->common); 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) if (buffer)
{ {
nativeWindow->queueBuffer(nativeWindow, buffer, -1); nativeWindow->queueBuffer(nativeWindow, buffer, -1);
......
...@@ -16,11 +16,11 @@ namespace sw ...@@ -16,11 +16,11 @@ namespace sw
~FrameBufferAndroid(); ~FrameBufferAndroid();
virtual void flip(void *source, Format format) {blit(source, 0, 0, format);}; void flip(void *source, Format sourceFormat, size_t sourceStride) override {blit(source, 0, 0, sourceFormat, sourceStride);};
virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format); void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) override;
virtual void *lock(); void *lock() override;
virtual void unlock(); void unlock() override;
bool setSwapRectangle(int l, int t, int w, int h); bool setSwapRectangle(int l, int t, int w, int h);
......
...@@ -247,9 +247,9 @@ namespace sw ...@@ -247,9 +247,9 @@ namespace sw
updateBounds(windowHandle); 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()) if(!readySurfaces())
{ {
...@@ -278,9 +278,9 @@ namespace sw ...@@ -278,9 +278,9 @@ namespace sw
} }
} }
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()) if(!readySurfaces())
{ {
...@@ -317,20 +317,20 @@ namespace sw ...@@ -317,20 +317,20 @@ namespace sw
} }
} }
void FrameBufferDD::flip(HWND windowOverride, void *source, Format format) void FrameBufferDD::flip(HWND windowOverride, void *source, Format sourceFormat, size_t sourceStride)
{ {
updateClipper(windowOverride); updateClipper(windowOverride);
updateBounds(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); updateClipper(windowOverride);
updateBounds(windowOverride); updateBounds(windowOverride);
blit(source, sourceRect, destRect, format); blit(source, sourceRect, destRect, sourceFormat, sourceStride);
} }
void FrameBufferDD::screenshot(void *destBuffer) void FrameBufferDD::screenshot(void *destBuffer)
......
...@@ -25,20 +25,20 @@ namespace sw ...@@ -25,20 +25,20 @@ namespace sw
virtual ~FrameBufferDD(); virtual ~FrameBufferDD();
virtual void flip(void *source, Format format); void flip(void *source, Format sourceFormat, size_t sourceStride) override;
virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format); 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); void flip(HWND windowOverride, void *source, Format sourceFormat, size_t sourceStride) override;
virtual void blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format format); void blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) override;
virtual void *lock(); void *lock() override;
virtual void unlock(); void unlock() override;
virtual void setGammaRamp(GammaRamp *gammaRamp, bool calibrate); void setGammaRamp(GammaRamp *gammaRamp, bool calibrate) override;
virtual void getGammaRamp(GammaRamp *gammaRamp); void getGammaRamp(GammaRamp *gammaRamp) override;
virtual void screenshot(void *destBuffer); void screenshot(void *destBuffer) override;
virtual bool getScanline(bool &inVerticalBlank, unsigned int &scanline); bool getScanline(bool &inVerticalBlank, unsigned int &scanline) override;
void drawText(int x, int y, const char *string, ...); void drawText(int x, int y, const char *string, ...);
......
...@@ -68,14 +68,14 @@ namespace sw ...@@ -68,14 +68,14 @@ namespace sw
{ {
} }
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 sourceLeft = sourceRect ? sourceRect->x0 : 0;
int sourceTop = sourceRect ? sourceRect->y0 : 0; int sourceTop = sourceRect ? sourceRect->y0 : 0;
...@@ -89,12 +89,12 @@ namespace sw ...@@ -89,12 +89,12 @@ namespace sw
StretchBlt(windowContext, destLeft, destTop, destWidth, destHeight, bitmapContext, sourceLeft, sourceTop, sourceWidth, sourceHeight, SRCCOPY); 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) if(windowed && windowOverride != 0 && windowOverride != bitmapWindow)
{ {
...@@ -102,7 +102,7 @@ namespace sw ...@@ -102,7 +102,7 @@ namespace sw
init(windowOverride); init(windowOverride);
} }
blit(source, sourceRect, destRect, format); blit(source, sourceRect, destRect, sourceFormat, sourceStride);
} }
void FrameBufferGDI::setGammaRamp(GammaRamp *gammaRamp, bool calibrate) void FrameBufferGDI::setGammaRamp(GammaRamp *gammaRamp, bool calibrate)
......
...@@ -23,20 +23,20 @@ namespace sw ...@@ -23,20 +23,20 @@ namespace sw
virtual ~FrameBufferGDI(); virtual ~FrameBufferGDI();
virtual void flip(void *source, Format format); void flip(void *source, Format sourceFormat, size_t sourceStride) override;
virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format); 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); void flip(HWND windowOverride, void *source, Format sourceFormat, size_t sourceStride) override;
virtual void blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format format); void blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) override;
virtual void *lock(); void *lock() override;
virtual void unlock(); void unlock() override;
virtual void setGammaRamp(GammaRamp *gammaRamp, bool calibrate); void setGammaRamp(GammaRamp *gammaRamp, bool calibrate) override;
virtual void getGammaRamp(GammaRamp *gammaRamp); void getGammaRamp(GammaRamp *gammaRamp) override;
virtual void screenshot(void *destBuffer); void screenshot(void *destBuffer) override;
virtual bool getScanline(bool &inVerticalBlank, unsigned int &scanline); bool getScanline(bool &inVerticalBlank, unsigned int &scanline) override;
private: private:
void init(HWND bitmapWindow); void init(HWND bitmapWindow);
......
...@@ -30,14 +30,8 @@ namespace sw ...@@ -30,14 +30,8 @@ namespace sw
virtual ~FrameBufferWin(); virtual ~FrameBufferWin();
virtual void flip(void *source, Format format) = 0; virtual void flip(HWND windowOverride, void *source, Format sourceFormat, size_t sourceStride) = 0;
virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format) = 0; virtual void blit(HWND windowOverride, void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) = 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 setGammaRamp(GammaRamp *gammaRamp, bool calibrate) = 0; virtual void setGammaRamp(GammaRamp *gammaRamp, bool calibrate) = 0;
virtual void getGammaRamp(GammaRamp *gammaRamp) = 0; virtual void getGammaRamp(GammaRamp *gammaRamp) = 0;
......
...@@ -127,9 +127,9 @@ namespace sw ...@@ -127,9 +127,9 @@ namespace sw
locked = 0; 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) if(!mit_shm)
{ {
......
...@@ -32,11 +32,11 @@ namespace sw ...@@ -32,11 +32,11 @@ namespace sw
~FrameBufferX11(); ~FrameBufferX11();
virtual void flip(void *source, Format format) {blit(source, 0, 0, format);}; void flip(void *source, Format sourceFormat, size_t sourceStride) override {blit(source, 0, 0, sourceFormat, sourceStride);};
virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format); void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) override;
virtual void *lock(); void *lock() override;
virtual void unlock(); void unlock() override;
private: private:
bool ownX11; bool ownX11;
......
...@@ -257,7 +257,7 @@ void WindowSurface::swap() ...@@ -257,7 +257,7 @@ void WindowSurface::swap()
if(backBuffer && frameBuffer) if(backBuffer && frameBuffer)
{ {
void *source = backBuffer->lockInternal(0, 0, 0, sw::LOCK_READONLY, sw::PUBLIC); 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(); backBuffer->unlockInternal();
checkForResize(); checkForResize();
......
...@@ -8,4 +8,12 @@ ...@@ -8,4 +8,12 @@
<LocalDebuggerEnvironment>PATH=$(SolutionDir)..\lib\$(Configuration)_$(Platform)</LocalDebuggerEnvironment> <LocalDebuggerEnvironment>PATH=$(SolutionDir)..\lib\$(Configuration)_$(Platform)</LocalDebuggerEnvironment>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup> </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> </Project>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment