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
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 @@ namespace sw
}
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;
......
......@@ -42,8 +42,8 @@ namespace sw
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 @@ namespace sw
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;
......
......@@ -28,9 +28,9 @@ namespace sw
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);
......
......@@ -16,11 +16,11 @@ namespace sw
~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);
......
......@@ -247,9 +247,9 @@ namespace sw
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 @@ 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())
{
......@@ -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);
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)
......
......@@ -25,20 +25,20 @@ namespace sw
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, ...);
......
......@@ -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 sourceTop = sourceRect ? sourceRect->y0 : 0;
......@@ -89,12 +89,12 @@ namespace sw
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 @@ namespace sw
init(windowOverride);
}
blit(source, sourceRect, destRect, format);
blit(source, sourceRect, destRect, sourceFormat, sourceStride);
}
void FrameBufferGDI::setGammaRamp(GammaRamp *gammaRamp, bool calibrate)
......
......@@ -23,20 +23,20 @@ namespace sw
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);
......
......@@ -30,14 +30,8 @@ namespace sw
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;
......
......@@ -127,9 +127,9 @@ namespace sw
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)
{
......
......@@ -32,11 +32,11 @@ namespace sw
~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;
......
......@@ -257,7 +257,7 @@ void WindowSurface::swap()
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();
......
......@@ -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
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