Improve GPU blur speed by clearing only when necessary. This gives a
1.8X speedup on the Blurs sample, and 2.3X on the BigBlur sample. We don't need to clear while downsampling, since each step reads only the pixels written in the previous step. We can avoid destination clears before convolution by disabling blending. We also don't need to clear when upsampling, since the upsample step also only reads pixels written by the convolution. The only clears we then need to do are on each side of the srcRect used for convolution. Since our srcRect is always offset to (0, 0), we only need to clear on the right and bottom. Review URL: http://codereview.appspot.com/4803048/ git-svn-id: http://skia.googlecode.com/svn/trunk@1937 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
6dc745506e
commit
b7f28d6ecd
@ -1736,5 +1736,6 @@ void GrContext::convolve(GrTexture* texture,
|
|||||||
fGpu->setSamplerState(0, sampler);
|
fGpu->setSamplerState(0, sampler);
|
||||||
fGpu->setViewMatrix(GrMatrix::I());
|
fGpu->setViewMatrix(GrMatrix::I());
|
||||||
fGpu->setTexture(0, texture);
|
fGpu->setTexture(0, texture);
|
||||||
|
fGpu->setBlendFunc(kOne_BlendCoeff, kZero_BlendCoeff);
|
||||||
fGpu->drawSimpleRect(rect, NULL, 1 << 0);
|
fGpu->drawSimpleRect(rect, NULL, 1 << 0);
|
||||||
}
|
}
|
||||||
|
@ -913,9 +913,7 @@ static bool drawWithGPUMaskFilter(GrContext* context, const SkPath& path,
|
|||||||
GrClip oldClip = context->getClip();
|
GrClip oldClip = context->getClip();
|
||||||
context->setRenderTarget(dstTexture->asRenderTarget());
|
context->setRenderTarget(dstTexture->asRenderTarget());
|
||||||
context->setClip(srcRect);
|
context->setClip(srcRect);
|
||||||
// FIXME: could just clear bounds
|
|
||||||
context->clear(NULL, 0);
|
context->clear(NULL, 0);
|
||||||
GrMatrix transM;
|
|
||||||
GrPaint tempPaint;
|
GrPaint tempPaint;
|
||||||
tempPaint.reset();
|
tempPaint.reset();
|
||||||
|
|
||||||
@ -959,9 +957,6 @@ static bool drawWithGPUMaskFilter(GrContext* context, const SkPath& path,
|
|||||||
context->setRenderTarget(dstTexture->asRenderTarget());
|
context->setRenderTarget(dstTexture->asRenderTarget());
|
||||||
SkRect dstRect(srcRect);
|
SkRect dstRect(srcRect);
|
||||||
scaleRect(&dstRect, 0.5f);
|
scaleRect(&dstRect, 0.5f);
|
||||||
// Clear out 1 pixel border for linear filtering.
|
|
||||||
// FIXME: for now, clear everything
|
|
||||||
context->clear(NULL, 0);
|
|
||||||
paint.setTexture(0, srcTexture);
|
paint.setTexture(0, srcTexture);
|
||||||
context->drawRectToRect(paint, dstRect, srcRect);
|
context->drawRectToRect(paint, dstRect, srcRect);
|
||||||
srcRect = dstRect;
|
srcRect = dstRect;
|
||||||
@ -972,13 +967,23 @@ static bool drawWithGPUMaskFilter(GrContext* context, const SkPath& path,
|
|||||||
float* kernel = kernelStorage.get();
|
float* kernel = kernelStorage.get();
|
||||||
buildKernel(sigma, kernel, kernelWidth);
|
buildKernel(sigma, kernel, kernelWidth);
|
||||||
|
|
||||||
|
// Clear out a halfWidth to the right of the srcRect to prevent the
|
||||||
|
// X convolution from reading garbage.
|
||||||
|
SkIRect clearRect = SkIRect::MakeXYWH(
|
||||||
|
srcRect.fRight, srcRect.fTop, halfWidth, srcRect.height());
|
||||||
|
context->clear(&clearRect, 0x0);
|
||||||
|
|
||||||
context->setRenderTarget(dstTexture->asRenderTarget());
|
context->setRenderTarget(dstTexture->asRenderTarget());
|
||||||
context->clear(NULL, 0);
|
|
||||||
context->convolveInX(srcTexture, srcRect, kernel, kernelWidth);
|
context->convolveInX(srcTexture, srcRect, kernel, kernelWidth);
|
||||||
SkTSwap(srcTexture, dstTexture);
|
SkTSwap(srcTexture, dstTexture);
|
||||||
|
|
||||||
|
// Clear out a halfWidth below the srcRect to prevent the Y
|
||||||
|
// convolution from reading garbage.
|
||||||
|
clearRect = SkIRect::MakeXYWH(
|
||||||
|
srcRect.fLeft, srcRect.fBottom, srcRect.width(), halfWidth);
|
||||||
|
context->clear(&clearRect, 0x0);
|
||||||
|
|
||||||
context->setRenderTarget(dstTexture->asRenderTarget());
|
context->setRenderTarget(dstTexture->asRenderTarget());
|
||||||
context->clear(NULL, 0);
|
|
||||||
context->convolveInY(srcTexture, srcRect, kernel, kernelWidth);
|
context->convolveInY(srcTexture, srcRect, kernel, kernelWidth);
|
||||||
SkTSwap(srcTexture, dstTexture);
|
SkTSwap(srcTexture, dstTexture);
|
||||||
|
|
||||||
@ -988,9 +993,6 @@ static bool drawWithGPUMaskFilter(GrContext* context, const SkPath& path,
|
|||||||
sampleM.setIDiv(srcTexture->width(), srcTexture->height());
|
sampleM.setIDiv(srcTexture->width(), srcTexture->height());
|
||||||
paint.getTextureSampler(0)->setMatrix(sampleM);
|
paint.getTextureSampler(0)->setMatrix(sampleM);
|
||||||
context->setRenderTarget(dstTexture->asRenderTarget());
|
context->setRenderTarget(dstTexture->asRenderTarget());
|
||||||
// Clear out 2 pixel border for bicubic filtering.
|
|
||||||
// FIXME: for now, clear everything
|
|
||||||
context->clear(NULL, 0);
|
|
||||||
paint.setTexture(0, srcTexture);
|
paint.setTexture(0, srcTexture);
|
||||||
SkRect dstRect(srcRect);
|
SkRect dstRect(srcRect);
|
||||||
scaleRect(&dstRect, scaleFactor);
|
scaleRect(&dstRect, scaleFactor);
|
||||||
|
Loading…
Reference in New Issue
Block a user