Chromium Code Reviews| 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 "GrGpuGL.h" | 9 #include "GrGpuGL.h" |
| 10 #include "GrGLNameAllocator.h" | 10 #include "GrGLNameAllocator.h" |
| (...skipping 2146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2157 // the target is not multisampled. Single pixel wide lines are rendered thicker than 1 pixel wide. | 2157 // the target is not multisampled. Single pixel wide lines are rendered thicker than 1 pixel wide. |
| 2158 #if 0 | 2158 #if 0 |
| 2159 // Replace RT_HAS_MSAA with this definition once this driver bug is no longe r a relevant concern | 2159 // Replace RT_HAS_MSAA with this definition once this driver bug is no longe r a relevant concern |
| 2160 #define RT_HAS_MSAA rt->isMultisampled() | 2160 #define RT_HAS_MSAA rt->isMultisampled() |
| 2161 #else | 2161 #else |
| 2162 #define RT_HAS_MSAA (rt->isMultisampled() || kDrawLines_DrawType == type) | 2162 #define RT_HAS_MSAA (rt->isMultisampled() || kDrawLines_DrawType == type) |
| 2163 #endif | 2163 #endif |
| 2164 | 2164 |
| 2165 const GrRenderTarget* rt = this->getDrawState().getRenderTarget(); | 2165 const GrRenderTarget* rt = this->getDrawState().getRenderTarget(); |
| 2166 if (kGL_GrGLStandard == this->glStandard()) { | 2166 if (kGL_GrGLStandard == this->glStandard()) { |
| 2167 // ES doesn't support toggling GL_MULTISAMPLE and doesn't have | |
| 2168 // smooth lines. | |
| 2169 // we prefer smooth lines over multisampled lines | |
| 2170 bool smoothLines = false; | |
| 2171 | |
| 2172 if (kDrawLines_DrawType == type) { | 2167 if (kDrawLines_DrawType == type) { |
| 2173 smoothLines = this->willUseHWAALines(); | 2168 if (kNo_TriState != fHWAAState.fSmoothLineEnabled) { |
| 2174 if (smoothLines) { | 2169 GL_CALL(Disable(GR_GL_LINE_SMOOTH)); |
|
bsalomon
2014/07/28 19:46:05
We already disable this in onResetContext. Let's g
| |
| 2175 if (kYes_TriState != fHWAAState.fSmoothLineEnabled) { | 2170 fHWAAState.fSmoothLineEnabled = kNo_TriState; |
| 2176 GL_CALL(Enable(GR_GL_LINE_SMOOTH)); | |
| 2177 fHWAAState.fSmoothLineEnabled = kYes_TriState; | |
| 2178 // must disable msaa to use line smoothing | |
| 2179 if (RT_HAS_MSAA && | |
| 2180 kNo_TriState != fHWAAState.fMSAAEnabled) { | |
| 2181 GL_CALL(Disable(GR_GL_MULTISAMPLE)); | |
| 2182 fHWAAState.fMSAAEnabled = kNo_TriState; | |
| 2183 } | |
| 2184 } | |
| 2185 } else { | |
| 2186 if (kNo_TriState != fHWAAState.fSmoothLineEnabled) { | |
| 2187 GL_CALL(Disable(GR_GL_LINE_SMOOTH)); | |
| 2188 fHWAAState.fSmoothLineEnabled = kNo_TriState; | |
| 2189 } | |
| 2190 } | 2171 } |
| 2191 } | 2172 } |
| 2192 if (!smoothLines && RT_HAS_MSAA) { | 2173 if (RT_HAS_MSAA) { |
| 2193 // FIXME: GL_NV_pr doesn't seem to like MSAA disabled. The paths | 2174 // FIXME: GL_NV_pr doesn't seem to like MSAA disabled. The paths |
| 2194 // convex hulls of each segment appear to get filled. | 2175 // convex hulls of each segment appear to get filled. |
| 2195 bool enableMSAA = kStencilPath_DrawType == type || | 2176 bool enableMSAA = kStencilPath_DrawType == type || |
| 2196 this->getDrawState().isHWAntialiasState(); | 2177 this->getDrawState().isHWAntialiasState(); |
| 2197 if (enableMSAA) { | 2178 if (enableMSAA) { |
| 2198 if (kYes_TriState != fHWAAState.fMSAAEnabled) { | 2179 if (kYes_TriState != fHWAAState.fMSAAEnabled) { |
| 2199 GL_CALL(Enable(GR_GL_MULTISAMPLE)); | 2180 GL_CALL(Enable(GR_GL_MULTISAMPLE)); |
| 2200 fHWAAState.fMSAAEnabled = kYes_TriState; | 2181 fHWAAState.fMSAAEnabled = kYes_TriState; |
| 2201 } | 2182 } |
| 2202 } else { | 2183 } else { |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 2221 pathStencilSettings.funcRef(GrStencilSettings::k Front_Face), | 2202 pathStencilSettings.funcRef(GrStencilSettings::k Front_Face), |
| 2222 pathStencilSettings.funcMask(GrStencilSettings:: kFront_Face))); | 2203 pathStencilSettings.funcMask(GrStencilSettings:: kFront_Face))); |
| 2223 | 2204 |
| 2224 fHWPathStencilSettings = pathStencilSettings; | 2205 fHWPathStencilSettings = pathStencilSettings; |
| 2225 } | 2206 } |
| 2226 } | 2207 } |
| 2227 | 2208 |
| 2228 void GrGpuGL::flushBlend(bool isLines, | 2209 void GrGpuGL::flushBlend(bool isLines, |
| 2229 GrBlendCoeff srcCoeff, | 2210 GrBlendCoeff srcCoeff, |
| 2230 GrBlendCoeff dstCoeff) { | 2211 GrBlendCoeff dstCoeff) { |
| 2231 if (isLines && this->willUseHWAALines()) { | 2212 // any optimization to disable blending should |
| 2213 // have already been applied and tweaked the coeffs | |
| 2214 // to (1, 0). | |
| 2215 bool blendOff = kOne_GrBlendCoeff == srcCoeff && | |
| 2216 kZero_GrBlendCoeff == dstCoeff; | |
| 2217 if (blendOff) { | |
| 2218 if (kNo_TriState != fHWBlendState.fEnabled) { | |
| 2219 GL_CALL(Disable(GR_GL_BLEND)); | |
| 2220 fHWBlendState.fEnabled = kNo_TriState; | |
| 2221 } | |
| 2222 } else { | |
| 2232 if (kYes_TriState != fHWBlendState.fEnabled) { | 2223 if (kYes_TriState != fHWBlendState.fEnabled) { |
| 2233 GL_CALL(Enable(GR_GL_BLEND)); | 2224 GL_CALL(Enable(GR_GL_BLEND)); |
| 2234 fHWBlendState.fEnabled = kYes_TriState; | 2225 fHWBlendState.fEnabled = kYes_TriState; |
| 2235 } | 2226 } |
| 2236 if (kSA_GrBlendCoeff != fHWBlendState.fSrcCoeff || | 2227 if (fHWBlendState.fSrcCoeff != srcCoeff || |
| 2237 kISA_GrBlendCoeff != fHWBlendState.fDstCoeff) { | 2228 fHWBlendState.fDstCoeff != dstCoeff) { |
| 2238 GL_CALL(BlendFunc(gXfermodeCoeff2Blend[kSA_GrBlendCoeff], | 2229 GL_CALL(BlendFunc(gXfermodeCoeff2Blend[srcCoeff], |
| 2239 gXfermodeCoeff2Blend[kISA_GrBlendCoeff])); | 2230 gXfermodeCoeff2Blend[dstCoeff])); |
| 2240 fHWBlendState.fSrcCoeff = kSA_GrBlendCoeff; | 2231 fHWBlendState.fSrcCoeff = srcCoeff; |
| 2241 fHWBlendState.fDstCoeff = kISA_GrBlendCoeff; | 2232 fHWBlendState.fDstCoeff = dstCoeff; |
| 2242 } | 2233 } |
| 2243 } else { | 2234 GrColor blendConst = this->getDrawState().getBlendConstant(); |
| 2244 // any optimization to disable blending should | 2235 if ((BlendCoeffReferencesConstant(srcCoeff) || |
| 2245 // have already been applied and tweaked the coeffs | 2236 BlendCoeffReferencesConstant(dstCoeff)) && |
| 2246 // to (1, 0). | 2237 (!fHWBlendState.fConstColorValid || |
| 2247 bool blendOff = kOne_GrBlendCoeff == srcCoeff && | 2238 fHWBlendState.fConstColor != blendConst)) { |
| 2248 kZero_GrBlendCoeff == dstCoeff; | 2239 GrGLfloat c[4]; |
| 2249 if (blendOff) { | 2240 GrColorToRGBAFloat(blendConst, c); |
| 2250 if (kNo_TriState != fHWBlendState.fEnabled) { | 2241 GL_CALL(BlendColor(c[0], c[1], c[2], c[3])); |
| 2251 GL_CALL(Disable(GR_GL_BLEND)); | 2242 fHWBlendState.fConstColor = blendConst; |
| 2252 fHWBlendState.fEnabled = kNo_TriState; | 2243 fHWBlendState.fConstColorValid = true; |
| 2253 } | |
| 2254 } else { | |
| 2255 if (kYes_TriState != fHWBlendState.fEnabled) { | |
| 2256 GL_CALL(Enable(GR_GL_BLEND)); | |
| 2257 fHWBlendState.fEnabled = kYes_TriState; | |
| 2258 } | |
| 2259 if (fHWBlendState.fSrcCoeff != srcCoeff || | |
| 2260 fHWBlendState.fDstCoeff != dstCoeff) { | |
| 2261 GL_CALL(BlendFunc(gXfermodeCoeff2Blend[srcCoeff], | |
| 2262 gXfermodeCoeff2Blend[dstCoeff])); | |
| 2263 fHWBlendState.fSrcCoeff = srcCoeff; | |
| 2264 fHWBlendState.fDstCoeff = dstCoeff; | |
| 2265 } | |
| 2266 GrColor blendConst = this->getDrawState().getBlendConstant(); | |
| 2267 if ((BlendCoeffReferencesConstant(srcCoeff) || | |
| 2268 BlendCoeffReferencesConstant(dstCoeff)) && | |
| 2269 (!fHWBlendState.fConstColorValid || | |
| 2270 fHWBlendState.fConstColor != blendConst)) { | |
| 2271 GrGLfloat c[4]; | |
| 2272 GrColorToRGBAFloat(blendConst, c); | |
| 2273 GL_CALL(BlendColor(c[0], c[1], c[2], c[3])); | |
| 2274 fHWBlendState.fConstColor = blendConst; | |
| 2275 fHWBlendState.fConstColorValid = true; | |
| 2276 } | |
| 2277 } | 2244 } |
| 2278 } | 2245 } |
| 2279 } | 2246 } |
| 2280 | 2247 |
| 2281 static inline GrGLenum tile_to_gl_wrap(SkShader::TileMode tm) { | 2248 static inline GrGLenum tile_to_gl_wrap(SkShader::TileMode tm) { |
| 2282 static const GrGLenum gWrapModes[] = { | 2249 static const GrGLenum gWrapModes[] = { |
| 2283 GR_GL_CLAMP_TO_EDGE, | 2250 GR_GL_CLAMP_TO_EDGE, |
| 2284 GR_GL_REPEAT, | 2251 GR_GL_REPEAT, |
| 2285 GR_GL_MIRRORED_REPEAT | 2252 GR_GL_MIRRORED_REPEAT |
| 2286 }; | 2253 }; |
| (...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3018 this->setVertexArrayID(gpu, 0); | 2985 this->setVertexArrayID(gpu, 0); |
| 3019 } | 2986 } |
| 3020 int attrCount = gpu->glCaps().maxVertexAttributes(); | 2987 int attrCount = gpu->glCaps().maxVertexAttributes(); |
| 3021 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 2988 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
| 3022 fDefaultVertexArrayAttribState.resize(attrCount); | 2989 fDefaultVertexArrayAttribState.resize(attrCount); |
| 3023 } | 2990 } |
| 3024 attribState = &fDefaultVertexArrayAttribState; | 2991 attribState = &fDefaultVertexArrayAttribState; |
| 3025 } | 2992 } |
| 3026 return attribState; | 2993 return attribState; |
| 3027 } | 2994 } |
| OLD | NEW |