Changeset 270253 in webkit
- Timestamp:
- Nov 30, 2020 11:20:52 AM (20 months ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
html/canvas/WebGL2RenderingContext.cpp (modified) (2 diffs)
-
html/canvas/WebGLRenderingContextBase.cpp (modified) (19 diffs)
-
html/canvas/WebGLRenderingContextBase.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r270251 r270253 1 2020-11-30 Kenneth Russell <kbr@chromium.org> 2 3 [WebGL2] Rasterizer discard interferes with implicit clears 4 https://bugs.webkit.org/show_bug.cgi?id=219061 5 6 Reviewed by Dean Jackson. 7 8 When rasterizer discard is enabled, user-level draw calls and 9 clears skip the implicit clear since they have no effect. 10 Readbacks and copies still perform the implicit clear. 11 12 A new WebGL conformance test has been added for this in 13 https://github.com/KhronosGroup/WebGL/pull/3183 which passes with 14 this fix. WebKit's TestRunner doesn't run the composite phase as 15 the browser or MiniBrowser do, so wouldn't pass this test as 16 integrated as a layout test. Per discussion with dino and 17 kkinnunen on Slack, will address this in follow-on work. 18 19 * html/canvas/WebGL2RenderingContext.cpp: 20 (WebCore::WebGL2RenderingContext::copyTexSubImage3D): 21 (WebCore::WebGL2RenderingContext::readPixels): 22 * html/canvas/WebGLRenderingContextBase.cpp: 23 (WebCore::ScopedDisableRasterizerDiscard::ScopedDisableRasterizerDiscard): 24 (WebCore::ScopedDisableRasterizerDiscard::~ScopedDisableRasterizerDiscard): 25 (WebCore::WebGLRenderingContextBase::initializeNewContext): 26 (WebCore::WebGLRenderingContextBase::clearIfComposited): 27 (WebCore::WebGLRenderingContextBase::paintRenderingResultsToCanvas): 28 (WebCore::WebGLRenderingContextBase::paintRenderingResultsToImageData): 29 (WebCore::WebGLRenderingContextBase::clear): 30 (WebCore::WebGLRenderingContextBase::copyTexSubImage2D): 31 (WebCore::WebGLRenderingContextBase::disable): 32 (WebCore::WebGLRenderingContextBase::drawArrays): 33 (WebCore::WebGLRenderingContextBase::drawElements): 34 (WebCore::WebGLRenderingContextBase::enable): 35 (WebCore::WebGLRenderingContextBase::readPixels): 36 (WebCore::WebGLRenderingContextBase::copyTexImage2D): 37 (WebCore::WebGLRenderingContextBase::drawArraysInstanced): 38 (WebCore::WebGLRenderingContextBase::drawElementsInstanced): 39 * html/canvas/WebGLRenderingContextBase.h: 40 1 41 2020-11-30 Simon Fraser <simon.fraser@apple.com> 2 42 -
trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp
r270185 r270253 1341 1341 if (!validateTexture3DBinding("copyTexSubImage3D", target)) 1342 1342 return; 1343 clearIfComposited( );1343 clearIfComposited(ClearCallerOther); 1344 1344 m_context->copyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); 1345 1345 } … … 3567 3567 ASSERT(canvasBase().originClean()); 3568 3568 3569 clearIfComposited( );3569 clearIfComposited(ClearCallerOther); 3570 3570 3571 3571 GCGLsizei length, columns, rows; -
trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp
r270185 r270253 462 462 }; 463 463 464 class ScopedDisableRasterizerDiscard { 465 public: 466 explicit ScopedDisableRasterizerDiscard(WebGLRenderingContextBase* context, bool wasEnabled) 467 : m_context(context) 468 , m_wasEnabled(wasEnabled) 469 { 470 if (m_wasEnabled) 471 m_context->disable(GraphicsContextGL::RASTERIZER_DISCARD); 472 } 473 474 ~ScopedDisableRasterizerDiscard() 475 { 476 if (m_wasEnabled) 477 m_context->enable(GraphicsContextGL::RASTERIZER_DISCARD); 478 } 479 480 private: 481 WebGLRenderingContextBase* m_context; 482 bool m_wasEnabled; 483 }; 484 464 485 #define ADD_VALUES_TO_SET(set, arr) \ 465 486 set.add(arr, arr + WTF_ARRAY_LENGTH(arr)) … … 866 887 m_layerCleared = false; 867 888 m_numGLErrorsToConsoleAllowed = maxGLErrorsAllowedToConsole; 868 889 890 m_rasterizerDiscardEnabled = false; 891 869 892 m_clearColor[0] = m_clearColor[1] = m_clearColor[2] = m_clearColor[3] = 0; 870 893 m_scissorEnabled = false; … … 1098 1121 } 1099 1122 1100 bool WebGLRenderingContextBase::clearIfComposited( GCGLbitfield mask)1123 bool WebGLRenderingContextBase::clearIfComposited(WebGLRenderingContextBase::ClearCaller caller, GCGLbitfield mask) 1101 1124 { 1102 1125 if (isContextLostOrPending()) … … 1108 1131 GCGLbitfield buffersNeedingClearing = m_context->getBuffersToAutoClear(); 1109 1132 1110 if (!buffersNeedingClearing || (mask && m_framebufferBinding) )1133 if (!buffersNeedingClearing || (mask && m_framebufferBinding) || (m_rasterizerDiscardEnabled && caller == ClearCallerDrawOrClear)) 1111 1134 return false; 1112 1135 … … 1146 1169 if (m_framebufferBinding) 1147 1170 m_context->bindFramebuffer(bindingPoint, 0); 1148 // If the WebGL 2.0 clearBuffer APIs already have been used to 1149 // selectively clear some of the buffers, don't destroy those 1150 // results. 1151 m_context->clear(clearMask & buffersNeedingClearing); 1171 { 1172 ScopedDisableRasterizerDiscard disable(this, m_rasterizerDiscardEnabled); 1173 // If the WebGL 2.0 clearBuffer APIs already have been used to 1174 // selectively clear some of the buffers, don't destroy those 1175 // results. 1176 m_context->clear(clearMask & buffersNeedingClearing); 1177 } 1152 1178 m_context->setBuffersToAutoClear(0); 1153 1179 … … 1201 1227 } 1202 1228 1203 clearIfComposited( );1229 clearIfComposited(ClearCallerOther); 1204 1230 1205 1231 if (!m_markedCanvasDirty && !m_layerCleared) … … 1218 1244 if (isContextLostOrPending()) 1219 1245 return nullptr; 1220 clearIfComposited( );1246 clearIfComposited(ClearCallerOther); 1221 1247 return m_context->paintRenderingResultsToImageData(); 1222 1248 } … … 1681 1707 } 1682 1708 #endif 1683 if (!clearIfComposited( mask))1709 if (!clearIfComposited(ClearCallerDrawOrClear, mask)) 1684 1710 m_context->clear(mask); 1685 1711 markContextChangedAndNotifyCanvasObserver(); … … 1858 1884 if (!validateTexture2DBinding("copyTexSubImage2D", target)) 1859 1885 return; 1860 clearIfComposited( );1886 clearIfComposited(ClearCallerOther); 1861 1887 m_context->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); 1862 1888 #else … … 1889 1915 return; 1890 1916 } 1891 clearIfComposited( );1917 clearIfComposited(ClearCallerOther); 1892 1918 1893 1919 GCGLint clippedX, clippedY; … … 2170 2196 if (cap == GraphicsContextGL::SCISSOR_TEST) 2171 2197 m_scissorEnabled = false; 2198 if (cap == GraphicsContextGL::RASTERIZER_DISCARD) 2199 m_rasterizerDiscardEnabled = false; 2172 2200 m_context->disable(cap); 2173 2201 } … … 2537 2565 return; 2538 2566 2539 clearIfComposited( );2567 clearIfComposited(ClearCallerDrawOrClear); 2540 2568 2541 2569 #if !USE(ANGLE) … … 2600 2628 return; 2601 2629 2602 clearIfComposited( );2630 clearIfComposited(ClearCallerDrawOrClear); 2603 2631 2604 2632 #if !USE(ANGLE) … … 2651 2679 if (cap == GraphicsContextGL::SCISSOR_TEST) 2652 2680 m_scissorEnabled = true; 2681 if (cap == GraphicsContextGL::RASTERIZER_DISCARD) 2682 m_rasterizerDiscardEnabled = true; 2653 2683 m_context->enable(cap); 2654 2684 } … … 4335 4365 #endif // USE(ANGLE) 4336 4366 4337 clearIfComposited( );4367 clearIfComposited(ClearCallerOther); 4338 4368 void* data = pixels.baseAddress(); 4339 4369 … … 5594 5624 return; 5595 5625 #if USE(ANGLE) 5596 clearIfComposited( );5626 clearIfComposited(ClearCallerOther); 5597 5627 m_context->copyTexImage2D(target, level, internalFormat, x, y, width, height, border); 5598 5628 #else … … 5610 5640 return; 5611 5641 } 5612 clearIfComposited( );5642 clearIfComposited(ClearCallerOther); 5613 5643 5614 5644 GCGLint clippedX, clippedY; … … 7686 7716 #endif // !USE(ANGLE) 7687 7717 7688 clearIfComposited( );7718 clearIfComposited(ClearCallerDrawOrClear); 7689 7719 7690 7720 #if !USE(ANGLE) … … 7732 7762 #endif // !USE(ANGLE) 7733 7763 7734 clearIfComposited( );7764 clearIfComposited(ClearCallerDrawOrClear); 7735 7765 7736 7766 #if !USE(ANGLE) -
trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.h
r270185 r270253 648 648 GCGLuint m_stencilFuncMask, m_stencilFuncMaskBack; 649 649 650 bool m_rasterizerDiscardEnabled { false }; 651 650 652 bool m_isGLES2Compliant; 651 653 bool m_isGLES2NPOTStrict; … … 719 721 RefPtr<Int32Array> getWebGLIntArrayParameter(GCGLenum); 720 722 723 enum ClearCaller { 724 // Caller of ClearIfComposited is a user-level draw or clear call. 725 ClearCallerDrawOrClear, 726 // Caller of ClearIfComposited is anything else, including 727 // readbacks or copies. 728 ClearCallerOther, 729 }; 721 730 // Clear the backbuffer if it was composited since the last operation. 722 731 // clearMask is set to the bitfield of any clear that would happen anyway at this time 723 732 // and the function returns true if that clear is now unnecessary. 724 bool clearIfComposited( GCGLbitfield clearMask = 0);733 bool clearIfComposited(ClearCaller, GCGLbitfield clearMask = 0); 725 734 726 735 // Helper to restore state that clearing the framebuffer may destroy.
Note: See TracChangeset
for help on using the changeset viewer.