BsPass.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #include "BsPass.h"
  2. #include "BsRasterizerState.h"
  3. #include "BsBlendState.h"
  4. #include "BsDepthStencilState.h"
  5. #include "BsPassRTTI.h"
  6. #include "BsMaterial.h"
  7. #include "BsGpuParams.h"
  8. #include "BsFrameAlloc.h"
  9. #include "BsException.h"
  10. namespace BansheeEngine
  11. {
  12. bool propertiesHaveBlending(const BlendProperties& bsProps)
  13. {
  14. bool transparent = false;
  15. for (UINT32 i = 0; i < BS_MAX_MULTIPLE_RENDER_TARGETS; i++)
  16. {
  17. // Transparent if destination color is taken into account
  18. if (bsProps.getDstBlend(i) != BF_ZERO ||
  19. bsProps.getSrcBlend(i) == BF_DEST_COLOR ||
  20. bsProps.getSrcBlend(i) == BF_INV_DEST_COLOR ||
  21. bsProps.getSrcBlend(i) == BF_DEST_ALPHA ||
  22. bsProps.getSrcBlend(i) == BF_INV_DEST_ALPHA)
  23. {
  24. transparent = true;
  25. }
  26. }
  27. return transparent;
  28. }
  29. bool PassBase::hasBlending(const HBlendState& blendState)
  30. {
  31. if (blendState != nullptr)
  32. return propertiesHaveBlending(blendState->getProperties());
  33. return false;
  34. }
  35. bool PassBase::hasBlending(const SPtr<BlendStateCore>& blendState)
  36. {
  37. if (blendState != nullptr)
  38. return propertiesHaveBlending(blendState->getProperties());
  39. return false;
  40. }
  41. void PassCore::syncToCore(const CoreSyncData& data)
  42. {
  43. UINT8* buffer = data.getBuffer();
  44. SPtr<BlendStateCore>* blendState = (SPtr<BlendStateCore>*)buffer;
  45. mData.mBlendState = *blendState;
  46. blendState->~SPtr<BlendStateCore>();
  47. buffer += sizeof(SPtr<BlendStateCore>);
  48. SPtr<RasterizerStateCore>* rasterizerState = (SPtr<RasterizerStateCore>*)buffer;
  49. mData.mRasterizerState = *rasterizerState;
  50. rasterizerState->~SPtr<RasterizerStateCore>();
  51. buffer += sizeof(SPtr<RasterizerStateCore>);
  52. SPtr<DepthStencilStateCore>* depthStencilState = (SPtr<DepthStencilStateCore>*)buffer;
  53. mData.mDepthStencilState = *depthStencilState;
  54. depthStencilState->~SPtr<DepthStencilStateCore>();
  55. buffer += sizeof(SPtr<DepthStencilStateCore>);
  56. memcpy(&mData.mStencilRefValue, buffer, sizeof(UINT32));
  57. buffer += sizeof(UINT32);
  58. SPtr<GpuProgramCore>* allPrograms[6] = { &mData.mVertexProgram, &mData.mFragmentProgram, &mData.mGeometryProgram,
  59. &mData.mHullProgram, &mData.mDomainProgram, &mData.mComputeProgram };
  60. UINT32 numPrograms = sizeof(allPrograms) / sizeof(HGpuProgram*);
  61. for (UINT32 i = 0; i < numPrograms; i++)
  62. {
  63. SPtr<GpuProgramCore>* gpuProgram = (SPtr<GpuProgramCore>*)buffer;
  64. *allPrograms[i] = *gpuProgram;
  65. gpuProgram->~SPtr<GpuProgramCore>();
  66. buffer += sizeof(SPtr<GpuProgramCore>);
  67. }
  68. }
  69. SPtr<PassCore> PassCore::create()
  70. {
  71. PassCore* newPass = new (bs_alloc<PassCore>()) PassCore();
  72. SPtr<PassCore> newPassPtr = bs_shared_ptr<PassCore, GenAlloc>(newPass);
  73. newPassPtr->_setThisPtr(newPassPtr);
  74. newPassPtr->initialize();
  75. return newPassPtr;
  76. }
  77. SPtr<PassCore> Pass::getCore() const
  78. {
  79. return std::static_pointer_cast<PassCore>(mCoreSpecific);
  80. }
  81. SPtr<CoreObjectCore> Pass::createCore() const
  82. {
  83. PassCore* pass = new (bs_alloc<PassCore>()) PassCore();
  84. SPtr<PassCore> passPtr = bs_shared_ptr<PassCore, GenAlloc>(pass);
  85. passPtr->_setThisPtr(passPtr);
  86. return passPtr;
  87. }
  88. void Pass::_markCoreDirty()
  89. {
  90. markCoreDirty();
  91. }
  92. CoreSyncData Pass::syncToCore(FrameAlloc* alloc)
  93. {
  94. UINT32 size = sizeof(SPtr<BlendStateCore>) + sizeof(SPtr<RasterizerStateCore>) +
  95. sizeof(SPtr<DepthStencilStateCore>) + sizeof(SPtr<GpuProgramCore>) * 6 + sizeof(UINT32);
  96. UINT8* data = alloc->alloc(size);
  97. UINT8* dataPtr = data;
  98. SPtr<BlendStateCore>* blendState = new (dataPtr)SPtr<BlendStateCore>();
  99. dataPtr += sizeof(SPtr<BlendStateCore>);
  100. if (mData.mBlendState != nullptr)
  101. *blendState = mData.mBlendState->getCore();
  102. else
  103. *blendState = nullptr;
  104. SPtr<RasterizerStateCore>* rasterizerState = new (dataPtr)SPtr<RasterizerStateCore>();
  105. dataPtr += sizeof(SPtr<RasterizerStateCore>);
  106. if (mData.mRasterizerState != nullptr)
  107. *rasterizerState = mData.mRasterizerState->getCore();
  108. else
  109. *rasterizerState = nullptr;
  110. SPtr<DepthStencilStateCore>* depthStencilState = new (dataPtr)SPtr<DepthStencilStateCore>();
  111. dataPtr += sizeof(SPtr<DepthStencilStateCore>);
  112. if (mData.mDepthStencilState != nullptr)
  113. *depthStencilState = mData.mDepthStencilState->getCore();
  114. else
  115. *depthStencilState = nullptr;
  116. memcpy(dataPtr, &mData.mStencilRefValue, sizeof(UINT32));
  117. dataPtr += sizeof(UINT32);
  118. HGpuProgram* allPrograms[6] = { &mData.mVertexProgram, &mData.mFragmentProgram, &mData.mGeometryProgram,
  119. &mData.mHullProgram, &mData.mDomainProgram, &mData.mComputeProgram };
  120. UINT32 numPrograms = sizeof(allPrograms) / sizeof(HGpuProgram*);
  121. for (UINT32 i = 0; i < numPrograms; i++)
  122. {
  123. SPtr<GpuProgramCore>* gpuProgram = new (dataPtr)SPtr<GpuProgramCore>();
  124. dataPtr += sizeof(SPtr<GpuProgramCore>);
  125. if (*allPrograms[i] != nullptr)
  126. *gpuProgram = (*allPrograms[i])->getCore();
  127. else
  128. *gpuProgram = nullptr;
  129. }
  130. return CoreSyncData(data, size);
  131. }
  132. PassPtr Pass::create()
  133. {
  134. PassPtr newPass = createEmpty();
  135. newPass->initialize();
  136. return newPass;
  137. }
  138. PassPtr Pass::createEmpty()
  139. {
  140. Pass* newPass = new (bs_alloc<Pass>()) Pass();
  141. PassPtr newPassPtr = bs_core_ptr<Pass, GenAlloc>(newPass);
  142. newPassPtr->_setThisPtr(newPassPtr);
  143. return newPassPtr;
  144. }
  145. RTTITypeBase* Pass::getRTTIStatic()
  146. {
  147. return PassRTTI::instance();
  148. }
  149. RTTITypeBase* Pass::getRTTI() const
  150. {
  151. return Pass::getRTTIStatic();
  152. }
  153. }