OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkGpuDevice.h" | 8 #include "SkGpuDevice.h" |
9 | 9 |
10 #include "GrBlurUtils.h" | 10 #include "GrBlurUtils.h" |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 | 318 |
319 void SkGpuDevice::replaceRenderTarget(bool shouldRetainContent) { | 319 void SkGpuDevice::replaceRenderTarget(bool shouldRetainContent) { |
320 // Caller must have accessed the render target, because it knows the rt must
be replaced. | 320 // Caller must have accessed the render target, because it knows the rt must
be replaced. |
321 SkASSERT(!fNeedClear); | 321 SkASSERT(!fNeedClear); |
322 | 322 |
323 SkSurface::Budgeted budgeted = | 323 SkSurface::Budgeted budgeted = |
324 fRenderTarget->resourcePriv().isBudgeted() ? SkSurface::kYes_Budgete
d | 324 fRenderTarget->resourcePriv().isBudgeted() ? SkSurface::kYes_Budgete
d |
325 : SkSurface::kNo_Budgeted
; | 325 : SkSurface::kNo_Budgeted
; |
326 | 326 |
327 SkAutoTUnref<GrRenderTarget> newRT(CreateRenderTarget( | 327 SkAutoTUnref<GrRenderTarget> newRT(CreateRenderTarget( |
328 fRenderTarget->getContext(), budgeted, this->imageInfo(), fRenderTarget-
>numSamples())); | 328 fRenderTarget->getContext(), budgeted, this->imageInfo(), fRenderTarget-
>desc().fSampleCnt)); |
329 | 329 |
330 if (NULL == newRT) { | 330 if (NULL == newRT) { |
331 return; | 331 return; |
332 } | 332 } |
333 | 333 |
334 if (shouldRetainContent) { | 334 if (shouldRetainContent) { |
335 if (fRenderTarget->wasDestroyed()) { | 335 if (fRenderTarget->wasDestroyed()) { |
336 return; | 336 return; |
337 } | 337 } |
338 this->context()->copySurface(newRT, fRenderTarget); | 338 this->context()->copySurface(newRT, fRenderTarget); |
(...skipping 1336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1675 } | 1675 } |
1676 | 1676 |
1677 /////////////////////////////////////////////////////////////////////////////// | 1677 /////////////////////////////////////////////////////////////////////////////// |
1678 | 1678 |
1679 SkBaseDevice* SkGpuDevice::onCreateDevice(const CreateInfo& cinfo, const SkPaint
*) { | 1679 SkBaseDevice* SkGpuDevice::onCreateDevice(const CreateInfo& cinfo, const SkPaint
*) { |
1680 GrSurfaceDesc desc; | 1680 GrSurfaceDesc desc; |
1681 desc.fConfig = fRenderTarget->config(); | 1681 desc.fConfig = fRenderTarget->config(); |
1682 desc.fFlags = kRenderTarget_GrSurfaceFlag; | 1682 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
1683 desc.fWidth = cinfo.fInfo.width(); | 1683 desc.fWidth = cinfo.fInfo.width(); |
1684 desc.fHeight = cinfo.fInfo.height(); | 1684 desc.fHeight = cinfo.fInfo.height(); |
1685 desc.fSampleCnt = fRenderTarget->numSamples(); | 1685 desc.fSampleCnt = fRenderTarget->desc().fSampleCnt; |
1686 | 1686 |
1687 SkAutoTUnref<GrTexture> texture; | 1687 SkAutoTUnref<GrTexture> texture; |
1688 // Skia's convention is to only clear a device if it is non-opaque. | 1688 // Skia's convention is to only clear a device if it is non-opaque. |
1689 unsigned flags = cinfo.fInfo.isOpaque() ? 0 : kNeedClear_Flag; | 1689 unsigned flags = cinfo.fInfo.isOpaque() ? 0 : kNeedClear_Flag; |
1690 | 1690 |
1691 // layers are never draw in repeat modes, so we can request an approx | 1691 // layers are never draw in repeat modes, so we can request an approx |
1692 // match and ignore any padding. | 1692 // match and ignore any padding. |
1693 const GrTextureProvider::ScratchTexMatch match = (kNever_TileUsage == cinfo.
fTileUsage) ? | 1693 const GrTextureProvider::ScratchTexMatch match = (kNever_TileUsage == cinfo.
fTileUsage) ? |
1694 GrTextureProvider::kApprox_Scr
atchTexMatch : | 1694 GrTextureProvider::kApprox_Scr
atchTexMatch : |
1695 GrTextureProvider::kExact_Scra
tchTexMatch; | 1695 GrTextureProvider::kExact_Scra
tchTexMatch; |
1696 texture.reset(fContext->textureProvider()->refScratchTexture(desc, match)); | 1696 texture.reset(fContext->textureProvider()->refScratchTexture(desc, match)); |
1697 | 1697 |
1698 if (texture) { | 1698 if (texture) { |
1699 SkSurfaceProps props(fSurfaceProps.flags(), cinfo.fPixelGeometry); | 1699 SkSurfaceProps props(fSurfaceProps.flags(), cinfo.fPixelGeometry); |
1700 return SkGpuDevice::Create( | 1700 return SkGpuDevice::Create( |
1701 texture->asRenderTarget(), cinfo.fInfo.width(), cinfo.fInfo.height()
, &props, flags); | 1701 texture->asRenderTarget(), cinfo.fInfo.width(), cinfo.fInfo.height()
, &props, flags); |
1702 } else { | 1702 } else { |
1703 SkErrorInternals::SetError( kInternalError_SkError, | 1703 SkErrorInternals::SetError( kInternalError_SkError, |
1704 "---- failed to create gpu device texture [%
d %d]\n", | 1704 "---- failed to create gpu device texture [%
d %d]\n", |
1705 cinfo.fInfo.width(), cinfo.fInfo.height()); | 1705 cinfo.fInfo.width(), cinfo.fInfo.height()); |
1706 return NULL; | 1706 return NULL; |
1707 } | 1707 } |
1708 } | 1708 } |
1709 | 1709 |
1710 SkSurface* SkGpuDevice::newSurface(const SkImageInfo& info, const SkSurfaceProps
& props) { | 1710 SkSurface* SkGpuDevice::newSurface(const SkImageInfo& info, const SkSurfaceProps
& props) { |
1711 // TODO: Change the signature of newSurface to take a budgeted parameter. | 1711 // TODO: Change the signature of newSurface to take a budgeted parameter. |
1712 static const SkSurface::Budgeted kBudgeted = SkSurface::kNo_Budgeted; | 1712 static const SkSurface::Budgeted kBudgeted = SkSurface::kNo_Budgeted; |
1713 return SkSurface::NewRenderTarget(fContext, kBudgeted, info, fRenderTarget->
numSamples(), | 1713 return SkSurface::NewRenderTarget(fContext, kBudgeted, info, fRenderTarget->
desc().fSampleCnt, |
1714 &props); | 1714 &props); |
1715 } | 1715 } |
1716 | 1716 |
1717 bool SkGpuDevice::EXPERIMENTAL_drawPicture(SkCanvas* mainCanvas, const SkPicture
* mainPicture, | 1717 bool SkGpuDevice::EXPERIMENTAL_drawPicture(SkCanvas* mainCanvas, const SkPicture
* mainPicture, |
1718 const SkMatrix* matrix, const SkPaint
* paint) { | 1718 const SkMatrix* matrix, const SkPaint
* paint) { |
1719 #ifndef SK_IGNORE_GPU_LAYER_HOISTING | 1719 #ifndef SK_IGNORE_GPU_LAYER_HOISTING |
1720 // todo: should handle this natively | 1720 // todo: should handle this natively |
1721 if (paint) { | 1721 if (paint) { |
1722 return false; | 1722 return false; |
1723 } | 1723 } |
(...skipping 19 matching lines...) Expand all Loading... |
1743 } | 1743 } |
1744 | 1744 |
1745 SkRect clipBounds = SkRect::Make(iBounds); | 1745 SkRect clipBounds = SkRect::Make(iBounds); |
1746 | 1746 |
1747 SkMatrix initialMatrix = mainCanvas->getTotalMatrix(); | 1747 SkMatrix initialMatrix = mainCanvas->getTotalMatrix(); |
1748 | 1748 |
1749 GrLayerHoister::FindLayersToAtlas(fContext, mainPicture, | 1749 GrLayerHoister::FindLayersToAtlas(fContext, mainPicture, |
1750 initialMatrix, | 1750 initialMatrix, |
1751 clipBounds, | 1751 clipBounds, |
1752 &atlasedNeedRendering, &atlasedRecycled, | 1752 &atlasedNeedRendering, &atlasedRecycled, |
1753 fRenderTarget->numSamples()); | 1753 fRenderTarget->numColorSamples()); |
1754 | 1754 |
1755 GrLayerHoister::DrawLayersToAtlas(fContext, atlasedNeedRendering); | 1755 GrLayerHoister::DrawLayersToAtlas(fContext, atlasedNeedRendering); |
1756 | 1756 |
1757 SkTDArray<GrHoistedLayer> needRendering, recycled; | 1757 SkTDArray<GrHoistedLayer> needRendering, recycled; |
1758 | 1758 |
1759 SkAutoCanvasMatrixPaint acmp(mainCanvas, matrix, paint, mainPicture->cullRec
t()); | 1759 SkAutoCanvasMatrixPaint acmp(mainCanvas, matrix, paint, mainPicture->cullRec
t()); |
1760 | 1760 |
1761 GrLayerHoister::FindLayersToHoist(fContext, mainPicture, | 1761 GrLayerHoister::FindLayersToHoist(fContext, mainPicture, |
1762 initialMatrix, | 1762 initialMatrix, |
1763 clipBounds, | 1763 clipBounds, |
1764 &needRendering, &recycled, | 1764 &needRendering, &recycled, |
1765 fRenderTarget->numSamples()); | 1765 fRenderTarget->numColorSamples()); |
1766 | 1766 |
1767 GrLayerHoister::DrawLayers(fContext, needRendering); | 1767 GrLayerHoister::DrawLayers(fContext, needRendering); |
1768 | 1768 |
1769 // Render the entire picture using new layers | 1769 // Render the entire picture using new layers |
1770 GrRecordReplaceDraw(mainPicture, mainCanvas, fContext->getLayerCache(), | 1770 GrRecordReplaceDraw(mainPicture, mainCanvas, fContext->getLayerCache(), |
1771 initialMatrix, NULL); | 1771 initialMatrix, NULL); |
1772 | 1772 |
1773 GrLayerHoister::UnlockLayers(fContext, needRendering); | 1773 GrLayerHoister::UnlockLayers(fContext, needRendering); |
1774 GrLayerHoister::UnlockLayers(fContext, recycled); | 1774 GrLayerHoister::UnlockLayers(fContext, recycled); |
1775 GrLayerHoister::UnlockLayers(fContext, atlasedNeedRendering); | 1775 GrLayerHoister::UnlockLayers(fContext, atlasedNeedRendering); |
1776 GrLayerHoister::UnlockLayers(fContext, atlasedRecycled); | 1776 GrLayerHoister::UnlockLayers(fContext, atlasedRecycled); |
1777 | 1777 |
1778 return true; | 1778 return true; |
1779 #else | 1779 #else |
1780 return false; | 1780 return false; |
1781 #endif | 1781 #endif |
1782 } | 1782 } |
1783 | 1783 |
1784 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 1784 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { |
1785 // We always return a transient cache, so it is freed after each | 1785 // We always return a transient cache, so it is freed after each |
1786 // filter traversal. | 1786 // filter traversal. |
1787 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); | 1787 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); |
1788 } | 1788 } |
1789 | 1789 |
1790 #endif | 1790 #endif |
OLD | NEW |