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

Side by Side Diff: src/gpu/gl/GrGLGpu.cpp

Issue 1270583003: Move some parts of onReadPixels up to GrGpu readPixels. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: nit Created 5 years, 4 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/GrGpu.cpp ('k') | no next file » | 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 * Copyright 2011 Google Inc. 2 * Copyright 2011 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 8
9 #include "GrGLGpu.h" 9 #include "GrGLGpu.h"
10 #include "GrGLGLSL.h" 10 #include "GrGLGLSL.h"
(...skipping 1713 matching lines...) Expand 10 before | Expand all | Expand 10 after
1724 // If we have to do memcpy to handle non-trim rowBytes then we 1724 // If we have to do memcpy to handle non-trim rowBytes then we
1725 // get the flip for free. Otherwise it costs. 1725 // get the flip for free. Otherwise it costs.
1726 // Note that we're assuming that 0 rowBytes has already been handled and tha t the width has been 1726 // Note that we're assuming that 0 rowBytes has already been handled and tha t the width has been
1727 // clipped. 1727 // clipped.
1728 return caps.packRowLengthSupport() || GrBytesPerPixel(config) * width == row Bytes; 1728 return caps.packRowLengthSupport() || GrBytesPerPixel(config) * width == row Bytes;
1729 } 1729 }
1730 1730
1731 bool GrGLGpu::onGetReadPixelsInfo(GrSurface* srcSurface, int width, int height, size_t rowBytes, 1731 bool GrGLGpu::onGetReadPixelsInfo(GrSurface* srcSurface, int width, int height, size_t rowBytes,
1732 GrPixelConfig readConfig, DrawPreference* draw Preference, 1732 GrPixelConfig readConfig, DrawPreference* draw Preference,
1733 ReadPixelTempDrawInfo* tempDrawInfo) { 1733 ReadPixelTempDrawInfo* tempDrawInfo) {
1734 if (GrPixelConfigIsCompressed(readConfig)) {
1735 return false;
1736 }
1737
1738 // This subclass can only read pixels from a render target. We could use glT exSubImage2D on 1734 // This subclass can only read pixels from a render target. We could use glT exSubImage2D on
1739 // GL versions that support it but we don't today. 1735 // GL versions that support it but we don't today.
1740 if (!srcSurface->asRenderTarget()) { 1736 if (!srcSurface->asRenderTarget()) {
1741 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); 1737 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference);
1742 } 1738 }
1743 1739
1744 tempDrawInfo->fSwapRAndB = false; 1740 tempDrawInfo->fSwapRAndB = false;
1745 1741
1746 // These settings we will always want if a temp draw is performed. The confi g is set below 1742 // These settings we will always want if a temp draw is performed. The confi g is set below
1747 // depending on whether we want to do a R/B swap or not. 1743 // depending on whether we want to do a R/B swap or not.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1789 } 1785 }
1790 1786
1791 bool GrGLGpu::onReadPixels(GrSurface* surface, 1787 bool GrGLGpu::onReadPixels(GrSurface* surface,
1792 int left, int top, 1788 int left, int top,
1793 int width, int height, 1789 int width, int height,
1794 GrPixelConfig config, 1790 GrPixelConfig config,
1795 void* buffer, 1791 void* buffer,
1796 size_t rowBytes) { 1792 size_t rowBytes) {
1797 SkASSERT(surface); 1793 SkASSERT(surface);
1798 1794
1799 // We cannot read pixels into a compressed buffer
1800 if (GrPixelConfigIsCompressed(config)) {
1801 return false;
1802 }
1803
1804 GrGLRenderTarget* tgt = static_cast<GrGLRenderTarget*>(surface->asRenderTarg et()); 1795 GrGLRenderTarget* tgt = static_cast<GrGLRenderTarget*>(surface->asRenderTarg et());
1805 if (!tgt) { 1796 if (!tgt) {
1806 return false; 1797 return false;
1807 } 1798 }
1808 1799
1809 GrGLenum format = 0; 1800 GrGLenum format = 0;
1810 GrGLenum type = 0; 1801 GrGLenum type = 0;
1811 bool flipY = kBottomLeft_GrSurfaceOrigin == surface->origin(); 1802 bool flipY = kBottomLeft_GrSurfaceOrigin == surface->origin();
1812 if (!this->configToGLFormats(config, false, NULL, &format, &type)) { 1803 if (!this->configToGLFormats(config, false, NULL, &format, &type)) {
1813 return false; 1804 return false;
1814 } 1805 }
1815 size_t bpp = GrBytesPerPixel(config);
1816 if (!GrSurfacePriv::AdjustReadPixelParams(surface->width(), surface->height( ), bpp,
1817 &left, &top, &width, &height,
1818 &buffer,
1819 &rowBytes)) {
1820 return false;
1821 }
1822 1806
1823 // resolve the render target if necessary 1807 // resolve the render target if necessary
1824 switch (tgt->getResolveType()) { 1808 switch (tgt->getResolveType()) {
1825 case GrGLRenderTarget::kCantResolve_ResolveType: 1809 case GrGLRenderTarget::kCantResolve_ResolveType:
1826 return false; 1810 return false;
1827 case GrGLRenderTarget::kAutoResolves_ResolveType: 1811 case GrGLRenderTarget::kAutoResolves_ResolveType:
1828 this->flushRenderTarget(tgt, &SkIRect::EmptyIRect()); 1812 this->flushRenderTarget(tgt, &SkIRect::EmptyIRect());
1829 break; 1813 break;
1830 case GrGLRenderTarget::kCanResolve_ResolveType: 1814 case GrGLRenderTarget::kCanResolve_ResolveType:
1831 this->onResolveRenderTarget(tgt); 1815 this->onResolveRenderTarget(tgt);
1832 // we don't track the state of the READ FBO ID. 1816 // we don't track the state of the READ FBO ID.
1833 fStats.incRenderTargetBinds(); 1817 fStats.incRenderTargetBinds();
1834 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, 1818 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER,
1835 tgt->textureFBOID())); 1819 tgt->textureFBOID()));
1836 break; 1820 break;
1837 default: 1821 default:
1838 SkFAIL("Unknown resolve type"); 1822 SkFAIL("Unknown resolve type");
1839 } 1823 }
1840 1824
1841 const GrGLIRect& glvp = tgt->getViewport(); 1825 const GrGLIRect& glvp = tgt->getViewport();
1842 1826
1843 // the read rect is viewport-relative 1827 // the read rect is viewport-relative
1844 GrGLIRect readRect; 1828 GrGLIRect readRect;
1845 readRect.setRelativeTo(glvp, left, top, width, height, tgt->origin()); 1829 readRect.setRelativeTo(glvp, left, top, width, height, tgt->origin());
1846 1830
1847 size_t tightRowBytes = bpp * width; 1831 size_t tightRowBytes = GrBytesPerPixel(config) * width;
1848 if (0 == rowBytes) { 1832
1849 rowBytes = tightRowBytes;
1850 }
1851 size_t readDstRowBytes = tightRowBytes; 1833 size_t readDstRowBytes = tightRowBytes;
1852 void* readDst = buffer; 1834 void* readDst = buffer;
1853 1835
1854 // determine if GL can read using the passed rowBytes or if we need 1836 // determine if GL can read using the passed rowBytes or if we need
1855 // a scratch buffer. 1837 // a scratch buffer.
1856 SkAutoSMalloc<32 * sizeof(GrColor)> scratch; 1838 SkAutoSMalloc<32 * sizeof(GrColor)> scratch;
1857 if (rowBytes != tightRowBytes) { 1839 if (rowBytes != tightRowBytes) {
1858 if (this->glCaps().packRowLengthSupport()) { 1840 if (this->glCaps().packRowLengthSupport()) {
1859 SkASSERT(!(rowBytes % sizeof(GrColor))); 1841 SkASSERT(!(rowBytes % sizeof(GrColor)));
1860 GL_CALL(PixelStorei(GR_GL_PACK_ROW_LENGTH, 1842 GL_CALL(PixelStorei(GR_GL_PACK_ROW_LENGTH,
(...skipping 1326 matching lines...) Expand 10 before | Expand all | Expand 10 after
3187 this->setVertexArrayID(gpu, 0); 3169 this->setVertexArrayID(gpu, 0);
3188 } 3170 }
3189 int attrCount = gpu->glCaps().maxVertexAttributes(); 3171 int attrCount = gpu->glCaps().maxVertexAttributes();
3190 if (fDefaultVertexArrayAttribState.count() != attrCount) { 3172 if (fDefaultVertexArrayAttribState.count() != attrCount) {
3191 fDefaultVertexArrayAttribState.resize(attrCount); 3173 fDefaultVertexArrayAttribState.resize(attrCount);
3192 } 3174 }
3193 attribState = &fDefaultVertexArrayAttribState; 3175 attribState = &fDefaultVertexArrayAttribState;
3194 } 3176 }
3195 return attribState; 3177 return attribState;
3196 } 3178 }
OLDNEW
« no previous file with comments | « src/gpu/GrGpu.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698