OgreGpuProgram.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 
00009 Permission is hereby granted, free of charge, to any person obtaining a copy
00010 of this software and associated documentation files (the "Software"), to deal
00011 in the Software without restriction, including without limitation the rights
00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00013 copies of the Software, and to permit persons to whom the Software is
00014 furnished to do so, subject to the following conditions:
00015 
00016 The above copyright notice and this permission notice shall be included in
00017 all copies or substantial portions of the Software.
00018 
00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00025 THE SOFTWARE.
00026 -----------------------------------------------------------------------------
00027 */
00028 #ifndef __GpuProgram_H_
00029 #define __GpuProgram_H_
00030 
00031 // Precompiler options
00032 #include "OgrePrerequisites.h"
00033 #include "OgreResource.h"
00034 #include "OgreSharedPtr.h"
00035 #include "OgreIteratorWrappers.h"
00036 #include "OgreSerializer.h"
00037 #include "OgreRenderOperation.h"
00038 #include "OgreGpuProgramParams.h"
00039 
00040 namespace Ogre {
00041 
00049     enum GpuProgramType
00050     {
00051         GPT_VERTEX_PROGRAM,
00052         GPT_FRAGMENT_PROGRAM,
00053         GPT_GEOMETRY_PROGRAM
00054     };
00055 
00056 
00057     // Forward declaration 
00058     class GpuProgramPtr;
00059 
00069     class _OgreExport GpuProgram : public Resource
00070     {
00071     protected:
00073         class _OgreExport CmdType : public ParamCommand
00074         {
00075         public:
00076             String doGet(const void* target) const;
00077             void doSet(void* target, const String& val);
00078         };
00079         class _OgreExport CmdSyntax : public ParamCommand
00080         {
00081         public:
00082             String doGet(const void* target) const;
00083             void doSet(void* target, const String& val);
00084         };
00085         class _OgreExport CmdSkeletal : public ParamCommand
00086         {
00087         public:
00088             String doGet(const void* target) const;
00089             void doSet(void* target, const String& val);
00090         };
00091         class _OgreExport CmdMorph : public ParamCommand
00092         {
00093         public:
00094             String doGet(const void* target) const;
00095             void doSet(void* target, const String& val);
00096         };
00097         class _OgreExport CmdPose : public ParamCommand
00098         {
00099         public:
00100             String doGet(const void* target) const;
00101             void doSet(void* target, const String& val);
00102         };
00103         class _OgreExport CmdVTF : public ParamCommand
00104         {
00105         public:
00106             String doGet(const void* target) const;
00107             void doSet(void* target, const String& val);
00108         };
00109         class _OgreExport CmdManualNamedConstsFile : public ParamCommand
00110         {
00111         public:
00112             String doGet(const void* target) const;
00113             void doSet(void* target, const String& val);
00114         };
00115         class _OgreExport CmdAdjacency : public ParamCommand
00116         {
00117         public:
00118             String doGet(const void* target) const;
00119             void doSet(void* target, const String& val);
00120         };
00121         // Command object for setting / getting parameters
00122         static CmdType msTypeCmd;
00123         static CmdSyntax msSyntaxCmd;
00124         static CmdSkeletal msSkeletalCmd;
00125         static CmdMorph msMorphCmd;
00126         static CmdPose msPoseCmd;
00127         static CmdVTF msVTFCmd;
00128         static CmdManualNamedConstsFile msManNamedConstsFileCmd;
00129         static CmdAdjacency msAdjacencyCmd;
00131         GpuProgramType mType;
00133         String mFilename;
00135         String mSource;
00137         bool mLoadFromFile;
00139         String mSyntaxCode;
00141         bool mSkeletalAnimation;
00143         bool mMorphAnimation;
00145         ushort mPoseAnimation;
00147         bool mVertexTextureFetch;
00149         bool mNeedsAdjacencyInfo;
00151         GpuProgramParametersSharedPtr mDefaultParams;
00153         bool mCompileError;
00158         mutable GpuLogicalBufferStructPtr mFloatLogicalToPhysical;
00163         mutable GpuLogicalBufferStructPtr mIntLogicalToPhysical;
00168         mutable GpuNamedConstantsPtr mConstantDefs;
00170         String mManualNamedConstantsFile;
00171         bool mLoadedManualNamedConstants;
00172 
00173 
00182         void setupBaseParamDictionary(void);
00183 
00186         bool isRequiredCapabilitiesSupported(void) const;
00187 
00189         size_t calculateSize(void) const { return 0; } // TODO 
00190 
00192         void loadImpl(void);
00193 
00195         void createParameterMappingStructures(bool recreateIfExists = true) const;
00197         void createLogicalParameterMappingStructures(bool recreateIfExists = true) const;
00199         void createNamedParameterMappingStructures(bool recreateIfExists = true) const;
00200 
00201     public:
00202 
00203         GpuProgram(ResourceManager* creator, const String& name, ResourceHandle handle,
00204             const String& group, bool isManual = false, ManualResourceLoader* loader = 0);
00205 
00206         virtual ~GpuProgram() {}
00207 
00212         virtual void setSourceFile(const String& filename);
00213 
00218         virtual void setSource(const String& source);
00219 
00221         virtual const String& getSyntaxCode(void) const { return mSyntaxCode; }
00222 
00224         virtual void setSyntaxCode(const String& syntax);
00225 
00227         virtual const String& getSourceFile(void) const { return mFilename; }
00229         virtual const String& getSource(void) const { return mSource; }
00231         virtual void setType(GpuProgramType t);
00233         virtual GpuProgramType getType(void) const { return mType; }
00234 
00239         virtual GpuProgram* _getBindingDelegate(void) { return this; }
00240 
00242         virtual bool isSupported(void) const;
00243 
00251         virtual GpuProgramParametersSharedPtr createParameters(void);
00252 
00259         virtual void setSkeletalAnimationIncluded(bool included) 
00260         { mSkeletalAnimation = included; }
00261 
00268         virtual bool isSkeletalAnimationIncluded(void) const { return mSkeletalAnimation; }
00269 
00276         virtual void setMorphAnimationIncluded(bool included) 
00277         { mMorphAnimation = included; }
00278 
00286         virtual void setPoseAnimationIncluded(ushort poseCount) 
00287         { mPoseAnimation = poseCount; }
00288 
00295         virtual bool isMorphAnimationIncluded(void) const { return mMorphAnimation; }
00296 
00303         virtual bool isPoseAnimationIncluded(void) const { return mPoseAnimation > 0; }
00307         virtual ushort getNumberOfPosesIncluded(void) const { return mPoseAnimation; }
00311         virtual void setVertexTextureFetchRequired(bool r) { mVertexTextureFetch = r; }
00315         virtual bool isVertexTextureFetchRequired(void) const { return mVertexTextureFetch; }
00316 
00320         virtual void setAdjacencyInfoRequired(bool r) { mNeedsAdjacencyInfo = r; }
00324         virtual bool isAdjacencyInfoRequired(void) const { return mNeedsAdjacencyInfo; }
00325         
00336         virtual GpuProgramParametersSharedPtr getDefaultParameters(void);
00337 
00340         virtual bool hasDefaultParameters(void) const { return !mDefaultParams.isNull(); }
00341 
00348         virtual bool getPassSurfaceAndLightStates(void) const { return false; }
00349 
00358         virtual bool getPassFogStates(void) const { return true; }
00359 
00366         virtual bool getPassTransformStates(void) const { return false; }
00367 
00371         virtual const String& getLanguage(void) const;
00372 
00375         virtual bool hasCompileError(void) const { return mCompileError; }
00376 
00379         virtual void resetCompileError(void) { mCompileError = false; }
00380 
00389         virtual void setManualNamedConstants(const GpuNamedConstants& namedConstants);
00390 
00392         virtual const GpuNamedConstants& getNamedConstants() const { return *mConstantDefs.get(); }
00393 
00404         virtual void setManualNamedConstantsFile(const String& paramDefFile);
00405 
00409         virtual const String& getManualNamedConstantsFile() const { return mManualNamedConstantsFile; }
00416         virtual const GpuNamedConstants& getConstantDefinitions() const { return *mConstantDefs.get(); }
00417 
00418 
00419     protected:
00421         virtual void loadFromSource(void) = 0;
00422 
00423     };
00424 
00425 
00432     class _OgreExport GpuProgramPtr : public SharedPtr<GpuProgram> 
00433     {
00434     public:
00435         GpuProgramPtr() : SharedPtr<GpuProgram>() {}
00436         explicit GpuProgramPtr(GpuProgram* rep) : SharedPtr<GpuProgram>(rep) {}
00437         GpuProgramPtr(const GpuProgramPtr& r) : SharedPtr<GpuProgram>(r) {} 
00438         GpuProgramPtr(const ResourcePtr& r) : SharedPtr<GpuProgram>()
00439         {
00440             // lock & copy other mutex pointer
00441             OGRE_MUTEX_CONDITIONAL(r.OGRE_AUTO_MUTEX_NAME)
00442             {
00443                 OGRE_LOCK_MUTEX(*r.OGRE_AUTO_MUTEX_NAME)
00444                 OGRE_COPY_AUTO_SHARED_MUTEX(r.OGRE_AUTO_MUTEX_NAME)
00445                 pRep = static_cast<GpuProgram*>(r.getPointer());
00446                 pUseCount = r.useCountPointer();
00447                 if (pUseCount)
00448                 {
00449                     ++(*pUseCount);
00450                 }
00451             }
00452         }
00453 
00455         GpuProgramPtr& operator=(const ResourcePtr& r)
00456         {
00457             if (pRep == static_cast<GpuProgram*>(r.getPointer()))
00458                 return *this;
00459             release();
00460             // lock & copy other mutex pointer
00461             OGRE_MUTEX_CONDITIONAL(r.OGRE_AUTO_MUTEX_NAME)
00462             {
00463                 OGRE_LOCK_MUTEX(*r.OGRE_AUTO_MUTEX_NAME)
00464                 OGRE_COPY_AUTO_SHARED_MUTEX(r.OGRE_AUTO_MUTEX_NAME)
00465                 pRep = static_cast<GpuProgram*>(r.getPointer());
00466                 pUseCount = r.useCountPointer();
00467                 if (pUseCount)
00468                 {
00469                     ++(*pUseCount);
00470                 }
00471             }
00472             else
00473             {
00474                 // RHS must be a null pointer
00475                 assert(r.isNull() && "RHS must be null if it has no mutex!");
00476                 setNull();
00477             }
00478             return *this;
00479         }
00481         GpuProgramPtr& operator=(const HighLevelGpuProgramPtr& r);
00482     };
00485 }
00486 
00487 #endif

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:24 2012