| OLD | NEW |
| 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 2051 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2062 return false; | 2062 return false; |
| 2063 } | 2063 } |
| 2064 | 2064 |
| 2065 // If we have to do memcpy to handle non-trim rowBytes then we | 2065 // If we have to do memcpy to handle non-trim rowBytes then we |
| 2066 // get the flip for free. Otherwise it costs. | 2066 // get the flip for free. Otherwise it costs. |
| 2067 // Note that we're assuming that 0 rowBytes has already been handled and tha
t the width has been | 2067 // Note that we're assuming that 0 rowBytes has already been handled and tha
t the width has been |
| 2068 // clipped. | 2068 // clipped. |
| 2069 return caps.packRowLengthSupport() || GrBytesPerPixel(config) * width == row
Bytes; | 2069 return caps.packRowLengthSupport() || GrBytesPerPixel(config) * width == row
Bytes; |
| 2070 } | 2070 } |
| 2071 | 2071 |
| 2072 bool GrGLGpu::readPixelsSupported(GrRenderTarget* target, GrPixelConfig readConf
ig) { |
| 2073 auto bindRenderTarget = [this, target]() -> bool { |
| 2074 this->flushRenderTarget(static_cast<GrGLRenderTarget*>(target), &SkIRect
::EmptyIRect()); |
| 2075 return true; |
| 2076 }; |
| 2077 auto getIntegerv = [this](GrGLenum query, GrGLint* value) { |
| 2078 GR_GL_GetIntegerv(this->glInterface(), query, value); |
| 2079 }; |
| 2080 GrPixelConfig rtConfig = target->config(); |
| 2081 return this->glCaps().readPixelsSupported(rtConfig, readConfig, getIntegerv,
bindRenderTarget); |
| 2082 } |
| 2083 |
| 2084 bool GrGLGpu::readPixelsSupported(GrPixelConfig rtConfig, GrPixelConfig readConf
ig) { |
| 2085 auto bindRenderTarget = [this, rtConfig]() -> bool { |
| 2086 GrTextureDesc desc; |
| 2087 desc.fConfig = rtConfig; |
| 2088 desc.fWidth = desc.fHeight = 16; |
| 2089 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
| 2090 SkAutoTUnref<GrTexture> temp(this->createTexture(desc, false, nullptr, 0
)); |
| 2091 if (!temp) { |
| 2092 return false; |
| 2093 } |
| 2094 GrGLRenderTarget* glrt = static_cast<GrGLRenderTarget*>(temp->asRenderTa
rget()); |
| 2095 this->flushRenderTarget(glrt, &SkIRect::EmptyIRect()); |
| 2096 return true; |
| 2097 }; |
| 2098 auto getIntegerv = [this](GrGLenum query, GrGLint* value) { |
| 2099 GR_GL_GetIntegerv(this->glInterface(), query, value); |
| 2100 }; |
| 2101 return this->glCaps().readPixelsSupported(rtConfig, readConfig, getIntegerv,
bindRenderTarget); |
| 2102 } |
| 2103 |
| 2104 bool GrGLGpu::readPixelsSupported(GrSurface* surfaceForConfig, GrPixelConfig rea
dConfig) { |
| 2105 if (GrRenderTarget* rt = surfaceForConfig->asRenderTarget()) { |
| 2106 return this->readPixelsSupported(rt, readConfig); |
| 2107 } else { |
| 2108 GrPixelConfig config = surfaceForConfig->config(); |
| 2109 return this->readPixelsSupported(config, readConfig); |
| 2110 } |
| 2111 } |
| 2112 |
| 2072 bool GrGLGpu::onGetReadPixelsInfo(GrSurface* srcSurface, int width, int height,
size_t rowBytes, | 2113 bool GrGLGpu::onGetReadPixelsInfo(GrSurface* srcSurface, int width, int height,
size_t rowBytes, |
| 2073 GrPixelConfig readConfig, DrawPreference* draw
Preference, | 2114 GrPixelConfig readConfig, DrawPreference* draw
Preference, |
| 2074 ReadPixelTempDrawInfo* tempDrawInfo) { | 2115 ReadPixelTempDrawInfo* tempDrawInfo) { |
| 2116 GrRenderTarget* srcAsRT = srcSurface->asRenderTarget(); |
| 2117 |
| 2075 // This subclass can only read pixels from a render target. We could use glT
exSubImage2D on | 2118 // This subclass can only read pixels from a render target. We could use glT
exSubImage2D on |
| 2076 // GL versions that support it but we don't today. | 2119 // GL versions that support it but we don't today. |
| 2077 if (!srcSurface->asRenderTarget()) { | 2120 if (!srcAsRT) { |
| 2078 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); | 2121 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); |
| 2079 } | 2122 } |
| 2080 | 2123 |
| 2081 if (GrPixelConfigIsSRGB(srcSurface->config()) != GrPixelConfigIsSRGB(readCon
fig)) { | 2124 if (GrPixelConfigIsSRGB(srcSurface->config()) != GrPixelConfigIsSRGB(readCon
fig)) { |
| 2082 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); | 2125 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); |
| 2083 } | 2126 } |
| 2084 | 2127 |
| 2085 tempDrawInfo->fSwizzle = GrSwizzle::RGBA(); | 2128 tempDrawInfo->fSwizzle = GrSwizzle::RGBA(); |
| 2086 tempDrawInfo->fReadConfig = readConfig; | 2129 tempDrawInfo->fReadConfig = readConfig; |
| 2087 | 2130 |
| 2088 // These settings we will always want if a temp draw is performed. The confi
g is set below | 2131 // These settings we will always want if a temp draw is performed. The confi
g is set below |
| 2089 // depending on whether we want to do a R/B swap or not. | 2132 // depending on whether we want to do a R/B swap or not. |
| 2090 tempDrawInfo->fTempSurfaceDesc.fFlags = kRenderTarget_GrSurfaceFlag; | 2133 tempDrawInfo->fTempSurfaceDesc.fFlags = kRenderTarget_GrSurfaceFlag; |
| 2091 tempDrawInfo->fTempSurfaceDesc.fWidth = width; | 2134 tempDrawInfo->fTempSurfaceDesc.fWidth = width; |
| 2092 tempDrawInfo->fTempSurfaceDesc.fHeight = height; | 2135 tempDrawInfo->fTempSurfaceDesc.fHeight = height; |
| 2093 tempDrawInfo->fTempSurfaceDesc.fSampleCnt = 0; | 2136 tempDrawInfo->fTempSurfaceDesc.fSampleCnt = 0; |
| 2094 tempDrawInfo->fTempSurfaceDesc.fOrigin = kTopLeft_GrSurfaceOrigin; // no CPU
y-flip for TL. | 2137 tempDrawInfo->fTempSurfaceDesc.fOrigin = kTopLeft_GrSurfaceOrigin; // no CPU
y-flip for TL. |
| 2095 tempDrawInfo->fUseExactScratch = this->glCaps().partialFBOReadIsSlow(); | 2138 tempDrawInfo->fUseExactScratch = this->glCaps().partialFBOReadIsSlow(); |
| 2096 | 2139 |
| 2097 // Start off assuming that any temp draw should be to the readConfig, then c
heck if that will | 2140 // Start off assuming that any temp draw should be to the readConfig, then c
heck if that will |
| 2098 // be inefficient. | 2141 // be inefficient. |
| 2099 GrPixelConfig srcConfig = srcSurface->config(); | 2142 GrPixelConfig srcConfig = srcSurface->config(); |
| 2100 tempDrawInfo->fTempSurfaceDesc.fConfig = readConfig; | 2143 tempDrawInfo->fTempSurfaceDesc.fConfig = readConfig; |
| 2101 | 2144 |
| 2102 if (this->glCaps().rgba8888PixelsOpsAreSlow() && kRGBA_8888_GrPixelConfig ==
readConfig) { | 2145 if (this->glCaps().rgba8888PixelsOpsAreSlow() && kRGBA_8888_GrPixelConfig ==
readConfig && |
| 2146 this->readPixelsSupported(kBGRA_8888_GrPixelConfig, kBGRA_8888_GrPixelCo
nfig)) { |
| 2103 tempDrawInfo->fTempSurfaceDesc.fConfig = kBGRA_8888_GrPixelConfig; | 2147 tempDrawInfo->fTempSurfaceDesc.fConfig = kBGRA_8888_GrPixelConfig; |
| 2104 tempDrawInfo->fSwizzle = GrSwizzle::BGRA(); | 2148 tempDrawInfo->fSwizzle = GrSwizzle::BGRA(); |
| 2105 tempDrawInfo->fReadConfig = kBGRA_8888_GrPixelConfig; | 2149 tempDrawInfo->fReadConfig = kBGRA_8888_GrPixelConfig; |
| 2106 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference); | 2150 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference); |
| 2107 } else if (kMesa_GrGLDriver == this->glContext().driver() && | 2151 } else if (kMesa_GrGLDriver == this->glContext().driver() && |
| 2108 GrBytesPerPixel(readConfig) == 4 && | 2152 GrBytesPerPixel(readConfig) == 4 && |
| 2109 GrPixelConfigSwapRAndB(readConfig) == srcConfig) { | 2153 GrPixelConfigSwapRAndB(readConfig) == srcConfig && |
| 2154 this->readPixelsSupported(srcSurface, srcConfig)) { |
| 2110 // Mesa 3D takes a slow path on when reading back BGRA from an RGBA surf
ace and vice-versa. | 2155 // Mesa 3D takes a slow path on when reading back BGRA from an RGBA surf
ace and vice-versa. |
| 2111 // Better to do a draw with a R/B swap and then read as the original con
fig. | 2156 // Better to do a draw with a R/B swap and then read as the original con
fig. |
| 2112 tempDrawInfo->fTempSurfaceDesc.fConfig = srcConfig; | 2157 tempDrawInfo->fTempSurfaceDesc.fConfig = srcConfig; |
| 2113 tempDrawInfo->fSwizzle = GrSwizzle::BGRA(); | 2158 tempDrawInfo->fSwizzle = GrSwizzle::BGRA(); |
| 2114 tempDrawInfo->fReadConfig = srcConfig; | 2159 tempDrawInfo->fReadConfig = srcConfig; |
| 2115 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference); | 2160 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference); |
| 2116 } else if (readConfig == kBGRA_8888_GrPixelConfig && | 2161 } else if (!this->readPixelsSupported(srcSurface, readConfig)) { |
| 2117 !this->glCaps().readPixelsSupported(this->glInterface(), readConf
ig, srcConfig)) { | 2162 if (readConfig == kBGRA_8888_GrPixelConfig && |
| 2118 tempDrawInfo->fTempSurfaceDesc.fConfig = kRGBA_8888_GrPixelConfig; | 2163 this->glCaps().isConfigRenderable(kRGBA_8888_GrPixelConfig, false) &
& |
| 2119 tempDrawInfo->fSwizzle = GrSwizzle::BGRA(); | 2164 this->readPixelsSupported(kRGBA_8888_GrPixelConfig, kRGBA_8888_GrPix
elConfig)) { |
| 2120 tempDrawInfo->fReadConfig = kRGBA_8888_GrPixelConfig; | 2165 |
| 2121 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); | 2166 tempDrawInfo->fTempSurfaceDesc.fConfig = kRGBA_8888_GrPixelConfig; |
| 2167 tempDrawInfo->fSwizzle = GrSwizzle::BGRA(); |
| 2168 tempDrawInfo->fReadConfig = kRGBA_8888_GrPixelConfig; |
| 2169 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); |
| 2170 } else { |
| 2171 return false; |
| 2172 } |
| 2122 } | 2173 } |
| 2123 | 2174 |
| 2124 GrRenderTarget* srcAsRT = srcSurface->asRenderTarget(); | 2175 if (srcAsRT && |
| 2125 if (!srcAsRT) { | 2176 read_pixels_pays_for_y_flip(srcAsRT, this->glCaps(), width, height, read
Config, rowBytes)) { |
| 2126 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); | |
| 2127 } else if (read_pixels_pays_for_y_flip(srcAsRT, this->glCaps(), width, heigh
t, readConfig, | |
| 2128 rowBytes)) { | |
| 2129 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference); | 2177 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference); |
| 2130 } | 2178 } |
| 2131 | 2179 |
| 2132 return true; | 2180 return true; |
| 2133 } | 2181 } |
| 2134 | 2182 |
| 2135 bool GrGLGpu::onReadPixels(GrSurface* surface, | 2183 bool GrGLGpu::onReadPixels(GrSurface* surface, |
| 2136 int left, int top, | 2184 int left, int top, |
| 2137 int width, int height, | 2185 int width, int height, |
| 2138 GrPixelConfig config, | 2186 GrPixelConfig config, |
| (...skipping 1569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3708 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || | 3756 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || |
| 3709 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { | 3757 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { |
| 3710 copyParams->fFilter = GrTextureParams::kNone_FilterMode; | 3758 copyParams->fFilter = GrTextureParams::kNone_FilterMode; |
| 3711 copyParams->fWidth = texture->width(); | 3759 copyParams->fWidth = texture->width(); |
| 3712 copyParams->fHeight = texture->height(); | 3760 copyParams->fHeight = texture->height(); |
| 3713 return true; | 3761 return true; |
| 3714 } | 3762 } |
| 3715 } | 3763 } |
| 3716 return false; | 3764 return false; |
| 3717 } | 3765 } |
| OLD | NEW |