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

Unified Diff: Source/core/platform/graphics/filters/custom/CustomFilterValidatedProgram.cpp

Issue 107713004: Move all filters-related files from core/platform to platform. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Maybe fix win build. Created 7 years 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 side-by-side diff with in-line comments
Download patch
Index: Source/core/platform/graphics/filters/custom/CustomFilterValidatedProgram.cpp
diff --git a/Source/core/platform/graphics/filters/custom/CustomFilterValidatedProgram.cpp b/Source/core/platform/graphics/filters/custom/CustomFilterValidatedProgram.cpp
deleted file mode 100644
index c7fbfe7c346f3cab22e49815c09440061b507258..0000000000000000000000000000000000000000
--- a/Source/core/platform/graphics/filters/custom/CustomFilterValidatedProgram.cpp
+++ /dev/null
@@ -1,616 +0,0 @@
-/*
- * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above
- * copyright notice, this list of conditions and the following
- * disclaimer.
- * 2. Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "core/platform/graphics/filters/custom/CustomFilterValidatedProgram.h"
-
-#include "core/platform/graphics/filters/custom/CustomFilterGlobalContext.h"
-#include "platform/NotImplemented.h"
-#include "platform/graphics/angle/ANGLEPlatformBridge.h"
-#include "platform/graphics/filters/custom/CustomFilterConstants.h"
-#include "wtf/HashMap.h"
-#include "wtf/text/StringBuilder.h"
-#include "wtf/text/StringHash.h"
-#include "wtf/Vector.h"
-
-namespace WebCore {
-
-#define SHADER(Src) (#Src)
-
-typedef HashMap<String, ShDataType> SymbolNameToTypeMap;
-
-static SymbolNameToTypeMap* builtInAttributeNameToTypeMap()
-{
- static SymbolNameToTypeMap* nameToTypeMap = 0;
- if (!nameToTypeMap) {
- nameToTypeMap = new SymbolNameToTypeMap;
- nameToTypeMap->set("a_meshCoord", SH_FLOAT_VEC2);
- nameToTypeMap->set("a_position", SH_FLOAT_VEC4);
- nameToTypeMap->set("a_texCoord", SH_FLOAT_VEC2);
- nameToTypeMap->set("a_triangleCoord", SH_FLOAT_VEC3);
- }
- return nameToTypeMap;
-}
-
-static SymbolNameToTypeMap* builtInUniformNameToTypeMap()
-{
- static SymbolNameToTypeMap* nameToTypeMap = 0;
- if (!nameToTypeMap) {
- nameToTypeMap = new SymbolNameToTypeMap;
- nameToTypeMap->set("u_meshBox", SH_FLOAT_VEC4);
- nameToTypeMap->set("u_meshSize", SH_FLOAT_VEC2);
- nameToTypeMap->set("u_projectionMatrix", SH_FLOAT_MAT4);
- nameToTypeMap->set("u_textureSize", SH_FLOAT_VEC2);
- nameToTypeMap->set("u_tileSize", SH_FLOAT_VEC2);
- }
- return nameToTypeMap;
-}
-
-static bool validateSymbols(const Vector<ANGLEShaderSymbol>& symbols, CustomFilterMeshType meshType)
-{
- for (size_t i = 0; i < symbols.size(); ++i) {
- const ANGLEShaderSymbol& symbol = symbols[i];
- switch (symbol.symbolType) {
- case SHADER_SYMBOL_TYPE_ATTRIBUTE: {
- SymbolNameToTypeMap* attributeNameToTypeMap = builtInAttributeNameToTypeMap();
- SymbolNameToTypeMap::iterator builtInAttribute = attributeNameToTypeMap->find(symbol.name);
- if (builtInAttribute == attributeNameToTypeMap->end()) {
- // The author defined a custom attribute.
- // FIXME: Report the validation error.
- // https://bugs.webkit.org/show_bug.cgi?id=74416
- return false;
- }
- if (meshType == MeshTypeAttached && symbol.name == "a_triangleCoord") {
- // a_triangleCoord is only available for detached meshes.
- // FIXME: Report the validation error.
- // https://bugs.webkit.org/show_bug.cgi?id=74416
- return false;
- }
- if (symbol.dataType != builtInAttribute->value) {
- // The author defined one of the built-in attributes with the wrong type.
- // FIXME: Report the validation error.
- // https://bugs.webkit.org/show_bug.cgi?id=74416
- return false;
- }
- break;
- }
- case SHADER_SYMBOL_TYPE_UNIFORM: {
- if (symbol.isSampler()) {
- // FIXME: For now, we restrict shaders with any sampler defined.
- // When we implement texture parameters, we will allow shaders whose samplers are bound to valid textures.
- // We must not allow OpenGL to give unbound samplers a default value of 0 because that references the element texture,
- // which should be inaccessible to the author's shader code.
- // https://bugs.webkit.org/show_bug.cgi?id=96230
- return false;
- }
-
- SymbolNameToTypeMap* uniformNameToTypeMap = builtInUniformNameToTypeMap();
- SymbolNameToTypeMap::iterator builtInUniform = uniformNameToTypeMap->find(symbol.name);
- if (builtInUniform != uniformNameToTypeMap->end() && (symbol.isArray || symbol.dataType != builtInUniform->value)) {
- // The author defined one of the built-in uniforms with the wrong type.
- // FIXME: Report the validation error.
- // https://bugs.webkit.org/show_bug.cgi?id=74416
- return false;
- }
- break;
- }
- default:
- ASSERT_NOT_REACHED();
- break;
- }
- }
-
- return true;
-}
-
-String CustomFilterValidatedProgram::defaultVertexShaderString()
-{
- DEFINE_STATIC_LOCAL(String, vertexShaderString, (SHADER(
- attribute mediump vec4 a_position;
- uniform mediump mat4 u_projectionMatrix;
-
- void main()
- {
- gl_Position = u_projectionMatrix * a_position;
- }
- )));
- return vertexShaderString;
-}
-
-String CustomFilterValidatedProgram::defaultFragmentShaderString()
-{
- DEFINE_STATIC_LOCAL(String, fragmentShaderString, (SHADER(
- void main()
- {
- }
- )));
- return fragmentShaderString;
-}
-
-CustomFilterValidatedProgram::CustomFilterValidatedProgram(CustomFilterGlobalContext* globalContext, const CustomFilterProgramInfo& programInfo)
- : m_globalContext(globalContext)
- , m_programInfo(programInfo)
- , m_isInitialized(false)
-{
- platformInit();
-
- String originalVertexShader = programInfo.vertexShaderString();
- if (originalVertexShader.isNull())
- originalVertexShader = defaultVertexShaderString();
-
- String originalFragmentShader = programInfo.fragmentShaderString();
- if (originalFragmentShader.isNull())
- originalFragmentShader = defaultFragmentShaderString();
-
- // Shaders referenced from the CSS mix function use a different validator than regular WebGL shaders. See core/platform/graphics/filters/custom/CustomFilterGlobalContext.h for more details.
- bool blendsElementTexture = (programInfo.programType() == ProgramTypeBlendsElementTexture);
- ANGLEPlatformBridge* validator = blendsElementTexture ? m_globalContext->mixShaderValidator() : m_globalContext->webglShaderValidator();
- String vertexShaderLog, fragmentShaderLog;
- Vector<ANGLEShaderSymbol> symbols;
- bool vertexShaderValid = validator->compileShaderSource(originalVertexShader.utf8().data(), SHADER_TYPE_VERTEX, m_validatedVertexShader, vertexShaderLog, symbols);
- bool fragmentShaderValid = validator->compileShaderSource(originalFragmentShader.utf8().data(), SHADER_TYPE_FRAGMENT, m_validatedFragmentShader, fragmentShaderLog, symbols);
- if (!vertexShaderValid || !fragmentShaderValid) {
- // FIXME: Report the validation errors.
- // https://bugs.webkit.org/show_bug.cgi?id=74416
- return;
- }
-
- if (!validateSymbols(symbols, m_programInfo.meshType())) {
- // FIXME: Report validation errors.
- // https://bugs.webkit.org/show_bug.cgi?id=74416
- return;
- }
-
- // We need to add texture access, blending, and compositing code to shaders that are referenced from the CSS mix function.
- if (blendsElementTexture) {
- rewriteMixVertexShader(symbols);
- rewriteMixFragmentShader();
- }
-
- m_isInitialized = true;
-}
-
-PassRefPtr<CustomFilterCompiledProgram> CustomFilterValidatedProgram::compiledProgram()
-{
- ASSERT(m_isInitialized && m_globalContext && !m_validatedVertexShader.isNull() && !m_validatedFragmentShader.isNull());
- if (!m_compiledProgram) {
- m_compiledProgram = CustomFilterCompiledProgram::create(m_globalContext->context(), m_validatedVertexShader, m_validatedFragmentShader, m_programInfo.programType());
- ASSERT(m_compiledProgram->isInitialized());
- ASSERT(m_compiledProgram->samplerLocation() != -1 || !needsInputTexture());
- }
- return m_compiledProgram;
-}
-
-bool CustomFilterValidatedProgram::needsInputTexture() const
-{
- return m_programInfo.programType() == ProgramTypeBlendsElementTexture
- && m_programInfo.mixSettings().compositeOperator != CompositeClear
- && m_programInfo.mixSettings().compositeOperator != CompositeCopy;
-}
-
-void CustomFilterValidatedProgram::rewriteMixVertexShader(const Vector<ANGLEShaderSymbol>& symbols)
-{
- ASSERT(m_programInfo.programType() == ProgramTypeBlendsElementTexture);
-
- // If the author defined a_texCoord, we can use it to shuttle the texture coordinate to the fragment shader.
- // Note that vertex attributes are read-only in GLSL, so the author could not have changed a_texCoord's value.
- // Also, note that we would have already rejected the shader if the author defined a_texCoord with the wrong type.
- bool texCoordAttributeDefined = false;
- for (size_t i = 0; i < symbols.size(); ++i) {
- if (symbols[i].name == "a_texCoord")
- texCoordAttributeDefined = true;
- }
-
- if (!texCoordAttributeDefined)
- m_validatedVertexShader.append("attribute mediump vec2 a_texCoord;");
-
- // During validation, ANGLE renamed the author's "main" function to "css_main".
- // We write our own "main" function and call "css_main" from it.
- // This makes rewriting easy and ensures that our code runs after all author code.
- m_validatedVertexShader.append(SHADER(
- varying mediump vec2 css_v_texCoord;
-
- void main()
- {
- css_main();
- css_v_texCoord = a_texCoord;
- }
- ));
-}
-
-void CustomFilterValidatedProgram::rewriteMixFragmentShader()
-{
- ASSERT(m_programInfo.programType() == ProgramTypeBlendsElementTexture);
-
- StringBuilder builder;
- // ANGLE considered these symbols as built-ins during validation under the SH_CSS_SHADERS_SPEC flag.
- // Now, we have to define these symbols in order to make this shader valid GLSL.
- // We define these symbols before the author's shader code, which makes them accessible to author code.
- builder.append(SHADER(
- mediump vec4 css_MixColor = vec4(0.0);
- mediump mat4 css_ColorMatrix = mat4(1.0);
- ));
- builder.append(m_validatedFragmentShader);
- builder.append(blendFunctionString(m_programInfo.mixSettings().blendMode));
- builder.append(compositeFunctionString(m_programInfo.mixSettings().compositeOperator));
- // We define symbols like "css_u_texture" after the author's shader code, which makes them inaccessible to author code.
- // In particular, "css_u_texture" represents the DOM element texture, so it's important to keep it inaccessible to
- // author code for security reasons.
- builder.append(SHADER(
- uniform sampler2D css_u_texture;
- varying mediump vec2 css_v_texCoord;
-
- void main()
- {
- css_main();
- mediump vec4 originalColor = texture2D(css_u_texture, css_v_texCoord);
- mediump vec4 multipliedColor = clamp(css_ColorMatrix * originalColor, 0.0, 1.0);
- mediump vec4 clampedMixColor = clamp(css_MixColor, 0.0, 1.0);
- mediump vec3 blendedColor = css_BlendColor(multipliedColor.rgb, clampedMixColor.rgb);
- mediump vec3 weightedColor = (1.0 - multipliedColor.a) * clampedMixColor.rgb + multipliedColor.a * blendedColor;
- gl_FragColor = css_Composite(multipliedColor.rgb, multipliedColor.a, weightedColor.rgb, clampedMixColor.a);
- }
- ));
- m_validatedFragmentShader = builder.toString();
-}
-
-String CustomFilterValidatedProgram::blendFunctionString(blink::WebBlendMode blendMode)
-{
- // Implemented using the same symbol names as the Compositing and Blending spec:
- // https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blendingnormal
- // Cs: is the source color in css_BlendColor() and the source color component in css_BlendComponent()
- // Cb: is the backdrop color in css_BlendColor() and the backdrop color component in css_BlendComponent()
- const char* blendColorExpression = "vec3(css_BlendComponent(Cb.r, Cs.r), css_BlendComponent(Cb.g, Cs.g), css_BlendComponent(Cb.b, Cs.b))";
- const char* blendComponentExpression = "Co = 0.0;";
- bool needsLuminosityHelperFunctions = false;
- bool needsSaturationHelperFunctions = false;
- String blendFunctionString;
- switch (blendMode) {
- case blink::WebBlendModeNormal:
- blendColorExpression = "Cs";
- break;
- case blink::WebBlendModeMultiply:
- blendColorExpression = "Cs * Cb";
- break;
- case blink::WebBlendModeScreen:
- blendColorExpression = "Cb + Cs - (Cb * Cs)";
- break;
- case blink::WebBlendModeDarken:
- blendColorExpression = "min(Cb, Cs)";
- break;
- case blink::WebBlendModeLighten:
- blendColorExpression = "max(Cb, Cs)";
- break;
- case blink::WebBlendModeDifference:
- blendColorExpression = "abs(Cb - Cs)";
- break;
- case blink::WebBlendModeExclusion:
- blendColorExpression = "Cb + Cs - 2.0 * Cb * Cs";
- break;
- case blink::WebBlendModeOverlay:
- /*
- Co = HardLight(Cs, Cb)
- = if(Cb <= 0.5)
- Multiply(Cs, 2 x Cb)
- else
- Screen(Cs, 2 x Cb - 1)
- = if(Cb <= 0.5)
- Cs x (2 x Cb)
- else
- Cs + (2 x Cb - 1) - (Cs x (2 x Cb - 1))
- */
- blendComponentExpression = SHADER(
- if (Cb <= 0.5)
- Co = Cs * (2.0 * Cb);
- else
- Co = Cs + (2.0 * Cb - 1.0) - (Cs * (2.0 * Cb - 1.0));
- );
- break;
- case blink::WebBlendModeColorDodge:
- /*
- Co = if(Cs < 1)
- min(1, Cb / (1 - Cs))
- else
- 1
- */
- blendComponentExpression = SHADER(
- if (Cs < 1.0)
- Co = min(1.0, Cb / (1.0 - Cs));
- else
- Co = 1.0;
- );
- break;
- case blink::WebBlendModeColorBurn:
- /*
- Co = if(Cs > 0)
- 1 - min(1, (1 - Cb) / Cs)
- else
- 0
- */
- blendComponentExpression = SHADER(
- if (Cs > 0.0)
- Co = 1.0 - min(1.0, (1.0 - Cb) / Cs);
- else
- Co = 0.0;
- );
- break;
- case blink::WebBlendModeHardLight:
- /*
- Co = if(Cs <= 0.5)
- Multiply(Cb, 2 x Cs)
- else
- Screen(Cb, 2 x Cs -1)
- = if(Cs <= 0.5)
- Cb x (2 x Cs)
- else
- Cb + (2 x Cs - 1) - (Cb x (2 x Cs - 1))
- */
- blendComponentExpression = SHADER(
- if (Cs <= 0.5)
- Co = Cb * (2.0 * Cs);
- else
- Co = Cb + (2.0 * Cs - 1.0) - (Cb * (2.0 * Cs - 1.0));
- );
- break;
- case blink::WebBlendModeSoftLight:
- /*
- Co = if(Cs <= 0.5)
- Cb - (1 - 2 x Cs) x Cb x (1 - Cb)
- else
- Cb + (2 x Cs - 1) x (D(Cb) - Cb)
-
- with
-
- D(Cb) = if(Cb <= 0.25)
- (16 * Cb - 12) x Cb + 4) x Cb
- else
- sqrt(Cb)
- */
- blendComponentExpression = SHADER(
- mediump float D;
- if (Cb <= 0.25)
- D = ((16.0 * Cb - 12.0) * Cb + 4.0) * Cb;
- else
- D = sqrt(Cb);
-
- if (Cs <= 0.5)
- Co = Cb - (1.0 - 2.0 * Cs) * Cb * (1.0 - Cb);
- else
- Co = Cb + (2.0 * Cs - 1.0) * (D - Cb);
- );
- break;
- case blink::WebBlendModeColor:
- needsLuminosityHelperFunctions = true;
- blendColorExpression = "css_SetLum(Cs, css_Lum(Cb))";
- break;
- case blink::WebBlendModeLuminosity:
- needsLuminosityHelperFunctions = true;
- blendColorExpression = "css_SetLum(Cb, css_Lum(Cs))";
- break;
- case blink::WebBlendModeHue:
- needsLuminosityHelperFunctions = true;
- needsSaturationHelperFunctions = true;
- blendColorExpression = "css_SetLum(css_SetSat(Cs, css_Sat(Cb)), css_Lum(Cb))";
- break;
- case blink::WebBlendModeSaturation:
- needsLuminosityHelperFunctions = true;
- needsSaturationHelperFunctions = true;
- blendColorExpression = "css_SetLum(css_SetSat(Cb, css_Sat(Cs)), css_Lum(Cb))";
- break;
- default:
- ASSERT_NOT_REACHED();
- }
-
- if (needsLuminosityHelperFunctions) {
- blendFunctionString.append(SHADER(
- mediump float css_Lum(mediump vec3 C)
- {
- return 0.3 * C.r + 0.59 * C.g + 0.11 * C.b;
- }
- mediump vec3 css_ClipColor(mediump vec3 C)
- {
- mediump float L = css_Lum(C);
- mediump float n = min(min(C.r, C.g), C.b);
- mediump float x = max(max(C.r, C.g), C.b);
- if (n < 0.0)
- C = L + (((C - L) * L) / (L - n));
- if (x > 1.0)
- C = L + (((C - L) * (1.0 - L) / (x - L)));
- return C;
- }
- mediump vec3 css_SetLum(mediump vec3 C, mediump float l)
- {
- C += l - css_Lum(C);
- return css_ClipColor(C);
- }
- ));
- }
-
- if (needsSaturationHelperFunctions) {
- blendFunctionString.append(SHADER(
- mediump float css_Sat(mediump vec3 C)
- {
- mediump float cMin = min(min(C.r, C.g), C.b);
- mediump float cMax = max(max(C.r, C.g), C.b);
- return cMax - cMin;
- }
- void css_SetSatHelper(inout mediump float cMin, inout mediump float cMid, inout mediump float cMax, mediump float s)
- {
- if (cMax > cMin) {
- cMid = (((cMid - cMin) * s) / (cMax - cMin));
- cMax = s;
- } else
- cMid = cMax = 0.0;
- cMin = 0.0;
- }
- mediump vec3 css_SetSat(mediump vec3 C, mediump float s)
- {
- if (C.r <= C.g) {
- if (C.g <= C.b)
- css_SetSatHelper(C.r, C.g, C.b, s);
- else {
- if (C.r <= C.b)
- css_SetSatHelper(C.r, C.b, C.g, s);
- else
- css_SetSatHelper(C.b, C.r, C.g, s);
- }
- } else {
- if (C.r <= C.b)
- css_SetSatHelper(C.g, C.r, C.b, s);
- else {
- if (C.g <= C.b)
- css_SetSatHelper(C.g, C.b, C.r, s);
- else
- css_SetSatHelper(C.b, C.g, C.r, s);
- }
- }
- return C;
- }
- ));
- }
-
- blendFunctionString.append(String::format(SHADER(
- mediump float css_BlendComponent(mediump float Cb, mediump float Cs)
- {
- mediump float Co;
- %s
- return Co;
- }
- mediump vec3 css_BlendColor(mediump vec3 Cb, mediump vec3 Cs)
- {
- return %s;
- }
- ), blendComponentExpression, blendColorExpression));
-
- return blendFunctionString;
-}
-
-String CustomFilterValidatedProgram::compositeFunctionString(CompositeOperator compositeOperator)
-{
- // Use the same symbol names as the Compositing and Blending spec:
- // https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blendingnormal
- // Cs: is the source color
- // Cb: is the backdrop color
- // as: is the source alpha
- // ab: is the backdrop alpha
- // Fa: is defined by the Porter Duff operator in use
- // Fb: is defined by the Porter Duff operator in use
- const char* Fa = 0;
- const char* Fb = 0;
- switch (compositeOperator) {
- case CompositeSourceAtop:
- Fa = "ab";
- Fb = "1.0 - as";
- break;
- case CompositeClear:
- Fa = "0.0";
- Fb = "0.0";
- break;
- case CompositeCopy:
- Fa = "1.0";
- Fb = "0.0";
- break;
- case CompositeSourceOver:
- Fa = "1.0";
- Fb = "1.0 - as";
- break;
- case CompositeSourceIn:
- Fa = "ab";
- Fb = "0.0";
- break;
- case CompositeSourceOut:
- Fa = "1.0 - ab";
- Fb = "0.0";
- break;
- case CompositeDestinationOver:
- Fa = "1.0 - ab";
- Fb = "1.0";
- break;
- case CompositeDestinationIn:
- Fa = "0.0";
- Fb = "as";
- break;
- case CompositeDestinationOut:
- Fa = "0.0";
- Fb = "1.0 - as";
- break;
- case CompositeDestinationAtop:
- Fa = "1.0 - ab";
- Fb = "as";
- break;
- case CompositeXOR:
- Fa = "1.0 - ab";
- Fb = "1.0 - as";
- break;
- case CompositePlusLighter:
- notImplemented();
- return String();
- default:
- // The CSS parser should not have accepted any other composite operators.
- ASSERT_NOT_REACHED();
- return String();
- }
-
- ASSERT(Fa && Fb);
- // Use the general formula for compositing, lifted from the spec:
- // https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#generalformula
- return String::format(SHADER(
- mediump vec4 css_Composite(mediump vec3 Cb, mediump float ab, mediump vec3 Cs, mediump float as)
- {
- mediump float Fa = %s;
- mediump float Fb = %s;
- return vec4(as * Fa * Cs + ab * Fb * Cb, as * Fa + ab * Fb);
- }
- ), Fa, Fb);
-}
-
-CustomFilterValidatedProgram::~CustomFilterValidatedProgram()
-{
- platformDestroy();
-
- if (m_globalContext)
- m_globalContext->removeValidatedProgram(this);
-}
-
-CustomFilterProgramInfo CustomFilterValidatedProgram::validatedProgramInfo() const
-{
- ASSERT(m_isInitialized);
- return CustomFilterProgramInfo(m_validatedVertexShader, m_validatedFragmentShader, m_programInfo.programType(), m_programInfo.mixSettings(), m_programInfo.meshType());
-}
-
-void CustomFilterValidatedProgram::platformInit()
-{
-}
-
-void CustomFilterValidatedProgram::platformDestroy()
-{
-}
-
-} // namespace WebCore
-

Powered by Google App Engine
This is Rietveld 408576698