ShaderProgramCompiler.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. // Copyright (C) 2009-2019, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <tests/framework/Framework.h>
  6. #include <anki/shader_compiler/ShaderProgramCompiler.h>
  7. ANKI_TEST(ShaderCompiler, ShaderProgramCompiler)
  8. {
  9. const CString sourceCode = R"(
  10. #pragma anki mutator INSTANCE_COUNT 1 2 4 8 16 32 64
  11. #pragma anki mutator LOD 0 1 2
  12. #pragma anki mutator PASS 0 1 2 3
  13. #pragma anki mutator DIFFUSE_TEX 0 1
  14. #pragma anki mutator SPECULAR_TEX 0 1
  15. #pragma anki mutator ROUGHNESS_TEX 0 1
  16. #pragma anki mutator METAL_TEX 0 1
  17. #pragma anki mutator NORMAL_TEX 0 1
  18. #pragma anki mutator PARALLAX 0 1
  19. #pragma anki mutator EMISSIVE_TEX 0 1
  20. #pragma anki mutator BONES 0 1
  21. #pragma anki mutator VELOCITY 0 1
  22. #pragma anki rewrite_mutation PASS 1 DIFFUSE_TEX 1 to PASS 1 DIFFUSE_TEX 0
  23. #pragma anki rewrite_mutation PASS 2 DIFFUSE_TEX 1 to PASS 2 DIFFUSE_TEX 0
  24. #pragma anki rewrite_mutation PASS 3 DIFFUSE_TEX 1 to PASS 2 DIFFUSE_TEX 0
  25. #pragma anki rewrite_mutation PASS 1 SPECULAR_TEX 1 to PASS 1 SPECULAR_TEX 0
  26. #pragma anki rewrite_mutation PASS 2 SPECULAR_TEX 1 to PASS 2 SPECULAR_TEX 0
  27. #pragma anki rewrite_mutation PASS 3 SPECULAR_TEX 1 to PASS 2 SPECULAR_TEX 0
  28. #pragma anki rewrite_mutation PASS 1 ROUGHNESS_TEX 1 to PASS 1 ROUGHNESS_TEX 0
  29. #pragma anki rewrite_mutation PASS 2 ROUGHNESS_TEX 1 to PASS 2 ROUGHNESS_TEX 0
  30. #pragma anki rewrite_mutation PASS 3 ROUGHNESS_TEX 1 to PASS 2 ROUGHNESS_TEX 0
  31. #pragma anki rewrite_mutation PASS 1 METAL_TEX 1 to PASS 1 METAL_TEX 0
  32. #pragma anki rewrite_mutation PASS 2 METAL_TEX 1 to PASS 2 METAL_TEX 0
  33. #pragma anki rewrite_mutation PASS 3 METAL_TEX 1 to PASS 2 METAL_TEX 0
  34. #pragma anki rewrite_mutation PASS 1 NORMAL_TEX 1 to PASS 1 NORMAL_TEX 0
  35. #pragma anki rewrite_mutation PASS 2 NORMAL_TEX 1 to PASS 2 NORMAL_TEX 0
  36. #pragma anki rewrite_mutation PASS 3 NORMAL_TEX 1 to PASS 2 NORMAL_TEX 0
  37. #pragma anki rewrite_mutation PASS 1 EMISSIVE_TEX 1 to PASS 1 EMISSIVE_TEX 0
  38. #pragma anki rewrite_mutation PASS 2 EMISSIVE_TEX 1 to PASS 2 EMISSIVE_TEX 0
  39. #pragma anki rewrite_mutation PASS 3 EMISSIVE_TEX 1 to PASS 2 EMISSIVE_TEX 0
  40. #pragma anki rewrite_mutation PASS 1 VELOCITY 1 to PASS 1 VELOCITY 0
  41. #pragma anki rewrite_mutation PASS 2 VELOCITY 1 to PASS 2 VELOCITY 0
  42. #pragma anki rewrite_mutation PASS 3 VELOCITY 1 to PASS 2 VELOCITY 0
  43. layout(set = 0, binding = 0) uniform ankiMaterial
  44. {
  45. Mat4 u_ankiMvp[INSTANCE_COUNT];
  46. #if PASS == 0
  47. Mat3 u_ankiRotationMat[INSTANCE_COUNT];
  48. #endif
  49. #if PASS == 0 && PARALLAX == 1
  50. Mat4 u_ankiModelViewMat[INSTANCE_COUNT];
  51. #endif
  52. #if PASS == 0 && VELOCITY == 1
  53. Mat4 u_ankiPrevMvp[INSTANCE_COUNT];
  54. #endif
  55. };
  56. #if PASS == 0
  57. #if DIFFUSE_TEX == 0
  58. ANKI_SPECIALIZATION_CONSTANT_VEC3(diffColor, 0, Vec3(0));
  59. #else
  60. layout(set = 0, binding = 1) uniform texture2D diffTex;
  61. #endif
  62. #if SPECULAR_TEX == 0
  63. ANKI_SPECIALIZATION_CONSTANT_VEC3(specColor, 3, Vec3(0));
  64. #else
  65. layout(set = 0, binding = 2) uniform texture2D specTex;
  66. #endif
  67. #if ROUGHNESS_TEX == 0
  68. ANKI_SPECIALIZATION_CONSTANT_F32(roughness, 6, 0.0);
  69. #else
  70. layout(set = 0, binding = 3) uniform texture2D roughnessTex;
  71. #endif
  72. #if METAL_TEX == 0
  73. ANKI_SPECIALIZATION_CONSTANT_F32(metallic, 7, 0.0);
  74. #else
  75. layout(set = 0, binding = 4) uniform texture2D metallicTex;
  76. #endif
  77. #if EMISSIVE_TEX == 0
  78. ANKI_SPECIALIZATION_CONSTANT_VEC3(emission, 8, Vec3(0.0));
  79. #else
  80. layout(set = 0, binding = 5) uniform texture2D emissiveTex;
  81. #endif
  82. #if PARALLAX == 1 && LOD == 0
  83. ANKI_SPECIALIZATION_CONSTANT_F32(heightMapScale, 11, 0.0);
  84. layout(set = 0, binding = 6) uniform texture2D heightTex;
  85. #endif
  86. #endif
  87. #pragma anki start vert
  88. out gl_PerVertex
  89. {
  90. Vec4 gl_Position;
  91. };
  92. void main()
  93. {
  94. gl_Position = Vec4(gl_VertexID);
  95. }
  96. #pragma anki end
  97. #pragma anki start frag
  98. layout(location = 0) out Vec3 out_color;
  99. void main()
  100. {
  101. out_color = Vec3(0.0);
  102. }
  103. #pragma anki end
  104. )";
  105. // Write the file
  106. {
  107. File file;
  108. ANKI_TEST_EXPECT_NO_ERR(file.open("test.glslp", FileOpenFlag::WRITE));
  109. ANKI_TEST_EXPECT_NO_ERR(file.writeText(sourceCode));
  110. }
  111. class Fsystem : public ShaderProgramFilesystemInterface
  112. {
  113. public:
  114. Error readAllText(CString filename, StringAuto& txt) final
  115. {
  116. File file;
  117. ANKI_CHECK(file.open(filename, FileOpenFlag::READ));
  118. ANKI_CHECK(file.readAllText(txt));
  119. return Error::NONE;
  120. }
  121. } fsystem;
  122. HeapAllocator<U8> alloc(allocAligned, nullptr);
  123. ShaderProgramBinaryWrapper binary(alloc);
  124. ANKI_TEST_EXPECT_NO_ERR(compileShaderProgram("test.glslp", fsystem, alloc, 128, 1, 1, GpuVendor::AMD, binary));
  125. #if 0
  126. StringAuto dis(alloc);
  127. disassembleShaderProgramBinary(binary.getBinary(), dis);
  128. ANKI_LOGI("Binary disassembly:\n%s\n", dis.cstr());
  129. #endif
  130. }