diff options
author | senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-12-02 19:11:17 +0000 |
---|---|---|
committer | senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-12-02 19:11:17 +0000 |
commit | ef843cdcd1be858fe55cc99ff134ffbd080c9a51 (patch) | |
tree | 7444455a3085d02aa86e3c5c3b0c2e0df2f264f8 /src/gpu/GrContext.cpp | |
parent | c62b0f8fd0cfaee1791e7bb4f349ad165df4f86b (diff) |
When a bitmap is texture-backed, change SkBitmap::copyTo() to do a deep
copy of the texels in VRAM rather than a readback and re-upload. This
gives a 3-10X speedup on recursive canvas-to-canvas draws.
N.B.: This introduces a new GM test, which will need new baselines.
git-svn-id: http://skia.googlecode.com/svn/trunk@2790 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/gpu/GrContext.cpp')
-rw-r--r-- | src/gpu/GrContext.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index 70c9f6de2f..e4b1150824 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -1813,6 +1813,27 @@ bool GrContext::internalReadRenderTargetPixels(GrRenderTarget* target, config, buffer, rowBytes, flipY); } +void GrContext::copyTexture(GrTexture* src, GrRenderTarget* dst) { + if (NULL == src || NULL == dst) { + return; + } + ASSERT_OWNED_RESOURCE(src); + + GrDrawTarget::AutoStateRestore asr(fGpu); + reset_target_state(fGpu); + fGpu->setRenderTarget(dst); + GrSamplerState sampler(GrSamplerState::kClamp_WrapMode, + GrSamplerState::kClamp_WrapMode, + GrSamplerState::kNearest_Filter); + GrMatrix sampleM; + sampleM.setIDiv(src->width(), src->height()); + sampler.setMatrix(sampleM); + fGpu->setTexture(0, src); + fGpu->setSamplerState(0, sampler); + SkRect rect = SkRect::MakeXYWH(0, 0, src->width(), src->height()); + fGpu->drawSimpleRect(rect, NULL, 1 << 0); +} + void GrContext::internalWriteRenderTargetPixels(GrRenderTarget* target, int left, int top, int width, int height, |