| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "GrContext.h" | 9 #include "GrContext.h" |
| 10 | 10 |
| 11 #include "GrAARectRenderer.h" | 11 #include "GrAARectRenderer.h" |
| 12 #include "GrAtlasTextContext.h" | 12 #include "GrAtlasTextContext.h" |
| 13 #include "GrBatch.h" | 13 #include "GrBatch.h" |
| 14 #include "GrBatchFontCache.h" | 14 #include "GrBatchFontCache.h" |
| 15 #include "GrBatchTarget.h" | 15 #include "GrBatchTarget.h" |
| 16 #include "GrBufferAllocPool.h" | |
| 17 #include "GrDefaultGeoProcFactory.h" | 16 #include "GrDefaultGeoProcFactory.h" |
| 18 #include "GrGpuResource.h" | 17 #include "GrGpuResource.h" |
| 19 #include "GrGpuResourcePriv.h" | 18 #include "GrGpuResourcePriv.h" |
| 20 #include "GrDrawTargetCaps.h" | 19 #include "GrDrawTargetCaps.h" |
| 21 #include "GrGpu.h" | 20 #include "GrGpu.h" |
| 22 #include "GrIndexBuffer.h" | 21 #include "GrIndexBuffer.h" |
| 23 #include "GrInOrderDrawBuffer.h" | 22 #include "GrInOrderDrawBuffer.h" |
| 24 #include "GrLayerCache.h" | 23 #include "GrLayerCache.h" |
| 25 #include "GrOvalRenderer.h" | 24 #include "GrOvalRenderer.h" |
| 26 #include "GrPathRenderer.h" | 25 #include "GrPathRenderer.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 43 #include "SkRRect.h" | 42 #include "SkRRect.h" |
| 44 #include "SkStrokeRec.h" | 43 #include "SkStrokeRec.h" |
| 45 #include "SkTLazy.h" | 44 #include "SkTLazy.h" |
| 46 #include "SkTLS.h" | 45 #include "SkTLS.h" |
| 47 #include "SkTraceEvent.h" | 46 #include "SkTraceEvent.h" |
| 48 | 47 |
| 49 #include "effects/GrConfigConversionEffect.h" | 48 #include "effects/GrConfigConversionEffect.h" |
| 50 #include "effects/GrDashingEffect.h" | 49 #include "effects/GrDashingEffect.h" |
| 51 #include "effects/GrSingleTextureEffect.h" | 50 #include "effects/GrSingleTextureEffect.h" |
| 52 | 51 |
| 53 static const size_t DRAW_BUFFER_VBPOOL_BUFFER_SIZE = 1 << 15; | |
| 54 static const int DRAW_BUFFER_VBPOOL_PREALLOC_BUFFERS = 4; | |
| 55 | |
| 56 static const size_t DRAW_BUFFER_IBPOOL_BUFFER_SIZE = 1 << 11; | |
| 57 static const int DRAW_BUFFER_IBPOOL_PREALLOC_BUFFERS = 4; | |
| 58 | |
| 59 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == this) | 52 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == this) |
| 60 #define RETURN_IF_ABANDONED if (!fDrawBuffer) { return; } | 53 #define RETURN_IF_ABANDONED if (!fDrawBuffer) { return; } |
| 61 #define RETURN_FALSE_IF_ABANDONED if (!fDrawBuffer) { return false; } | 54 #define RETURN_FALSE_IF_ABANDONED if (!fDrawBuffer) { return false; } |
| 62 #define RETURN_NULL_IF_ABANDONED if (!fDrawBuffer) { return NULL; } | 55 #define RETURN_NULL_IF_ABANDONED if (!fDrawBuffer) { return NULL; } |
| 63 | 56 |
| 64 class GrContext::AutoCheckFlush { | 57 class GrContext::AutoCheckFlush { |
| 65 public: | 58 public: |
| 66 AutoCheckFlush(GrContext* context) : fContext(context) { SkASSERT(context);
} | 59 AutoCheckFlush(GrContext* context) : fContext(context) { SkASSERT(context);
} |
| 67 | 60 |
| 68 ~AutoCheckFlush() { | 61 ~AutoCheckFlush() { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 93 } | 86 } |
| 94 | 87 |
| 95 GrContext::GrContext(const Options& opts) : fOptions(opts) { | 88 GrContext::GrContext(const Options& opts) : fOptions(opts) { |
| 96 fGpu = NULL; | 89 fGpu = NULL; |
| 97 fResourceCache = NULL; | 90 fResourceCache = NULL; |
| 98 fResourceProvider = NULL; | 91 fResourceProvider = NULL; |
| 99 fPathRendererChain = NULL; | 92 fPathRendererChain = NULL; |
| 100 fSoftwarePathRenderer = NULL; | 93 fSoftwarePathRenderer = NULL; |
| 101 fBatchFontCache = NULL; | 94 fBatchFontCache = NULL; |
| 102 fDrawBuffer = NULL; | 95 fDrawBuffer = NULL; |
| 103 fDrawBufferVBAllocPool = NULL; | |
| 104 fDrawBufferIBAllocPool = NULL; | |
| 105 fFlushToReduceCacheSize = false; | 96 fFlushToReduceCacheSize = false; |
| 106 fAARectRenderer = NULL; | 97 fAARectRenderer = NULL; |
| 107 fOvalRenderer = NULL; | 98 fOvalRenderer = NULL; |
| 108 fMaxTextureSizeOverride = 1 << 20; | 99 fMaxTextureSizeOverride = 1 << 20; |
| 109 } | 100 } |
| 110 | 101 |
| 111 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) { | 102 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) { |
| 112 SkASSERT(NULL == fGpu); | 103 SkASSERT(NULL == fGpu); |
| 113 | 104 |
| 114 fGpu = GrGpu::Create(backend, backendContext, this); | 105 fGpu = GrGpu::Create(backend, backendContext, this); |
| 115 if (NULL == fGpu) { | 106 if (NULL == fGpu) { |
| 116 return false; | 107 return false; |
| 117 } | 108 } |
| 118 this->initCommon(); | 109 this->initCommon(); |
| 119 return true; | 110 return true; |
| 120 } | 111 } |
| 121 | 112 |
| 122 void GrContext::initCommon() { | 113 void GrContext::initCommon() { |
| 123 fResourceCache = SkNEW(GrResourceCache); | 114 fResourceCache = SkNEW(GrResourceCache); |
| 124 fResourceCache->setOverBudgetCallback(OverBudgetCB, this); | 115 fResourceCache->setOverBudgetCallback(OverBudgetCB, this); |
| 125 fResourceProvider = SkNEW_ARGS(GrResourceProvider, (fGpu, fResourceCache)); | 116 fResourceProvider = SkNEW_ARGS(GrResourceProvider, (fGpu, fResourceCache)); |
| 126 | 117 |
| 127 fLayerCache.reset(SkNEW_ARGS(GrLayerCache, (this))); | 118 fLayerCache.reset(SkNEW_ARGS(GrLayerCache, (this))); |
| 128 | 119 |
| 129 fAARectRenderer = SkNEW(GrAARectRenderer); | 120 fAARectRenderer = SkNEW(GrAARectRenderer); |
| 130 fOvalRenderer = SkNEW(GrOvalRenderer); | 121 fOvalRenderer = SkNEW(GrOvalRenderer); |
| 131 | 122 |
| 132 fDidTestPMConversions = false; | 123 fDidTestPMConversions = false; |
| 133 | 124 |
| 134 this->setupDrawBuffer(); | 125 fDrawBuffer = SkNEW_ARGS(GrInOrderDrawBuffer, (this)); |
| 135 | 126 |
| 136 // GrBatchFontCache will eventually replace GrFontCache | 127 // GrBatchFontCache will eventually replace GrFontCache |
| 137 fBatchFontCache = SkNEW_ARGS(GrBatchFontCache, (this)); | 128 fBatchFontCache = SkNEW_ARGS(GrBatchFontCache, (this)); |
| 138 | 129 |
| 139 fTextBlobCache.reset(SkNEW_ARGS(GrTextBlobCache, (TextBlobCacheOverBudgetCB,
this))); | 130 fTextBlobCache.reset(SkNEW_ARGS(GrTextBlobCache, (TextBlobCacheOverBudgetCB,
this))); |
| 140 } | 131 } |
| 141 | 132 |
| 142 GrContext::~GrContext() { | 133 GrContext::~GrContext() { |
| 143 if (NULL == fGpu) { | 134 if (NULL == fGpu) { |
| 144 return; | 135 return; |
| 145 } | 136 } |
| 146 | 137 |
| 147 this->flush(); | 138 this->flush(); |
| 148 | 139 |
| 149 for (int i = 0; i < fCleanUpData.count(); ++i) { | 140 for (int i = 0; i < fCleanUpData.count(); ++i) { |
| 150 (*fCleanUpData[i].fFunc)(this, fCleanUpData[i].fInfo); | 141 (*fCleanUpData[i].fFunc)(this, fCleanUpData[i].fInfo); |
| 151 } | 142 } |
| 152 | 143 |
| 153 SkDELETE(fResourceProvider); | 144 SkDELETE(fResourceProvider); |
| 154 SkDELETE(fResourceCache); | 145 SkDELETE(fResourceCache); |
| 155 SkDELETE(fBatchFontCache); | 146 SkDELETE(fBatchFontCache); |
| 156 SkDELETE(fDrawBuffer); | 147 SkDELETE(fDrawBuffer); |
| 157 SkDELETE(fDrawBufferVBAllocPool); | |
| 158 SkDELETE(fDrawBufferIBAllocPool); | |
| 159 | 148 |
| 160 fAARectRenderer->unref(); | 149 fAARectRenderer->unref(); |
| 161 fOvalRenderer->unref(); | 150 fOvalRenderer->unref(); |
| 162 | 151 |
| 163 fGpu->unref(); | 152 fGpu->unref(); |
| 164 SkSafeUnref(fPathRendererChain); | 153 SkSafeUnref(fPathRendererChain); |
| 165 SkSafeUnref(fSoftwarePathRenderer); | 154 SkSafeUnref(fSoftwarePathRenderer); |
| 166 } | 155 } |
| 167 | 156 |
| 168 void GrContext::abandonContext() { | 157 void GrContext::abandonContext() { |
| 169 fResourceProvider->abandon(); | 158 fResourceProvider->abandon(); |
| 170 // abandon first to so destructors | 159 // abandon first to so destructors |
| 171 // don't try to free the resources in the API. | 160 // don't try to free the resources in the API. |
| 172 fResourceCache->abandonAll(); | 161 fResourceCache->abandonAll(); |
| 173 | 162 |
| 174 fGpu->contextAbandoned(); | 163 fGpu->contextAbandoned(); |
| 175 | 164 |
| 176 // a path renderer may be holding onto resources that | 165 // a path renderer may be holding onto resources that |
| 177 // are now unusable | 166 // are now unusable |
| 178 SkSafeSetNull(fPathRendererChain); | 167 SkSafeSetNull(fPathRendererChain); |
| 179 SkSafeSetNull(fSoftwarePathRenderer); | 168 SkSafeSetNull(fSoftwarePathRenderer); |
| 180 | 169 |
| 181 delete fDrawBuffer; | 170 SkDELETE(fDrawBuffer); |
| 182 fDrawBuffer = NULL; | 171 fDrawBuffer = NULL; |
| 183 | 172 |
| 184 delete fDrawBufferVBAllocPool; | |
| 185 fDrawBufferVBAllocPool = NULL; | |
| 186 | |
| 187 delete fDrawBufferIBAllocPool; | |
| 188 fDrawBufferIBAllocPool = NULL; | |
| 189 | |
| 190 fBatchFontCache->freeAll(); | 173 fBatchFontCache->freeAll(); |
| 191 fLayerCache->freeAll(); | 174 fLayerCache->freeAll(); |
| 192 fTextBlobCache->freeAll(); | 175 fTextBlobCache->freeAll(); |
| 193 } | 176 } |
| 194 | 177 |
| 195 void GrContext::resetContext(uint32_t state) { | 178 void GrContext::resetContext(uint32_t state) { |
| 196 fGpu->markContextDirty(state); | 179 fGpu->markContextDirty(state); |
| 197 } | 180 } |
| 198 | 181 |
| 199 void GrContext::freeGpuResources() { | 182 void GrContext::freeGpuResources() { |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 467 Geometry& args = fGeoData[0]; | 450 Geometry& args = fGeoData[0]; |
| 468 | 451 |
| 469 int vertexCount = kVertsPerHairlineRect; | 452 int vertexCount = kVertsPerHairlineRect; |
| 470 if (args.fStrokeWidth > 0) { | 453 if (args.fStrokeWidth > 0) { |
| 471 vertexCount = kVertsPerStrokeRect; | 454 vertexCount = kVertsPerStrokeRect; |
| 472 } | 455 } |
| 473 | 456 |
| 474 const GrVertexBuffer* vertexBuffer; | 457 const GrVertexBuffer* vertexBuffer; |
| 475 int firstVertex; | 458 int firstVertex; |
| 476 | 459 |
| 477 void* verts = batchTarget->vertexPool()->makeSpace(vertexStride, | 460 void* verts = batchTarget->makeVertSpace(vertexStride, vertexCount, |
| 478 vertexCount, | 461 &vertexBuffer, &firstVertex); |
| 479 &vertexBuffer, | |
| 480 &firstVertex); | |
| 481 | 462 |
| 482 if (!verts) { | 463 if (!verts) { |
| 483 SkDebugf("Could not allocate vertices\n"); | 464 SkDebugf("Could not allocate vertices\n"); |
| 484 return; | 465 return; |
| 485 } | 466 } |
| 486 | 467 |
| 487 SkPoint* vertex = reinterpret_cast<SkPoint*>(verts); | 468 SkPoint* vertex = reinterpret_cast<SkPoint*>(verts); |
| 488 | 469 |
| 489 GrPrimitiveType primType; | 470 GrPrimitiveType primType; |
| 490 | 471 |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 805 size_t vertexStride = gp->getVertexStride(); | 786 size_t vertexStride = gp->getVertexStride(); |
| 806 | 787 |
| 807 SkASSERT(vertexStride == sizeof(SkPoint) + (this->hasLocalCoords() ? siz
eof(SkPoint) : 0) | 788 SkASSERT(vertexStride == sizeof(SkPoint) + (this->hasLocalCoords() ? siz
eof(SkPoint) : 0) |
| 808 + (this->hasColors() ? sizeof(G
rColor) : 0)); | 789 + (this->hasColors() ? sizeof(G
rColor) : 0)); |
| 809 | 790 |
| 810 int instanceCount = fGeoData.count(); | 791 int instanceCount = fGeoData.count(); |
| 811 | 792 |
| 812 const GrVertexBuffer* vertexBuffer; | 793 const GrVertexBuffer* vertexBuffer; |
| 813 int firstVertex; | 794 int firstVertex; |
| 814 | 795 |
| 815 void* verts = batchTarget->vertexPool()->makeSpace(vertexStride, | 796 void* verts = batchTarget->makeVertSpace(vertexStride, this->vertexCount
(), |
| 816 this->vertexCount(), | 797 &vertexBuffer, &firstVertex); |
| 817 &vertexBuffer, | |
| 818 &firstVertex); | |
| 819 | 798 |
| 820 if (!verts) { | 799 if (!verts) { |
| 821 SkDebugf("Could not allocate vertices\n"); | 800 SkDebugf("Could not allocate vertices\n"); |
| 822 return; | 801 return; |
| 823 } | 802 } |
| 824 | 803 |
| 825 const GrIndexBuffer* indexBuffer = NULL; | 804 const GrIndexBuffer* indexBuffer = NULL; |
| 826 int firstIndex = 0; | 805 int firstIndex = 0; |
| 827 | 806 |
| 828 void* indices = NULL; | 807 uint16_t* indices = NULL; |
| 829 if (this->hasIndices()) { | 808 if (this->hasIndices()) { |
| 830 indices = batchTarget->indexPool()->makeSpace(this->indexCount(), | 809 indices = batchTarget->makeIndexSpace(this->indexCount(), &indexBuff
er, &firstIndex); |
| 831 &indexBuffer, | |
| 832 &firstIndex); | |
| 833 | 810 |
| 834 if (!indices) { | 811 if (!indices) { |
| 835 SkDebugf("Could not allocate indices\n"); | 812 SkDebugf("Could not allocate indices\n"); |
| 836 return; | 813 return; |
| 837 } | 814 } |
| 838 } | 815 } |
| 839 | 816 |
| 840 int indexOffset = 0; | 817 int indexOffset = 0; |
| 841 int vertexOffset = 0; | 818 int vertexOffset = 0; |
| 842 for (int i = 0; i < instanceCount; i++) { | 819 for (int i = 0; i < instanceCount; i++) { |
| 843 const Geometry& args = fGeoData[i]; | 820 const Geometry& args = fGeoData[i]; |
| 844 | 821 |
| 845 // TODO we can actually cache this interleaved and then just memcopy | 822 // TODO we can actually cache this interleaved and then just memcopy |
| 846 if (this->hasIndices()) { | 823 if (this->hasIndices()) { |
| 847 for (int j = 0; j < args.fIndices.count(); ++j, ++indexOffset) { | 824 for (int j = 0; j < args.fIndices.count(); ++j, ++indexOffset) { |
| 848 *((uint16_t*)indices + indexOffset) = args.fIndices[j] + ver
texOffset; | 825 *(indices + indexOffset) = args.fIndices[j] + vertexOffset; |
| 849 } | 826 } |
| 850 } | 827 } |
| 851 | 828 |
| 852 for (int j = 0; j < args.fPositions.count(); ++j) { | 829 for (int j = 0; j < args.fPositions.count(); ++j) { |
| 853 *((SkPoint*)verts) = args.fPositions[j]; | 830 *((SkPoint*)verts) = args.fPositions[j]; |
| 854 if (this->hasColors()) { | 831 if (this->hasColors()) { |
| 855 *(GrColor*)((intptr_t)verts + colorOffset) = args.fColors[j]
; | 832 *(GrColor*)((intptr_t)verts + colorOffset) = args.fColors[j]
; |
| 856 } | 833 } |
| 857 if (this->hasLocalCoords()) { | 834 if (this->hasLocalCoords()) { |
| 858 *(SkPoint*)((intptr_t)verts + texOffset) = args.fLocalCoords
[j]; | 835 *(SkPoint*)((intptr_t)verts + texOffset) = args.fLocalCoords
[j]; |
| (...skipping 938 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1797 if (dpi >= 250.0f) { | 1774 if (dpi >= 250.0f) { |
| 1798 chosenSampleCount = 4; | 1775 chosenSampleCount = 4; |
| 1799 } else { | 1776 } else { |
| 1800 chosenSampleCount = 16; | 1777 chosenSampleCount = 16; |
| 1801 } | 1778 } |
| 1802 } | 1779 } |
| 1803 return chosenSampleCount <= fGpu->caps()->maxSampleCount() ? | 1780 return chosenSampleCount <= fGpu->caps()->maxSampleCount() ? |
| 1804 chosenSampleCount : 0; | 1781 chosenSampleCount : 0; |
| 1805 } | 1782 } |
| 1806 | 1783 |
| 1807 void GrContext::setupDrawBuffer() { | |
| 1808 SkASSERT(NULL == fDrawBuffer); | |
| 1809 SkASSERT(NULL == fDrawBufferVBAllocPool); | |
| 1810 SkASSERT(NULL == fDrawBufferIBAllocPool); | |
| 1811 | |
| 1812 fDrawBufferVBAllocPool = | |
| 1813 SkNEW_ARGS(GrVertexBufferAllocPool, (fGpu, | |
| 1814 DRAW_BUFFER_VBPOOL_BUFFER_SIZE, | |
| 1815 DRAW_BUFFER_VBPOOL_PREALLOC_BUFFERS
)); | |
| 1816 fDrawBufferIBAllocPool = | |
| 1817 SkNEW_ARGS(GrIndexBufferAllocPool, (fGpu, | |
| 1818 DRAW_BUFFER_IBPOOL_BUFFER_SIZE, | |
| 1819 DRAW_BUFFER_IBPOOL_PREALLOC_BUFFERS)
); | |
| 1820 | |
| 1821 fDrawBuffer = SkNEW_ARGS(GrInOrderDrawBuffer, (this, | |
| 1822 fDrawBufferVBAllocPool, | |
| 1823 fDrawBufferIBAllocPool)); | |
| 1824 } | |
| 1825 | |
| 1826 GrDrawTarget* GrContext::getTextTarget() { | 1784 GrDrawTarget* GrContext::getTextTarget() { |
| 1827 return this->prepareToDraw(); | 1785 return this->prepareToDraw(); |
| 1828 } | 1786 } |
| 1829 | 1787 |
| 1830 namespace { | 1788 namespace { |
| 1831 void test_pm_conversions(GrContext* ctx, int* pmToUPMValue, int* upmToPMValue) { | 1789 void test_pm_conversions(GrContext* ctx, int* pmToUPMValue, int* upmToPMValue) { |
| 1832 GrConfigConversionEffect::PMConversion pmToUPM; | 1790 GrConfigConversionEffect::PMConversion pmToUPM; |
| 1833 GrConfigConversionEffect::PMConversion upmToPM; | 1791 GrConfigConversionEffect::PMConversion upmToPM; |
| 1834 GrConfigConversionEffect::TestForPreservingPMConversions(ctx, &pmToUPM, &upm
ToPM); | 1792 GrConfigConversionEffect::TestForPreservingPMConversions(ctx, &pmToUPM, &upm
ToPM); |
| 1835 *pmToUPMValue = pmToUPM; | 1793 *pmToUPMValue = pmToUPM; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1892 fDrawBuffer->addGpuTraceMarker(marker); | 1850 fDrawBuffer->addGpuTraceMarker(marker); |
| 1893 } | 1851 } |
| 1894 } | 1852 } |
| 1895 | 1853 |
| 1896 void GrContext::removeGpuTraceMarker(const GrGpuTraceMarker* marker) { | 1854 void GrContext::removeGpuTraceMarker(const GrGpuTraceMarker* marker) { |
| 1897 fGpu->removeGpuTraceMarker(marker); | 1855 fGpu->removeGpuTraceMarker(marker); |
| 1898 if (fDrawBuffer) { | 1856 if (fDrawBuffer) { |
| 1899 fDrawBuffer->removeGpuTraceMarker(marker); | 1857 fDrawBuffer->removeGpuTraceMarker(marker); |
| 1900 } | 1858 } |
| 1901 } | 1859 } |
| OLD | NEW |