Index: src/gpu/gl/GrGLGpu.cpp |
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp |
index 41cf62c66dc01dadc5d21a7ac2aebca310430879..781e7721e3d8731f0ac5ce888d896e88ffa6ad43 100644 |
--- a/src/gpu/gl/GrGLGpu.cpp |
+++ b/src/gpu/gl/GrGLGpu.cpp |
@@ -513,6 +513,12 @@ bool GrGLGpu::onGetWritePixelsInfo(GrSurface* dstSurface, int width, int height, |
return false; |
} |
+ // This subclass only allows writes to textures. If the dst is not a texture we have to draw |
+ // into it. We could use glDrawPixels on GLs that have it, but we don't today. |
+ if (!dstSurface->asTexture()) { |
+ ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); |
+ } |
+ |
tempDrawInfo->fSwapRAndB = false; |
// These settings we will always want if a temp draw is performed. Initially set the config |
@@ -553,14 +559,17 @@ bool GrGLGpu::onGetWritePixelsInfo(GrSurface* dstSurface, int width, int height, |
return true; |
} |
-bool GrGLGpu::onWriteTexturePixels(GrTexture* texture, |
- int left, int top, int width, int height, |
- GrPixelConfig config, const void* buffer, |
- size_t rowBytes) { |
+bool GrGLGpu::onWritePixels(GrSurface* surface, |
+ int left, int top, int width, int height, |
+ GrPixelConfig config, const void* buffer, |
+ size_t rowBytes) { |
if (NULL == buffer) { |
return false; |
} |
- GrGLTexture* glTex = static_cast<GrGLTexture*>(texture); |
+ GrGLTexture* glTex = static_cast<GrGLTexture*>(surface->asTexture()); |
+ if (!glTex) { |
+ return false; |
+ } |
this->setScratchTextureUnit(); |
GL_CALL(BindTexture(GR_GL_TEXTURE_2D, glTex->textureID())); |
@@ -577,7 +586,7 @@ bool GrGLGpu::onWriteTexturePixels(GrTexture* texture, |
} |
if (success) { |
- texture->texturePriv().dirtyMipMaps(true); |
+ glTex->texturePriv().dirtyMipMaps(true); |
return true; |
} |
@@ -1726,6 +1735,12 @@ bool GrGLGpu::onGetReadPixelsInfo(GrSurface* srcSurface, int width, int height, |
return false; |
} |
+ // This subclass can only read pixels from a render target. We could use glTexSubImage2D on |
+ // GL versions that support it but we don't today. |
+ if (!srcSurface->asRenderTarget()) { |
+ ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); |
+ } |
+ |
tempDrawInfo->fSwapRAndB = false; |
// These settings we will always want if a temp draw is performed. The config is set below |
@@ -1773,27 +1788,32 @@ bool GrGLGpu::onGetReadPixelsInfo(GrSurface* srcSurface, int width, int height, |
return true; |
} |
-bool GrGLGpu::onReadPixels(GrRenderTarget* target, |
+bool GrGLGpu::onReadPixels(GrSurface* surface, |
int left, int top, |
int width, int height, |
GrPixelConfig config, |
void* buffer, |
size_t rowBytes) { |
- SkASSERT(target); |
+ SkASSERT(surface); |
// We cannot read pixels into a compressed buffer |
if (GrPixelConfigIsCompressed(config)) { |
return false; |
} |
+ GrGLRenderTarget* tgt = static_cast<GrGLRenderTarget*>(surface->asRenderTarget()); |
+ if (!tgt) { |
+ return false; |
+ } |
+ |
GrGLenum format = 0; |
GrGLenum type = 0; |
- bool flipY = kBottomLeft_GrSurfaceOrigin == target->origin(); |
+ bool flipY = kBottomLeft_GrSurfaceOrigin == surface->origin(); |
if (!this->configToGLFormats(config, false, NULL, &format, &type)) { |
return false; |
} |
size_t bpp = GrBytesPerPixel(config); |
- if (!GrSurfacePriv::AdjustReadPixelParams(target->width(), target->height(), bpp, |
+ if (!GrSurfacePriv::AdjustReadPixelParams(surface->width(), surface->height(), bpp, |
&left, &top, &width, &height, |
&buffer, |
&rowBytes)) { |
@@ -1801,12 +1821,11 @@ bool GrGLGpu::onReadPixels(GrRenderTarget* target, |
} |
// resolve the render target if necessary |
- GrGLRenderTarget* tgt = static_cast<GrGLRenderTarget*>(target); |
switch (tgt->getResolveType()) { |
case GrGLRenderTarget::kCantResolve_ResolveType: |
return false; |
case GrGLRenderTarget::kAutoResolves_ResolveType: |
- this->flushRenderTarget(static_cast<GrGLRenderTarget*>(target), &SkIRect::EmptyIRect()); |
+ this->flushRenderTarget(tgt, &SkIRect::EmptyIRect()); |
break; |
case GrGLRenderTarget::kCanResolve_ResolveType: |
this->onResolveRenderTarget(tgt); |
@@ -1823,7 +1842,7 @@ bool GrGLGpu::onReadPixels(GrRenderTarget* target, |
// the read rect is viewport-relative |
GrGLIRect readRect; |
- readRect.setRelativeTo(glvp, left, top, width, height, target->origin()); |
+ readRect.setRelativeTo(glvp, left, top, width, height, tgt->origin()); |
size_t tightRowBytes = bpp * width; |
if (0 == rowBytes) { |