OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "GrBatchAtlas.h" | 8 #include "GrBatchAtlas.h" |
9 #include "GrBatchTarget.h" | 9 #include "GrBatchTarget.h" |
10 #include "GrGpu.h" | 10 #include "GrGpu.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 int genID() const { return fGenID; } | 43 int genID() const { return fGenID; } |
44 GrBatchAtlas::AtlasID id() { return fID; } | 44 GrBatchAtlas::AtlasID id() { return fID; } |
45 | 45 |
46 GrTexture* texture() const { return fTexture; } | 46 GrTexture* texture() const { return fTexture; } |
47 | 47 |
48 bool addSubImage(int width, int height, const void* image, SkIPoint16* loc,
size_t rowBytes) { | 48 bool addSubImage(int width, int height, const void* image, SkIPoint16* loc,
size_t rowBytes) { |
49 if (!fRects->addRect(width, height, loc)) { | 49 if (!fRects->addRect(width, height, loc)) { |
50 return false; | 50 return false; |
51 } | 51 } |
52 | 52 |
53 SkASSERT(fData); | 53 if (!fData) { |
| 54 fData = reinterpret_cast<unsigned char*>(sk_calloc_throw(fBytesPerPi
xel * fWidth * |
| 55 fHeight)); |
| 56 } |
54 const unsigned char* imagePtr = (const unsigned char*)image; | 57 const unsigned char* imagePtr = (const unsigned char*)image; |
55 // point ourselves at the right starting spot | 58 // point ourselves at the right starting spot |
56 unsigned char* dataPtr = fData; | 59 unsigned char* dataPtr = fData; |
57 dataPtr += fBytesPerPixel * fWidth * loc->fY; | 60 dataPtr += fBytesPerPixel * fWidth * loc->fY; |
58 dataPtr += fBytesPerPixel * loc->fX; | 61 dataPtr += fBytesPerPixel * loc->fX; |
59 // copy into the data buffer | 62 // copy into the data buffer |
60 for (int i = 0; i < height; ++i) { | 63 for (int i = 0; i < height; ++i) { |
61 memcpy(dataPtr, imagePtr, rowBytes); | 64 memcpy(dataPtr, imagePtr, rowBytes); |
62 dataPtr += fBytesPerPixel * fWidth; | 65 dataPtr += fBytesPerPixel * fWidth; |
63 imagePtr += rowBytes; | 66 imagePtr += rowBytes; |
(...skipping 17 matching lines...) Expand all Loading... |
81 SkASSERT(batchToken >= fLastUpload); | 84 SkASSERT(batchToken >= fLastUpload); |
82 fLastUpload = batchToken; | 85 fLastUpload = batchToken; |
83 } | 86 } |
84 void setLastUseToken(BatchToken batchToken) { | 87 void setLastUseToken(BatchToken batchToken) { |
85 SkASSERT(batchToken >= fLastUse); | 88 SkASSERT(batchToken >= fLastUse); |
86 fLastUse = batchToken; | 89 fLastUse = batchToken; |
87 } | 90 } |
88 | 91 |
89 void uploadToTexture(GrBatchTarget::TextureUploader uploader) { | 92 void uploadToTexture(GrBatchTarget::TextureUploader uploader) { |
90 // We should only be issuing uploads if we are in fact dirty | 93 // We should only be issuing uploads if we are in fact dirty |
91 SkASSERT(fDirty); | 94 SkASSERT(fDirty && fData && fTexture); |
92 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), "GrBatchPlot::upload
ToTexture"); | 95 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), "GrBatchPlot::upload
ToTexture"); |
93 SkASSERT(fTexture); | |
94 size_t rowBytes = fBytesPerPixel * fRects->width(); | 96 size_t rowBytes = fBytesPerPixel * fRects->width(); |
95 const unsigned char* dataPtr = fData; | 97 const unsigned char* dataPtr = fData; |
96 dataPtr += rowBytes * fDirtyRect.fTop; | 98 dataPtr += rowBytes * fDirtyRect.fTop; |
97 dataPtr += fBytesPerPixel * fDirtyRect.fLeft; | 99 dataPtr += fBytesPerPixel * fDirtyRect.fLeft; |
98 uploader.writeTexturePixels(fTexture, | 100 uploader.writeTexturePixels(fTexture, |
99 fOffset.fX + fDirtyRect.fLeft, fOffset.fY +
fDirtyRect.fTop, | 101 fOffset.fX + fDirtyRect.fLeft, fOffset.fY +
fDirtyRect.fTop, |
100 fDirtyRect.width(), fDirtyRect.height(), | 102 fDirtyRect.width(), fDirtyRect.height(), |
101 fTexture->config(), dataPtr, rowBytes); | 103 fTexture->config(), dataPtr, rowBytes); |
102 fDirtyRect.setEmpty(); | 104 fDirtyRect.setEmpty(); |
103 SkDEBUGCODE(fDirty = false;) | 105 SkDEBUGCODE(fDirty = false;) |
104 } | 106 } |
105 | 107 |
106 void resetRects() { | 108 void resetRects() { |
107 SkASSERT(fRects); | 109 SkASSERT(fRects); |
108 fRects->reset(); | 110 fRects->reset(); |
109 fGenID++; | 111 fGenID++; |
110 fID = create_id(fIndex, fGenID); | 112 fID = create_id(fIndex, fGenID); |
111 | 113 |
112 // zero out the plot | 114 // zero out the plot |
113 SkASSERT(fData); | 115 if (fData) { |
114 memset(fData, 0, fBytesPerPixel * fWidth * fHeight); | 116 sk_bzero(fData, fBytesPerPixel * fWidth * fHeight); |
| 117 } |
115 | 118 |
116 fDirtyRect.setEmpty(); | 119 fDirtyRect.setEmpty(); |
117 SkDEBUGCODE(fDirty = false;) | 120 SkDEBUGCODE(fDirty = false;) |
118 } | 121 } |
119 | 122 |
120 int x() const { return fX; } | 123 int x() const { return fX; } |
121 int y() const { return fY; } | 124 int y() const { return fY; } |
122 | 125 |
123 private: | 126 private: |
124 BatchPlot() | 127 BatchPlot() |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 fX = offX; | 162 fX = offX; |
160 fY = offY; | 163 fY = offY; |
161 fRects = GrRectanizer::Factory(width, height); | 164 fRects = GrRectanizer::Factory(width, height); |
162 fAtlas = atlas; | 165 fAtlas = atlas; |
163 fOffset.set(offX * width, offY * height); | 166 fOffset.set(offX * width, offY * height); |
164 fBytesPerPixel = bpp; | 167 fBytesPerPixel = bpp; |
165 fData = NULL; | 168 fData = NULL; |
166 fDirtyRect.setEmpty(); | 169 fDirtyRect.setEmpty(); |
167 SkDEBUGCODE(fDirty = false;) | 170 SkDEBUGCODE(fDirty = false;) |
168 fTexture = texture; | 171 fTexture = texture; |
169 | |
170 // allocate backing store | |
171 fData = SkNEW_ARRAY(unsigned char, fBytesPerPixel * width * height); | |
172 memset(fData, 0, fBytesPerPixel * width * height); | |
173 } | 172 } |
174 | 173 |
175 BatchToken fLastUpload; | 174 BatchToken fLastUpload; |
176 BatchToken fLastUse; | 175 BatchToken fLastUse; |
177 | 176 |
178 uint32_t fIndex; | 177 uint32_t fIndex; |
179 uint32_t fGenID; | 178 uint32_t fGenID; |
180 GrBatchAtlas::AtlasID fID; | 179 GrBatchAtlas::AtlasID fID; |
181 unsigned char* fData; | 180 unsigned char* fData; |
182 int fWidth; | 181 int fWidth; |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 } | 365 } |
367 | 366 |
368 void GrBatchAtlas::setLastUseTokenBulk(const BulkUseTokenUpdater& updater, Batch
Token batchToken) { | 367 void GrBatchAtlas::setLastUseTokenBulk(const BulkUseTokenUpdater& updater, Batch
Token batchToken) { |
369 int count = updater.fPlotsToUpdate.count(); | 368 int count = updater.fPlotsToUpdate.count(); |
370 for (int i = 0; i < count; i++) { | 369 for (int i = 0; i < count; i++) { |
371 BatchPlot* plot = fPlotArray[updater.fPlotsToUpdate[i]]; | 370 BatchPlot* plot = fPlotArray[updater.fPlotsToUpdate[i]]; |
372 this->makeMRU(plot); | 371 this->makeMRU(plot); |
373 plot->setLastUseToken(batchToken); | 372 plot->setLastUseToken(batchToken); |
374 } | 373 } |
375 } | 374 } |
OLD | NEW |