Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/gpu/GrAtlas.cpp

Issue 354533004: Begin atlasing (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Readd missing file Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/GrAtlas.h ('k') | src/gpu/GrLayerCache.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2010 Google Inc. 3 * Copyright 2010 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 "GrAtlas.h" 9 #include "GrAtlas.h"
10 #include "GrContext.h" 10 #include "GrContext.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 fDirtyRect.setEmpty(); 47 fDirtyRect.setEmpty();
48 fDirty = false; 48 fDirty = false;
49 fBatchUploads = batchUploads; 49 fBatchUploads = batchUploads;
50 } 50 }
51 51
52 static inline void adjust_for_offset(SkIPoint16* loc, const SkIPoint16& offset) { 52 static inline void adjust_for_offset(SkIPoint16* loc, const SkIPoint16& offset) {
53 loc->fX += offset.fX; 53 loc->fX += offset.fX;
54 loc->fY += offset.fY; 54 loc->fY += offset.fY;
55 } 55 }
56 56
57 bool GrPlot::addSubImage(int width, int height, const void* image, 57 bool GrPlot::addSubImage(int width, int height, const void* image, SkIPoint16* l oc) {
58 SkIPoint16* loc) {
59 float percentFull = fRects->percentFull(); 58 float percentFull = fRects->percentFull();
60 if (!fRects->addRect(width, height, loc)) { 59 if (!fRects->addRect(width, height, loc)) {
61 return false; 60 return false;
62 } 61 }
63 62
64 // if batching uploads, create backing memory on first use 63 // if batching uploads, create backing memory on first use
65 // once the plot is nearly full we will revert to uploading each subimage in dividually 64 // once the plot is nearly full we will revert to uploading each subimage in dividually
66 int plotWidth = fRects->width(); 65 int plotWidth = fRects->width();
67 int plotHeight = fRects->height(); 66 int plotHeight = fRects->height();
68 if (fBatchUploads && NULL == fPlotData && 0.0f == percentFull) { 67 if (fBatchUploads && NULL == fPlotData && 0.0f == percentFull) {
(...skipping 12 matching lines...) Expand all
81 for (int i = 0; i < height; ++i) { 80 for (int i = 0; i < height; ++i) {
82 memcpy(dataPtr, imagePtr, fBytesPerPixel*width); 81 memcpy(dataPtr, imagePtr, fBytesPerPixel*width);
83 dataPtr += fBytesPerPixel*plotWidth; 82 dataPtr += fBytesPerPixel*plotWidth;
84 imagePtr += fBytesPerPixel*width; 83 imagePtr += fBytesPerPixel*width;
85 } 84 }
86 85
87 fDirtyRect.join(loc->fX, loc->fY, loc->fX + width, loc->fY + height); 86 fDirtyRect.join(loc->fX, loc->fY, loc->fX + width, loc->fY + height);
88 adjust_for_offset(loc, fOffset); 87 adjust_for_offset(loc, fOffset);
89 fDirty = true; 88 fDirty = true;
90 // otherwise, just upload the image directly 89 // otherwise, just upload the image directly
91 } else { 90 } else if (NULL != image) {
92 adjust_for_offset(loc, fOffset); 91 adjust_for_offset(loc, fOffset);
93 GrContext* context = fTexture->getContext(); 92 GrContext* context = fTexture->getContext();
94 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), "GrPlot::uploadToTex ture"); 93 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), "GrPlot::uploadToTex ture");
95 context->writeTexturePixels(fTexture, 94 context->writeTexturePixels(fTexture,
96 loc->fX, loc->fY, width, height, 95 loc->fX, loc->fY, width, height,
97 fTexture->config(), image, 0, 96 fTexture->config(), image, 0,
98 GrContext::kDontFlush_PixelOpsFlag); 97 GrContext::kDontFlush_PixelOpsFlag);
98 } else {
99 adjust_for_offset(loc, fOffset);
99 } 100 }
100 101
101 #if FONT_CACHE_STATS 102 #if FONT_CACHE_STATS
102 ++g_UploadCount; 103 ++g_UploadCount;
103 #endif 104 #endif
104 105
105 return true; 106 return true;
106 } 107 }
107 108
108 void GrPlot::uploadToTexture() { 109 void GrPlot::uploadToTexture() {
(...skipping 30 matching lines...) Expand all
139 } 140 }
140 } 141 }
141 142
142 void GrPlot::resetRects() { 143 void GrPlot::resetRects() {
143 SkASSERT(NULL != fRects); 144 SkASSERT(NULL != fRects);
144 fRects->reset(); 145 fRects->reset();
145 } 146 }
146 147
147 /////////////////////////////////////////////////////////////////////////////// 148 ///////////////////////////////////////////////////////////////////////////////
148 149
149 GrAtlas::GrAtlas(GrGpu* gpu, GrPixelConfig config, 150 GrAtlas::GrAtlas(GrGpu* gpu, GrPixelConfig config, GrTextureFlags flags,
150 const SkISize& backingTextureSize, 151 const SkISize& backingTextureSize,
151 int numPlotsX, int numPlotsY, bool batchUploads) { 152 int numPlotsX, int numPlotsY, bool batchUploads) {
152 fGpu = SkRef(gpu); 153 fGpu = SkRef(gpu);
153 fPixelConfig = config; 154 fPixelConfig = config;
155 fFlags = flags;
154 fBackingTextureSize = backingTextureSize; 156 fBackingTextureSize = backingTextureSize;
155 fNumPlotsX = numPlotsX; 157 fNumPlotsX = numPlotsX;
156 fNumPlotsY = numPlotsY; 158 fNumPlotsY = numPlotsY;
157 fBatchUploads = batchUploads; 159 fBatchUploads = batchUploads;
158 fTexture = NULL; 160 fTexture = NULL;
159 161
160 int textureWidth = fBackingTextureSize.width(); 162 int textureWidth = fBackingTextureSize.width();
161 int textureHeight = fBackingTextureSize.height(); 163 int textureHeight = fBackingTextureSize.height();
162 164
163 int plotWidth = textureWidth / fNumPlotsX; 165 int plotWidth = textureWidth / fNumPlotsX;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 if (plot->addSubImage(width, height, image, loc)) { 216 if (plot->addSubImage(width, height, image, loc)) {
215 this->makeMRU(plot); 217 this->makeMRU(plot);
216 return plot; 218 return plot;
217 } 219 }
218 } 220 }
219 221
220 // before we get a new plot, make sure we have a backing texture 222 // before we get a new plot, make sure we have a backing texture
221 if (NULL == fTexture) { 223 if (NULL == fTexture) {
222 // TODO: Update this to use the cache rather than directly creating a te xture. 224 // TODO: Update this to use the cache rather than directly creating a te xture.
223 GrTextureDesc desc; 225 GrTextureDesc desc;
224 desc.fFlags = kDynamicUpdate_GrTextureFlagBit; 226 desc.fFlags = fFlags | kDynamicUpdate_GrTextureFlagBit;
225 desc.fWidth = fBackingTextureSize.width(); 227 desc.fWidth = fBackingTextureSize.width();
226 desc.fHeight = fBackingTextureSize.height(); 228 desc.fHeight = fBackingTextureSize.height();
227 desc.fConfig = fPixelConfig; 229 desc.fConfig = fPixelConfig;
228 230
229 fTexture = fGpu->createTexture(desc, NULL, 0); 231 fTexture = fGpu->createTexture(desc, NULL, 0);
230 if (NULL == fTexture) { 232 if (NULL == fTexture) {
231 return NULL; 233 return NULL;
232 } 234 }
233 } 235 }
234 236
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 if (fBatchUploads) { 281 if (fBatchUploads) {
280 GrPlotList::Iter plotIter; 282 GrPlotList::Iter plotIter;
281 plotIter.init(fPlotList, GrPlotList::Iter::kHead_IterStart); 283 plotIter.init(fPlotList, GrPlotList::Iter::kHead_IterStart);
282 GrPlot* plot; 284 GrPlot* plot;
283 while (NULL != (plot = plotIter.get())) { 285 while (NULL != (plot = plotIter.get())) {
284 plot->uploadToTexture(); 286 plot->uploadToTexture();
285 plotIter.next(); 287 plotIter.next();
286 } 288 }
287 } 289 }
288 } 290 }
OLDNEW
« no previous file with comments | « src/gpu/GrAtlas.h ('k') | src/gpu/GrLayerCache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698