| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- /*
- -----------------------------------------------------------------------------
- This source file is part of OGRE
- (Object-oriented Graphics Rendering Engine)
- For the latest info, see http://www.ogre3d.org/
- Copyright (c) 2000-2011 Torus Knot Software Ltd
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- -----------------------------------------------------------------------------
- */
- #include "CmGpuProgram.h"
- #include "CmHighLevelGpuProgram.h"
- #include "CmVector3.h"
- #include "CmVector4.h"
- #include "CmRenderSystemCapabilities.h"
- #include "CmException.h"
- #include "CmRenderSystem.h"
- #include "CmRenderSystemManager.h"
- #include "CmAsyncOp.h"
- #include "CmGpuProgramRTTI.h"
- #if CM_DEBUG_MODE
- #define THROW_IF_NOT_RENDER_THREAD throwIfNotRenderThread();
- #else
- #define THROW_IF_NOT_RENDER_THREAD
- #endif
- namespace CamelotEngine
- {
- //-----------------------------------------------------------------------------
- GpuProgram::GpuProgram()
- :mType(GPT_VERTEX_PROGRAM),
- mCompileError(false), mProfile(GPP_NONE)
- {
- createParameterMappingStructures();
- }
- //----------------------------------------------------------------------------
- GpuProgram::~GpuProgram()
- {
- THROW_IF_NOT_RENDER_THREAD;
- }
- //-----------------------------------------------------------------------------
- void GpuProgram::setType(GpuProgramType t)
- {
- mType = t;
- }
- //-----------------------------------------------------------------------------
- void GpuProgram::setSyntaxCode(const String& syntax)
- {
- mSyntaxCode = syntax;
- }
- //-----------------------------------------------------------------------------
- void GpuProgram::setSource(const String& source)
- {
- mSource = source;
- mCompileError = false;
- }
- //-----------------------------------------------------------------------------
- void GpuProgram::initialize()
- {
- RenderSystemManager::getActive()->queueResourceCommand(boost::bind(&GpuProgram::initialize_internal, this));
- }
- //-----------------------------------------------------------------------------
- void GpuProgram::initialize_internal(void)
- {
- // Call polymorphic load
- try
- {
- loadFromSource();
- Resource::initialize_internal();
- }
- catch (const Exception&)
- {
- // will already have been logged
- //LogManager::getSingleton().stream()
- // << "Gpu program " << mName << " encountered an error "
- // << "during loading and is thus not supported.";
- mCompileError = true;
- }
- }
- //-----------------------------------------------------------------------------
- bool GpuProgram::isSupported(void) const
- {
- if (mCompileError || !isRequiredCapabilitiesSupported())
- return false;
- RenderSystem* rs = CamelotEngine::RenderSystemManager::getActive();
- return rs->getCapabilities_internal()->isShaderProfileSupported(mSyntaxCode);
- }
- //-----------------------------------------------------------------------------
- bool GpuProgram::isRequiredCapabilitiesSupported(void) const
- {
- return true;
- }
- //---------------------------------------------------------------------
- void GpuProgram::createParameterMappingStructures(bool recreateIfExists) const
- {
- createLogicalParameterMappingStructures(recreateIfExists);
- createNamedParameterMappingStructures(recreateIfExists);
- }
- //---------------------------------------------------------------------
- void GpuProgram::createLogicalParameterMappingStructures(bool recreateIfExists) const
- {
- if (recreateIfExists || (mFloatLogicalToPhysical == nullptr))
- mFloatLogicalToPhysical = GpuLogicalBufferStructPtr(new GpuLogicalBufferStruct());
- if (recreateIfExists || (mIntLogicalToPhysical == nullptr))
- mIntLogicalToPhysical = GpuLogicalBufferStructPtr(new GpuLogicalBufferStruct());
- if (recreateIfExists || (mSamplerLogicalToPhysical == nullptr))
- mSamplerLogicalToPhysical = GpuLogicalBufferStructPtr(new GpuLogicalBufferStruct());
- }
- //---------------------------------------------------------------------
- void GpuProgram::createNamedParameterMappingStructures(bool recreateIfExists) const
- {
- if (recreateIfExists || (mConstantDefs == nullptr))
- mConstantDefs = GpuNamedConstantsPtr(new GpuNamedConstants());
- }
- //---------------------------------------------------------------------
- GpuProgramParametersSharedPtr GpuProgram::createParameters(void)
- {
- AsyncOp op = RenderSystemManager::getActive()->queueResourceReturnCommand(boost::bind(&GpuProgram::createParameters_internal, this, _1), true);
- return op.getReturnValue<GpuProgramParametersSharedPtr>();
- }
- //-----------------------------------------------------------------------------
- void GpuProgram::createParameters_internal(AsyncOp& op)
- {
- THROW_IF_NOT_RENDER_THREAD
- // Default implementation simply returns standard parameters.
- GpuProgramParametersSharedPtr ret = GpuProgramParametersSharedPtr(new GpuProgramParameters());
-
- // set up named parameters, if any
- if ((mConstantDefs != nullptr) && !mConstantDefs->map.empty())
- {
- ret->_setNamedConstants(mConstantDefs);
- }
- // link shared logical / physical map for low-level use
- ret->_setLogicalIndexes(mFloatLogicalToPhysical, mIntLogicalToPhysical, mSamplerLogicalToPhysical);
- op.completeOperation(ret);
- }
- //-----------------------------------------------------------------------
- const String& GpuProgram::getLanguage(void) const
- {
- static const String language = "asm";
- return language;
- }
- //-----------------------------------------------------------------------------
- void GpuProgram::throwIfNotRenderThread() const
- {
- if(CM_THREAD_CURRENT_ID != RenderSystemManager::getActive()->getRenderThreadId())
- CM_EXCEPT(InternalErrorException, "Calling an internal texture method from a non-render thread!");
- }
- /************************************************************************/
- /* SERIALIZATION */
- /************************************************************************/
- RTTITypeBase* GpuProgram::getRTTIStatic()
- {
- return GpuProgramRTTI::instance();
- }
- RTTITypeBase* GpuProgram::getRTTI() const
- {
- return GpuProgram::getRTTIStatic();
- }
- }
- #undef THROW_IF_NOT_RENDER_THREAD
|