BsGpuPipelineState.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsGpuPipelineState.h"
  4. #include "BsRasterizerState.h"
  5. #include "BsBlendState.h"
  6. #include "BsDepthStencilState.h"
  7. #include "BsGpuProgram.h"
  8. #include "BsGpuParamDesc.h"
  9. #include "BsGpuPipelineParamInfo.h"
  10. #include "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, PIPELINE_STATE_CORE_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. GraphicsPipelineStateCore::GraphicsPipelineStateCore(const PIPELINE_STATE_CORE_DESC& desc, GpuDeviceFlags deviceMask)
  35. :TGraphicsPipelineState(desc), mDeviceMask(deviceMask)
  36. { }
  37. void GraphicsPipelineStateCore::initialize()
  38. {
  39. GPU_PIPELINE_PARAMS_DESC paramsDesc;
  40. if (mData.vertexProgram != nullptr)
  41. paramsDesc.vertexParams = mData.vertexProgram->getParamDesc();
  42. if (mData.fragmentProgram != nullptr)
  43. paramsDesc.fragmentParams = mData.fragmentProgram->getParamDesc();
  44. if (mData.geometryProgram != nullptr)
  45. paramsDesc.geometryParams = mData.geometryProgram->getParamDesc();
  46. if (mData.hullProgram != nullptr)
  47. paramsDesc.hullParams = mData.hullProgram->getParamDesc();
  48. if (mData.domainProgram != nullptr)
  49. paramsDesc.domainParams = mData.domainProgram->getParamDesc();
  50. mParamInfo = GpuPipelineParamInfoCore::create(paramsDesc, mDeviceMask);
  51. CoreObjectCore::initialize();
  52. }
  53. SPtr<GraphicsPipelineStateCore> GraphicsPipelineStateCore::create(const PIPELINE_STATE_CORE_DESC& desc, GpuDeviceFlags deviceMask)
  54. {
  55. return RenderStateCoreManager::instance().createGraphicsPipelineState(desc, deviceMask);
  56. }
  57. GraphicsPipelineState::GraphicsPipelineState(const PIPELINE_STATE_DESC& desc)
  58. :TGraphicsPipelineState(desc)
  59. {
  60. GPU_PIPELINE_PARAMS_DESC paramsDesc;
  61. if (desc.vertexProgram != nullptr)
  62. {
  63. desc.vertexProgram->blockUntilCoreInitialized();
  64. paramsDesc.vertexParams = desc.vertexProgram->getParamDesc();
  65. }
  66. if (desc.fragmentProgram != nullptr)
  67. {
  68. desc.fragmentProgram->blockUntilCoreInitialized();
  69. paramsDesc.fragmentParams = desc.fragmentProgram->getParamDesc();
  70. }
  71. if (desc.geometryProgram != nullptr)
  72. {
  73. desc.geometryProgram->blockUntilCoreInitialized();
  74. paramsDesc.geometryParams = desc.geometryProgram->getParamDesc();
  75. }
  76. if (desc.hullProgram != nullptr)
  77. {
  78. desc.hullProgram->blockUntilCoreInitialized();
  79. paramsDesc.hullParams = desc.hullProgram->getParamDesc();
  80. }
  81. if (desc.domainProgram != nullptr)
  82. {
  83. desc.domainProgram->blockUntilCoreInitialized();
  84. paramsDesc.domainParams = desc.domainProgram->getParamDesc();
  85. }
  86. mParamInfo = GpuPipelineParamInfo::create(paramsDesc);
  87. }
  88. SPtr<GraphicsPipelineStateCore> GraphicsPipelineState::getCore() const
  89. {
  90. return std::static_pointer_cast<GraphicsPipelineStateCore>(mCoreSpecific);
  91. }
  92. SPtr<CoreObjectCore> GraphicsPipelineState::createCore() const
  93. {
  94. PIPELINE_STATE_CORE_DESC desc;
  95. convertPassDesc(mData, desc);
  96. return RenderStateCoreManager::instance()._createGraphicsPipelineState(desc);
  97. }
  98. SPtr<GraphicsPipelineState> GraphicsPipelineState::create(const PIPELINE_STATE_DESC& desc)
  99. {
  100. return RenderStateManager::instance().createGraphicsPipelineState(desc);
  101. }
  102. template<bool Core>
  103. TComputePipelineState<Core>::TComputePipelineState()
  104. { }
  105. template<bool Core>
  106. TComputePipelineState<Core>::TComputePipelineState(const GpuProgramType& program)
  107. :mProgram(program)
  108. { }
  109. template class TComputePipelineState < false >;
  110. template class TComputePipelineState < true >;
  111. ComputePipelineStateCore::ComputePipelineStateCore(const SPtr<GpuProgramCore>& program, GpuDeviceFlags deviceMask)
  112. :TComputePipelineState(program), mDeviceMask(deviceMask)
  113. { }
  114. void ComputePipelineStateCore::initialize()
  115. {
  116. GPU_PIPELINE_PARAMS_DESC paramsDesc;
  117. paramsDesc.computeParams = mProgram->getParamDesc();
  118. mParamInfo = GpuPipelineParamInfoCore::create(paramsDesc, mDeviceMask);
  119. CoreObjectCore::initialize();
  120. }
  121. SPtr<ComputePipelineStateCore> ComputePipelineStateCore::create(const SPtr<GpuProgramCore>& program,
  122. GpuDeviceFlags deviceMask)
  123. {
  124. return RenderStateCoreManager::instance().createComputePipelineState(program, deviceMask);
  125. }
  126. ComputePipelineState::ComputePipelineState(const SPtr<GpuProgram>& program)
  127. :TComputePipelineState(program)
  128. {
  129. GPU_PIPELINE_PARAMS_DESC paramsDesc;
  130. program->blockUntilCoreInitialized();
  131. paramsDesc.computeParams = program->getParamDesc();
  132. mParamInfo = GpuPipelineParamInfo::create(paramsDesc);
  133. }
  134. SPtr<ComputePipelineStateCore> ComputePipelineState::getCore() const
  135. {
  136. return std::static_pointer_cast<ComputePipelineStateCore>(mCoreSpecific);
  137. }
  138. SPtr<CoreObjectCore> ComputePipelineState::createCore() const
  139. {
  140. return RenderStateCoreManager::instance()._createComputePipelineState(mProgram->getCore());
  141. }
  142. SPtr<ComputePipelineState> ComputePipelineState::create(const SPtr<GpuProgram>& program)
  143. {
  144. return RenderStateManager::instance().createComputePipelineState(program);
  145. }
  146. }