ShaderProgramCompiler.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. // Copyright (C) 2009-2020, 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, ShaderProgramCompilerSimple)
  8. {
  9. const CString sourceCode = R"(
  10. #pragma anki mutator INSTANCE_COUNT 1 2 4 8 16 32 64
  11. struct Instanced
  12. {
  13. Mat4 m_ankiMvp;
  14. Mat3 m_ankiRotationMat;
  15. Mat4 m_ankiModelViewMat;
  16. Mat4 m_ankiPrevMvp;
  17. };
  18. layout(set = 0, binding = 0) uniform ankiMaterial
  19. {
  20. Instanced u_ankiInstanced[INSTANCE_COUNT];
  21. Vec4 u_color;
  22. };
  23. #pragma anki start vert
  24. out gl_PerVertex
  25. {
  26. Vec4 gl_Position;
  27. };
  28. void main()
  29. {
  30. gl_Position = u_ankiInstanced[gl_InstanceID].m_ankiMvp * Vec4(gl_VertexID);
  31. }
  32. #pragma anki end
  33. #pragma anki start frag
  34. layout(location = 0) out Vec3 out_color;
  35. void main()
  36. {
  37. out_color = Vec3(0.0) + u_color.xyz;
  38. }
  39. #pragma anki end
  40. )";
  41. // Write the file
  42. {
  43. File file;
  44. ANKI_TEST_EXPECT_NO_ERR(file.open("test.glslp", FileOpenFlag::WRITE));
  45. ANKI_TEST_EXPECT_NO_ERR(file.writeText(sourceCode));
  46. }
  47. class Fsystem : public ShaderProgramFilesystemInterface
  48. {
  49. public:
  50. Error readAllText(CString filename, StringAuto& txt) final
  51. {
  52. File file;
  53. ANKI_CHECK(file.open(filename, FileOpenFlag::READ));
  54. ANKI_CHECK(file.readAllText(txt));
  55. return Error::NONE;
  56. }
  57. } fsystem;
  58. HeapAllocator<U8> alloc(allocAligned, nullptr);
  59. ShaderProgramBinaryWrapper binary(alloc);
  60. BindlessLimits bindlessLimits;
  61. GpuDeviceCapabilities gpuCapabilities;
  62. ANKI_TEST_EXPECT_NO_ERR(
  63. compileShaderProgram("test.glslp", fsystem, alloc, gpuCapabilities, bindlessLimits, binary));
  64. #if 1
  65. StringAuto dis(alloc);
  66. dumpShaderProgramBinary(binary.getBinary(), dis);
  67. ANKI_LOGI("Binary disassembly:\n%s\n", dis.cstr());
  68. #endif
  69. }
  70. ANKI_TEST(ShaderCompiler, ShaderProgramCompiler)
  71. {
  72. const CString sourceCode = R"(
  73. #pragma anki mutator INSTANCE_COUNT 1 2 4 8 16 32 64
  74. #pragma anki mutator LOD 0 1 2
  75. #pragma anki mutator PASS 0 1 2 3
  76. #pragma anki mutator DIFFUSE_TEX 0 1
  77. #pragma anki mutator SPECULAR_TEX 0 1
  78. #pragma anki mutator ROUGHNESS_TEX 0 1
  79. #pragma anki mutator METAL_TEX 0 1
  80. #pragma anki mutator NORMAL_TEX 0 1
  81. #pragma anki mutator PARALLAX 0 1
  82. #pragma anki mutator EMISSIVE_TEX 0 1
  83. #pragma anki mutator BONES 0 1
  84. #pragma anki mutator VELOCITY 0 1
  85. #pragma anki rewrite_mutation PASS 1 DIFFUSE_TEX 1 to PASS 1 DIFFUSE_TEX 0
  86. #pragma anki rewrite_mutation PASS 2 DIFFUSE_TEX 1 to PASS 2 DIFFUSE_TEX 0
  87. #pragma anki rewrite_mutation PASS 3 DIFFUSE_TEX 1 to PASS 2 DIFFUSE_TEX 0
  88. #pragma anki rewrite_mutation PASS 1 SPECULAR_TEX 1 to PASS 1 SPECULAR_TEX 0
  89. #pragma anki rewrite_mutation PASS 2 SPECULAR_TEX 1 to PASS 2 SPECULAR_TEX 0
  90. #pragma anki rewrite_mutation PASS 3 SPECULAR_TEX 1 to PASS 2 SPECULAR_TEX 0
  91. #pragma anki rewrite_mutation PASS 1 ROUGHNESS_TEX 1 to PASS 1 ROUGHNESS_TEX 0
  92. #pragma anki rewrite_mutation PASS 2 ROUGHNESS_TEX 1 to PASS 2 ROUGHNESS_TEX 0
  93. #pragma anki rewrite_mutation PASS 3 ROUGHNESS_TEX 1 to PASS 2 ROUGHNESS_TEX 0
  94. #pragma anki rewrite_mutation PASS 1 METAL_TEX 1 to PASS 1 METAL_TEX 0
  95. #pragma anki rewrite_mutation PASS 2 METAL_TEX 1 to PASS 2 METAL_TEX 0
  96. #pragma anki rewrite_mutation PASS 3 METAL_TEX 1 to PASS 2 METAL_TEX 0
  97. #pragma anki rewrite_mutation PASS 1 NORMAL_TEX 1 to PASS 1 NORMAL_TEX 0
  98. #pragma anki rewrite_mutation PASS 2 NORMAL_TEX 1 to PASS 2 NORMAL_TEX 0
  99. #pragma anki rewrite_mutation PASS 3 NORMAL_TEX 1 to PASS 2 NORMAL_TEX 0
  100. #pragma anki rewrite_mutation PASS 1 EMISSIVE_TEX 1 to PASS 1 EMISSIVE_TEX 0
  101. #pragma anki rewrite_mutation PASS 2 EMISSIVE_TEX 1 to PASS 2 EMISSIVE_TEX 0
  102. #pragma anki rewrite_mutation PASS 3 EMISSIVE_TEX 1 to PASS 2 EMISSIVE_TEX 0
  103. #pragma anki rewrite_mutation PASS 1 VELOCITY 1 to PASS 1 VELOCITY 0
  104. #pragma anki rewrite_mutation PASS 2 VELOCITY 1 to PASS 2 VELOCITY 0
  105. #pragma anki rewrite_mutation PASS 3 VELOCITY 1 to PASS 2 VELOCITY 0
  106. layout(set = 0, binding = 0) uniform ankiMaterial
  107. {
  108. Mat4 u_ankiMvp[INSTANCE_COUNT];
  109. #if PASS == 0
  110. Mat3 u_ankiRotationMat[INSTANCE_COUNT];
  111. #endif
  112. #if PASS == 0 && PARALLAX == 1
  113. Mat4 u_ankiModelViewMat[INSTANCE_COUNT];
  114. #endif
  115. #if PASS == 0 && VELOCITY == 1
  116. Mat4 u_ankiPrevMvp[INSTANCE_COUNT];
  117. #endif
  118. };
  119. #if PASS == 0
  120. #if DIFFUSE_TEX == 0
  121. ANKI_SPECIALIZATION_CONSTANT_VEC3(diffColor, 0, Vec3(0));
  122. #else
  123. layout(set = 0, binding = 1) uniform texture2D diffTex;
  124. #endif
  125. #if SPECULAR_TEX == 0
  126. ANKI_SPECIALIZATION_CONSTANT_VEC3(specColor, 3, Vec3(0));
  127. #else
  128. layout(set = 0, binding = 2) uniform texture2D specTex;
  129. #endif
  130. #if ROUGHNESS_TEX == 0
  131. ANKI_SPECIALIZATION_CONSTANT_F32(roughness, 6, 0.0);
  132. #else
  133. layout(set = 0, binding = 3) uniform texture2D roughnessTex;
  134. #endif
  135. #if METAL_TEX == 0
  136. ANKI_SPECIALIZATION_CONSTANT_F32(metallic, 7, 0.0);
  137. #else
  138. layout(set = 0, binding = 4) uniform texture2D metallicTex;
  139. #endif
  140. #if EMISSIVE_TEX == 0
  141. ANKI_SPECIALIZATION_CONSTANT_VEC3(emission, 8, Vec3(0.0));
  142. #else
  143. layout(set = 0, binding = 5) uniform texture2D emissiveTex;
  144. #endif
  145. #if PARALLAX == 1 && LOD == 0
  146. ANKI_SPECIALIZATION_CONSTANT_F32(heightMapScale, 11, 0.0);
  147. layout(set = 0, binding = 6) uniform texture2D heightTex;
  148. #endif
  149. #endif
  150. #pragma anki start vert
  151. out gl_PerVertex
  152. {
  153. Vec4 gl_Position;
  154. };
  155. void main()
  156. {
  157. gl_Position = Vec4(gl_VertexID);
  158. }
  159. #pragma anki end
  160. #pragma anki start frag
  161. layout(location = 0) out Vec3 out_color;
  162. void main()
  163. {
  164. out_color = Vec3(0.0);
  165. }
  166. #pragma anki end
  167. )";
  168. // Write the file
  169. {
  170. File file;
  171. ANKI_TEST_EXPECT_NO_ERR(file.open("test.glslp", FileOpenFlag::WRITE));
  172. ANKI_TEST_EXPECT_NO_ERR(file.writeText(sourceCode));
  173. }
  174. class Fsystem : public ShaderProgramFilesystemInterface
  175. {
  176. public:
  177. Error readAllText(CString filename, StringAuto& txt) final
  178. {
  179. File file;
  180. ANKI_CHECK(file.open(filename, FileOpenFlag::READ));
  181. ANKI_CHECK(file.readAllText(txt));
  182. return Error::NONE;
  183. }
  184. } fsystem;
  185. HeapAllocator<U8> alloc(allocAligned, nullptr);
  186. ShaderProgramBinaryWrapper binary(alloc);
  187. BindlessLimits bindlessLimits;
  188. GpuDeviceCapabilities gpuCapabilities;
  189. ANKI_TEST_EXPECT_NO_ERR(
  190. compileShaderProgram("test.glslp", fsystem, alloc, gpuCapabilities, bindlessLimits, binary));
  191. #if 1
  192. StringAuto dis(alloc);
  193. dumpShaderProgramBinary(binary.getBinary(), dis);
  194. ANKI_LOGI("Binary disassembly:\n%s\n", dis.cstr());
  195. #endif
  196. }