Edit

kc3-lang/angle/src/compiler/depgraph/DependencyGraphTraverse.cpp

Branch :

  • Show log

    Commit

  • Author : maxvujovic@gmail.com
    Date : 2012-05-30 22:18:11
    Hash : 66ebd014
    Message : Add the SH_TIMING_RESTRICTIONS compile flag and dependency graph implementation. Description of the algorithm: http://code.google.com/p/mvujovic/wiki/ShaderControlFlowAnalysis This flag is one potential solution to timing attacks on textures containing cross-domain content or user agent data. This kind of analysis could be useful for both WebGL and CSS Shaders. The SH_TIMING_RESTRICTIONS flag will reject a shader if it uses texture dependent data to affect control flow. Other ways of affecting shader timing such as using NaNs in basic arithmetic operations or using built-in functions (e.g. atan) with different inputs are still under investigation. Issue=329 Review URL: http://codereview.appspot.com/6195062/ git-svn-id: https://angleproject.googlecode.com/svn/trunk@1101 736b8ea6-26fd-11df-bfd4-992fa37f6226

  • src/compiler/depgraph/DependencyGraphTraverse.cpp
  • //
    // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    #include "compiler/depgraph/DependencyGraph.h"
    
    // These methods do a breadth-first traversal through the graph and mark visited nodes.
    
    void TGraphNode::traverse(TDependencyGraphTraverser* graphTraverser)
    {
        graphTraverser->markVisited(this);
    }
    
    void TGraphParentNode::traverse(TDependencyGraphTraverser* graphTraverser)
    {
        TGraphNode::traverse(graphTraverser);
    
        graphTraverser->incrementDepth();
    
        // Visit the parent node's children.
        for (TGraphNodeSet::const_iterator iter = mDependentNodes.begin();
             iter != mDependentNodes.end();
             ++iter)
        {
            TGraphNode* node = *iter;
            if (!graphTraverser->isVisited(node))
                node->traverse(graphTraverser);
        }
    
        graphTraverser->decrementDepth();
    }
    
    void TGraphArgument::traverse(TDependencyGraphTraverser* graphTraverser)
    {
        graphTraverser->visitArgument(this);
        TGraphParentNode::traverse(graphTraverser);
    }
    
    void TGraphFunctionCall::traverse(TDependencyGraphTraverser* graphTraverser)
    {
        graphTraverser->visitFunctionCall(this);
        TGraphParentNode::traverse(graphTraverser);
    }
    
    void TGraphSymbol::traverse(TDependencyGraphTraverser* graphTraverser)
    {
        graphTraverser->visitSymbol(this);
        TGraphParentNode::traverse(graphTraverser);
    }
    
    void TGraphSelection::traverse(TDependencyGraphTraverser* graphTraverser)
    {
        graphTraverser->visitSelection(this);
        TGraphNode::traverse(graphTraverser);
    }
    
    void TGraphLoop::traverse(TDependencyGraphTraverser* graphTraverser)
    {
        graphTraverser->visitLoop(this);
        TGraphNode::traverse(graphTraverser);
    }
    
    void TGraphLogicalOp::traverse(TDependencyGraphTraverser* graphTraverser)
    {
        graphTraverser->visitLogicalOp(this);
        TGraphNode::traverse(graphTraverser);
    }