Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(129)

Side by Side Diff: src/gpu/gl/GrGLGpu.cpp

Issue 1666563003: Add support for GL_EXT_raster_multisample (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: remove rasterMultisampleSupport Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/gl/GrGLGpu.h ('k') | src/gpu/gl/GrGLPathRendering.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 } 436 }
437 fHWWriteToColor = kUnknown_TriState; 437 fHWWriteToColor = kUnknown_TriState;
438 // we only ever use lines in hairline mode 438 // we only ever use lines in hairline mode
439 GL_CALL(LineWidth(1)); 439 GL_CALL(LineWidth(1));
440 GL_CALL(Disable(GR_GL_DITHER)); 440 GL_CALL(Disable(GR_GL_DITHER));
441 } 441 }
442 442
443 if (resetBits & kMSAAEnable_GrGLBackendState) { 443 if (resetBits & kMSAAEnable_GrGLBackendState) {
444 fMSAAEnabled = kUnknown_TriState; 444 fMSAAEnabled = kUnknown_TriState;
445 445
446 // In mixed samples mode coverage modulation allows the coverage to be c onverted to
447 // "opacity", which can then be blended into the color buffer to accompl ish antialiasing.
448 // Enable coverage modulation suitable for premultiplied alpha colors.
449 // This state has no effect when not rendering to a mixed sampled target .
450 if (this->caps()->usesMixedSamples()) { 446 if (this->caps()->usesMixedSamples()) {
447 if (0 != this->caps()->maxRasterSamples()) {
448 fHWRasterMultisampleEnabled = kUnknown_TriState;
449 fHWNumRasterSamples = 0;
450 }
451
452 // The skia blend modes all use premultiplied alpha and therefore ex pect RGBA coverage
453 // modulation. This state has no effect when not rendering to a mixe d sampled target.
451 GL_CALL(CoverageModulation(GR_GL_RGBA)); 454 GL_CALL(CoverageModulation(GR_GL_RGBA));
452 } 455 }
453 } 456 }
454 457
455 fHWActiveTextureUnitIdx = -1; // invalid 458 fHWActiveTextureUnitIdx = -1; // invalid
456 459
457 if (resetBits & kTextureBinding_GrGLBackendState) { 460 if (resetBits & kTextureBinding_GrGLBackendState) {
458 for (int s = 0; s < fHWBoundTextureUniqueIDs.count(); ++s) { 461 for (int s = 0; s < fHWBoundTextureUniqueIDs.count(); ++s) {
459 fHWBoundTextureUniqueIDs[s] = SK_InvalidUniqueID; 462 fHWBoundTextureUniqueIDs[s] = SK_InvalidUniqueID;
460 } 463 }
(...skipping 1243 matching lines...) Expand 10 before | Expand all | Expand 10 after
1704 1707
1705 int numTextureAccesses = textureAccesses.count(); 1708 int numTextureAccesses = textureAccesses.count();
1706 for (int i = 0; i < numTextureAccesses; i++) { 1709 for (int i = 0; i < numTextureAccesses; i++) {
1707 this->bindTexture(i, textureAccesses[i]->getParams(), 1710 this->bindTexture(i, textureAccesses[i]->getParams(),
1708 static_cast<GrGLTexture*>(textureAccesses[i]->getTextu re())); 1711 static_cast<GrGLTexture*>(textureAccesses[i]->getTextu re()));
1709 } 1712 }
1710 1713
1711 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(pipeline.getRenderTa rget()); 1714 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(pipeline.getRenderTa rget());
1712 this->flushStencil(pipeline.getStencil()); 1715 this->flushStencil(pipeline.getStencil());
1713 this->flushScissor(pipeline.getScissorState(), glRT->getViewport(), glRT->or igin()); 1716 this->flushScissor(pipeline.getScissorState(), glRT->getViewport(), glRT->or igin());
1714 this->flushHWAAState(glRT, pipeline.isHWAntialiasState()); 1717 this->flushHWAAState(glRT, pipeline.isHWAntialiasState(), !pipeline.getStenc il().isDisabled());
1715 1718
1716 // This must come after textures are flushed because a texture may need 1719 // This must come after textures are flushed because a texture may need
1717 // to be msaa-resolved (which will modify bound FBO state). 1720 // to be msaa-resolved (which will modify bound FBO state).
1718 this->flushRenderTarget(glRT, nullptr); 1721 this->flushRenderTarget(glRT, nullptr);
1719 1722
1720 return true; 1723 return true;
1721 } 1724 }
1722 1725
1723 void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc, 1726 void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc,
1724 const GrNonInstancedVertices& vertices, 1727 const GrNonInstancedVertices& vertices,
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after
2377 2380
2378 void GrGLGpu::performFlushWorkaround() { 2381 void GrGLGpu::performFlushWorkaround() {
2379 if (fPLSHasBeenUsed) { 2382 if (fPLSHasBeenUsed) {
2380 /* There is an ARM driver bug where if we use PLS, and then draw a frame which does not 2383 /* There is an ARM driver bug where if we use PLS, and then draw a frame which does not
2381 * use PLS, it leaves garbage all over the place. As a workaround, we us e PLS in a 2384 * use PLS, it leaves garbage all over the place. As a workaround, we us e PLS in a
2382 * trivial way every frame. And since we use it every frame, there's nev er a point at which 2385 * trivial way every frame. And since we use it every frame, there's nev er a point at which
2383 * it becomes safe to stop using this workaround once we start. 2386 * it becomes safe to stop using this workaround once we start.
2384 */ 2387 */
2385 this->disableScissor(); 2388 this->disableScissor();
2386 // using PLS in the presence of MSAA results in GL_INVALID_OPERATION 2389 // using PLS in the presence of MSAA results in GL_INVALID_OPERATION
2387 this->flushHWAAState(nullptr, false); 2390 this->flushHWAAState(nullptr, false, false);
2388 SkASSERT(!fHWPLSEnabled); 2391 SkASSERT(!fHWPLSEnabled);
2389 SkASSERT(fMSAAEnabled != kYes_TriState); 2392 SkASSERT(fMSAAEnabled != kYes_TriState);
2390 GL_CALL(Enable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE)); 2393 GL_CALL(Enable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE));
2391 this->stampRectUsingProgram(fPLSSetupProgram.fProgram, 2394 this->stampRectUsingProgram(fPLSSetupProgram.fProgram,
2392 SkRect::MakeXYWH(-100.0f, -100.0f, 0.01f, 0. 01f), 2395 SkRect::MakeXYWH(-100.0f, -100.0f, 0.01f, 0. 01f),
2393 fPLSSetupProgram.fPosXformUniform, 2396 fPLSSetupProgram.fPosXformUniform,
2394 fPLSSetupProgram.fArrayBuffer); 2397 fPLSSetupProgram.fArrayBuffer);
2395 GL_CALL(Disable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE)); 2398 GL_CALL(Disable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE));
2396 } 2399 }
2397 } 2400 }
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
2709 set_gl_stencil(this->glInterface(), 2712 set_gl_stencil(this->glInterface(),
2710 stencilSettings, 2713 stencilSettings,
2711 GR_GL_FRONT_AND_BACK, 2714 GR_GL_FRONT_AND_BACK,
2712 GrStencilSettings::kFront_Face); 2715 GrStencilSettings::kFront_Face);
2713 } 2716 }
2714 } 2717 }
2715 fHWStencilSettings = stencilSettings; 2718 fHWStencilSettings = stencilSettings;
2716 } 2719 }
2717 } 2720 }
2718 2721
2719 void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA) { 2722 void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA, bool stencilEnabl ed) {
2720 SkASSERT(!useHWAA || rt->isStencilBufferMultisampled()); 2723 SkASSERT(!useHWAA || rt->isStencilBufferMultisampled());
2721 2724
2722 if (this->glCaps().multisampleDisableSupport()) { 2725 if (this->glCaps().multisampleDisableSupport()) {
2723 if (useHWAA) { 2726 if (useHWAA) {
2724 if (kYes_TriState != fMSAAEnabled) { 2727 if (kYes_TriState != fMSAAEnabled) {
2725 GL_CALL(Enable(GR_GL_MULTISAMPLE)); 2728 GL_CALL(Enable(GR_GL_MULTISAMPLE));
2726 fMSAAEnabled = kYes_TriState; 2729 fMSAAEnabled = kYes_TriState;
2727 } 2730 }
2728 } else { 2731 } else {
2729 if (kNo_TriState != fMSAAEnabled) { 2732 if (kNo_TriState != fMSAAEnabled) {
2730 GL_CALL(Disable(GR_GL_MULTISAMPLE)); 2733 GL_CALL(Disable(GR_GL_MULTISAMPLE));
2731 fMSAAEnabled = kNo_TriState; 2734 fMSAAEnabled = kNo_TriState;
2732 } 2735 }
2733 } 2736 }
2734 } 2737 }
2738
2739 if (0 != this->caps()->maxRasterSamples()) {
2740 if (useHWAA && rt->hasMixedSamples() && !stencilEnabled) {
2741 // Since stencil is disabled and we want more samples than are in th e color buffer, we
2742 // need to tell the rasterizer explicitly how many to run.
2743 if (kYes_TriState != fHWRasterMultisampleEnabled) {
2744 GL_CALL(Enable(GR_GL_RASTER_MULTISAMPLE));
2745 fHWRasterMultisampleEnabled = kYes_TriState;
2746 }
2747 if (rt->numStencilSamples() != fHWNumRasterSamples) {
2748 SkASSERT(rt->numStencilSamples() <= this->caps()->maxRasterSampl es());
2749 GL_CALL(RasterSamples(rt->numStencilSamples(), GR_GL_TRUE));
2750 fHWNumRasterSamples = rt->numStencilSamples();
2751 }
2752 } else {
2753 if (kNo_TriState != fHWRasterMultisampleEnabled) {
2754 GL_CALL(Disable(GR_GL_RASTER_MULTISAMPLE));
2755 fHWRasterMultisampleEnabled = kNo_TriState;
2756 }
2757 }
2758 } else {
2759 SkASSERT(!useHWAA || !rt->hasMixedSamples() || stencilEnabled);
2760 }
2735 } 2761 }
2736 2762
2737 void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo, const GrSw izzle& swizzle) { 2763 void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo, const GrSw izzle& swizzle) {
2738 // Any optimization to disable blending should have already been applied and 2764 // Any optimization to disable blending should have already been applied and
2739 // tweaked the equation to "add" or "subtract", and the coeffs to (1, 0). 2765 // tweaked the equation to "add" or "subtract", and the coeffs to (1, 0).
2740 2766
2741 GrBlendEquation equation = blendInfo.fEquation; 2767 GrBlendEquation equation = blendInfo.fEquation;
2742 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend; 2768 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend;
2743 GrBlendCoeff dstCoeff = blendInfo.fDstBlend; 2769 GrBlendCoeff dstCoeff = blendInfo.fDstBlend;
2744 bool blendOff = (kAdd_GrBlendEquation == equation || kSubtract_GrBlendEquati on == equation) && 2770 bool blendOff = (kAdd_GrBlendEquation == equation || kSubtract_GrBlendEquati on == equation) &&
(...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after
3467 attribs->disableUnusedArrays(this, 0x1); 3493 attribs->disableUnusedArrays(this, 0x1);
3468 3494
3469 GL_CALL(Uniform4fv(fWireRectProgram.fRectUniform, 1, edges)); 3495 GL_CALL(Uniform4fv(fWireRectProgram.fRectUniform, 1, edges));
3470 GL_CALL(Uniform4fv(fWireRectProgram.fColorUniform, 1, channels)); 3496 GL_CALL(Uniform4fv(fWireRectProgram.fColorUniform, 1, channels));
3471 3497
3472 GrXferProcessor::BlendInfo blendInfo; 3498 GrXferProcessor::BlendInfo blendInfo;
3473 blendInfo.reset(); 3499 blendInfo.reset();
3474 this->flushBlend(blendInfo, GrSwizzle::RGBA()); 3500 this->flushBlend(blendInfo, GrSwizzle::RGBA());
3475 this->flushColorWrite(true); 3501 this->flushColorWrite(true);
3476 this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace); 3502 this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace);
3477 this->flushHWAAState(glRT, false); 3503 this->flushHWAAState(glRT, false, false);
3478 this->disableScissor(); 3504 this->disableScissor();
3479 GrStencilSettings stencil; 3505 GrStencilSettings stencil;
3480 stencil.setDisabled(); 3506 stencil.setDisabled();
3481 this->flushStencil(stencil); 3507 this->flushStencil(stencil);
3482 3508
3483 GL_CALL(DrawArrays(GR_GL_LINE_LOOP, 0, 4)); 3509 GL_CALL(DrawArrays(GR_GL_LINE_LOOP, 0, 4));
3484 } 3510 }
3485 3511
3486 3512
3487 void GrGLGpu::copySurfaceAsDraw(GrSurface* dst, 3513 void GrGLGpu::copySurfaceAsDraw(GrSurface* dst,
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
3545 GL_CALL(Uniform4f(fCopyPrograms[progIdx].fPosXformUniform, dx1 - dx0, dy1 - dy0, dx0, dy0)); 3571 GL_CALL(Uniform4f(fCopyPrograms[progIdx].fPosXformUniform, dx1 - dx0, dy1 - dy0, dx0, dy0));
3546 GL_CALL(Uniform4f(fCopyPrograms[progIdx].fTexCoordXformUniform, 3572 GL_CALL(Uniform4f(fCopyPrograms[progIdx].fTexCoordXformUniform,
3547 sx1 - sx0, sy1 - sy0, sx0, sy0)); 3573 sx1 - sx0, sy1 - sy0, sx0, sy0));
3548 GL_CALL(Uniform1i(fCopyPrograms[progIdx].fTextureUniform, 0)); 3574 GL_CALL(Uniform1i(fCopyPrograms[progIdx].fTextureUniform, 0));
3549 3575
3550 GrXferProcessor::BlendInfo blendInfo; 3576 GrXferProcessor::BlendInfo blendInfo;
3551 blendInfo.reset(); 3577 blendInfo.reset();
3552 this->flushBlend(blendInfo, GrSwizzle::RGBA()); 3578 this->flushBlend(blendInfo, GrSwizzle::RGBA());
3553 this->flushColorWrite(true); 3579 this->flushColorWrite(true);
3554 this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace); 3580 this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace);
3555 this->flushHWAAState(dstRT, false); 3581 this->flushHWAAState(dstRT, false, false);
3556 this->disableScissor(); 3582 this->disableScissor();
3557 GrStencilSettings stencil; 3583 GrStencilSettings stencil;
3558 stencil.setDisabled(); 3584 stencil.setDisabled();
3559 this->flushStencil(stencil); 3585 this->flushStencil(stencil);
3560 3586
3561 GL_CALL(DrawArrays(GR_GL_TRIANGLE_STRIP, 0, 4)); 3587 GL_CALL(DrawArrays(GR_GL_TRIANGLE_STRIP, 0, 4));
3562 } 3588 }
3563 3589
3564 void GrGLGpu::copySurfaceAsCopyTexSubImage(GrSurface* dst, 3590 void GrGLGpu::copySurfaceAsCopyTexSubImage(GrSurface* dst,
3565 GrSurface* src, 3591 GrSurface* src,
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
3824 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || 3850 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() ||
3825 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { 3851 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) {
3826 copyParams->fFilter = GrTextureParams::kNone_FilterMode; 3852 copyParams->fFilter = GrTextureParams::kNone_FilterMode;
3827 copyParams->fWidth = texture->width(); 3853 copyParams->fWidth = texture->width();
3828 copyParams->fHeight = texture->height(); 3854 copyParams->fHeight = texture->height();
3829 return true; 3855 return true;
3830 } 3856 }
3831 } 3857 }
3832 return false; 3858 return false;
3833 } 3859 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLGpu.h ('k') | src/gpu/gl/GrGLPathRendering.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698