OgreShaderProgramProcessor.h

Go to the documentation of this file.
00001 /*
00002 -----------------------------------------------------------------------------
00003 This source file is part of OGRE
00004 (Object-oriented Graphics Rendering Engine)
00005 For the latest info, see http://www.ogre3d.org
00006 
00007 Copyright (c) 2000-2012 Torus Knot Software Ltd
00008 Permission is hereby granted, free of charge, to any person obtaining a copy
00009 of this software and associated documentation files (the "Software"), to deal
00010 in the Software without restriction, including without limitation the rights
00011 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00012 copies of the Software, and to permit persons to whom the Software is
00013 furnished to do so, subject to the following conditions:
00014 
00015 The above copyright notice and this permission notice shall be included in
00016 all copies or substantial portions of the Software.
00017 
00018 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00019 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00020 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00021 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00022 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00023 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00024 THE SOFTWARE.
00025 -----------------------------------------------------------------------------
00026 */
00027 #ifndef _ShaderProgramProcessor_
00028 #define _ShaderProgramProcessor_
00029 
00030 #include "OgreShaderPrerequisites.h"
00031 #include "OgreShaderParameter.h"
00032 #include "OgreShaderFunctionAtom.h"
00033 
00034 
00035 namespace Ogre {
00036 namespace RTShader {
00037 
00049 class _OgreRTSSExport ProgramProcessor : public RTShaderSystemAlloc
00050 {
00051 
00052 // Interface.
00053 public: 
00054 
00058     ProgramProcessor            ();
00059 
00061     virtual ~ProgramProcessor   ();
00062 
00064     virtual const String&       getTargetLanguage   () const = 0;
00065     
00071     virtual bool                preCreateGpuPrograms    (ProgramSet* programSet) = 0;
00072 
00077     virtual bool                postCreateGpuPrograms   (ProgramSet* programSet) = 0;
00078  
00079 // Protected types.
00080 protected:
00081     
00082     //-----------------------------------------------------------------------------
00083     // Class that holds merge parameter information.
00084     class _OgreRTSSExport MergeParameter 
00085     {
00086     // Interface.
00087     public:
00089         MergeParameter();
00090 
00091 
00093         void            clear                       ();
00094         
00096         void            addSourceParameter          (ParameterPtr srcParam, int mask);
00097 
00099         size_t          getSourceParameterCount     () const { return mSrcParameterCount; }
00100 
00102         ParameterPtr    getSourceParameter          (unsigned int index) { return mSrcParameter[index]; }
00103 
00105         int             getSourceParameterMask      (unsigned int index) const { return mSrcParameterMask[index]; }
00106 
00108         int             getDestinationParameterMask (unsigned int index) const { return mDstParameterMask[index]; }
00109 
00111         int             getUsedFloatCount           ();
00112         
00114         ParameterPtr    getDestinationParameter     (int usage, int index);
00115 
00116     protected:
00117     
00119         void            createDestinationParameter  (int usage, int index);
00120 
00121 
00122     protected:
00123         ParameterPtr    mDstParameter;          // Destination merged parameter.
00124         ParameterPtr    mSrcParameter[4];       // Source parameters - 4 source at max 1,1,1,1 -> 4.
00125         int             mSrcParameterMask[4];   // Source parameters mask. OPM_ALL means all fields used, otherwise it is split source parameter.
00126         int             mDstParameterMask[4];   // Destination parameters mask. OPM_ALL means all fields used, otherwise it is split source parameter.
00127         size_t          mSrcParameterCount;     // The actual source parameters count.
00128         size_t          mUsedFloatCount;        // The number of used floats.
00129     };
00130     typedef vector<MergeParameter>::type    MergeParameterList;
00131 
00132     
00133     //-----------------------------------------------------------------------------
00134     // A struct that defines merge parameters combination.
00135     struct _OgreRTSSExport MergeCombination
00136     {       
00137         size_t          srcParamterTypeCount[4];    // The count of each source type. I.E (1 FLOAT1, 0 FLOAT2, 1 FLOAT3, 0 FLOAT4).
00138         int             srcParameterMask[4];        // Source parameters mask. OPM_ALL means all fields used, otherwise it is split source parameter.
00139 
00140         MergeCombination(
00141             int float1Count, int float1Mask,
00142             int float2Count, int float2Mask,
00143             int float3Count, int float3Mask,
00144             int float4Count, int float4Mask)
00145         {
00146             srcParamterTypeCount[0] = float1Count;
00147             srcParamterTypeCount[1] = float2Count;
00148             srcParamterTypeCount[2] = float3Count;
00149             srcParamterTypeCount[3] = float4Count;
00150             srcParameterMask[0]     = float1Mask;
00151             srcParameterMask[1]     = float2Mask;
00152             srcParameterMask[2]     = float3Mask;
00153             srcParameterMask[3]     = float4Mask;
00154 
00155         }
00156     };
00157     typedef vector<MergeCombination>::type  MergeCombinationList;
00158 
00159     //-----------------------------------------------------------------------------
00160     typedef vector<Operand*>::type                      OperandPtrVector;
00161     typedef map<Parameter*, OperandPtrVector>::type     ParameterOperandMap;
00162     typedef map<Parameter*, ParameterPtr>::type         LocalParameterMap;
00163 
00164 protected:
00165 
00167     void            buildMergeCombinations          ();
00168 
00174     virtual bool    compactVsOutputs                (Function* vsMain, Function* fsMain);
00175 
00181     void            countVsTexcoordOutputs          (Function* vsMain, int& outTexCoordSlots, int& outTexCoordFloats);
00182 
00187     void            buildTexcoordTable              (const ShaderParameterList& paramList, ShaderParameterList outParamsTable[4]);
00188 
00189 
00194     void            mergeParameters                 (ShaderParameterList paramsTable[4], MergeParameterList& mergedParams, ShaderParameterList& splitParams);
00195 
00196 
00201     void            mergeParametersByPredefinedCombinations(ShaderParameterList paramsTable[4], MergeParameterList& mergedParams);
00202 
00208     bool            mergeParametersByCombination            (const MergeCombination& combination, ShaderParameterList paramsTable[4], 
00209                                                                  MergeParameter* mergedParameter);
00210 
00216     void            mergeParametersReminders                (ShaderParameterList paramsTable[4], MergeParameterList& mergedParams, ShaderParameterList& splitParams);
00217 
00218 
00220     void            generateLocalSplitParameters                (Function* func, GpuProgramType progType, MergeParameterList& mergedParams, ShaderParameterList& splitParams, LocalParameterMap& localParamsMap);
00221     
00224     void            rebuildParameterList                (Function* func, int paramsUsage, MergeParameterList& mergedParams);
00225 
00227     void            rebuildFunctionInvocations          (FunctionAtomInstanceList& funcAtomList, MergeParameterList& mergedParams, LocalParameterMap& localParamsMap);
00228 
00230     void            buildParameterReferenceMap          (FunctionAtomInstanceList& funcAtomList, ParameterOperandMap& paramsRefMap);
00231 
00233     void            replaceParametersReferences         (MergeParameterList& mergedParams, ParameterOperandMap& paramsRefMap);
00234 
00236     void            replaceSplitParametersReferences    (LocalParameterMap& localParamsMap, ParameterOperandMap& paramsRefMap);
00237 
00239     static int      getParameterFloatCount              (GpuConstantType type);     
00240 
00242     static int      getParameterMaskByType              (GpuConstantType type);
00243     
00245     static int      getParameterMaskByFloatCount        (int floatCount);
00246     
00248     void            bindAutoParameters                  (Program* pCpuProgram, GpuProgramPtr pGpuProgram);
00249 
00250 protected:
00251     MergeCombinationList    mParamMergeCombinations;        // Merging combinations defs.
00252     int                     mMaxTexCoordSlots;              // Maximum texcoord slots.
00253     int                     mMaxTexCoordFloats;             // Maximum texcoord floats count.
00254     std::map<Function *, String *>  mFunctionMap;           // Map between function signatures and source code
00255 
00256 };
00257 
00258 
00262 }
00263 }
00264 
00265 #endif
00266 

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:27 2012