BsGpuPipelineState.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsCorePrerequisites.h"
  5. #include "BsCoreObject.h"
  6. namespace BansheeEngine
  7. {
  8. /** @addtogroup RenderAPI
  9. * @{
  10. */
  11. /** Descriptor structure used for initializing a GPU pipeline state. */
  12. struct PIPELINE_STATE_DESC
  13. {
  14. SPtr<BlendState> blendState;
  15. SPtr<RasterizerState> rasterizerState;
  16. SPtr<DepthStencilState> depthStencilState;
  17. SPtr<GpuProgram> vertexProgram;
  18. SPtr<GpuProgram> fragmentProgram;
  19. SPtr<GpuProgram> geometryProgram;
  20. SPtr<GpuProgram> hullProgram;
  21. SPtr<GpuProgram> domainProgram;
  22. };
  23. /** @} */
  24. /** @addtogroup RenderAPI-Internal
  25. * @{
  26. */
  27. /** Descriptor structure used for initializing a GPU pipeline state. */
  28. struct PIPELINE_STATE_CORE_DESC
  29. {
  30. SPtr<BlendStateCore> blendState;
  31. SPtr<RasterizerStateCore> rasterizerState;
  32. SPtr<DepthStencilStateCore> depthStencilState;
  33. SPtr<GpuProgramCore> vertexProgram;
  34. SPtr<GpuProgramCore> fragmentProgram;
  35. SPtr<GpuProgramCore> geometryProgram;
  36. SPtr<GpuProgramCore> hullProgram;
  37. SPtr<GpuProgramCore> domainProgram;
  38. };
  39. /** @} */
  40. /** @addtogroup Implementation
  41. * @{
  42. */
  43. /** Contains all data used by a GPU pipeline state, templated so it may contain both core and sim thread data. */
  44. template<bool Core>
  45. struct TGpuPipelineStateTypes
  46. { };
  47. template<>
  48. struct TGpuPipelineStateTypes < false >
  49. {
  50. typedef SPtr<BlendState> BlendStateType;
  51. typedef SPtr<RasterizerState> RasterizerStateType;
  52. typedef SPtr<DepthStencilState> DepthStencilStateType;
  53. typedef SPtr<GpuProgram> GpuProgramType;
  54. typedef PIPELINE_STATE_DESC StateDescType;
  55. };
  56. template<>
  57. struct TGpuPipelineStateTypes < true >
  58. {
  59. typedef SPtr<BlendStateCore> BlendStateType;
  60. typedef SPtr<RasterizerStateCore> RasterizerStateType;
  61. typedef SPtr<DepthStencilStateCore> DepthStencilStateType;
  62. typedef SPtr<GpuProgramCore> GpuProgramType;
  63. typedef PIPELINE_STATE_CORE_DESC StateDescType;
  64. };
  65. /**
  66. * Templated version of GpuPipelineState so it can be used for both core and non-core versions of the pipeline state.
  67. */
  68. template<bool Core>
  69. class BS_CORE_EXPORT TGpuPipelineState
  70. {
  71. public:
  72. typedef typename TGpuPipelineStateTypes<Core>::BlendStateType BlendStateType;
  73. typedef typename TGpuPipelineStateTypes<Core>::RasterizerStateType RasterizerStateType;
  74. typedef typename TGpuPipelineStateTypes<Core>::DepthStencilStateType DepthStencilStateType;
  75. typedef typename TGpuPipelineStateTypes<Core>::GpuProgramType GpuProgramType;
  76. typedef typename TGpuPipelineStateTypes<Core>::StateDescType StateDescType;
  77. virtual ~TGpuPipelineState() { }
  78. bool hasVertexProgram() const { return mData.vertexProgram != nullptr; }
  79. bool hasFragmentProgram() const { return mData.fragmentProgram != nullptr; }
  80. bool hasGeometryProgram() const { return mData.geometryProgram != nullptr; }
  81. bool hasHullProgram() const { return mData.hullProgram != nullptr; }
  82. bool hasDomainProgram() const { return mData.domainProgram != nullptr; }
  83. BlendStateType getBlendState() const { return mData.blendState; }
  84. RasterizerStateType getRasterizerState() const { return mData.rasterizerState; }
  85. DepthStencilStateType getDepthStencilState() const { return mData.depthStencilState; }
  86. const GpuProgramType& getVertexProgram() const { return mData.vertexProgram; }
  87. const GpuProgramType& getFragmentProgram() const { return mData.fragmentProgram; }
  88. const GpuProgramType& getGeometryProgram() const { return mData.geometryProgram; }
  89. const GpuProgramType& getHullProgram() const { return mData.hullProgram; }
  90. const GpuProgramType& getDomainProgram() const { return mData.domainProgram; }
  91. protected:
  92. TGpuPipelineState();
  93. TGpuPipelineState(const StateDescType& desc);
  94. StateDescType mData;
  95. };
  96. /** @} */
  97. /** @addtogroup RenderAPI
  98. * @{
  99. */
  100. class GpuPipelineStateCore;
  101. /**
  102. * Describes the state of the GPU pipeline that determines how are primitives rendered. It consists of programmable
  103. * states (vertex, fragment, geometry, etc. GPU programs), as well as a set of fixed states (blend, rasterizer,
  104. * depth-stencil). Once created the state is immutable, and can be bound to RenderAPI for rendering.
  105. */
  106. class BS_CORE_EXPORT GpuPipelineState : public CoreObject, public TGpuPipelineState<false>
  107. {
  108. public:
  109. virtual ~GpuPipelineState() { }
  110. /**
  111. * Retrieves a core implementation of the pipeline object usable only from the core thread.
  112. *
  113. * @note Core thread only.
  114. */
  115. SPtr<GpuPipelineStateCore> getCore() const;
  116. /** @copydoc RenderStateManager::createPipelineState */
  117. static SPtr<GpuPipelineState> create(const PIPELINE_STATE_DESC& desc);
  118. protected:
  119. friend class RenderStateManager;
  120. GpuPipelineState(const PIPELINE_STATE_DESC& desc);
  121. /** @copydoc CoreObject::createCore */
  122. virtual SPtr<CoreObjectCore> createCore() const;
  123. };
  124. /** @} */
  125. /** @addtogroup RenderAPI-Internal
  126. * @{
  127. */
  128. /** Core thread version of a GpuPipelineState. */
  129. class BS_CORE_EXPORT GpuPipelineStateCore : public CoreObjectCore, public TGpuPipelineState<true>
  130. {
  131. public:
  132. GpuPipelineStateCore(const PIPELINE_STATE_CORE_DESC& desc, GpuDeviceFlags deviceMask);
  133. virtual ~GpuPipelineStateCore() { }
  134. /** @copydoc RenderStateManager::createPipelineState */
  135. static SPtr<GpuPipelineStateCore> create(const PIPELINE_STATE_CORE_DESC& desc,
  136. GpuDeviceFlags deviceMask = GDF_DEFAULT);
  137. };
  138. /** @} */
  139. }