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 2720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2731 return; | 2731 return; |
2732 } | 2732 } |
2733 GrPixelLocalStorageState plsState = primProc.getPixelLocalStorageState(); | 2733 GrPixelLocalStorageState plsState = primProc.getPixelLocalStorageState(); |
2734 if (!fHWPLSEnabled && plsState != | 2734 if (!fHWPLSEnabled && plsState != |
2735 GrPixelLocalStorageState::kDisabled_GrPixelLocalStorageState) { | 2735 GrPixelLocalStorageState::kDisabled_GrPixelLocalStorageState) { |
2736 GL_CALL(Enable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE)); | 2736 GL_CALL(Enable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE)); |
2737 this->setupPixelLocalStorage(pipeline, primProc); | 2737 this->setupPixelLocalStorage(pipeline, primProc); |
2738 fHWPLSEnabled = true; | 2738 fHWPLSEnabled = true; |
2739 } | 2739 } |
2740 if (plsState == GrPixelLocalStorageState::kFinish_GrPixelLocalStorageState)
{ | 2740 if (plsState == GrPixelLocalStorageState::kFinish_GrPixelLocalStorageState)
{ |
2741 GrStencilSettings stencil; | 2741 this->disableStencil(); |
2742 stencil.setDisabled(); | |
2743 this->flushStencil(stencil); | |
2744 } | 2742 } |
2745 | 2743 |
2746 for (int i = 0; i < meshCount; ++i) { | 2744 for (int i = 0; i < meshCount; ++i) { |
2747 if (GrXferBarrierType barrierType = pipeline.xferBarrierType(*this->caps
())) { | 2745 if (GrXferBarrierType barrierType = pipeline.xferBarrierType(*this->caps
())) { |
2748 this->xferBarrier(pipeline.getRenderTarget(), barrierType); | 2746 this->xferBarrier(pipeline.getRenderTarget(), barrierType); |
2749 } | 2747 } |
2750 | 2748 |
2751 const GrMesh& mesh = meshes[i]; | 2749 const GrMesh& mesh = meshes[i]; |
2752 GrMesh::Iterator iter; | 2750 GrMesh::Iterator iter; |
2753 const GrNonInstancedMesh* nonInstMesh = iter.init(mesh); | 2751 const GrNonInstancedMesh* nonInstMesh = iter.init(mesh); |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2966 GR_GL_CALL(gl, StencilOp(glFailOp, GR_GL_KEEP, glPassOp)); | 2964 GR_GL_CALL(gl, StencilOp(glFailOp, GR_GL_KEEP, glPassOp)); |
2967 } else { | 2965 } else { |
2968 GR_GL_CALL(gl, StencilFuncSeparate(glFace, glFunc, ref, mask)); | 2966 GR_GL_CALL(gl, StencilFuncSeparate(glFace, glFunc, ref, mask)); |
2969 GR_GL_CALL(gl, StencilMaskSeparate(glFace, writeMask)); | 2967 GR_GL_CALL(gl, StencilMaskSeparate(glFace, writeMask)); |
2970 GR_GL_CALL(gl, StencilOpSeparate(glFace, glFailOp, GR_GL_KEEP, glPassOp)
); | 2968 GR_GL_CALL(gl, StencilOpSeparate(glFace, glFailOp, GR_GL_KEEP, glPassOp)
); |
2971 } | 2969 } |
2972 } | 2970 } |
2973 } | 2971 } |
2974 | 2972 |
2975 void GrGLGpu::flushStencil(const GrStencilSettings& stencilSettings) { | 2973 void GrGLGpu::flushStencil(const GrStencilSettings& stencilSettings) { |
2976 if (fHWStencilSettings != stencilSettings) { | 2974 if (stencilSettings.isDisabled()) { |
2977 if (stencilSettings.isDisabled()) { | 2975 this->disableStencil(); |
2978 if (kNo_TriState != fHWStencilTestEnabled) { | 2976 } else if (fHWStencilSettings != stencilSettings) { |
2979 GL_CALL(Disable(GR_GL_STENCIL_TEST)); | 2977 if (kYes_TriState != fHWStencilTestEnabled) { |
2980 fHWStencilTestEnabled = kNo_TriState; | 2978 GL_CALL(Enable(GR_GL_STENCIL_TEST)); |
2981 } | 2979 fHWStencilTestEnabled = kYes_TriState; |
| 2980 } |
| 2981 if (stencilSettings.isTwoSided()) { |
| 2982 SkASSERT(this->caps()->twoSidedStencilSupport()); |
| 2983 set_gl_stencil(this->glInterface(), |
| 2984 stencilSettings.front(), |
| 2985 GR_GL_FRONT); |
| 2986 set_gl_stencil(this->glInterface(), |
| 2987 stencilSettings.back(), |
| 2988 GR_GL_BACK); |
2982 } else { | 2989 } else { |
2983 if (kYes_TriState != fHWStencilTestEnabled) { | 2990 set_gl_stencil(this->glInterface(), |
2984 GL_CALL(Enable(GR_GL_STENCIL_TEST)); | 2991 stencilSettings.front(), |
2985 fHWStencilTestEnabled = kYes_TriState; | 2992 GR_GL_FRONT_AND_BACK); |
2986 } | |
2987 } | |
2988 if (!stencilSettings.isDisabled()) { | |
2989 if (stencilSettings.isTwoSided()) { | |
2990 SkASSERT(this->caps()->twoSidedStencilSupport()); | |
2991 set_gl_stencil(this->glInterface(), | |
2992 stencilSettings.front(), | |
2993 GR_GL_FRONT); | |
2994 set_gl_stencil(this->glInterface(), | |
2995 stencilSettings.back(), | |
2996 GR_GL_BACK); | |
2997 } else { | |
2998 set_gl_stencil(this->glInterface(), | |
2999 stencilSettings.front(), | |
3000 GR_GL_FRONT_AND_BACK); | |
3001 } | |
3002 } | 2993 } |
3003 fHWStencilSettings = stencilSettings; | 2994 fHWStencilSettings = stencilSettings; |
3004 } | 2995 } |
3005 } | 2996 } |
3006 | 2997 |
| 2998 void GrGLGpu::disableStencil() { |
| 2999 if (kNo_TriState != fHWStencilTestEnabled) { |
| 3000 GL_CALL(Disable(GR_GL_STENCIL_TEST)); |
| 3001 fHWStencilTestEnabled = kNo_TriState; |
| 3002 fHWStencilSettings.invalidate(); |
| 3003 } |
| 3004 } |
| 3005 |
3007 void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA, bool stencilEnabl
ed) { | 3006 void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA, bool stencilEnabl
ed) { |
3008 // rt is only optional if useHWAA is false. | 3007 // rt is only optional if useHWAA is false. |
3009 SkASSERT(rt || !useHWAA); | 3008 SkASSERT(rt || !useHWAA); |
3010 SkASSERT(!useHWAA || rt->isStencilBufferMultisampled()); | 3009 SkASSERT(!useHWAA || rt->isStencilBufferMultisampled()); |
3011 | 3010 |
3012 if (this->caps()->multisampleDisableSupport()) { | 3011 if (this->caps()->multisampleDisableSupport()) { |
3013 if (useHWAA) { | 3012 if (useHWAA) { |
3014 if (kYes_TriState != fMSAAEnabled) { | 3013 if (kYes_TriState != fMSAAEnabled) { |
3015 GL_CALL(Enable(GR_GL_MULTISAMPLE)); | 3014 GL_CALL(Enable(GR_GL_MULTISAMPLE)); |
3016 fMSAAEnabled = kYes_TriState; | 3015 fMSAAEnabled = kYes_TriState; |
(...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4131 GL_CALL(Uniform4fv(fWireRectProgram.fColorUniform, 1, channels)); | 4130 GL_CALL(Uniform4fv(fWireRectProgram.fColorUniform, 1, channels)); |
4132 | 4131 |
4133 GrXferProcessor::BlendInfo blendInfo; | 4132 GrXferProcessor::BlendInfo blendInfo; |
4134 blendInfo.reset(); | 4133 blendInfo.reset(); |
4135 this->flushBlend(blendInfo, GrSwizzle::RGBA()); | 4134 this->flushBlend(blendInfo, GrSwizzle::RGBA()); |
4136 this->flushColorWrite(true); | 4135 this->flushColorWrite(true); |
4137 this->flushDrawFace(GrDrawFace::kBoth); | 4136 this->flushDrawFace(GrDrawFace::kBoth); |
4138 this->flushHWAAState(glRT, false, false); | 4137 this->flushHWAAState(glRT, false, false); |
4139 this->disableScissor(); | 4138 this->disableScissor(); |
4140 this->disableWindowRectangles(); | 4139 this->disableWindowRectangles(); |
4141 GrStencilSettings stencil; | 4140 this->disableStencil(); |
4142 stencil.setDisabled(); | |
4143 this->flushStencil(stencil); | |
4144 | 4141 |
4145 GL_CALL(DrawArrays(GR_GL_LINE_LOOP, 0, 4)); | 4142 GL_CALL(DrawArrays(GR_GL_LINE_LOOP, 0, 4)); |
4146 } | 4143 } |
4147 | 4144 |
4148 | 4145 |
4149 bool GrGLGpu::copySurfaceAsDraw(GrSurface* dst, | 4146 bool GrGLGpu::copySurfaceAsDraw(GrSurface* dst, |
4150 GrSurface* src, | 4147 GrSurface* src, |
4151 const SkIRect& srcRect, | 4148 const SkIRect& srcRect, |
4152 const SkIPoint& dstPoint) { | 4149 const SkIPoint& dstPoint) { |
4153 GrGLTexture* srcTex = static_cast<GrGLTexture*>(src->asTexture()); | 4150 GrGLTexture* srcTex = static_cast<GrGLTexture*>(src->asTexture()); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4220 GL_CALL(Uniform1i(fCopyPrograms[progIdx].fTextureUniform, 0)); | 4217 GL_CALL(Uniform1i(fCopyPrograms[progIdx].fTextureUniform, 0)); |
4221 | 4218 |
4222 GrXferProcessor::BlendInfo blendInfo; | 4219 GrXferProcessor::BlendInfo blendInfo; |
4223 blendInfo.reset(); | 4220 blendInfo.reset(); |
4224 this->flushBlend(blendInfo, GrSwizzle::RGBA()); | 4221 this->flushBlend(blendInfo, GrSwizzle::RGBA()); |
4225 this->flushColorWrite(true); | 4222 this->flushColorWrite(true); |
4226 this->flushDrawFace(GrDrawFace::kBoth); | 4223 this->flushDrawFace(GrDrawFace::kBoth); |
4227 this->flushHWAAState(nullptr, false, false); | 4224 this->flushHWAAState(nullptr, false, false); |
4228 this->disableScissor(); | 4225 this->disableScissor(); |
4229 this->disableWindowRectangles(); | 4226 this->disableWindowRectangles(); |
4230 GrStencilSettings stencil; | 4227 this->disableStencil(); |
4231 stencil.setDisabled(); | |
4232 this->flushStencil(stencil); | |
4233 | 4228 |
4234 GL_CALL(DrawArrays(GR_GL_TRIANGLE_STRIP, 0, 4)); | 4229 GL_CALL(DrawArrays(GR_GL_TRIANGLE_STRIP, 0, 4)); |
4235 this->unbindTextureFBOForCopy(GR_GL_FRAMEBUFFER, dst); | 4230 this->unbindTextureFBOForCopy(GR_GL_FRAMEBUFFER, dst); |
4236 this->didWriteToSurface(dst, &dstRect); | 4231 this->didWriteToSurface(dst, &dstRect); |
4237 | 4232 |
4238 return true; | 4233 return true; |
4239 } | 4234 } |
4240 | 4235 |
4241 void GrGLGpu::copySurfaceAsCopyTexSubImage(GrSurface* dst, | 4236 void GrGLGpu::copySurfaceAsCopyTexSubImage(GrSurface* dst, |
4242 GrSurface* src, | 4237 GrSurface* src, |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4430 | 4425 |
4431 // Set "simple" state once: | 4426 // Set "simple" state once: |
4432 GrXferProcessor::BlendInfo blendInfo; | 4427 GrXferProcessor::BlendInfo blendInfo; |
4433 blendInfo.reset(); | 4428 blendInfo.reset(); |
4434 this->flushBlend(blendInfo, GrSwizzle::RGBA()); | 4429 this->flushBlend(blendInfo, GrSwizzle::RGBA()); |
4435 this->flushColorWrite(true); | 4430 this->flushColorWrite(true); |
4436 this->flushDrawFace(GrDrawFace::kBoth); | 4431 this->flushDrawFace(GrDrawFace::kBoth); |
4437 this->flushHWAAState(nullptr, false, false); | 4432 this->flushHWAAState(nullptr, false, false); |
4438 this->disableScissor(); | 4433 this->disableScissor(); |
4439 this->disableWindowRectangles(); | 4434 this->disableWindowRectangles(); |
4440 GrStencilSettings stencil; | 4435 this->disableStencil(); |
4441 stencil.setDisabled(); | |
4442 this->flushStencil(stencil); | |
4443 | 4436 |
4444 // Do all the blits: | 4437 // Do all the blits: |
4445 width = texture->width(); | 4438 width = texture->width(); |
4446 height = texture->height(); | 4439 height = texture->height(); |
4447 GrGLIRect viewport; | 4440 GrGLIRect viewport; |
4448 viewport.fLeft = 0; | 4441 viewport.fLeft = 0; |
4449 viewport.fBottom = 0; | 4442 viewport.fBottom = 0; |
4450 for (GrGLint level = 1; level < levelCount; ++level) { | 4443 for (GrGLint level = 1; level < levelCount; ++level) { |
4451 // Get and bind the program for this particular downsample (filter shape
can vary): | 4444 // Get and bind the program for this particular downsample (filter shape
can vary): |
4452 int progIdx = TextureSizeToMipmapProgramIdx(width, height); | 4445 int progIdx = TextureSizeToMipmapProgramIdx(width, height); |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4656 | 4649 |
4657 bool GrGLGpu::waitFence(GrFence fence, uint64_t timeout) const { | 4650 bool GrGLGpu::waitFence(GrFence fence, uint64_t timeout) const { |
4658 GrGLenum result; | 4651 GrGLenum result; |
4659 GL_CALL_RET(result, ClientWaitSync((GrGLsync)fence, GR_GL_SYNC_FLUSH_COMMAND
S_BIT, timeout)); | 4652 GL_CALL_RET(result, ClientWaitSync((GrGLsync)fence, GR_GL_SYNC_FLUSH_COMMAND
S_BIT, timeout)); |
4660 return (GR_GL_CONDITION_SATISFIED == result); | 4653 return (GR_GL_CONDITION_SATISFIED == result); |
4661 } | 4654 } |
4662 | 4655 |
4663 void GrGLGpu::deleteFence(GrFence fence) const { | 4656 void GrGLGpu::deleteFence(GrFence fence) const { |
4664 GL_CALL(DeleteSync((GrGLsync)fence)); | 4657 GL_CALL(DeleteSync((GrGLsync)fence)); |
4665 } | 4658 } |
OLD | NEW |