BsGpuPipelineState.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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)
  36. {
  37. GPU_PIPELINE_PARAMS_DESC paramsDesc;
  38. if (desc.vertexProgram != nullptr)
  39. paramsDesc.vertexParams = desc.vertexProgram->getParamDesc();
  40. if (desc.fragmentProgram != nullptr)
  41. paramsDesc.fragmentParams = desc.fragmentProgram->getParamDesc();
  42. if (desc.geometryProgram != nullptr)
  43. paramsDesc.geometryParams = desc.geometryProgram->getParamDesc();
  44. if (desc.hullProgram != nullptr)
  45. paramsDesc.hullParams = desc.hullProgram->getParamDesc();
  46. if (desc.domainProgram != nullptr)
  47. paramsDesc.domainParams = desc.domainProgram->getParamDesc();
  48. mParamInfo = GpuPipelineParamInfoCore::create(paramsDesc, deviceMask);
  49. }
  50. SPtr<GraphicsPipelineStateCore> GraphicsPipelineStateCore::create(const PIPELINE_STATE_CORE_DESC& desc, GpuDeviceFlags deviceMask)
  51. {
  52. return RenderStateCoreManager::instance().createGraphicsPipelineState(desc, deviceMask);
  53. }
  54. GraphicsPipelineState::GraphicsPipelineState(const PIPELINE_STATE_DESC& desc)
  55. :TGraphicsPipelineState(desc)
  56. {
  57. GPU_PIPELINE_PARAMS_DESC paramsDesc;
  58. if (desc.vertexProgram != nullptr)
  59. {
  60. desc.vertexProgram->blockUntilCoreInitialized();
  61. paramsDesc.vertexParams = desc.vertexProgram->getParamDesc();
  62. }
  63. if (desc.fragmentProgram != nullptr)
  64. {
  65. desc.fragmentProgram->blockUntilCoreInitialized();
  66. paramsDesc.fragmentParams = desc.fragmentProgram->getParamDesc();
  67. }
  68. if (desc.geometryProgram != nullptr)
  69. {
  70. desc.geometryProgram->blockUntilCoreInitialized();
  71. paramsDesc.geometryParams = desc.geometryProgram->getParamDesc();
  72. }
  73. if (desc.hullProgram != nullptr)
  74. {
  75. desc.hullProgram->blockUntilCoreInitialized();
  76. paramsDesc.hullParams = desc.hullProgram->getParamDesc();
  77. }
  78. if (desc.domainProgram != nullptr)
  79. {
  80. desc.domainProgram->blockUntilCoreInitialized();
  81. paramsDesc.domainParams = desc.domainProgram->getParamDesc();
  82. }
  83. mParamInfo = GpuPipelineParamInfo::create(paramsDesc);
  84. }
  85. SPtr<GraphicsPipelineStateCore> GraphicsPipelineState::getCore() const
  86. {
  87. return std::static_pointer_cast<GraphicsPipelineStateCore>(mCoreSpecific);
  88. }
  89. SPtr<CoreObjectCore> GraphicsPipelineState::createCore() const
  90. {
  91. PIPELINE_STATE_CORE_DESC desc;
  92. convertPassDesc(mData, desc);
  93. return RenderStateCoreManager::instance()._createGraphicsPipelineState(desc);
  94. }
  95. SPtr<GraphicsPipelineState> GraphicsPipelineState::create(const PIPELINE_STATE_DESC& desc)
  96. {
  97. return RenderStateManager::instance().createGraphicsPipelineState(desc);
  98. }
  99. template<bool Core>
  100. TComputePipelineState<Core>::TComputePipelineState()
  101. { }
  102. template<bool Core>
  103. TComputePipelineState<Core>::TComputePipelineState(const GpuProgramType& program)
  104. :mProgram(program)
  105. { }
  106. template class TComputePipelineState < false >;
  107. template class TComputePipelineState < true >;
  108. ComputePipelineStateCore::ComputePipelineStateCore(const SPtr<GpuProgramCore>& program, GpuDeviceFlags deviceMask)
  109. :TComputePipelineState(program)
  110. {
  111. GPU_PIPELINE_PARAMS_DESC paramsDesc;
  112. paramsDesc.computeParams = program->getParamDesc();
  113. mParamInfo = GpuPipelineParamInfoCore::create(paramsDesc, deviceMask);
  114. }
  115. SPtr<ComputePipelineStateCore> ComputePipelineStateCore::create(const SPtr<GpuProgramCore>& program,
  116. GpuDeviceFlags deviceMask)
  117. {
  118. return RenderStateCoreManager::instance().createComputePipelineState(program, deviceMask);
  119. }
  120. ComputePipelineState::ComputePipelineState(const SPtr<GpuProgram>& program)
  121. :TComputePipelineState(program)
  122. {
  123. GPU_PIPELINE_PARAMS_DESC paramsDesc;
  124. program->blockUntilCoreInitialized();
  125. paramsDesc.computeParams = program->getParamDesc();
  126. mParamInfo = GpuPipelineParamInfo::create(paramsDesc);
  127. }
  128. SPtr<ComputePipelineStateCore> ComputePipelineState::getCore() const
  129. {
  130. return std::static_pointer_cast<ComputePipelineStateCore>(mCoreSpecific);
  131. }
  132. SPtr<CoreObjectCore> ComputePipelineState::createCore() const
  133. {
  134. return RenderStateCoreManager::instance()._createComputePipelineState(mProgram->getCore());
  135. }
  136. SPtr<ComputePipelineState> ComputePipelineState::create(const SPtr<GpuProgram>& program)
  137. {
  138. return RenderStateManager::instance().createComputePipelineState(program);
  139. }
  140. }