BsParamBlocks.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #pragma once
  2. #include "BsCorePrerequisites.h"
  3. #include "BsGpuParamDesc.h"
  4. #include "BsGpuParams.h"
  5. #include "BsRenderAPI.h"
  6. #include "BsGpuParamBlockBuffer.h"
  7. namespace BansheeEngine
  8. {
  9. /**
  10. * Macros used for manually constructing parameter block buffers used by GPU programs.
  11. */
  12. #define BS_PARAM_BLOCK_BEGIN(Name) \
  13. struct Name \
  14. { \
  15. Name() \
  16. { \
  17. SPtr<GpuParamDesc> paramsDesc = bs_shared_ptr_new<GpuParamDesc>(); \
  18. \
  19. Vector<GpuParamDataDesc> params = getEntries(); \
  20. for(auto& param : params) \
  21. paramsDesc->params[param.name] = param; \
  22. \
  23. RenderAPICore& rapi = RenderAPICore::instance(); \
  24. \
  25. GpuParamBlockDesc blockDesc = rapi.generateParamBlockDesc(#Name, params); \
  26. paramsDesc->paramBlocks[#Name] = blockDesc; \
  27. \
  28. mParams = GpuParamsCore::create(paramsDesc, rapi.getGpuProgramHasColumnMajorMatrices()); \
  29. \
  30. mBuffer = GpuParamBlockBufferCore::create(blockDesc.blockSize * sizeof(UINT32)); \
  31. mParams->setParamBlockBuffer(#Name, mBuffer); \
  32. initEntries(); \
  33. } \
  34. \
  35. const SPtr<GpuParamBlockBufferCore>& getBuffer() const { return mBuffer; } \
  36. \
  37. private: \
  38. struct META_FirstEntry {}; \
  39. static void META_GetPrevEntries(Vector<GpuParamDataDesc>& params, META_FirstEntry id) { } \
  40. void META_InitPrevEntry(const SPtr<GpuParamsCore>& params, META_FirstEntry id) { } \
  41. \
  42. typedef META_FirstEntry
  43. #define BS_PARAM_BLOCK_ENTRY_ARRAY(Type, Name, NumElements) \
  44. META_Entry_##Name; \
  45. \
  46. struct META_NextEntry_##Name {}; \
  47. static void META_GetPrevEntries(Vector<GpuParamDataDesc>& params, META_NextEntry_##Name id) \
  48. { \
  49. META_GetPrevEntries(params, META_Entry_##Name##()); \
  50. \
  51. params.push_back(GpuParamDataDesc()); \
  52. GpuParamDataDesc& newEntry = params.back(); \
  53. newEntry.name = #Name; \
  54. newEntry.type = (GpuParamDataType)TGpuDataParamInfo<Type>::TypeId; \
  55. newEntry.arraySize = NumElements; \
  56. } \
  57. \
  58. void META_InitPrevEntry(const SPtr<GpuParamsCore>& params, META_NextEntry_##Name id) \
  59. { \
  60. params->getParam(#Name, Name); \
  61. } \
  62. \
  63. public: \
  64. TGpuDataParam<Type, true> Name; \
  65. \
  66. private: \
  67. typedef META_NextEntry_##Name
  68. #define BS_PARAM_BLOCK_ENTRY(Type, Name) BS_PARAM_BLOCK_ENTRY_ARRAY(Type, Name, 1)
  69. #define BS_PARAM_BLOCK_END \
  70. META_LastEntry; \
  71. \
  72. static Vector<GpuParamDataDesc> getEntries() \
  73. { \
  74. Vector<GpuParamDataDesc> entries; \
  75. META_GetPrevEntries(entries, META_LastEntry()); \
  76. return entries; \
  77. } \
  78. \
  79. void initEntries() \
  80. { \
  81. META_InitPrevEntry(mParams, META_LastEntry()); \
  82. } \
  83. \
  84. SPtr<GpuParamsCore> mParams; \
  85. SPtr<GpuParamBlockBufferCore> mBuffer; \
  86. };
  87. }