14167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com/*
24167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * Copyright (C) 2012 Apple Inc. All rights reserved.
34167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com *
44167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * Redistribution and use in source and binary forms, with or without
54167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * modification, are permitted provided that the following conditions
64167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * are met:
74167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * 1. Redistributions of source code must retain the above copyright
84167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com *    notice, this list of conditions and the following disclaimer.
94167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * 2. Redistributions in binary form must reproduce the above copyright
104167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com *    notice, this list of conditions and the following disclaimer in the
114167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com *    documentation and/or other materials provided with the distribution.
124167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com *
134167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * THIS SOFTWARE IS PROVIDED BY APPLE, INC. ``AS IS'' AND ANY
144167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
154167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
164167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE, INC. OR
174167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
184167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
194167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
204167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
214167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
224167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
234167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
244167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com */
254167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com
26da1ed36a3ba807337ec1d5a2009238c00ce4caabshannon.woods@transgaming.com#ifndef THIRD_PARTY_COMPILER_ARRAY_BOUNDS_CLAMPER_H_
27da1ed36a3ba807337ec1d5a2009238c00ce4caabshannon.woods@transgaming.com#define THIRD_PARTY_COMPILER_ARRAY_BOUNDS_CLAMPER_H_
284167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com
2917732823f9c21bdba9cc51ffaceb545ce3857a8cGeoff Lang#include "compiler/translator/InfoSink.h"
30b1a85f48a6cb63c32e884a9dea86b1ca7275bf7cJamie Madill#include "compiler/translator/IntermNode.h"
314167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com
324167cc910276be723901f187dec45d04275abb7edaniel@transgaming.comclass ArrayBoundsClamper {
334167cc910276be723901f187dec45d04275abb7edaniel@transgaming.compublic:
344167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com    ArrayBoundsClamper();
354167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com
361d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com    // Must be set before compiling any shaders to ensure consistency
371d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com    // between the translated shaders and any necessary prequel.
381d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com    void SetClampingStrategy(ShArrayIndexClampingStrategy clampingStrategy);
394167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com
404167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com    // Marks nodes in the tree that index arrays indirectly as
414167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com    // requiring clamping.
424167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com    void MarkIndirectArrayBoundsForClamping(TIntermNode* root);
434167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com
441d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com    // If necessary, output array clamp function source into the shader source.
451d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com    void OutputClampingFunctionDefinition(TInfoSinkBase& out) const;
461d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com
474167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com    void Cleanup()
484167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com    {
494167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com        mArrayBoundsClampDefinitionNeeded = false;
504167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com    }
514167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com
524167cc910276be723901f187dec45d04275abb7edaniel@transgaming.comprivate:
534167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com    bool GetArrayBoundsClampDefinitionNeeded() const { return mArrayBoundsClampDefinitionNeeded; }
544167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com    void SetArrayBoundsClampDefinitionNeeded() { mArrayBoundsClampDefinitionNeeded = true; }
551d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com
561d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com    ShArrayIndexClampingStrategy mClampingStrategy;
574167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com    bool mArrayBoundsClampDefinitionNeeded;
584167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com};
594167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com
60da1ed36a3ba807337ec1d5a2009238c00ce4caabshannon.woods@transgaming.com#endif // THIRD_PARTY_COMPILER_ARRAY_BOUNDS_CLAMPER_H_
61