BsGpuPipelineState.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "RenderAPI/BsGpuPipelineState.h"
  4. #include "RenderAPI/BsRasterizerState.h"
  5. #include "RenderAPI/BsBlendState.h"
  6. #include "RenderAPI/BsDepthStencilState.h"
  7. #include "RenderAPI/BsGpuProgram.h"
  8. #include "RenderAPI/BsGpuParamDesc.h"
  9. #include "RenderAPI/BsGpuPipelineParamInfo.h"
  10. #include "Managers/BsRenderStateManager.h"
  11. namespace bs
  12. {
  13. /** Converts a sim thread pipeline state descriptor to a core thread one. */
  14. void convertPassDesc(const PIPELINE_STATE_DESC& input, ct::PIPELINE_STATE_DESC& output)
  15. {
  16. output.blendState = input.blendState != nullptr ? input.blendState->getCore() : nullptr;
  17. output.rasterizerState = input.rasterizerState != nullptr ? input.rasterizerState->getCore() : nullptr;
  18. output.depthStencilState = input.depthStencilState != nullptr ? input.depthStencilState->getCore() : nullptr;
  19. output.vertexProgram = input.vertexProgram != nullptr ? input.vertexProgram->getCore() : nullptr;
  20. output.fragmentProgram = input.fragmentProgram != nullptr ? input.fragmentProgram->getCore() : nullptr;
  21. output.geometryProgram = input.geometryProgram != nullptr ? input.geometryProgram->getCore() : nullptr;
  22. output.hullProgram = input.hullProgram != nullptr ? input.hullProgram->getCore() : nullptr;
  23. output.domainProgram = input.domainProgram != nullptr ? input.domainProgram->getCore() : nullptr;
  24. }
  25. template<bool Core>
  26. TGraphicsPipelineState<Core>::TGraphicsPipelineState()
  27. { }
  28. template<bool Core>
  29. TGraphicsPipelineState<Core>::TGraphicsPipelineState(const StateDescType& data)
  30. :mData(data)
  31. { }
  32. template class TGraphicsPipelineState < false > ;
  33. template class TGraphicsPipelineState < true >;
  34. GraphicsPipelineState::GraphicsPipelineState(const PIPELINE_STATE_DESC& desc)
  35. :TGraphicsPipelineState(desc)
  36. {
  37. GPU_PIPELINE_PARAMS_DESC paramsDesc;
  38. if (desc.vertexProgram != nullptr)
  39. {
  40. desc.vertexProgram->blockUntilCoreInitialized();
  41. paramsDesc.vertexParams = desc.vertexProgram->getParamDesc();
  42. }
  43. if (desc.fragmentProgram != nullptr)
  44. {
  45. desc.fragmentProgram->blockUntilCoreInitialized();
  46. paramsDesc.fragmentParams = desc.fragmentProgram->getParamDesc();
  47. }
  48. if (desc.geometryProgram != nullptr)
  49. {
  50. desc.geometryProgram->blockUntilCoreInitialized();
  51. paramsDesc.geometryParams = desc.geometryProgram->getParamDesc();
  52. }
  53. if (desc.hullProgram != nullptr)
  54. {
  55. desc.hullProgram->blockUntilCoreInitialized();
  56. paramsDesc.hullParams = desc.hullProgram->getParamDesc();
  57. }
  58. if (desc.domainProgram != nullptr)
  59. {
  60. desc.domainProgram->blockUntilCoreInitialized();
  61. paramsDesc.domainParams = desc.domainProgram->getParamDesc();
  62. }
  63. mParamInfo = GpuPipelineParamInfo::create(paramsDesc);
  64. }
  65. SPtr<ct::GraphicsPipelineState> GraphicsPipelineState::getCore() const
  66. {
  67. return std::static_pointer_cast<ct::GraphicsPipelineState>(mCoreSpecific);
  68. }
  69. SPtr<ct::CoreObject> GraphicsPipelineState::createCore() const
  70. {
  71. ct::PIPELINE_STATE_DESC desc;
  72. convertPassDesc(mData, desc);
  73. return ct::RenderStateManager::instance()._createGraphicsPipelineState(desc);
  74. }
  75. SPtr<GraphicsPipelineState> GraphicsPipelineState::create(const PIPELINE_STATE_DESC& desc)
  76. {
  77. return RenderStateManager::instance().createGraphicsPipelineState(desc);
  78. }
  79. template<bool Core>
  80. TComputePipelineState<Core>::TComputePipelineState()
  81. { }
  82. template<bool Core>
  83. TComputePipelineState<Core>::TComputePipelineState(const GpuProgramType& program)
  84. :mProgram(program)
  85. { }
  86. template class TComputePipelineState < false >;
  87. template class TComputePipelineState < true >;
  88. ComputePipelineState::ComputePipelineState(const SPtr<GpuProgram>& program)
  89. :TComputePipelineState(program)
  90. {
  91. GPU_PIPELINE_PARAMS_DESC paramsDesc;
  92. program->blockUntilCoreInitialized();
  93. paramsDesc.computeParams = program->getParamDesc();
  94. mParamInfo = GpuPipelineParamInfo::create(paramsDesc);
  95. }
  96. SPtr<ct::ComputePipelineState> ComputePipelineState::getCore() const
  97. {
  98. return std::static_pointer_cast<ct::ComputePipelineState>(mCoreSpecific);
  99. }
  100. SPtr<ct::CoreObject> ComputePipelineState::createCore() const
  101. {
  102. return ct::RenderStateManager::instance()._createComputePipelineState(mProgram->getCore());
  103. }
  104. SPtr<ComputePipelineState> ComputePipelineState::create(const SPtr<GpuProgram>& program)
  105. {
  106. return RenderStateManager::instance().createComputePipelineState(program);
  107. }
  108. namespace ct
  109. {
  110. GraphicsPipelineState::GraphicsPipelineState(const PIPELINE_STATE_DESC& desc, GpuDeviceFlags deviceMask)
  111. :TGraphicsPipelineState(desc), mDeviceMask(deviceMask)
  112. { }
  113. void GraphicsPipelineState::initialize()
  114. {
  115. GPU_PIPELINE_PARAMS_DESC paramsDesc;
  116. if (mData.vertexProgram != nullptr)
  117. paramsDesc.vertexParams = mData.vertexProgram->getParamDesc();
  118. if (mData.fragmentProgram != nullptr)
  119. paramsDesc.fragmentParams = mData.fragmentProgram->getParamDesc();
  120. if (mData.geometryProgram != nullptr)
  121. paramsDesc.geometryParams = mData.geometryProgram->getParamDesc();
  122. if (mData.hullProgram != nullptr)
  123. paramsDesc.hullParams = mData.hullProgram->getParamDesc();
  124. if (mData.domainProgram != nullptr)
  125. paramsDesc.domainParams = mData.domainProgram->getParamDesc();
  126. mParamInfo = GpuPipelineParamInfo::create(paramsDesc, mDeviceMask);
  127. CoreObject::initialize();
  128. }
  129. SPtr<GraphicsPipelineState> GraphicsPipelineState::create(const PIPELINE_STATE_DESC& desc, GpuDeviceFlags deviceMask)
  130. {
  131. return RenderStateManager::instance().createGraphicsPipelineState(desc, deviceMask);
  132. }
  133. ComputePipelineState::ComputePipelineState(const SPtr<GpuProgram>& program, GpuDeviceFlags deviceMask)
  134. :TComputePipelineState(program), mDeviceMask(deviceMask)
  135. { }
  136. void ComputePipelineState::initialize()
  137. {
  138. GPU_PIPELINE_PARAMS_DESC paramsDesc;
  139. paramsDesc.computeParams = mProgram->getParamDesc();
  140. mParamInfo = GpuPipelineParamInfo::create(paramsDesc, mDeviceMask);
  141. CoreObject::initialize();
  142. }
  143. SPtr<ComputePipelineState> ComputePipelineState::create(const SPtr<GpuProgram>& program,
  144. GpuDeviceFlags deviceMask)
  145. {
  146. return RenderStateManager::instance().createComputePipelineState(program, deviceMask);
  147. }
  148. }
  149. }