diff --git a/gpu/include/GrContext.h b/gpu/include/GrContext.h index c2838b8df..db53b1a85 100644 --- a/gpu/include/GrContext.h +++ b/gpu/include/GrContext.h @@ -134,6 +134,11 @@ public: */ void setTextureCacheLimits(int maxTextures, size_t maxTextureBytes); + /** + * Return the max width or height of a texture supported by the current gpu + */ + int getMaxTextureDimension(); + /////////////////////////////////////////////////////////////////////////// // Render targets diff --git a/gpu/include/GrGpu.h b/gpu/include/GrGpu.h index 6cbe53e69..62f68cafd 100644 --- a/gpu/include/GrGpu.h +++ b/gpu/include/GrGpu.h @@ -287,6 +287,8 @@ public: */ NPOTTextureTypes npotTextureSupport() const { return fNPOTTextureSupport; } + int maxTextureDimension() const { return fMaxTextureDimension; } + // GrDrawTarget overrides virtual void drawIndexed(PrimitiveType type, uint32_t startVertex, @@ -381,6 +383,7 @@ protected: // set by subclass int fMinRenderTargetWidth; int fMinRenderTargetHeight; + int fMaxTextureDimension; // overridden by API specific GrGpu-derived class to perform the draw call. virtual void drawIndexedHelper(PrimitiveType type, diff --git a/gpu/src/GrContext.cpp b/gpu/src/GrContext.cpp index 5e6b824c9..9b94b7a6a 100644 --- a/gpu/src/GrContext.cpp +++ b/gpu/src/GrContext.cpp @@ -241,6 +241,10 @@ void GrContext::setTextureCacheLimits(int maxTextures, size_t maxTextureBytes) { fTextureCache->setLimits(maxTextures, maxTextureBytes); } +int GrContext::getMaxTextureDimension() { + return fGpu->maxTextureDimension(); +} + /////////////////////////////////////////////////////////////////////////////// GrRenderTarget* GrContext::createPlatformRenderTarget(intptr_t platformRenderTarget, diff --git a/gpu/src/GrGpuGL.cpp b/gpu/src/GrGpuGL.cpp index ae27189d0..fb2315266 100644 --- a/gpu/src/GrGpuGL.cpp +++ b/gpu/src/GrGpuGL.cpp @@ -380,6 +380,8 @@ GrGpuGL::GrGpuGL() { fMinRenderTargetHeight = GrMax(fMinRenderTargetHeight, 16); #endif + GR_GL_GetIntegerv(GL_MAX_TEXTURE_SIZE, &fMaxTextureDimension); + #if GR_COLLECT_STATS ++fStats.fRenderTargetChngCnt; #endif diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 4042006de..dca146ec5 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -709,13 +709,6 @@ void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& path, fContext->drawPath(grPaint, &iter, fill); } -/* - * This value must not exceed the GPU's texture dimension limit, but it can - * be smaller, if that helps avoid very large single textures hurting the - * cache. - */ -#define MAX_TEXTURE_DIM 512 - void SkGpuDevice::drawBitmap(const SkDraw& draw, const SkBitmap& bitmap, const SkIRect* srcRectPtr, @@ -736,8 +729,9 @@ void SkGpuDevice::drawBitmap(const SkDraw& draw, } grPaint.fSampler.setFilter(paint.isFilterBitmap()); - if (bitmap.getTexture() || (bitmap.width() <= MAX_TEXTURE_DIM && - bitmap.height() <= MAX_TEXTURE_DIM)) { + const int maxTextureDim = fContext->getMaxTextureDimension(); + if (bitmap.getTexture() || (bitmap.width() <= maxTextureDim && + bitmap.height() <= maxTextureDim)) { // take the fast case this->internalDrawBitmap(draw, bitmap, srcRect, m, &grPaint); return; @@ -762,13 +756,13 @@ void SkGpuDevice::drawBitmap(const SkDraw& draw, clipRect.offset(DX, DY); } - int nx = bitmap.width() / MAX_TEXTURE_DIM; - int ny = bitmap.height() / MAX_TEXTURE_DIM; + int nx = bitmap.width() / maxTextureDim; + int ny = bitmap.height() / maxTextureDim; for (int x = 0; x <= nx; x++) { for (int y = 0; y <= ny; y++) { SkIRect tileR; - tileR.set(x * MAX_TEXTURE_DIM, y * MAX_TEXTURE_DIM, - (x + 1) * MAX_TEXTURE_DIM, (y + 1) * MAX_TEXTURE_DIM); + tileR.set(x * maxTextureDim, y * maxTextureDim, + (x + 1) * maxTextureDim, (y + 1) * maxTextureDim); if (!SkIRect::Intersects(tileR, clipRect)) { continue; } @@ -807,8 +801,8 @@ void SkGpuDevice::internalDrawBitmap(const SkDraw& draw, const SkIRect& srcRect, const SkMatrix& m, GrPaint* grPaint) { - SkASSERT(bitmap.width() <= MAX_TEXTURE_DIM && - bitmap.height() <= MAX_TEXTURE_DIM); + SkASSERT(bitmap.width() <= fContext->getMaxTextureDimension() && + bitmap.height() <= fContext->getMaxTextureDimension()); SkAutoLockPixels alp(bitmap); if (!bitmap.getTexture() && !bitmap.readyToDraw()) {