| 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 #include "GrGLGpu.h" | 8 #include "GrGLGpu.h" |
| 9 #include "GrGLBuffer.h" | 9 #include "GrGLBuffer.h" |
| 10 #include "GrGLGLSL.h" | 10 #include "GrGLGLSL.h" |
| (...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 557 fHWBufferTextures[b].fKnownBound = false; | 557 fHWBufferTextures[b].fKnownBound = false; |
| 558 } | 558 } |
| 559 } | 559 } |
| 560 | 560 |
| 561 if (resetBits & kBlend_GrGLBackendState) { | 561 if (resetBits & kBlend_GrGLBackendState) { |
| 562 fHWBlendState.invalidate(); | 562 fHWBlendState.invalidate(); |
| 563 } | 563 } |
| 564 | 564 |
| 565 if (resetBits & kView_GrGLBackendState) { | 565 if (resetBits & kView_GrGLBackendState) { |
| 566 fHWScissorSettings.invalidate(); | 566 fHWScissorSettings.invalidate(); |
| 567 fHWWindowRectsState.invalidate(); | 567 fHWWindowRects.invalidate(); |
| 568 fHWViewport.invalidate(); | 568 fHWViewport.invalidate(); |
| 569 } | 569 } |
| 570 | 570 |
| 571 if (resetBits & kStencil_GrGLBackendState) { | 571 if (resetBits & kStencil_GrGLBackendState) { |
| 572 fHWStencilSettings.invalidate(); | 572 fHWStencilSettings.invalidate(); |
| 573 fHWStencilTestEnabled = kUnknown_TriState; | 573 fHWStencilTestEnabled = kUnknown_TriState; |
| 574 } | 574 } |
| 575 | 575 |
| 576 // Vertex | 576 // Vertex |
| 577 if (resetBits & kVertex_GrGLBackendState) { | 577 if (resetBits & kVertex_GrGLBackendState) { |
| (...skipping 1412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1990 fHWScissorSettings.fEnabled = kYes_TriState; | 1990 fHWScissorSettings.fEnabled = kYes_TriState; |
| 1991 } | 1991 } |
| 1992 return; | 1992 return; |
| 1993 } | 1993 } |
| 1994 } | 1994 } |
| 1995 | 1995 |
| 1996 // See fall through note above | 1996 // See fall through note above |
| 1997 this->disableScissor(); | 1997 this->disableScissor(); |
| 1998 } | 1998 } |
| 1999 | 1999 |
| 2000 void GrGLGpu::flushWindowRectangles(const GrWindowRectsState& windowState, | 2000 void GrGLGpu::flushWindowRectangles(const GrWindowRectangles& windows, const GrG
LRenderTarget* rt) { |
| 2001 const GrGLRenderTarget* rt) { | 2001 typedef GrWindowRectangles::Mode Mode; |
| 2002 typedef GrWindowRectsState::Mode Mode; | 2002 SkASSERT(windows.count() <= this->caps()->maxWindowRectangles()); |
| 2003 SkASSERT(!windowState.enabled() || rt->renderFBOID()); // Window rects can't
be used on-screen. | 2003 SkASSERT(windows.disabled() || rt->renderFBOID()); // Window rectangles can'
t be used on-screen. |
| 2004 SkASSERT(windowState.numWindows() <= this->caps()->maxWindowRectangles()); | |
| 2005 | 2004 |
| 2006 if (!this->caps()->maxWindowRectangles() || | 2005 if (!this->caps()->maxWindowRectangles() || |
| 2007 fHWWindowRectsState.knownEqualTo(rt->origin(), rt->getViewport(), window
State)) { | 2006 fHWWindowRects.equal(rt->origin(), rt->getViewport(), windows)) { |
| 2008 return; | 2007 return; |
| 2009 } | 2008 } |
| 2010 | 2009 |
| 2011 // This is purely a workaround for a spurious warning generated by gcc. Othe
rwise the above | 2010 // This is purely a workaround for a spurious warning generated by gcc. Othe
rwise the above |
| 2012 // assert would be sufficient. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=
5912 | 2011 // assert would be sufficient. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=
5912 |
| 2013 int numWindows = SkTMin(windowState.numWindows(), int(GrWindowRectangles::kM
axWindows)); | 2012 int numWindows = SkTMin(windows.count(), int(GrWindowRectangles::kMaxWindows
)); |
| 2014 SkASSERT(windowState.numWindows() == numWindows); | 2013 SkASSERT(windows.count() == numWindows); |
| 2015 | 2014 |
| 2016 GrGLIRect glwindows[GrWindowRectangles::kMaxWindows]; | 2015 GrGLIRect glwindows[GrWindowRectangles::kMaxWindows]; |
| 2017 const SkIRect* skwindows = windowState.windows().data(); | 2016 const SkIRect* skwindows = windows.data(); |
| 2018 int dx = -windowState.origin().x(), dy = -windowState.origin().y(); | |
| 2019 for (int i = 0; i < numWindows; ++i) { | 2017 for (int i = 0; i < numWindows; ++i) { |
| 2020 const SkIRect& skwindow = skwindows[i].makeOffset(dx, dy); | 2018 glwindows[i].setRelativeTo(rt->getViewport(), skwindows[i], rt->origin()
); |
| 2021 glwindows[i].setRelativeTo(rt->getViewport(), skwindow, rt->origin()); | |
| 2022 } | 2019 } |
| 2023 | 2020 |
| 2024 GrGLenum glmode = (Mode::kExclusive == windowState.mode()) ? GR_GL_EXCLUSIVE
: GR_GL_INCLUSIVE; | 2021 GrGLenum glmode = (Mode::kExclusive == windows.mode()) ? GR_GL_EXCLUSIVE : G
R_GL_INCLUSIVE; |
| 2025 GL_CALL(WindowRectangles(glmode, numWindows, glwindows->asInts())); | 2022 GL_CALL(WindowRectangles(glmode, numWindows, glwindows->asInts())); |
| 2026 | 2023 |
| 2027 fHWWindowRectsState.set(rt->origin(), rt->getViewport(), windowState); | 2024 fHWWindowRects.set(rt->origin(), rt->getViewport(), windows); |
| 2028 } | 2025 } |
| 2029 | 2026 |
| 2030 void GrGLGpu::disableWindowRectangles() { | 2027 void GrGLGpu::disableWindowRectangles() { |
| 2031 if (!this->caps()->maxWindowRectangles() || fHWWindowRectsState.knownDisable
d()) { | 2028 if (!this->caps()->maxWindowRectangles() || fHWWindowRects.disabled()) { |
| 2032 return; | 2029 return; |
| 2033 } | 2030 } |
| 2034 GL_CALL(WindowRectangles(GR_GL_EXCLUSIVE, 0, nullptr)); | 2031 GL_CALL(WindowRectangles(GR_GL_EXCLUSIVE, 0, nullptr)); |
| 2035 fHWWindowRectsState.setDisabled(); | 2032 fHWWindowRects.setDisabled(); |
| 2036 } | 2033 } |
| 2037 | 2034 |
| 2038 void GrGLGpu::flushMinSampleShading(float minSampleShading) { | 2035 void GrGLGpu::flushMinSampleShading(float minSampleShading) { |
| 2039 if (fHWMinSampleShading != minSampleShading) { | 2036 if (fHWMinSampleShading != minSampleShading) { |
| 2040 if (minSampleShading > 0.0) { | 2037 if (minSampleShading > 0.0) { |
| 2041 GL_CALL(Enable(GR_GL_SAMPLE_SHADING)); | 2038 GL_CALL(Enable(GR_GL_SAMPLE_SHADING)); |
| 2042 GL_CALL(MinSampleShading(minSampleShading)); | 2039 GL_CALL(MinSampleShading(minSampleShading)); |
| 2043 } | 2040 } |
| 2044 else { | 2041 else { |
| 2045 GL_CALL(Disable(GR_GL_SAMPLE_SHADING)); | 2042 GL_CALL(Disable(GR_GL_SAMPLE_SHADING)); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2075 const GrSwizzle& swizzle = this->glCaps().glslCaps()->configOutputSwizzl
e( | 2072 const GrSwizzle& swizzle = this->glCaps().glslCaps()->configOutputSwizzl
e( |
| 2076 pipeline.getRenderTarget()->config()); | 2073 pipeline.getRenderTarget()->config()); |
| 2077 this->flushBlend(blendInfo, swizzle); | 2074 this->flushBlend(blendInfo, swizzle); |
| 2078 } | 2075 } |
| 2079 | 2076 |
| 2080 program->setData(primProc, pipeline); | 2077 program->setData(primProc, pipeline); |
| 2081 | 2078 |
| 2082 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(pipeline.getRenderTa
rget()); | 2079 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(pipeline.getRenderTa
rget()); |
| 2083 this->flushStencil(pipeline.getStencil()); | 2080 this->flushStencil(pipeline.getStencil()); |
| 2084 this->flushScissor(pipeline.getScissorState(), glRT->getViewport(), glRT->or
igin()); | 2081 this->flushScissor(pipeline.getScissorState(), glRT->getViewport(), glRT->or
igin()); |
| 2085 this->flushWindowRectangles(pipeline.getWindowRectsState(), glRT); | 2082 this->flushWindowRectangles(pipeline.getWindowRectangles(), glRT); |
| 2086 this->flushHWAAState(glRT, pipeline.isHWAntialiasState(), !pipeline.getStenc
il().isDisabled()); | 2083 this->flushHWAAState(glRT, pipeline.isHWAntialiasState(), !pipeline.getStenc
il().isDisabled()); |
| 2087 | 2084 |
| 2088 // This must come after textures are flushed because a texture may need | 2085 // This must come after textures are flushed because a texture may need |
| 2089 // to be msaa-resolved (which will modify bound FBO state). | 2086 // to be msaa-resolved (which will modify bound FBO state). |
| 2090 this->flushRenderTarget(glRT, nullptr, pipeline.getDisableOutputConversionTo
SRGB()); | 2087 this->flushRenderTarget(glRT, nullptr, pipeline.getDisableOutputConversionTo
SRGB()); |
| 2091 | 2088 |
| 2092 return true; | 2089 return true; |
| 2093 } | 2090 } |
| 2094 | 2091 |
| 2095 void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc, | 2092 void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc, |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2203 | 2200 |
| 2204 void GrGLGpu::clear(const GrFixedClip& clip, GrColor color, GrRenderTarget* targ
et) { | 2201 void GrGLGpu::clear(const GrFixedClip& clip, GrColor color, GrRenderTarget* targ
et) { |
| 2205 this->handleDirtyContext(); | 2202 this->handleDirtyContext(); |
| 2206 | 2203 |
| 2207 // parent class should never let us get here with no RT | 2204 // parent class should never let us get here with no RT |
| 2208 SkASSERT(target); | 2205 SkASSERT(target); |
| 2209 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(target); | 2206 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(target); |
| 2210 | 2207 |
| 2211 this->flushRenderTarget(glRT, clip.scissorEnabled() ? &clip.scissorRect() :
nullptr); | 2208 this->flushRenderTarget(glRT, clip.scissorEnabled() ? &clip.scissorRect() :
nullptr); |
| 2212 this->flushScissor(clip.scissorState(), glRT->getViewport(), glRT->origin())
; | 2209 this->flushScissor(clip.scissorState(), glRT->getViewport(), glRT->origin())
; |
| 2213 this->flushWindowRectangles(clip.windowRectsState(), glRT); | 2210 this->disableWindowRectangles(); |
| 2214 | 2211 |
| 2215 GrGLfloat r, g, b, a; | 2212 GrGLfloat r, g, b, a; |
| 2216 static const GrGLfloat scale255 = 1.f / 255.f; | 2213 static const GrGLfloat scale255 = 1.f / 255.f; |
| 2217 a = GrColorUnpackA(color) * scale255; | 2214 a = GrColorUnpackA(color) * scale255; |
| 2218 GrGLfloat scaleRGB = scale255; | 2215 GrGLfloat scaleRGB = scale255; |
| 2219 r = GrColorUnpackR(color) * scaleRGB; | 2216 r = GrColorUnpackR(color) * scaleRGB; |
| 2220 g = GrColorUnpackG(color) * scaleRGB; | 2217 g = GrColorUnpackG(color) * scaleRGB; |
| 2221 b = GrColorUnpackB(color) * scaleRGB; | 2218 b = GrColorUnpackB(color) * scaleRGB; |
| 2222 | 2219 |
| 2223 GL_CALL(ColorMask(GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE)); | 2220 GL_CALL(ColorMask(GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE)); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2267 GrGLint value; | 2264 GrGLint value; |
| 2268 if (insideStencilMask) { | 2265 if (insideStencilMask) { |
| 2269 value = (1 << (stencilBitCount - 1)); | 2266 value = (1 << (stencilBitCount - 1)); |
| 2270 } else { | 2267 } else { |
| 2271 value = 0; | 2268 value = 0; |
| 2272 } | 2269 } |
| 2273 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(target); | 2270 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(target); |
| 2274 this->flushRenderTarget(glRT, &SkIRect::EmptyIRect()); | 2271 this->flushRenderTarget(glRT, &SkIRect::EmptyIRect()); |
| 2275 | 2272 |
| 2276 this->flushScissor(clip.scissorState(), glRT->getViewport(), glRT->origin())
; | 2273 this->flushScissor(clip.scissorState(), glRT->getViewport(), glRT->origin())
; |
| 2277 this->flushWindowRectangles(clip.windowRectsState(), glRT); | 2274 this->disableWindowRectangles(); |
| 2278 | 2275 |
| 2279 GL_CALL(StencilMask((uint32_t) clipStencilMask)); | 2276 GL_CALL(StencilMask((uint32_t) clipStencilMask)); |
| 2280 GL_CALL(ClearStencil(value)); | 2277 GL_CALL(ClearStencil(value)); |
| 2281 GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT)); | 2278 GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT)); |
| 2282 fHWStencilSettings.invalidate(); | 2279 fHWStencilSettings.invalidate(); |
| 2283 } | 2280 } |
| 2284 | 2281 |
| 2285 static bool read_pixels_pays_for_y_flip(GrRenderTarget* renderTarget, const GrGL
Caps& caps, | 2282 static bool read_pixels_pays_for_y_flip(GrRenderTarget* renderTarget, const GrGL
Caps& caps, |
| 2286 int width, int height, GrPixelConfig co
nfig, | 2283 int width, int height, GrPixelConfig co
nfig, |
| 2287 size_t rowBytes) { | 2284 size_t rowBytes) { |
| (...skipping 2384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4672 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || | 4669 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || |
| 4673 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { | 4670 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { |
| 4674 copyParams->fFilter = GrTextureParams::kNone_FilterMode; | 4671 copyParams->fFilter = GrTextureParams::kNone_FilterMode; |
| 4675 copyParams->fWidth = texture->width(); | 4672 copyParams->fWidth = texture->width(); |
| 4676 copyParams->fHeight = texture->height(); | 4673 copyParams->fHeight = texture->height(); |
| 4677 return true; | 4674 return true; |
| 4678 } | 4675 } |
| 4679 } | 4676 } |
| 4680 return false; | 4677 return false; |
| 4681 } | 4678 } |
| OLD | NEW |