| Index: src/gpu/GrAtlas.cpp
|
| diff --git a/src/gpu/GrAtlas.cpp b/src/gpu/GrAtlas.cpp
|
| deleted file mode 100644
|
| index 3eb74f074b0277d373df1977400faa2c6b5e87e9..0000000000000000000000000000000000000000
|
| --- a/src/gpu/GrAtlas.cpp
|
| +++ /dev/null
|
| @@ -1,229 +0,0 @@
|
| -
|
| -/*
|
| - * Copyright 2010 Google Inc.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -
|
| -#include "GrAtlas.h"
|
| -#include "GrContext.h"
|
| -#include "GrGpu.h"
|
| -#include "GrRectanizer.h"
|
| -#include "GrTracing.h"
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -// for testing
|
| -#define FONT_CACHE_STATS 0
|
| -#if FONT_CACHE_STATS
|
| -static int g_UploadCount = 0;
|
| -#endif
|
| -
|
| -GrPlot::GrPlot()
|
| - : fID(-1)
|
| - , fTexture(nullptr)
|
| - , fRects(nullptr)
|
| - , fAtlas(nullptr)
|
| - , fBytesPerPixel(1)
|
| - , fDirty(false)
|
| - , fBatchUploads(false)
|
| -{
|
| - fOffset.set(0, 0);
|
| -}
|
| -
|
| -GrPlot::~GrPlot() {
|
| - delete[] fPlotData;
|
| - fPlotData = nullptr;
|
| - delete fRects;
|
| -}
|
| -
|
| -void GrPlot::init(GrAtlas* atlas, int id, int offX, int offY, int width, int height, size_t bpp,
|
| - bool batchUploads) {
|
| - fID = id;
|
| - fRects = GrRectanizer::Factory(width, height);
|
| - fAtlas = atlas;
|
| - fOffset.set(offX * width, offY * height);
|
| - fBytesPerPixel = bpp;
|
| - fPlotData = nullptr;
|
| - fDirtyRect.setEmpty();
|
| - fDirty = false;
|
| - fBatchUploads = batchUploads;
|
| -}
|
| -
|
| -static inline void adjust_for_offset(SkIPoint16* loc, const SkIPoint16& offset) {
|
| - loc->fX += offset.fX;
|
| - loc->fY += offset.fY;
|
| -}
|
| -
|
| -bool GrPlot::addSubImage(int width, int height, const void* image, SkIPoint16* loc) {
|
| - float percentFull = fRects->percentFull();
|
| - if (!fRects->addRect(width, height, loc)) {
|
| - return false;
|
| - }
|
| -
|
| - // if batching uploads, create backing memory on first use
|
| - // once the plot is nearly full we will revert to uploading each subimage individually
|
| - int plotWidth = fRects->width();
|
| - int plotHeight = fRects->height();
|
| - if (fBatchUploads && nullptr == fPlotData && 0.0f == percentFull) {
|
| - fPlotData = new unsigned char[fBytesPerPixel * plotWidth * plotHeight];
|
| - memset(fPlotData, 0, fBytesPerPixel*plotWidth*plotHeight);
|
| - }
|
| -
|
| - // if we have backing memory, copy to the memory and set for future upload
|
| - if (fPlotData) {
|
| - const unsigned char* imagePtr = (const unsigned char*) image;
|
| - // point ourselves at the right starting spot
|
| - unsigned char* dataPtr = fPlotData;
|
| - dataPtr += fBytesPerPixel*plotWidth*loc->fY;
|
| - dataPtr += fBytesPerPixel*loc->fX;
|
| - // copy into the data buffer
|
| - for (int i = 0; i < height; ++i) {
|
| - memcpy(dataPtr, imagePtr, fBytesPerPixel*width);
|
| - dataPtr += fBytesPerPixel*plotWidth;
|
| - imagePtr += fBytesPerPixel*width;
|
| - }
|
| -
|
| - fDirtyRect.join(loc->fX, loc->fY, loc->fX + width, loc->fY + height);
|
| - adjust_for_offset(loc, fOffset);
|
| - fDirty = true;
|
| - // otherwise, just upload the image directly
|
| - } else if (image) {
|
| - adjust_for_offset(loc, fOffset);
|
| - TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), "GrPlot::uploadToTexture");
|
| - fTexture->writePixels(loc->fX, loc->fY, width, height, fTexture->config(), image, 0,
|
| - GrContext::kDontFlush_PixelOpsFlag);
|
| - } else {
|
| - adjust_for_offset(loc, fOffset);
|
| - }
|
| -
|
| -#if FONT_CACHE_STATS
|
| - ++g_UploadCount;
|
| -#endif
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void GrPlot::resetRects() {
|
| - SkASSERT(fRects);
|
| - fRects->reset();
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -GrAtlas::GrAtlas(GrGpu* gpu, GrPixelConfig config, GrSurfaceFlags flags,
|
| - const SkISize& backingTextureSize,
|
| - int numPlotsX, int numPlotsY, bool batchUploads) {
|
| - fGpu = SkRef(gpu);
|
| - fPixelConfig = config;
|
| - fFlags = flags;
|
| - fBackingTextureSize = backingTextureSize;
|
| - fNumPlotsX = numPlotsX;
|
| - fNumPlotsY = numPlotsY;
|
| - fBatchUploads = batchUploads;
|
| - fTexture = nullptr;
|
| -
|
| - int textureWidth = fBackingTextureSize.width();
|
| - int textureHeight = fBackingTextureSize.height();
|
| -
|
| - int plotWidth = textureWidth / fNumPlotsX;
|
| - int plotHeight = textureHeight / fNumPlotsY;
|
| -
|
| - SkASSERT(plotWidth * fNumPlotsX == textureWidth);
|
| - SkASSERT(plotHeight * fNumPlotsY == textureHeight);
|
| -
|
| - // We currently do not support compressed atlases...
|
| - SkASSERT(!GrPixelConfigIsCompressed(config));
|
| -
|
| - // set up allocated plots
|
| - size_t bpp = GrBytesPerPixel(fPixelConfig);
|
| - fPlotArray = new GrPlot[(fNumPlotsX * fNumPlotsY)];
|
| -
|
| - GrPlot* currPlot = fPlotArray;
|
| - for (int y = numPlotsY-1; y >= 0; --y) {
|
| - for (int x = numPlotsX-1; x >= 0; --x) {
|
| - currPlot->init(this, y*numPlotsX+x, x, y, plotWidth, plotHeight, bpp, batchUploads);
|
| -
|
| - // build LRU list
|
| - fPlotList.addToHead(currPlot);
|
| - ++currPlot;
|
| - }
|
| - }
|
| -}
|
| -
|
| -GrAtlas::~GrAtlas() {
|
| - SkSafeUnref(fTexture);
|
| - delete[] fPlotArray;
|
| -
|
| - fGpu->unref();
|
| -#if FONT_CACHE_STATS
|
| - SkDebugf("Num uploads: %d\n", g_UploadCount);
|
| -#endif
|
| -}
|
| -
|
| -void GrAtlas::makeMRU(GrPlot* plot) {
|
| - if (fPlotList.head() == plot) {
|
| - return;
|
| - }
|
| -
|
| - fPlotList.remove(plot);
|
| - fPlotList.addToHead(plot);
|
| -};
|
| -
|
| -GrPlot* GrAtlas::addToAtlas(ClientPlotUsage* usage,
|
| - int width, int height, const void* image,
|
| - SkIPoint16* loc) {
|
| - // iterate through entire plot list for this atlas, see if we can find a hole
|
| - // last one was most recently added and probably most empty
|
| - for (int i = usage->fPlots.count()-1; i >= 0; --i) {
|
| - GrPlot* plot = usage->fPlots[i];
|
| - // client may have plots from more than one atlas, must check for ours before adding
|
| - if (this == plot->fAtlas && plot->addSubImage(width, height, image, loc)) {
|
| - this->makeMRU(plot);
|
| - return plot;
|
| - }
|
| - }
|
| -
|
| - // before we get a new plot, make sure we have a backing texture
|
| - if (nullptr == fTexture) {
|
| - // TODO: Update this to use the cache rather than directly creating a texture.
|
| - GrSurfaceDesc desc;
|
| - desc.fFlags = fFlags;
|
| - desc.fWidth = fBackingTextureSize.width();
|
| - desc.fHeight = fBackingTextureSize.height();
|
| - desc.fConfig = fPixelConfig;
|
| -
|
| - fTexture = fGpu->createTexture(desc, true, nullptr, 0);
|
| - if (nullptr == fTexture) {
|
| - return nullptr;
|
| - }
|
| - }
|
| -
|
| - // now look through all allocated plots for one we can share, in MRU order
|
| - GrPlotList::Iter plotIter;
|
| - plotIter.init(fPlotList, GrPlotList::Iter::kHead_IterStart);
|
| - GrPlot* plot;
|
| - while ((plot = plotIter.get())) {
|
| - // make sure texture is set for quick lookup
|
| - plot->fTexture = fTexture;
|
| - if (plot->addSubImage(width, height, image, loc)) {
|
| - this->makeMRU(plot);
|
| - // new plot for atlas, put at end of array
|
| - SkASSERT(!usage->fPlots.contains(plot));
|
| - *(usage->fPlots.append()) = plot;
|
| - return plot;
|
| - }
|
| - plotIter.next();
|
| - }
|
| -
|
| - // If the above fails, then the current plot list has no room
|
| - return nullptr;
|
| -}
|
| -
|
| -void GrAtlas::RemovePlot(ClientPlotUsage* usage, const GrPlot* plot) {
|
| - int index = usage->fPlots.find(const_cast<GrPlot*>(plot));
|
| - if (index >= 0) {
|
| - usage->fPlots.remove(index);
|
| - }
|
| -}
|
|
|