| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- #include "BsGpuParams.h"
- #include "BsGpuParamDesc.h"
- #include "BsGpuParamBlockBuffer.h"
- #include "BsVector2.h"
- #include "BsTexture.h"
- #include "BsSamplerState.h"
- #include "BsFrameAlloc.h"
- #include "BsDebug.h"
- #include "BsException.h"
- namespace BansheeEngine
- {
- GpuParamsBase::GpuParamsBase(const GpuParamDescPtr& paramDesc, bool transposeMatrices)
- :mParamDesc(paramDesc), mTransposeMatrices(transposeMatrices), mNumParamBlocks(0), mNumSamplerStates(0),
- mNumTextures(0), mTextureInfo(nullptr)
- {
- for (auto& paramBlock : mParamDesc->paramBlocks)
- {
- if ((paramBlock.second.slot + 1) > mNumParamBlocks)
- mNumParamBlocks = paramBlock.second.slot + 1;
- }
- for (auto& texture : mParamDesc->textures)
- {
- if ((texture.second.slot + 1) > mNumTextures)
- mNumTextures = texture.second.slot + 1;
- }
- for (auto& sampler : mParamDesc->samplers)
- {
- if ((sampler.second.slot + 1) > mNumSamplerStates)
- mNumSamplerStates = sampler.second.slot + 1;
- }
- mTextureInfo = bs_newN<BoundTextureInfo>(mNumTextures);
- }
- GpuParamsBase::~GpuParamsBase()
- {
- bs_deleteN(mTextureInfo, mNumTextures);
- }
- UINT32 GpuParamsBase::getDataParamSize(const String& name) const
- {
- GpuParamDataDesc* desc = getParamDesc(name);
- if(desc != nullptr)
- return desc->elementSize * 4;
- return 0;
- }
- bool GpuParamsBase::hasParam(const String& name) const
- {
- return getParamDesc(name) != nullptr;
- }
- bool GpuParamsBase::hasTexture(const String& name) const
- {
- auto paramIter = mParamDesc->textures.find(name);
- if(paramIter != mParamDesc->textures.end())
- return true;
- return false;
- }
- bool GpuParamsBase::hasSamplerState(const String& name) const
- {
- auto paramIter = mParamDesc->samplers.find(name);
- if(paramIter != mParamDesc->samplers.end())
- return true;
- return false;
- }
- bool GpuParamsBase::hasParamBlock(const String& name) const
- {
- auto paramBlockIter = mParamDesc->paramBlocks.find(name);
- if(paramBlockIter != mParamDesc->paramBlocks.end())
- return true;
- return false;
- }
- GpuParamDataDesc* GpuParamsBase::getParamDesc(const String& name) const
- {
- auto paramIter = mParamDesc->params.find(name);
- if (paramIter != mParamDesc->params.end())
- return ¶mIter->second;
- return nullptr;
- }
- bool GpuParamsBase::isLoadStoreTexture(UINT32 slot) const
- {
- if (slot < 0 || slot >= mNumTextures)
- {
- BS_EXCEPT(InvalidParametersException, "Index out of range: Valid range: 0 .. " +
- toString(mNumTextures - 1) + ". Requested: " + toString(slot));
- }
- return mTextureInfo[slot].isLoadStore;
- }
- void GpuParamsBase::setIsLoadStoreTexture(UINT32 slot, bool isLoadStore)
- {
- if (slot < 0 || slot >= mNumTextures)
- {
- BS_EXCEPT(InvalidParametersException, "Index out of range: Valid range: 0 .. " +
- toString(mNumTextures - 1) + ". Requested: " + toString(slot));
- }
- mTextureInfo[slot].isLoadStore = isLoadStore;
- }
- const TextureSurface& GpuParamsBase::getLoadStoreSurface(UINT32 slot) const
- {
- if (slot < 0 || slot >= mNumTextures)
- {
- BS_EXCEPT(InvalidParametersException, "Index out of range: Valid range: 0 .. " +
- toString(mNumTextures - 1) + ". Requested: " + toString(slot));
- }
- return mTextureInfo[slot].surface;
- }
- void GpuParamsBase::setLoadStoreSurface(UINT32 slot, const TextureSurface& surface) const
- {
- if (slot < 0 || slot >= mNumTextures)
- {
- BS_EXCEPT(InvalidParametersException, "Index out of range: Valid range: 0 .. " +
- toString(mNumTextures - 1) + ". Requested: " + toString(slot));
- }
- mTextureInfo[slot].surface = surface;
- }
- GpuParamsCore::GpuParamsCore(const GpuParamDescPtr& paramDesc, bool transposeMatrices)
- : TGpuParams(paramDesc, transposeMatrices)
- {
- }
- void GpuParamsCore::updateHardwareBuffers()
- {
- for (UINT32 i = 0; i < mNumParamBlocks; i++)
- {
- if (mParamBlockBuffers[i] != nullptr)
- {
- mParamBlockBuffers[i]->flushToGPU();
- }
- }
- }
- void GpuParamsCore::syncToCore(const CoreSyncData& data)
- {
- UINT32 textureInfoSize = mNumTextures * sizeof(BoundTextureInfo);
- UINT32 paramBufferSize = mNumParamBlocks * sizeof(SPtr<GpuParamBlockBufferCore>);
- UINT32 textureArraySize = mNumTextures * sizeof(SPtr<TextureCore>);
- UINT32 samplerArraySize = mNumSamplerStates * sizeof(SPtr<SamplerStateCore>);
- UINT32 totalSize = textureInfoSize + paramBufferSize + textureArraySize + samplerArraySize;
- UINT32 textureInfoOffset = 0;
- UINT32 paramBufferOffset = textureInfoOffset + textureInfoSize;
- UINT32 textureArrayOffset = paramBufferOffset + paramBufferSize;
- UINT32 samplerArrayOffset = textureArrayOffset + textureArraySize;
- assert(data.getBufferSize() == totalSize);
- UINT8* dataPtr = data.getBuffer();
- BoundTextureInfo* textureInfos = (BoundTextureInfo*)(dataPtr + textureInfoOffset);
- SPtr<GpuParamBlockBufferCore>* paramBuffers = (SPtr<GpuParamBlockBufferCore>*)(dataPtr + paramBufferOffset);
- SPtr<TextureCore>* textures = (SPtr<TextureCore>*)(dataPtr + textureArrayOffset);
- SPtr<SamplerStateCore>* samplers = (SPtr<SamplerStateCore>*)(dataPtr + samplerArrayOffset);
- // Copy & destruct
- for (UINT32 i = 0; i < mNumParamBlocks; i++)
- {
- mParamBlockBuffers[i] = paramBuffers[i];
- paramBuffers[i].~SPtr<GpuParamBlockBufferCore>();
- }
- for (UINT32 i = 0; i < mNumTextures; i++)
- {
- mTextureInfo[i] = textureInfos[i];
- textureInfos[i].~BoundTextureInfo();
- mTextures[i] = textures[i];
- textures[i].~SPtr<TextureCore>();
- }
- for (UINT32 i = 0; i < mNumSamplerStates; i++)
- {
- mSamplerStates[i] = samplers[i];
- samplers[i].~SPtr<SamplerStateCore>();
- }
- }
- SPtr<GpuParamsCore> GpuParamsCore::create(const GpuParamDescPtr& paramDesc, bool transposeMatrices)
- {
- GpuParamsCore* params = new (bs_alloc<GpuParamsCore>()) GpuParamsCore(paramDesc, transposeMatrices);
- SPtr<GpuParamsCore> paramsPtr = bs_shared_ptr<GpuParamsCore, GenAlloc>(params);
- paramsPtr->_setThisPtr(paramsPtr);
- return paramsPtr;
- }
- GpuParams::GpuParams(const GpuParamDescPtr& paramDesc, bool transposeMatrices)
- : TGpuParams(paramDesc, transposeMatrices)
- {
- }
- SPtr<GpuParamsCore> GpuParams::getCore() const
- {
- return std::static_pointer_cast<GpuParamsCore>(mCoreSpecific);
- }
- SPtr<CoreObjectCore> GpuParams::createCore() const
- {
- GpuParamsCore* obj = new (bs_alloc<GpuParamsCore>()) GpuParamsCore(mParamDesc, mTransposeMatrices);
- SPtr<CoreObjectCore> coreObj = bs_shared_ptr<GpuParamsCore, GenAlloc>(obj);
- coreObj->_setThisPtr(coreObj);
- return coreObj;
- }
- void GpuParams::_markCoreDirty()
- {
- markCoreDirty();
- }
- SPtr<GpuParams> GpuParams::create(const GpuParamDescPtr& paramDesc, bool transposeMatrices)
- {
- GpuParams* params = new (bs_alloc<GpuParams>()) GpuParams(paramDesc, transposeMatrices);
- SPtr<GpuParams> paramsPtr = bs_core_ptr<GpuParams, GenAlloc>(params);
- paramsPtr->_setThisPtr(paramsPtr);
- paramsPtr->initialize();
-
- return paramsPtr;
- }
- CoreSyncData GpuParams::syncToCore(FrameAlloc* allocator)
- {
- UINT32 textureInfoSize = mNumTextures * sizeof(BoundTextureInfo);
- UINT32 paramBufferSize = mNumParamBlocks * sizeof(SPtr<GpuParamBlockBufferCore>);
- UINT32 textureArraySize = mNumTextures * sizeof(SPtr<TextureCore>);
- UINT32 samplerArraySize = mNumSamplerStates * sizeof(SPtr<SamplerStateCore>);
- UINT32 totalSize = textureInfoSize + paramBufferSize + textureArraySize + samplerArraySize;
- UINT32 textureInfoOffset = 0;
- UINT32 paramBufferOffset = textureInfoOffset + textureInfoSize;
- UINT32 textureArrayOffset = paramBufferOffset + paramBufferSize;
- UINT32 samplerArrayOffset = textureArrayOffset + textureArraySize;
- UINT8* data = allocator->alloc(totalSize);
- BoundTextureInfo* textureInfos = (BoundTextureInfo*)(data + textureInfoOffset);
- SPtr<GpuParamBlockBufferCore>* paramBuffers = (SPtr<GpuParamBlockBufferCore>*)(data + paramBufferOffset);
- SPtr<TextureCore>* textures = (SPtr<TextureCore>*)(data + textureArrayOffset);
- SPtr<SamplerStateCore>* samplers = (SPtr<SamplerStateCore>*)(data + samplerArrayOffset);
- // Construct & copy
- for (UINT32 i = 0; i < mNumParamBlocks; i++)
- {
- new (¶mBuffers[i]) SPtr<GpuParamBlockBufferCore>();
- if (mParamBlockBuffers[i] != nullptr)
- paramBuffers[i] = mParamBlockBuffers[i]->getCore();
- }
- for (UINT32 i = 0; i < mNumTextures; i++)
- {
- new (&textureInfos[i]) BoundTextureInfo();
- textureInfos[i] = mTextureInfo[i];
- new (&textures[i]) SPtr<TextureCore>();
- if (mTextures[i].isLoaded())
- textures[i] = mTextures[i]->getCore();
- else
- textures[i] = nullptr;
- }
- for (UINT32 i = 0; i < mNumSamplerStates; i++)
- {
- new (&samplers[i]) SPtr<SamplerStateCore>();
- if (mSamplerStates[i].isLoaded())
- samplers[i] = mSamplerStates[i]->getCore();
- else
- samplers[i] = nullptr;
- }
- return CoreSyncData(data, totalSize);
- }
- }
|