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 "GrGLGpu.h" | 9 #include "GrGLGpu.h" |
| 10 #include "GrGLStencilBuffer.h" | 10 #include "GrGLStencilBuffer.h" |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 440 } | 440 } |
| 441 | 441 |
| 442 return texture; | 442 return texture; |
| 443 } | 443 } |
| 444 | 444 |
| 445 GrRenderTarget* GrGLGpu::onWrapBackendRenderTarget(const GrBackendRenderTargetDe sc& wrapDesc) { | 445 GrRenderTarget* GrGLGpu::onWrapBackendRenderTarget(const GrBackendRenderTargetDe sc& wrapDesc) { |
| 446 GrGLRenderTarget::IDDesc idDesc; | 446 GrGLRenderTarget::IDDesc idDesc; |
| 447 GrGLuint fboID = static_cast<GrGLuint>(wrapDesc.fRenderTargetHandle); | 447 GrGLuint fboID = static_cast<GrGLuint>(wrapDesc.fRenderTargetHandle); |
| 448 idDesc.fRenderFBO.reset(SkNEW_ARGS(GrGLFBO, (fboID))); | 448 idDesc.fRenderFBO.reset(SkNEW_ARGS(GrGLFBO, (fboID))); |
| 449 idDesc.fMSColorRenderbufferID = 0; | 449 idDesc.fMSColorRenderbufferID = 0; |
| 450 idDesc.fSampleConfig = wrapDesc.fSampleConfig; | |
| 450 idDesc.fLifeCycle = GrGpuResource::kWrapped_LifeCycle; | 451 idDesc.fLifeCycle = GrGpuResource::kWrapped_LifeCycle; |
| 451 | 452 |
| 452 GrSurfaceDesc desc; | 453 GrSurfaceDesc desc; |
| 453 desc.fConfig = wrapDesc.fConfig; | 454 desc.fConfig = wrapDesc.fConfig; |
| 454 desc.fFlags = kCheckAllocation_GrSurfaceFlag; | 455 desc.fFlags = kCheckAllocation_GrSurfaceFlag; |
| 455 desc.fWidth = wrapDesc.fWidth; | 456 desc.fWidth = wrapDesc.fWidth; |
| 456 desc.fHeight = wrapDesc.fHeight; | 457 desc.fHeight = wrapDesc.fHeight; |
| 457 desc.fSampleCnt = wrapDesc.fSampleCnt; | 458 desc.fSampleCnt = wrapDesc.fSampleCnt; |
| 458 desc.fOrigin = resolve_origin(wrapDesc.fOrigin, true); | 459 desc.fOrigin = resolve_origin(wrapDesc.fOrigin, true); |
| 459 | 460 |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 787 | 788 |
| 788 static bool renderbuffer_storage_msaa(GrGLContext& ctx, | 789 static bool renderbuffer_storage_msaa(GrGLContext& ctx, |
| 789 int sampleCount, | 790 int sampleCount, |
| 790 GrGLenum format, | 791 GrGLenum format, |
| 791 int width, int height) { | 792 int width, int height) { |
| 792 CLEAR_ERROR_BEFORE_ALLOC(ctx.interface()); | 793 CLEAR_ERROR_BEFORE_ALLOC(ctx.interface()); |
| 793 SkASSERT(GrGLCaps::kNone_MSFBOType != ctx.caps()->msFBOType()); | 794 SkASSERT(GrGLCaps::kNone_MSFBOType != ctx.caps()->msFBOType()); |
| 794 switch (ctx.caps()->msFBOType()) { | 795 switch (ctx.caps()->msFBOType()) { |
| 795 case GrGLCaps::kDesktop_ARB_MSFBOType: | 796 case GrGLCaps::kDesktop_ARB_MSFBOType: |
| 796 case GrGLCaps::kDesktop_EXT_MSFBOType: | 797 case GrGLCaps::kDesktop_EXT_MSFBOType: |
| 798 case GrGLCaps::kStencil_MSFBOType: | |
| 797 case GrGLCaps::kES_3_0_MSFBOType: | 799 case GrGLCaps::kES_3_0_MSFBOType: |
| 798 GL_ALLOC_CALL(ctx.interface(), | 800 GL_ALLOC_CALL(ctx.interface(), |
| 799 RenderbufferStorageMultisample(GR_GL_RENDERBUFFER, | 801 RenderbufferStorageMultisample(GR_GL_RENDERBUFFER, |
| 800 sampleCount, | 802 sampleCount, |
| 801 format, | 803 format, |
| 802 width, height)); | 804 width, height)); |
| 803 break; | 805 break; |
| 804 case GrGLCaps::kES_Apple_MSFBOType: | 806 case GrGLCaps::kES_Apple_MSFBOType: |
| 805 GL_ALLOC_CALL(ctx.interface(), | 807 GL_ALLOC_CALL(ctx.interface(), |
| 806 RenderbufferStorageMultisampleES2APPLE(GR_GL_RENDERB UFFER, | 808 RenderbufferStorageMultisampleES2APPLE(GR_GL_RENDERB UFFER, |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 821 break; | 823 break; |
| 822 } | 824 } |
| 823 return (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctx.interface()));; | 825 return (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctx.interface()));; |
| 824 } | 826 } |
| 825 | 827 |
| 826 bool GrGLGpu::createRenderTargetObjects(const GrSurfaceDesc& desc, bool budgeted , GrGLuint texID, | 828 bool GrGLGpu::createRenderTargetObjects(const GrSurfaceDesc& desc, bool budgeted , GrGLuint texID, |
| 827 GrGLRenderTarget::IDDesc* idDesc) { | 829 GrGLRenderTarget::IDDesc* idDesc) { |
| 828 idDesc->fMSColorRenderbufferID = 0; | 830 idDesc->fMSColorRenderbufferID = 0; |
| 829 idDesc->fLifeCycle = budgeted ? GrGpuResource::kCached_LifeCycle : | 831 idDesc->fLifeCycle = budgeted ? GrGpuResource::kCached_LifeCycle : |
| 830 GrGpuResource::kUncached_LifeCycle; | 832 GrGpuResource::kUncached_LifeCycle; |
| 833 idDesc->fSampleConfig = GrGLCaps::kStencil_MSFBOType == | |
| 834 this->glCaps().msFBOType() ? kStencil_GrSampleConfig : | |
| 835 kUnified_GrSampleConfig ; | |
| 831 | 836 |
| 832 GrGLenum status; | 837 GrGLenum status; |
| 833 | 838 |
| 834 GrGLenum msColorFormat = 0; // suppress warning | 839 GrGLenum msColorFormat = 0; // suppress warning |
| 835 GrGLenum fboTarget = 0; // suppress warning | 840 GrGLenum fboTarget = 0; // suppress warning |
| 836 | 841 |
| 837 if (desc.fSampleCnt > 0 && GrGLCaps::kNone_MSFBOType == this->glCaps().msFBO Type()) { | 842 if (desc.fSampleCnt > 0 && GrGLCaps::kNone_MSFBOType == this->glCaps().msFBO Type()) { |
| 838 goto FAILED; | 843 goto FAILED; |
| 839 } | 844 } |
| 840 | 845 |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1140 } | 1145 } |
| 1141 } | 1146 } |
| 1142 | 1147 |
| 1143 bool GrGLGpu::createStencilBufferForRenderTarget(GrRenderTarget* rt, int width, int height) { | 1148 bool GrGLGpu::createStencilBufferForRenderTarget(GrRenderTarget* rt, int width, int height) { |
| 1144 // All internally created RTs are also textures. We don't create | 1149 // All internally created RTs are also textures. We don't create |
| 1145 // SBs for a client's standalone RT (that is a RT that isn't also a texture) . | 1150 // SBs for a client's standalone RT (that is a RT that isn't also a texture) . |
| 1146 SkASSERT(rt->asTexture()); | 1151 SkASSERT(rt->asTexture()); |
| 1147 SkASSERT(width >= rt->width()); | 1152 SkASSERT(width >= rt->width()); |
| 1148 SkASSERT(height >= rt->height()); | 1153 SkASSERT(height >= rt->height()); |
| 1149 | 1154 |
| 1150 int samples = rt->numSamples(); | 1155 int samples = rt->numSamples(kStencil_GrSampleConfig); |
| 1151 GrGLStencilBuffer::IDDesc sbDesc; | 1156 GrGLStencilBuffer::IDDesc sbDesc; |
| 1152 | 1157 |
| 1153 int stencilFmtCnt = this->glCaps().stencilFormats().count(); | 1158 int stencilFmtCnt = this->glCaps().stencilFormats().count(); |
| 1154 for (int i = 0; i < stencilFmtCnt; ++i) { | 1159 for (int i = 0; i < stencilFmtCnt; ++i) { |
| 1155 if (!sbDesc.fRenderbufferID) { | 1160 if (!sbDesc.fRenderbufferID) { |
| 1156 GL_CALL(GenRenderbuffers(1, &sbDesc.fRenderbufferID)); | 1161 GL_CALL(GenRenderbuffers(1, &sbDesc.fRenderbufferID)); |
| 1157 } | 1162 } |
| 1158 if (!sbDesc.fRenderbufferID) { | 1163 if (!sbDesc.fRenderbufferID) { |
| 1159 return false; | 1164 return false; |
| 1160 } | 1165 } |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1383 fHWScissorSettings.fEnabled = kYes_TriState; | 1388 fHWScissorSettings.fEnabled = kYes_TriState; |
| 1384 } | 1389 } |
| 1385 return; | 1390 return; |
| 1386 } | 1391 } |
| 1387 } | 1392 } |
| 1388 | 1393 |
| 1389 // See fall through note above | 1394 // See fall through note above |
| 1390 this->disableScissor(); | 1395 this->disableScissor(); |
| 1391 } | 1396 } |
| 1392 | 1397 |
| 1393 bool GrGLGpu::flushGLState(const DrawArgs& args, bool isLineDraw) { | 1398 bool GrGLGpu::flushGLState(const DrawArgs& args, bool isLineDraw, GrSampleConfig sampleConfig) { |
| 1394 GrXferProcessor::BlendInfo blendInfo; | 1399 GrXferProcessor::BlendInfo blendInfo; |
| 1395 const GrPipeline& pipeline = *args.fPipeline; | 1400 const GrPipeline& pipeline = *args.fPipeline; |
| 1396 args.fPipeline->getXferProcessor()->getBlendInfo(&blendInfo); | 1401 args.fPipeline->getXferProcessor()->getBlendInfo(&blendInfo); |
| 1397 | 1402 |
| 1398 this->flushDither(pipeline.isDitherState()); | 1403 this->flushDither(pipeline.isDitherState()); |
| 1399 this->flushColorWrite(blendInfo.fWriteColor); | 1404 this->flushColorWrite(blendInfo.fWriteColor); |
| 1400 this->flushDrawFace(pipeline.getDrawFace()); | 1405 this->flushDrawFace(pipeline.getDrawFace()); |
| 1401 | 1406 |
| 1402 fCurrentProgram.reset(fProgramCache->getProgram(args)); | 1407 fCurrentProgram.reset(fProgramCache->getProgram(args)); |
| 1403 if (NULL == fCurrentProgram.get()) { | 1408 if (NULL == fCurrentProgram.get()) { |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 1415 | 1420 |
| 1416 if (blendInfo.fWriteColor) { | 1421 if (blendInfo.fWriteColor) { |
| 1417 this->flushBlend(blendInfo); | 1422 this->flushBlend(blendInfo); |
| 1418 } | 1423 } |
| 1419 | 1424 |
| 1420 fCurrentProgram->setData(*args.fPrimitiveProcessor, pipeline, *args.fBatchTr acker); | 1425 fCurrentProgram->setData(*args.fPrimitiveProcessor, pipeline, *args.fBatchTr acker); |
| 1421 | 1426 |
| 1422 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(pipeline.getRenderTa rget()); | 1427 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(pipeline.getRenderTa rget()); |
| 1423 this->flushStencil(pipeline.getStencil()); | 1428 this->flushStencil(pipeline.getStencil()); |
| 1424 this->flushScissor(pipeline.getScissorState(), glRT->getViewport(), glRT->or igin()); | 1429 this->flushScissor(pipeline.getScissorState(), glRT->getViewport(), glRT->or igin()); |
| 1425 this->flushHWAAState(glRT, pipeline.isHWAntialiasState(), isLineDraw); | 1430 this->flushHWAAState(glRT, pipeline.isHWAntialiasState(), isLineDraw, sample Config); |
| 1426 | 1431 |
| 1427 // This must come after textures are flushed because a texture may need | 1432 // This must come after textures are flushed because a texture may need |
| 1428 // to be msaa-resolved (which will modify bound FBO state). | 1433 // to be msaa-resolved (which will modify bound FBO state). |
| 1429 this->prepareToDrawToRenderTarget(glRT, NULL); | 1434 this->prepareToDrawToRenderTarget(glRT, NULL); |
| 1430 | 1435 |
| 1431 return true; | 1436 return true; |
| 1432 } | 1437 } |
| 1433 | 1438 |
| 1434 void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc, | 1439 void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc, |
| 1435 const GrDrawTarget::DrawInfo& info, | 1440 const GrDrawTarget::DrawInfo& info, |
| (...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1943 this->glPathRendering()->setProjectionMatrix(*state.fViewMatrix, size, rt->o rigin()); | 1948 this->glPathRendering()->setProjectionMatrix(*state.fViewMatrix, size, rt->o rigin()); |
| 1944 this->flushScissor(*state.fScissor, rt->getViewport(), rt->origin()); | 1949 this->flushScissor(*state.fScissor, rt->getViewport(), rt->origin()); |
| 1945 this->flushHWAAState(rt, state.fUseHWAA, false); | 1950 this->flushHWAAState(rt, state.fUseHWAA, false); |
| 1946 this->prepareToDrawToRenderTarget(rt, NULL); | 1951 this->prepareToDrawToRenderTarget(rt, NULL); |
| 1947 | 1952 |
| 1948 fPathRendering->stencilPath(path, *state.fStencil); | 1953 fPathRendering->stencilPath(path, *state.fStencil); |
| 1949 } | 1954 } |
| 1950 | 1955 |
| 1951 void GrGLGpu::onDrawPath(const DrawArgs& args, const GrPath* path, | 1956 void GrGLGpu::onDrawPath(const DrawArgs& args, const GrPath* path, |
| 1952 const GrStencilSettings& stencil) { | 1957 const GrStencilSettings& stencil) { |
| 1953 if (!this->flushGLState(args, false)) { | 1958 if (!this->flushGLState(args, false, kStencil_GrSampleConfig)) { |
| 1954 return; | 1959 return; |
| 1955 } | 1960 } |
| 1956 fPathRendering->drawPath(path, stencil); | 1961 fPathRendering->drawPath(path, stencil); |
| 1957 } | 1962 } |
| 1958 | 1963 |
| 1959 void GrGLGpu::onDrawPaths(const DrawArgs& args, | 1964 void GrGLGpu::onDrawPaths(const DrawArgs& args, |
| 1960 const GrPathRange* pathRange, | 1965 const GrPathRange* pathRange, |
| 1961 const void* indices, | 1966 const void* indices, |
| 1962 GrDrawTarget::PathIndexType indexType, | 1967 GrDrawTarget::PathIndexType indexType, |
| 1963 const float transformValues[], | 1968 const float transformValues[], |
| 1964 GrDrawTarget::PathTransformType transformType, | 1969 GrDrawTarget::PathTransformType transformType, |
| 1965 int count, | 1970 int count, |
| 1966 const GrStencilSettings& stencil) { | 1971 const GrStencilSettings& stencil) { |
| 1967 if (!this->flushGLState(args, false)) { | 1972 if (!this->flushGLState(args, false, kStencil_GrSampleConfig)) { |
| 1968 return; | 1973 return; |
| 1969 } | 1974 } |
| 1970 fPathRendering->drawPaths(pathRange, indices, indexType, transformValues, | 1975 fPathRendering->drawPaths(pathRange, indices, indexType, transformValues, |
| 1971 transformType, count, stencil); | 1976 transformType, count, stencil); |
| 1972 } | 1977 } |
| 1973 | 1978 |
| 1974 void GrGLGpu::onResolveRenderTarget(GrRenderTarget* target) { | 1979 void GrGLGpu::onResolveRenderTarget(GrRenderTarget* target) { |
| 1975 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target); | 1980 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target); |
| 1976 if (rt->needsResolve()) { | 1981 if (rt->needsResolve()) { |
| 1977 // Some extensions automatically resolves the texture when it is read. | 1982 // Some extensions automatically resolves the texture when it is read. |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2087 set_gl_stencil(this->glInterface(), | 2092 set_gl_stencil(this->glInterface(), |
| 2088 stencilSettings, | 2093 stencilSettings, |
| 2089 GR_GL_FRONT_AND_BACK, | 2094 GR_GL_FRONT_AND_BACK, |
| 2090 GrStencilSettings::kFront_Face); | 2095 GrStencilSettings::kFront_Face); |
| 2091 } | 2096 } |
| 2092 } | 2097 } |
| 2093 fHWStencilSettings = stencilSettings; | 2098 fHWStencilSettings = stencilSettings; |
| 2094 } | 2099 } |
| 2095 } | 2100 } |
| 2096 | 2101 |
| 2097 void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA, bool isLineDraw) { | 2102 void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA, bool isLineDraw, |
| 2103 GrSampleConfig sampleConfig) { | |
| 2098 // At least some ATI linux drivers will render GL_LINES incorrectly when MSAA st ate is enabled but | 2104 // At least some ATI linux drivers will render GL_LINES incorrectly when MSAA st ate is enabled but |
| 2099 // the target is not multisampled. Single pixel wide lines are rendered thicker than 1 pixel wide. | 2105 // the target is not multisampled. Single pixel wide lines are rendered thicker than 1 pixel wide. |
| 2100 #if 0 | 2106 #if 0 |
| 2101 // Replace RT_HAS_MSAA with this definition once this driver bug is no longe r a relevant concern | 2107 // Replace RT_HAS_MSAA with this definition once this driver bug is no longe r a relevant concern |
| 2102 #define RT_HAS_MSAA rt->isMultisampled() | 2108 #define RT_HAS_MSAA rt->isMultisampled(sampleConfig) |
| 2103 #else | 2109 #else |
| 2104 #define RT_HAS_MSAA (rt->isMultisampled() || isLineDraw) | 2110 #define RT_HAS_MSAA (rt->isMultisampled(sampleConfig) || isLineDraw) |
| 2105 #endif | 2111 #endif |
| 2106 | 2112 |
| 2107 if (kGL_GrGLStandard == this->glStandard()) { | 2113 if (kGL_GrGLStandard == this->glStandard()) { |
|
Chris Dalton
2015/03/14 02:51:30
GL_MULTISAMPLE doesn't traditionally exist in ES 2
| |
| 2108 if (RT_HAS_MSAA) { | 2114 if (RT_HAS_MSAA && useHWAA) { |
| 2109 if (useHWAA) { | 2115 if (kYes_TriState != fMSAAEnabled) { |
| 2110 if (kYes_TriState != fMSAAEnabled) { | 2116 GL_CALL(Enable(GR_GL_MULTISAMPLE)); |
| 2111 GL_CALL(Enable(GR_GL_MULTISAMPLE)); | 2117 fMSAAEnabled = kYes_TriState; |
| 2112 fMSAAEnabled = kYes_TriState; | |
| 2113 } | |
| 2114 } else { | |
| 2115 if (kNo_TriState != fMSAAEnabled) { | |
| 2116 GL_CALL(Disable(GR_GL_MULTISAMPLE)); | |
| 2117 fMSAAEnabled = kNo_TriState; | |
| 2118 } | |
| 2119 } | 2118 } |
| 2119 } else { | |
| 2120 if (kNo_TriState != fMSAAEnabled) { | |
| 2121 GL_CALL(Disable(GR_GL_MULTISAMPLE)); | |
| 2122 fMSAAEnabled = kNo_TriState; | |
| 2123 } | |
| 2124 } | |
| 2125 } | |
| 2126 if (this->glCaps().fbMixedSamplesSupport()) { | |
| 2127 if (rt->isMultisampled(kStencil_GrSampleConfig)) { | |
|
Chris Dalton
2015/03/14 02:51:30
I think this would want to say: (after applying ht
| |
| 2128 GL_CALL(CoverageModulation(GR_GL_RGBA)); | |
|
Chris Dalton
2015/03/14 02:51:30
We should add a state variable for fCoverageModula
| |
| 2129 } else { | |
| 2130 GL_CALL(CoverageModulation(GR_GL_NONE)); | |
| 2120 } | 2131 } |
| 2121 } | 2132 } |
| 2122 } | 2133 } |
| 2123 | 2134 |
| 2124 void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo) { | 2135 void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo) { |
| 2125 // Any optimization to disable blending should have already been applied and | 2136 // Any optimization to disable blending should have already been applied and |
| 2126 // tweaked the coeffs to (1, 0). | 2137 // tweaked the coeffs to (1, 0). |
| 2127 | 2138 |
| 2128 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend; | 2139 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend; |
| 2129 GrBlendCoeff dstCoeff = blendInfo.fDstBlend; | 2140 GrBlendCoeff dstCoeff = blendInfo.fDstBlend; |
| (...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2822 this->setVertexArrayID(gpu, 0); | 2833 this->setVertexArrayID(gpu, 0); |
| 2823 } | 2834 } |
| 2824 int attrCount = gpu->glCaps().maxVertexAttributes(); | 2835 int attrCount = gpu->glCaps().maxVertexAttributes(); |
| 2825 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 2836 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
| 2826 fDefaultVertexArrayAttribState.resize(attrCount); | 2837 fDefaultVertexArrayAttribState.resize(attrCount); |
| 2827 } | 2838 } |
| 2828 attribState = &fDefaultVertexArrayAttribState; | 2839 attribState = &fDefaultVertexArrayAttribState; |
| 2829 } | 2840 } |
| 2830 return attribState; | 2841 return attribState; |
| 2831 } | 2842 } |
| OLD | NEW |