Changeset 127217 in webkit
- Timestamp:
- Aug 30, 2012 5:34:58 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 13 added
- 2 deleted
- 27 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r127216 r127217 1 2012-08-30 Max Vujovic <mvujovic@adobe.com> 2 3 [CSS Shaders] Implement normal blend mode and source-atop compositing mode 4 https://bugs.webkit.org/show_bug.cgi?id=93869 5 6 Reviewed by Dean Jackson. 7 8 We've added two new special built-in symbols in CSS Shaders, css_MixColor and 9 css_ColorMatrix. 10 11 This change adds custom-filter-composite-source-atop.html, a new test that uses css_MixColor 12 in a shader with the normal blend mode and the source-atop compositing operator. 13 14 This change also adds custom-filter-color-matrix.html, a new test that uses css_ColorMatrix 15 in the shader. 16 17 Authors can read and write to these special built-ins in their shader code. WebKit will 18 premultiply the DOM element texture with css_ColorMatrix. Additionally, WebKit will blend 19 and composite css_MixColor with the DOM element texture, according to the blend mode and 20 compositing operator that the author specifies in CSS. 21 22 For example, the following line of CSS tells WebKit how to blend and composite the 23 css_MixColor from shader.fs: 24 -webkit-filter: custom(none mix(shader.fs normal source-atop)); 25 26 * css3/filters/custom/custom-filter-color-matrix-expected.png: Added. 27 * css3/filters/custom/custom-filter-color-matrix-expected.txt: Added. 28 * css3/filters/custom/custom-filter-color-matrix.html: Added. 29 * css3/filters/custom/custom-filter-composite-source-atop-expected.png: Added. 30 * css3/filters/custom/custom-filter-composite-source-atop-expected.txt: Added. 31 * css3/filters/custom/custom-filter-composite-source-atop.html: Added. 32 * css3/filters/custom/custom-filter-shader-cache.html: 33 * css3/filters/custom/effect-color-check.html: 34 Use pass-tex-coord.vs now. Since v_texCoord in not automatically passed in the default 35 shaders anymore, we have to pass it in our own vertex shader. After we implement more 36 blending and compositing modes, we will be able to convert most of the tests to use the 37 CSS mix function. Then, we won't be sampling the DOM element texture directly, so we 38 won't need a tex coord, so we won't need this shader anymore. 39 * css3/filters/custom/effect-custom.html: 40 The default CSS value for <fragmentShader> needs to be specified explicitly until we 41 change it from its current default. This will be fixed in: 42 https://bugs.webkit.org/show_bug.cgi?id=94020 43 * css3/filters/custom/effect-custom-transform-parameters.html: 44 Ditto. 45 * css3/filters/custom/filter-fallback-to-software.html: 46 Ditto. 47 * css3/filters/custom/invalid-custom-filter-shader-expected.html: 48 These tests will not attempt to apply a filter because the programs do not validate. 49 This means we don't need to trigger FilterEffectRenderer with grayscale(0) in 50 the reference file anymore. 51 * css3/filters/resources/composite.fs: Added. 52 * css3/filters/resources/empty-shader.fs: Added. 53 * css3/filters/resources/grayscale-color-matrix.fs: Added. 54 * css3/filters/resources/pass-tex-coord.vs: Added. 55 * platform/chromium/css3/filters/custom/custom-filter-color-matrix-expected.png: Added. 56 * platform/chromium/css3/filters/custom/custom-filter-composite-source-atop-expected.png: Added. 57 * platform/chromium/TestExpectations: 58 * platform/mac-snowleopard/css3/filters/custom/effect-custom-expected.png: Removed. 59 We should use the generic expectation, because this expectation does not show the 60 shaders applied. 61 * platform/mac-snowleopard/css3/filters/custom/effect-custom-parameters-expected.png: Removed. 62 Ditto. 63 1 64 2012-08-30 Jessie Berlin <jberlin@apple.com> 2 65 -
trunk/LayoutTests/css3/filters/custom/custom-filter-shader-cache.html
r119990 r127217 22 22 .vertex_shader 23 23 { 24 -webkit-filter: custom(url('../resources/vertex-offset.vs') );24 -webkit-filter: custom(url('../resources/vertex-offset.vs') mix(url('../resources/empty-shader.fs') normal source-atop)); 25 25 } 26 26 .fragment_shader 27 27 { 28 -webkit-filter: custom( noneurl('../resources/color-offset.fs'));28 -webkit-filter: custom(url('../resources/pass-tex-coord.vs') url('../resources/color-offset.fs')); 29 29 } 30 30 .both_shaders -
trunk/LayoutTests/css3/filters/custom/effect-color-check.html
r119990 r127217 20 20 </head> 21 21 <body onload="runTest()"> 22 <img style="-webkit-filter: custom( noneurl('../resources/color-fill.fs'), color 1 0 0 1)" src="../../../compositing/resources/thiswayup.png">23 <img style="-webkit-filter: custom( noneurl('../resources/color-fill.fs'), color 0 1 0 1)" src="../../../compositing/resources/thiswayup.png">24 <img style="-webkit-filter: custom( noneurl('../resources/color-fill.fs'), color 0 0 1 1)" src="../../../compositing/resources/thiswayup.png">22 <img style="-webkit-filter: custom(url('../resources/pass-tex-coord.vs') url('../resources/color-fill.fs'), color 1 0 0 1)" src="../../../compositing/resources/thiswayup.png"> 23 <img style="-webkit-filter: custom(url('../resources/pass-tex-coord.vs') url('../resources/color-fill.fs'), color 0 1 0 1)" src="../../../compositing/resources/thiswayup.png"> 24 <img style="-webkit-filter: custom(url('../resources/pass-tex-coord.vs') url('../resources/color-fill.fs'), color 0 0 1 1)" src="../../../compositing/resources/thiswayup.png"> 25 25 <!-- 26 26 Testing that the color channels are specified correctly. You should see 3 boxes filled with red, green and blue. The arrow should -
trunk/LayoutTests/css3/filters/custom/effect-custom-transform-parameters.html
r127173 r127217 26 26 /* Testing parameters of type transform in vertex-transform-parameter.vs. */ 27 27 .filter { 28 -webkit-filter: custom(url('../resources/vertex-transform-parameter.vs'), 28 -webkit-filter: custom(url('../resources/vertex-transform-parameter.vs') 29 mix(url('../resources/empty-shader.fs') normal source-atop), 29 30 transform translate(10px, 20px) 30 31 ); -
trunk/LayoutTests/css3/filters/custom/effect-custom.html
r119990 r127217 21 21 <body onload="runTest()"> 22 22 <img style="-webkit-filter: custom(url('../resources/vertex-offset.vs') url('../resources/color-offset.fs'))" src="../resources/reference.png"> 23 <img style="-webkit-filter: custom(url('../resources/vertex-offset.vs') , 6 11)" src="../resources/reference.png">24 <img style="-webkit-filter: custom(url('../resources/vertex-explode-detached.vs') , 3 3 detached)" src="../resources/reference.png">23 <img style="-webkit-filter: custom(url('../resources/vertex-offset.vs') mix(url('../resources/empty-shader.fs') normal source-atop), 6 11)" src="../resources/reference.png"> 24 <img style="-webkit-filter: custom(url('../resources/vertex-explode-detached.vs') mix(url('../resources/empty-shader.fs') normal source-atop), 3 3 detached)" src="../resources/reference.png"> 25 25 <img style="-webkit-filter: custom(url('../resources/vertex-explode-detached.vs') url('../resources/color-offset.fs'), 3 3 detached)" src="../resources/reference.png"> 26 <img style="-webkit-filter: custom( noneurl('../resources/color-offset.fs'))" src="../resources/reference.png">26 <img style="-webkit-filter: custom(url('../resources/pass-tex-coord.vs') url('../resources/color-offset.fs'))" src="../resources/reference.png"> 27 27 <!-- 28 28 Testing that simple custom filters work in software mode. You should see 5 blocks of colored bars with different effects applied, from left to right: -
trunk/LayoutTests/css3/filters/custom/filter-fallback-to-software.html
r125629 r127217 31 31 32 32 .shader { 33 -webkit-filter: custom(url('../resources/vertex-offset.vs') ) drop-shadow(10px 10px 10px blue);33 -webkit-filter: custom(url('../resources/vertex-offset.vs') mix(url('../resources/empty-shader.fs') normal source-atop)) drop-shadow(10px 10px 10px blue); 34 34 } 35 35 -
trunk/LayoutTests/css3/filters/custom/invalid-custom-filter-shader-expected.html
r125128 r127217 15 15 } 16 16 </script> 17 <style>18 img19 {20 /* Note that we use grayscale(0) just to make sure that it triggers the whole FilterEffectRenderer on the images,21 otherwise the result will be slightly different because of the precision errors. Having another filter like grayscale(0)22 will trigger the same precission errors and will act as a similar pass-through filter. */23 -webkit-filter: grayscale(0);24 }25 </style>26 17 </head> 27 18 <body onload="notifyDone()"> -
trunk/LayoutTests/css3/filters/resources/pass-tex-coord.vs
r127216 r127217 3 3 attribute vec4 a_position; 4 4 attribute vec2 a_texCoord; 5 6 5 uniform mat4 u_projectionMatrix; 7 uniform mat4 transform;8 6 varying vec2 v_texCoord; 9 7 10 8 void main() 11 9 { 12 gl_Position = u_projectionMatrix * transform * a_position;13 10 v_texCoord = a_texCoord; 11 gl_Position = u_projectionMatrix * a_position; 14 12 } -
trunk/LayoutTests/css3/filters/resources/vertex-transform-parameter.vs
r127046 r127217 2 2 3 3 attribute vec4 a_position; 4 attribute vec2 a_texCoord;5 4 6 5 uniform mat4 u_projectionMatrix; 7 6 uniform mat4 transform; 8 varying vec2 v_texCoord;9 7 10 8 void main() 11 9 { 12 10 gl_Position = u_projectionMatrix * transform * a_position; 13 v_texCoord = a_texCoord;14 11 } -
trunk/LayoutTests/platform/chromium/TestExpectations
r127200 r127217 3492 3492 BUGWK94256 DEBUG : fast/block/inline-children-root-linebox-crash.html = PASS CRASH 3493 3493 3494 // Following tests need baselines on Win and Linux 3495 BUGWK94492 WIN LINUX : css3/filters/custom/custom-filter-color-matrix.html = PASS IMAGE IMAGE+TEXT TEXT MISSING 3496 BUGWK94492 WIN LINUX : css3/filters/custom/custom-filter-composite-source-atop.html = PASS IMAGE IMAGE+TEXT TEXT MISSING 3497 3494 3498 // Flaky 3495 3499 BUGWK95246 : http/tests/security/mixedContent/filesystem-url-in-iframe.html = PASS TEXT -
trunk/Source/WebCore/ChangeLog
r127206 r127217 1 2012-08-30 Max Vujovic <mvujovic@adobe.com> 2 3 [CSS Shaders] Implement normal blend mode and source-atop compositing mode 4 https://bugs.webkit.org/show_bug.cgi?id=93869 5 6 Reviewed by Dean Jackson. 7 8 Instead of allowing direct texture access in an author's shader via u_texture, CSS 9 Shaders blends special symbols in the author's shader (css_MixColor and 10 css_ColorMatrix) with the DOM element texture. 11 12 The author specifies the blend mode and composite operator via the CSS mix 13 function like this: 14 -webkit-filter: custom(none mix(shader.fs normal source-atop)); 15 16 This patch implements the normal blend mode and the source-atop composite 17 operator. The other blend modes and composite operators will come in later 18 patches. 19 20 This patch introduces a new class, CustomFilterValidatedProgram, which validates 21 the shader using ANGLE. If the shader uses blending and compositing, 22 CustomFilterValidatedProgram uses ANGLE's SH_CSS_SHADERS_SPEC flag. This allows 23 the author's shader to compile successfully with special symbols like 24 "css_MixColor". ANGLE also reserves the "css_" prefix. If the shader doesn't use 25 blending and compositing, CustomFilterValidatedProgram validates the shader using 26 ANGLE's SH_WEBGL_SPEC flag. 27 28 After validation, CustomFilterValidatedProgram adds blending, compositing, and 29 texture access shader code to the author's original shaders. The definitions for 30 css_MixColor and css_ColorMatrix are added before the author's fragment shader 31 code so that the author code can access them. The blending, compositing, and 32 texture access code is added after the author code and is thus inaccessible to the 33 author code. Since ANGLE reserves the "css_" prefix during the validation phase, 34 no collisions are possible between the author's code and the code that WebKit adds. 35 36 The CustomFilterGlobalContext now caches CustomFilterValidatedProgram instead 37 of CustomFilterCompiledProgram. CustomFilterValidatedProgram owns a 38 CustomFilterCompiledProgram. This way, we can use the platform-independent 39 CustomFilterValidatedProgram to validate and rewrite the shaders, regardless of 40 the platform representation of the program (e.g. CustomFilterCompiledProgram). 41 42 Tests: css3/filters/custom/custom-filter-color-matrix.html 43 css3/filters/custom/custom-filter-composite-source-atop.html 44 45 * GNUmakefile.list.am: 46 * Target.pri: 47 * WebCore.gyp/WebCore.gyp: 48 * WebCore.gypi: 49 * WebCore.vcproj/WebCore.vcproj: 50 * WebCore.xcodeproj/project.pbxproj: 51 * platform/graphics/ANGLEWebKitBridge.cpp: 52 (WebCore::ANGLEWebKitBridge::ANGLEWebKitBridge): 53 Add a shader spec parameter, since sometimes we want to validate the shader 54 against the CSS Shaders spec and other times we want to validate the shader 55 against the WebGL spec. Note that the CSS Shaders spec is treated as a subset 56 of the WebGL spec in ANGLE. 57 (WebCore::ANGLEWebKitBridge::validateShaderSource): 58 * platform/graphics/ANGLEWebKitBridge.h: 59 (ANGLEWebKitBridge): 60 * platform/graphics/filters/CustomFilterCompiledProgram.cpp: 61 (WebCore::CustomFilterCompiledProgram::CustomFilterCompiledProgram): 62 (WebCore::CustomFilterCompiledProgram::compileShader): 63 (WebCore::CustomFilterCompiledProgram::initializeParameterLocations): 64 (WebCore::CustomFilterCompiledProgram::~CustomFilterCompiledProgram): 65 * platform/graphics/filters/CustomFilterCompiledProgram.h: 66 (WebCore): 67 * platform/graphics/filters/CustomFilterGlobalContext.cpp: 68 (WebCore::CustomFilterGlobalContext::~CustomFilterGlobalContext): 69 (WebCore::CustomFilterGlobalContext::webglShaderValidator): 70 (WebCore): 71 (WebCore::CustomFilterGlobalContext::mixShaderValidator): 72 (WebCore::CustomFilterGlobalContext::createShaderValidator): 73 (WebCore::CustomFilterGlobalContext::getValidatedProgram): 74 (WebCore::CustomFilterGlobalContext::removeValidatedProgram): 75 * platform/graphics/filters/CustomFilterGlobalContext.h: 76 (WebCore): 77 (CustomFilterGlobalContext): 78 * platform/graphics/filters/CustomFilterProgramInfo.h: 79 (WebCore::CustomFilterProgramInfo::mixSettings): 80 * platform/graphics/filters/CustomFilterValidatedProgram.cpp: Added. 81 (WebCore): 82 (WebCore::CustomFilterValidatedProgram::defaultVertexShaderString): 83 (WebCore::CustomFilterValidatedProgram::defaultFragmentShaderString): 84 (WebCore::CustomFilterValidatedProgram::CustomFilterValidatedProgram): 85 (WebCore::CustomFilterValidatedProgram::compiledProgram): 86 (WebCore::CustomFilterValidatedProgram::rewriteMixVertexShader): 87 (WebCore::CustomFilterValidatedProgram::rewriteMixFragmentShader): 88 (WebCore::CustomFilterValidatedProgram::blendFunctionString): 89 (WebCore::CustomFilterValidatedProgram::compositeFunctionString): 90 (WebCore::CustomFilterValidatedProgram::~CustomFilterValidatedProgram): 91 * platform/graphics/filters/CustomFilterValidatedProgram.h: Added. 92 (WebCore): 93 (CustomFilterValidatedProgram): 94 (WebCore::CustomFilterValidatedProgram::create): 95 (WebCore::CustomFilterValidatedProgram::programInfo): 96 (WebCore::CustomFilterValidatedProgram::isInitialized): 97 (WebCore::CustomFilterValidatedProgram::detachFromGlobalContext): 98 * platform/graphics/filters/FECustomFilter.cpp: 99 (WebCore::FECustomFilter::FECustomFilter): 100 Accept a CustomFilterValidatedProgram instead of CustomFilterProgram. 101 (WebCore::FECustomFilter::create): 102 (WebCore::FECustomFilter::initializeContext): 103 (WebCore::FECustomFilter::bindVertexAttribute): 104 (WebCore::FECustomFilter::bindProgramAndBuffers): 105 * platform/graphics/filters/FECustomFilter.h: 106 (WebCore): 107 (FECustomFilter): 108 * rendering/FilterEffectRenderer.cpp: 109 (WebCore): 110 (WebCore::createCustomFilterEffect): 111 (WebCore::FilterEffectRenderer::build): 112 Only create an FECustomFilter if the program validates. 113 * rendering/FilterEffectRenderer.h: 114 (WebCore): 115 (FilterEffectRenderer): 116 1 117 2012-08-30 Julien Chaffraix <jchaffraix@webkit.org> 2 118 -
trunk/Source/WebCore/GNUmakefile.list.am
r127165 r127217 4243 4243 Source/WebCore/platform/graphics/filters/CustomFilterCompiledProgram.h \ 4244 4244 Source/WebCore/platform/graphics/filters/CustomFilterTransformParameter.h \ 4245 Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp \ 4246 Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.h \ 4245 4247 Source/WebCore/platform/graphics/filters/DistantLightSource.cpp \ 4246 4248 Source/WebCore/platform/graphics/filters/DistantLightSource.h \ -
trunk/Source/WebCore/Target.pri
r127132 r127217 2046 2046 platform/graphics/filters/CustomFilterProgram.h \ 2047 2047 platform/graphics/filters/CustomFilterTransformParameter.h \ 2048 platform/graphics/filters/CustomFilterValidatedProgram.h \ 2048 2049 platform/graphics/filters/FEBlend.h \ 2049 2050 platform/graphics/filters/FEColorMatrix.h \ … … 3441 3442 platform/graphics/filters/CustomFilterCompiledProgram.cpp \ 3442 3443 platform/graphics/filters/CustomFilterMesh.cpp \ 3444 platform/graphics/filters/CustomFilterValidatedProgram.cpp \ 3443 3445 platform/graphics/filters/DistantLightSource.cpp \ 3444 3446 platform/graphics/filters/FEBlend.cpp \ -
trunk/Source/WebCore/WebCore.gyp/WebCore.gyp
r126907 r127217 1642 1642 ['exclude', 'platform/MIMETypeRegistry\\.cpp$'], 1643 1643 ['exclude', 'platform/Theme\\.cpp$'], 1644 ['exclude', 'platform/graphics/ANGLEWebKitBridge\\.(cpp|h)$'],1645 1644 # *NEON.cpp files need special compile options. 1646 1645 # They are moved to the webcore_arm_neon target. -
trunk/Source/WebCore/WebCore.gypi
r127170 r127217 3712 3712 'platform/graphics/filters/CustomFilterCompiledProgram.cpp', 3713 3713 'platform/graphics/filters/CustomFilterCompiledProgram.h', 3714 'platform/graphics/filters/CustomFilterValidatedProgram.cpp', 3715 'platform/graphics/filters/CustomFilterValidatedProgram.h', 3714 3716 'platform/graphics/filters/CustomFilterMesh.cpp', 3715 3717 'platform/graphics/filters/CustomFilterTransformParameter.h', -
trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj
r127191 r127217 31926 31926 </File> 31927 31927 <File 31928 RelativePath="..\platform\graphics\filters\CustomFilterValidatedProgram.cpp" 31929 > 31930 </File> 31931 <File 31932 RelativePath="..\platform\graphics\filters\CustomFilterValidatedProgram.h" 31933 > 31934 </File> 31935 <File 31928 31936 RelativePath="..\platform\graphics\filters\DistantLightSource.cpp" 31929 31937 > -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r127170 r127217 3767 3767 A24BF77B15CC3BAF003191F2 /* WebKitCSSMixFunctionValue.h in Headers */ = {isa = PBXBuildFile; fileRef = A24BF77915CC3BAF003191F2 /* WebKitCSSMixFunctionValue.h */; }; 3768 3768 A24BF77C15CC3BAF003191F2 /* WebKitCSSMixFunctionValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A24BF77A15CC3BAF003191F2 /* WebKitCSSMixFunctionValue.cpp */; }; 3769 A29532CF15DD5E1700469EBC /* CustomFilterValidatedProgram.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A29532CD15DD5E1700469EBC /* CustomFilterValidatedProgram.cpp */; }; 3770 A29532D015DD5E1700469EBC /* CustomFilterValidatedProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = A29532CE15DD5E1700469EBC /* CustomFilterValidatedProgram.h */; }; 3769 3771 A3BB59F31457A40D00AC56FE /* DocumentEventQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A3BB59F11457A40D00AC56FE /* DocumentEventQueue.cpp */; }; 3770 3772 A3BB59F41457A40D00AC56FE /* DocumentEventQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = A3BB59F21457A40D00AC56FE /* DocumentEventQueue.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 10982 10984 A24BF77915CC3BAF003191F2 /* WebKitCSSMixFunctionValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebKitCSSMixFunctionValue.h; sourceTree = "<group>"; }; 10983 10985 A24BF77A15CC3BAF003191F2 /* WebKitCSSMixFunctionValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebKitCSSMixFunctionValue.cpp; sourceTree = "<group>"; }; 10986 A29532CD15DD5E1700469EBC /* CustomFilterValidatedProgram.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CustomFilterValidatedProgram.cpp; path = filters/CustomFilterValidatedProgram.cpp; sourceTree = "<group>"; }; 10987 A29532CE15DD5E1700469EBC /* CustomFilterValidatedProgram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CustomFilterValidatedProgram.h; path = filters/CustomFilterValidatedProgram.h; sourceTree = "<group>"; }; 10984 10988 A3BB59F11457A40D00AC56FE /* DocumentEventQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DocumentEventQueue.cpp; sourceTree = "<group>"; }; 10985 10989 A3BB59F21457A40D00AC56FE /* DocumentEventQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DocumentEventQueue.h; sourceTree = "<group>"; }; … … 18156 18160 50D88CB315BDFDAA001809F4 /* CustomFilterProgramInfo.cpp */, 18157 18161 50D88CB415BDFDAA001809F4 /* CustomFilterProgramInfo.h */, 18162 A29532CD15DD5E1700469EBC /* CustomFilterValidatedProgram.cpp */, 18163 A29532CE15DD5E1700469EBC /* CustomFilterValidatedProgram.h */, 18158 18164 A1E1154313015C3D0054AC8C /* DistantLightSource.cpp */, 18159 18165 84730D5A1248F0B300D3A9C9 /* DistantLightSource.h */, … … 22539 22545 503D0CAC14B5B08700F32F57 /* CustomFilterProgramClient.h in Headers */, 22540 22546 50D88CB615BDFDAA001809F4 /* CustomFilterProgramInfo.h in Headers */, 22547 A29532D015DD5E1700469EBC /* CustomFilterValidatedProgram.h in Headers */, 22541 22548 A8CB413E0E8633FD0032C4F0 /* DashArray.h in Headers */, 22542 22549 A80E6D0B0A1989CA007FB8C5 /* DashboardRegion.h in Headers */, … … 26112 26119 503D0CAA14B5B08700F32F57 /* CustomFilterProgram.cpp in Sources */, 26113 26120 50D88CB515BDFDAA001809F4 /* CustomFilterProgramInfo.cpp in Sources */, 26121 A29532CF15DD5E1700469EBC /* CustomFilterValidatedProgram.cpp in Sources */, 26114 26122 97BC6A201505F081001B74AC /* Database.cpp in Sources */, 26115 26123 97BC6A231505F081001B74AC /* DatabaseAuthorizer.cpp in Sources */, -
trunk/Source/WebCore/platform/graphics/ANGLEWebKitBridge.cpp
r126342 r127217 33 33 namespace WebCore { 34 34 35 ANGLEWebKitBridge::ANGLEWebKitBridge(ShShaderOutput shaderOutput) : 36 builtCompilers(false), 37 m_fragmentCompiler(0), 38 m_vertexCompiler(0), 39 m_shaderOutput(shaderOutput) 35 ANGLEWebKitBridge::ANGLEWebKitBridge(ShShaderOutput shaderOutput, ShShaderSpec shaderSpec) 36 : builtCompilers(false) 37 , m_fragmentCompiler(0) 38 , m_vertexCompiler(0) 39 , m_shaderOutput(shaderOutput) 40 , m_shaderSpec(shaderSpec) 40 41 { 42 // This is a no-op if it's already initialized. 41 43 ShInitialize(); 42 44 } … … 70 72 { 71 73 if (!builtCompilers) { 72 m_fragmentCompiler = ShConstructCompiler(SH_FRAGMENT_SHADER, SH_WEBGL_SPEC, m_shaderOutput, &m_resources);73 m_vertexCompiler = ShConstructCompiler(SH_VERTEX_SHADER, SH_WEBGL_SPEC, m_shaderOutput, &m_resources);74 m_fragmentCompiler = ShConstructCompiler(SH_FRAGMENT_SHADER, m_shaderSpec, m_shaderOutput, &m_resources); 75 m_vertexCompiler = ShConstructCompiler(SH_VERTEX_SHADER, m_shaderSpec, m_shaderOutput, &m_resources); 74 76 if (!m_fragmentCompiler || !m_vertexCompiler) { 75 77 cleanupCompilers(); -
trunk/Source/WebCore/platform/graphics/ANGLEWebKitBridge.h
r126342 r127217 32 32 #if PLATFORM(QT) 33 33 #include "ANGLE/include/GLSLANG/ShaderLang.h" 34 #elif !PLATFORM(GTK) && !PLATFORM(EFL) && !PLATFORM(BLACKBERRY) 34 #elif !PLATFORM(GTK) && !PLATFORM(EFL) && !PLATFORM(BLACKBERRY) && !PLATFORM(CHROMIUM) 35 35 #include "ANGLE/ShaderLang.h" 36 36 #else … … 48 48 public: 49 49 50 ANGLEWebKitBridge(ShShaderOutput = SH_GLSL_OUTPUT );50 ANGLEWebKitBridge(ShShaderOutput = SH_GLSL_OUTPUT, ShShaderSpec = SH_WEBGL_SPEC); 51 51 ~ANGLEWebKitBridge(); 52 52 … … 54 54 void setResources(ShBuiltInResources); 55 55 56 bool validateShaderSource(const char* shaderSource, ANGLEShaderType shaderType, String& translatedShaderSource, String& shaderValidationLog, int extraCompileOptions);56 bool validateShaderSource(const char* shaderSource, ANGLEShaderType, String& translatedShaderSource, String& shaderValidationLog, int extraCompileOptions = 0); 57 57 58 58 private: … … 66 66 67 67 ShShaderOutput m_shaderOutput; 68 ShShaderSpec m_shaderSpec; 68 69 69 70 ShBuiltInResources m_resources; -
trunk/Source/WebCore/platform/graphics/filters/CustomFilterCompiledProgram.cpp
r126968 r127217 34 34 35 35 #include "CustomFilterGlobalContext.h" 36 #include "CustomFilterProgramInfo.h"37 #include "GraphicsContext3D.h"38 36 39 37 namespace WebCore { 40 38 41 #define SHADER(Src) (ASCIILiteral(#Src)) 42 43 String CustomFilterCompiledProgram::defaultVertexShaderString() 44 { 45 DEFINE_STATIC_LOCAL(String, vertexShaderString, SHADER( 46 precision mediump float; 47 attribute vec4 a_position; 48 attribute vec2 a_texCoord; 49 uniform mat4 u_projectionMatrix; 50 varying vec2 v_texCoord; 51 void main() 52 { 53 gl_Position = u_projectionMatrix * a_position; 54 v_texCoord = a_texCoord; 55 } 56 )); 57 return vertexShaderString; 58 } 59 60 String CustomFilterCompiledProgram::defaultFragmentShaderString() 61 { 62 DEFINE_STATIC_LOCAL(String, fragmentShaderString, SHADER( 63 precision mediump float; 64 varying vec2 v_texCoord; 65 uniform sampler2D u_texture; 66 void main() 67 { 68 gl_FragColor = texture2D(u_texture, v_texCoord); 69 } 70 )); 71 return fragmentShaderString; 72 } 73 74 CustomFilterCompiledProgram::CustomFilterCompiledProgram(CustomFilterGlobalContext* globalContext, const CustomFilterProgramInfo& programInfo) 75 : m_globalContext(globalContext) 76 , m_context(globalContext->context()) 77 , m_programInfo(programInfo) 39 CustomFilterCompiledProgram::CustomFilterCompiledProgram(PassRefPtr<GraphicsContext3D> context, const String& validatedVertexShader, const String& validatedFragmentShader) 40 : m_context(context) 78 41 , m_program(0) 79 42 , m_positionAttribLocation(-1) … … 88 51 , m_samplerSizeLocation(-1) 89 52 , m_contentSamplerLocation(-1) 53 , m_internalTexCoordAttribLocation(-1) 90 54 , m_isInitialized(false) 91 55 { 92 56 m_context->makeContextCurrent(); 93 94 Platform3DObject vertexShader = compileShader(GraphicsContext3D::VERTEX_SHADER, programInfo.vertexShaderString());57 58 Platform3DObject vertexShader = compileShader(GraphicsContext3D::VERTEX_SHADER, validatedVertexShader); 95 59 if (!vertexShader) 96 60 return; 97 61 98 Platform3DObject fragmentShader = compileShader(GraphicsContext3D::FRAGMENT_SHADER, programInfo.fragmentShaderString());62 Platform3DObject fragmentShader = compileShader(GraphicsContext3D::FRAGMENT_SHADER, validatedFragmentShader); 99 63 if (!fragmentShader) { 100 64 m_context->deleteShader(vertexShader); … … 115 79 } 116 80 117 String CustomFilterCompiledProgram::getDefaultShaderString(GC3Denum shaderType)118 {119 switch (shaderType) {120 case GraphicsContext3D::VERTEX_SHADER:121 return defaultVertexShaderString();122 case GraphicsContext3D::FRAGMENT_SHADER:123 return defaultFragmentShaderString();124 default:125 ASSERT_NOT_REACHED();126 return String();127 }128 }129 130 81 Platform3DObject CustomFilterCompiledProgram::compileShader(GC3Denum shaderType, const String& shaderString) 131 82 { 83 ASSERT(!shaderString.isNull()); 84 132 85 Platform3DObject shader = m_context->createShader(shaderType); 133 if (shaderString.isNull()) 134 m_context->shaderSource(shader, getDefaultShaderString(shaderType)); 135 else 136 m_context->shaderSource(shader, shaderString); 86 m_context->shaderSource(shader, shaderString); 137 87 m_context->compileShader(shader); 138 88 … … 178 128 m_meshSizeLocation = m_context->getUniformLocation(m_program, "u_meshSize"); 179 129 m_projectionMatrixLocation = m_context->getUniformLocation(m_program, "u_projectionMatrix"); 180 m_samplerLocation = m_context->getUniformLocation(m_program, "u_texture");181 130 m_samplerSizeLocation = m_context->getUniformLocation(m_program, "u_textureSize"); 182 131 m_contentSamplerLocation = m_context->getUniformLocation(m_program, "u_contentTexture"); 132 m_internalTexCoordAttribLocation = m_context->getAttribLocation(m_program, "css_a_texCoord"); 133 m_samplerLocation = m_context->getUniformLocation(m_program, "css_u_texture"); 134 // FIXME: Remove texture access via u_texture and change the tests to use blending and compositing. 135 // https://bugs.webkit.org/show_bug.cgi?id=93871 136 if (m_samplerLocation == -1) 137 m_samplerLocation = m_context->getUniformLocation(m_program, "u_texture"); 183 138 } 184 139 … … 192 147 CustomFilterCompiledProgram::~CustomFilterCompiledProgram() 193 148 { 194 if (m_globalContext)195 m_globalContext->removeCompiledProgram(this);196 149 if (m_program) { 197 150 m_context->makeContextCurrent(); -
trunk/Source/WebCore/platform/graphics/filters/CustomFilterCompiledProgram.h
r124897 r127217 33 33 #if ENABLE(CSS_SHADERS) && USE(3D_GRAPHICS) 34 34 35 #include "CustomFilterProgramInfo.h" 36 #include "GraphicsTypes3D.h" 35 #include "GraphicsContext3D.h" 37 36 #include <wtf/RefCounted.h> 38 37 #include <wtf/text/WTFString.h> … … 41 40 42 41 class CustomFilterGlobalContext; 43 class GraphicsContext3D;44 42 45 // A specific combination of vertex / fragment shader is only going to be compiled once. The CustomFilterGlobalContext is46 // caching the compiled programs. CustomFilterGlobalContext has a weak reference to the CustomFilterCompiledProgram, so the47 // CustomFilterCompiledProgram destructor needs to notify the CustomFilterGlobalContext to remove the program from the cache.48 // FECustomFilter is the reference owner of the CustomFilterCompiledProgram, so a compiled shader is only kept alive as49 // long as there is at least one visible layer that applies the shader.50 43 class CustomFilterCompiledProgram: public RefCounted<CustomFilterCompiledProgram> { 51 44 public: 52 static PassRefPtr<CustomFilterCompiledProgram> create( CustomFilterGlobalContext* globalContext, const CustomFilterProgramInfo& programInfo)45 static PassRefPtr<CustomFilterCompiledProgram> create(PassRefPtr<GraphicsContext3D> context, const String& validatedVertexShader, const String& validatedFragmentShader) 53 46 { 54 return adoptRef(new CustomFilterCompiledProgram( globalContext, programInfo));47 return adoptRef(new CustomFilterCompiledProgram(context, validatedVertexShader, validatedFragmentShader)); 55 48 } 56 49 57 50 ~CustomFilterCompiledProgram(); 58 59 const CustomFilterProgramInfo& programInfo() const { return m_programInfo; }60 51 61 52 int positionAttribLocation() const { return m_positionAttribLocation; } … … 70 61 int contentSamplerLocation() const { return m_contentSamplerLocation; } 71 62 int samplerSizeLocation() const { return m_samplerSizeLocation; } 63 // FIXME: Get rid of the internal tex coord attribute "css_a_texCoord". 64 // If the author defined "a_texCoord", we should leverage that. 65 // If not, we should write "a_texCoord" in the shader. 66 // This requires us to first get the list of attributes from the vertex shader using ANGLE. 67 // https://bugs.webkit.org/show_bug.cgi?id=94358 68 int internalTexCoordAttribLocation() const { return m_internalTexCoordAttribLocation; } 72 69 73 70 int uniformLocationByName(const String&); … … 76 73 77 74 Platform3DObject program() const { return m_program; } 78 79 // 'detachGlobalContext' is called when the CustomFilterGlobalContext is deleted80 // and there's no need for the callback anymore.81 // Note that CustomFilterGlobalContext doesn't not keep a strong reference to82 // the CustomFilterCompiledProgram.83 void detachFromGlobalContext() { m_globalContext = 0; }84 75 private: 85 CustomFilterCompiledProgram( CustomFilterGlobalContext*, const CustomFilterProgramInfo&);76 CustomFilterCompiledProgram(PassRefPtr<GraphicsContext3D>, const String& validatedVertexShader, const String& validatedFragmentShader); 86 77 87 78 Platform3DObject compileShader(GC3Denum shaderType, const String& shaderString); … … 89 80 void initializeParameterLocations(); 90 81 91 static String defaultVertexShaderString();92 static String defaultFragmentShaderString();93 String getDefaultShaderString(GC3Denum shaderType);94 95 CustomFilterGlobalContext* m_globalContext;96 82 RefPtr<GraphicsContext3D> m_context; 97 CustomFilterProgramInfo m_programInfo;98 83 Platform3DObject m_program; 99 84 … … 109 94 int m_samplerSizeLocation; 110 95 int m_contentSamplerLocation; 96 // FIXME: Get rid of the internal tex coord attribute "css_a_texCoord". 97 // https://bugs.webkit.org/show_bug.cgi?id=94358 98 int m_internalTexCoordAttribLocation; 111 99 112 100 bool m_isInitialized; -
trunk/Source/WebCore/platform/graphics/filters/CustomFilterGlobalContext.cpp
r126926 r127217 33 33 #include "CustomFilterGlobalContext.h" 34 34 35 #include "CustomFilter CompiledProgram.h"35 #include "CustomFilterValidatedProgram.h" 36 36 #include "GraphicsContext3D.h" 37 37 … … 44 44 CustomFilterGlobalContext::~CustomFilterGlobalContext() 45 45 { 46 for (CustomFilter CompiledProgramsMap::iterator iter = m_programs.begin(); iter != m_programs.end(); ++iter)46 for (CustomFilterValidatedProgramsMap::iterator iter = m_programs.begin(); iter != m_programs.end(); ++iter) 47 47 iter->second->detachFromGlobalContext(); 48 } 49 50 ANGLEWebKitBridge* CustomFilterGlobalContext::webglShaderValidator() 51 { 52 if (!m_webglShaderValidator) 53 m_webglShaderValidator = createShaderValidator(SH_WEBGL_SPEC); 54 return m_webglShaderValidator.get(); 55 } 56 57 ANGLEWebKitBridge* CustomFilterGlobalContext::mixShaderValidator() 58 { 59 if (!m_mixShaderValidator) 60 m_mixShaderValidator = createShaderValidator(SH_CSS_SHADERS_SPEC); 61 return m_mixShaderValidator.get(); 62 } 63 64 PassOwnPtr<ANGLEWebKitBridge> CustomFilterGlobalContext::createShaderValidator(ShShaderSpec shaderSpec) 65 { 66 OwnPtr<ANGLEWebKitBridge> validator = adoptPtr(new ANGLEWebKitBridge(SH_ESSL_OUTPUT, shaderSpec)); 67 ShBuiltInResources resources; 68 ShInitBuiltInResources(&resources); 69 validator->setResources(resources); 70 return validator.release(); 48 71 } 49 72 … … 63 86 } 64 87 65 PassRefPtr<CustomFilter CompiledProgram> CustomFilterGlobalContext::getCompiledProgram(const CustomFilterProgramInfo& programInfo)88 PassRefPtr<CustomFilterValidatedProgram> CustomFilterGlobalContext::getValidatedProgram(const CustomFilterProgramInfo& programInfo) 66 89 { 67 90 // Check that the context is already prepared. 68 91 ASSERT(m_context); 69 92 70 CustomFilter CompiledProgramsMap::iterator iter = m_programs.find(programInfo);93 CustomFilterValidatedProgramsMap::iterator iter = m_programs.find(programInfo); 71 94 if (iter != m_programs.end()) 72 95 return iter->second; 73 96 74 RefPtr<CustomFilter CompiledProgram> compiledProgram = CustomFilterCompiledProgram::create(this, programInfo);75 m_programs.set(programInfo, compiledProgram.get());76 return compiledProgram.release();97 RefPtr<CustomFilterValidatedProgram> validatedProgram = CustomFilterValidatedProgram::create(this, programInfo); 98 m_programs.set(programInfo, validatedProgram.get()); 99 return validatedProgram.release(); 77 100 } 78 101 79 void CustomFilterGlobalContext::remove CompiledProgram(const CustomFilterCompiledProgram* program)102 void CustomFilterGlobalContext::removeValidatedProgram(const CustomFilterValidatedProgram* program) 80 103 { 81 CustomFilter CompiledProgramsMap::iterator iter = m_programs.find(program->programInfo());104 CustomFilterValidatedProgramsMap::iterator iter = m_programs.find(program->programInfo()); 82 105 ASSERT(iter != m_programs.end()); 83 106 m_programs.remove(iter); -
trunk/Source/WebCore/platform/graphics/filters/CustomFilterGlobalContext.h
r124897 r127217 32 32 33 33 #if ENABLE(CSS_SHADERS) && USE(3D_GRAPHICS) 34 #include "ANGLEWebKitBridge.h" 34 35 #include "CustomFilterProgramInfo.h" 35 36 #include <wtf/HashMap.h> … … 38 39 namespace WebCore { 39 40 40 class CustomFilter CompiledProgram;41 class CustomFilterValidatedProgram; 41 42 class HostWindow; 42 43 class GraphicsContext3D; 43 44 44 typedef HashMap<CustomFilterProgramInfo, CustomFilter CompiledProgram*> CustomFilterCompiledProgramsMap;45 typedef HashMap<CustomFilterProgramInfo, CustomFilterValidatedProgram*> CustomFilterValidatedProgramsMap; 45 46 46 47 class CustomFilterGlobalContext { … … 50 51 51 52 GraphicsContext3D* context() const { return m_context.get(); } 53 54 // CSS shaders not referenced from the CSS mix function should be validated just like regular WebGL shaders. 55 // This ANGLE validator uses the SH_WEBGL_SPEC flag. 56 ANGLEWebKitBridge* webglShaderValidator(); 57 58 // CSS shaders referenced from the CSS mix function should be validated slightly differently than WebGL shaders. 59 // This ANGLE validator uses the SH_CSS_SHADERS_SPEC flag. 60 // Under this flag, most notably: 61 // - The "gl_FragColor" built-in is not available. 62 // - Instead, the "css_MixColor" and "css_ColorMatrix" built-ins are available. 63 // - The "css_" prefix is reserved. 64 // - In the translated source that ANGLE returns, ANGLE renames the author's "main" function to "css_main". 65 // The complete details are documented in ANGLE/ShaderLang.h. 66 ANGLEWebKitBridge* mixShaderValidator(); 52 67 53 68 void prepareContextIfNeeded(HostWindow*); 54 69 55 PassRefPtr<CustomFilter CompiledProgram> getCompiledProgram(const CustomFilterProgramInfo&);56 void remove CompiledProgram(const CustomFilterCompiledProgram*);70 PassRefPtr<CustomFilterValidatedProgram> getValidatedProgram(const CustomFilterProgramInfo&); 71 void removeValidatedProgram(const CustomFilterValidatedProgram*); 57 72 private: 73 static PassOwnPtr<ANGLEWebKitBridge> createShaderValidator(ShShaderSpec); 74 58 75 RefPtr<GraphicsContext3D> m_context; 59 CustomFilterCompiledProgramsMap m_programs; 76 OwnPtr<ANGLEWebKitBridge> m_webglShaderValidator; 77 OwnPtr<ANGLEWebKitBridge> m_mixShaderValidator; 78 CustomFilterValidatedProgramsMap m_programs; 60 79 }; 61 80 -
trunk/Source/WebCore/platform/graphics/filters/CustomFilterProgramInfo.h
r125331 r127217 76 76 const String& vertexShaderString() const { return m_vertexShaderString; } 77 77 const String& fragmentShaderString() const { return m_fragmentShaderString; } 78 const CustomFilterProgramMixSettings& mixSettings() const { return m_mixSettings; } 78 79 private: 79 80 String m_vertexShaderString; -
trunk/Source/WebCore/platform/graphics/filters/FECustomFilter.cpp
r127046 r127217 40 40 #include "CustomFilterProgram.h" 41 41 #include "CustomFilterTransformParameter.h" 42 #include "CustomFilterValidatedProgram.h" 42 43 #include "DrawingBuffer.h" 43 44 #include "GraphicsContext3D.h" … … 76 77 } 77 78 78 FECustomFilter::FECustomFilter(Filter* filter, CustomFilterGlobalContext* customFilterGlobalContext, PassRefPtr<CustomFilter Program> program, const CustomFilterParameterList& parameters,79 FECustomFilter::FECustomFilter(Filter* filter, CustomFilterGlobalContext* customFilterGlobalContext, PassRefPtr<CustomFilterValidatedProgram> validatedProgram, const CustomFilterParameterList& parameters, 79 80 unsigned meshRows, unsigned meshColumns, CustomFilterOperation::MeshBoxType, 80 81 CustomFilterOperation::MeshType meshType) 81 82 : FilterEffect(filter) 82 83 , m_globalContext(customFilterGlobalContext) 84 , m_validatedProgram(validatedProgram) 85 , m_compiledProgram(0) // Don't compile the program unless we need to paint. 83 86 , m_frameBuffer(0) 84 87 , m_depthBuffer(0) 85 88 , m_destTexture(0) 86 , m_program(program)87 89 , m_parameters(parameters) 88 90 , m_meshRows(meshRows) … … 90 92 , m_meshType(meshType) 91 93 { 92 } 93 94 PassRefPtr<FECustomFilter> FECustomFilter::create(Filter* filter, CustomFilterGlobalContext* customFilterGlobalContext, PassRefPtr<CustomFilterProgram> program, const CustomFilterParameterList& parameters, 94 // An FECustomFilter shouldn't have been created unless the program passed validation. 95 ASSERT(m_validatedProgram->isInitialized()); 96 } 97 98 PassRefPtr<FECustomFilter> FECustomFilter::create(Filter* filter, CustomFilterGlobalContext* customFilterGlobalContext, PassRefPtr<CustomFilterValidatedProgram> validatedProgram, const CustomFilterParameterList& parameters, 95 99 unsigned meshRows, unsigned meshColumns, CustomFilterOperation::MeshBoxType meshBoxType, 96 100 CustomFilterOperation::MeshType meshType) 97 101 { 98 return adoptRef(new FECustomFilter(filter, customFilterGlobalContext, program, parameters, meshRows, meshColumns, meshBoxType, meshType));102 return adoptRef(new FECustomFilter(filter, customFilterGlobalContext, validatedProgram, parameters, meshRows, meshColumns, meshBoxType, meshType)); 99 103 } 100 104 … … 197 201 return false; 198 202 m_context->makeContextCurrent(); 199 m_compiledProgram = m_ globalContext->getCompiledProgram(m_program->programInfo());203 m_compiledProgram = m_validatedProgram->compiledProgram(); 200 204 201 205 // FIXME: Sharing the mesh would just save the time needed to upload it to the GPU, so I assume we could … … 242 246 } 243 247 244 void FECustomFilter::bindVertexAttribute(int attributeLocation, unsigned size, unsigned &offset)248 void FECustomFilter::bindVertexAttribute(int attributeLocation, unsigned size, unsigned offset) 245 249 { 246 250 if (attributeLocation != -1) { … … 248 252 m_context->enableVertexAttribArray(attributeLocation); 249 253 } 250 offset += size * sizeof(float);251 254 } 252 255 … … 314 317 void FECustomFilter::bindProgramAndBuffers(Uint8ClampedArray* srcPixelArray) 315 318 { 319 ASSERT(m_compiledProgram->isInitialized()); 320 316 321 m_context->useProgram(m_compiledProgram->program()); 317 322 … … 338 343 m_context->bindBuffer(GraphicsContext3D::ELEMENT_ARRAY_BUFFER, m_mesh->elementsBufferObject()); 339 344 340 unsigned offset = 0; 341 bindVertexAttribute(m_compiledProgram->positionAttribLocation(), 4, offset); 342 bindVertexAttribute(m_compiledProgram->texAttribLocation(), 2, offset); 343 bindVertexAttribute(m_compiledProgram->meshAttribLocation(), 2, offset); 345 // FIXME: Ideally, these should be public members of CustomFilterMesh. 346 // https://bugs.webkit.org/show_bug.cgi?id=94755 347 static const unsigned PositionAttribSize = 4; 348 static const unsigned TexAttribSize = 2; 349 static const unsigned MeshAttribSize = 2; 350 static const unsigned TriangleAttribSize = 3; 351 352 static const unsigned PositionAttribOffset = 0; 353 static const unsigned TexAttribOffset = PositionAttribOffset + PositionAttribSize * sizeof(float); 354 static const unsigned MeshAttribOffset = TexAttribOffset + TexAttribSize * sizeof(float); 355 static const unsigned TriangleAttribOffset = MeshAttribOffset + MeshAttribSize * sizeof(float); 356 357 bindVertexAttribute(m_compiledProgram->positionAttribLocation(), PositionAttribSize, PositionAttribOffset); 358 bindVertexAttribute(m_compiledProgram->texAttribLocation(), TexAttribSize, TexAttribOffset); 359 // FIXME: Get rid of the internal tex coord attribute "css_a_texCoord". 360 // https://bugs.webkit.org/show_bug.cgi?id=94358 361 bindVertexAttribute(m_compiledProgram->internalTexCoordAttribLocation(), TexAttribSize, TexAttribOffset); 362 bindVertexAttribute(m_compiledProgram->meshAttribLocation(), MeshAttribSize, MeshAttribOffset); 344 363 if (m_meshType == CustomFilterOperation::DETACHED) 345 bindVertexAttribute(m_compiledProgram->triangleAttribLocation(), 3, offset);364 bindVertexAttribute(m_compiledProgram->triangleAttribLocation(), TriangleAttribSize, TriangleAttribOffset); 346 365 347 366 bindProgramParameters(); -
trunk/Source/WebCore/platform/graphics/filters/FECustomFilter.h
r127046 r127217 52 52 class CustomFilterProgram; 53 53 class CustomFilterTransformParameter; 54 class CustomFilterValidatedProgram; 54 55 class DrawingBuffer; 55 56 class GraphicsContext3D; … … 59 60 class FECustomFilter : public FilterEffect { 60 61 public: 61 static PassRefPtr<FECustomFilter> create(Filter*, CustomFilterGlobalContext*, PassRefPtr<CustomFilter Program>, const CustomFilterParameterList&,62 static PassRefPtr<FECustomFilter> create(Filter*, CustomFilterGlobalContext*, PassRefPtr<CustomFilterValidatedProgram>, const CustomFilterParameterList&, 62 63 unsigned meshRows, unsigned meshColumns, CustomFilterOperation::MeshBoxType, 63 64 CustomFilterOperation::MeshType); … … 69 70 70 71 private: 71 FECustomFilter(Filter*, CustomFilterGlobalContext*, PassRefPtr<CustomFilter Program>, const CustomFilterParameterList&,72 FECustomFilter(Filter*, CustomFilterGlobalContext*, PassRefPtr<CustomFilterValidatedProgram>, const CustomFilterParameterList&, 72 73 unsigned meshRows, unsigned meshColumns, CustomFilterOperation::MeshBoxType, 73 74 CustomFilterOperation::MeshType); … … 79 80 void deleteRenderBuffers(); 80 81 void resizeContext(const IntSize& newContextSize); 81 void bindVertexAttribute(int attributeLocation, unsigned size, unsigned &offset);82 void bindVertexAttribute(int attributeLocation, unsigned size, unsigned offset); 82 83 void bindProgramNumberParameters(int uniformLocation, CustomFilterNumberParameter*); 83 84 void bindProgramTransformParameter(int uniformLocation, CustomFilterTransformParameter*); … … 90 91 RefPtr<GraphicsContext3D> m_context; 91 92 RefPtr<Texture> m_inputTexture; 93 RefPtr<CustomFilterValidatedProgram> m_validatedProgram; 92 94 RefPtr<CustomFilterCompiledProgram> m_compiledProgram; 93 95 RefPtr<CustomFilterMesh> m_mesh; -
trunk/Source/WebCore/rendering/FilterEffectRenderer.cpp
r126927 r127217 47 47 #include "CustomFilterProgram.h" 48 48 #include "CustomFilterOperation.h" 49 #include "CustomFilterValidatedProgram.h" 49 50 #include "FECustomFilter.h" 50 51 #include "RenderView.h" … … 90 91 Settings* settings = document->settings(); 91 92 return settings && settings->isCSSCustomFilterEnabled() && settings->webGLEnabled(); 93 } 94 95 static PassRefPtr<FECustomFilter> createCustomFilterEffect(Filter* filter, Document* document, CustomFilterOperation* operation) 96 { 97 if (!isCSSCustomFilterEnabled(document)) 98 return 0; 99 100 RefPtr<CustomFilterProgram> program = operation->program(); 101 if (!program->isLoaded()) 102 return 0; 103 104 CustomFilterGlobalContext* globalContext = document->renderView()->customFilterGlobalContext(); 105 globalContext->prepareContextIfNeeded(document->view()->hostWindow()); 106 RefPtr<CustomFilterValidatedProgram> validatedProgram = globalContext->getValidatedProgram(program->programInfo()); 107 if (!validatedProgram->isInitialized()) 108 return 0; 109 110 return FECustomFilter::create(filter, globalContext, validatedProgram, operation->parameters(), 111 operation->meshRows(), operation->meshColumns(), 112 operation->meshBoxType(), operation->meshType()); 92 113 } 93 114 #endif … … 324 345 break; 325 346 } 326 #if ENABLE(CSS_SHADERS) 347 #if ENABLE(CSS_SHADERS) && ENABLE(WEBGL) 327 348 case FilterOperation::CUSTOM: { 328 #if ENABLE(WEBGL)329 if (!isCSSCustomFilterEnabled(document))330 continue;331 332 349 CustomFilterOperation* customFilterOperation = static_cast<CustomFilterOperation*>(filterOperation); 333 RefPtr<CustomFilterProgram> program = customFilterOperation->program(); 334 if (program->isLoaded()) { 335 CustomFilterGlobalContext* globalContext = document->renderView()->customFilterGlobalContext(); 336 globalContext->prepareContextIfNeeded(document->view()->hostWindow()); 337 effect = FECustomFilter::create(this, globalContext, program, customFilterOperation->parameters(), 338 customFilterOperation->meshRows(), customFilterOperation->meshColumns(), 339 customFilterOperation->meshBoxType(), customFilterOperation->meshType()); 350 effect = createCustomFilterEffect(this, document, customFilterOperation); 351 if (effect) 340 352 m_hasCustomShaderFilter = true; 341 }342 #endif343 353 break; 344 354 } -
trunk/Source/WebCore/rendering/FilterEffectRenderer.h
r126986 r127217 113 113 LayoutRect computeSourceImageRectForDirtyRect(const LayoutRect& filterBoxRect, const LayoutRect& dirtyRect); 114 114 115 #if ENABLE(CSS_SHADERS) 115 #if ENABLE(CSS_SHADERS) && ENABLE(WEBGL) 116 116 bool hasCustomShaderFilter() const { return m_hasCustomShaderFilter; } 117 117 #endif
Note: See TracChangeset
for help on using the changeset viewer.