Explorar el Código

Added GLSL->SPIRV compilation, instead of attempting to use GLSL directly

BearishSun hace 9 años
padre
commit
f8fe191760

+ 14 - 22
Source/BansheeVulkanRenderAPI/Source/BsVulkanGpuProgram.cpp

@@ -11,9 +11,10 @@
 #include "BsHardwareBufferManager.h"
 #include "BsHardwareBufferManager.h"
 #include "BsRenderStats.h"
 #include "BsRenderStats.h"
 
 
-#include "Public/ShaderLang.h"
-#include "Include/Types.h"
-#include "vulkan/icd-spv.h"
+#include "glslang/Public/ShaderLang.h"
+#include "glslang/Include/Types.h"
+#include "SPIRV/GlslangToSpv.h"
+#include "SPIRV/Logger.h"
 
 
 namespace bs
 namespace bs
 {
 {
@@ -568,6 +569,10 @@ namespace bs
 			break;
 			break;
 		}
 		}
 
 
+		std::vector<UINT32> spirv;
+		spv::SpvBuildLogger logger;
+		std::string compileLog;
+
 		const String& source = mProperties.getSource();
 		const String& source = mProperties.getSource();
 		const char* sourceBytes = source.c_str();
 		const char* sourceBytes = source.c_str();
 
 
@@ -593,6 +598,9 @@ namespace bs
 			goto cleanup;
 			goto cleanup;
 		}
 		}
 
 
+		// Compile to SPIR-V
+		GlslangToSpv(*program->getIntermediate(glslType), spirv, &logger);
+
 		// Parse uniforms
 		// Parse uniforms
 		program->buildReflection();
 		program->buildReflection();
 
 
@@ -616,27 +624,13 @@ namespace bs
 			}
 			}
 		}
 		}
 
 
-		// Compile shader and create Vulkan module
-		// Note: We provide GLSL code to the driver under the hood instead of using SPIR-V, mainly because of
-		// optimization concerns. Later we can convert to SPIR-V and feed it directly.
-		UINT32 codeSize = (UINT32)source.size() + 3 * sizeof(UINT32);
-		UINT32* codeBytes = (UINT32*)bs_stack_alloc(codeSize);
-
-		// Add special header so code is recognized as GLSL
-		UINT32* header = (UINT32*)codeBytes;
-		header[0] = ICD_SPV_MAGIC;
-		header[1] = 0;
-		header[2] = VulkanUtility::getShaderStage(mProperties.getType());
-
-		UINT32* glslBytes = codeBytes + 3;
-		memcpy(glslBytes, sourceBytes, source.size());
-
+		// Create Vulkan module
 		VkShaderModuleCreateInfo moduleCI;
 		VkShaderModuleCreateInfo moduleCI;
 		moduleCI.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
 		moduleCI.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
 		moduleCI.pNext = nullptr;
 		moduleCI.pNext = nullptr;
 		moduleCI.flags = 0;
 		moduleCI.flags = 0;
-		moduleCI.codeSize = codeSize;
-		moduleCI.pCode = codeBytes;
+		moduleCI.codeSize = spirv.size();
+		moduleCI.pCode = spirv.data();
 
 
 		VulkanRenderAPI& rapi = static_cast<VulkanRenderAPI&>(RenderAPICore::instance());
 		VulkanRenderAPI& rapi = static_cast<VulkanRenderAPI&>(RenderAPICore::instance());
 
 
@@ -658,8 +652,6 @@ namespace bs
 			}
 			}
 		}
 		}
 
 
-		bs_stack_free(codeBytes);
-
 cleanup:
 cleanup:
 		delete program;
 		delete program;
 		delete shader;
 		delete shader;

+ 14 - 4
Source/CMake/Modules/Findglslang.cmake

@@ -21,16 +21,19 @@ find_library(glslang_LIBRARY_OPTIMIZED NAMES glslang PATHS ${glslang_LIBRARY_SEA
 find_library(glslangHLSL_LIBRARY_OPTIMIZED NAMES HLSL PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 find_library(glslangHLSL_LIBRARY_OPTIMIZED NAMES HLSL PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 find_library(glslangOSDependent_LIBRARY_OPTIMIZED NAMES OSDependent PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 find_library(glslangOSDependent_LIBRARY_OPTIMIZED NAMES OSDependent PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 find_library(glslangOGLCompiler_LIBRARY_OPTIMIZED NAMES OGLCompiler PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 find_library(glslangOGLCompiler_LIBRARY_OPTIMIZED NAMES OGLCompiler PATHS ${glslang_LIBRARY_SEARCH_DIRS})
+find_library(glslangSPIRV_LIBRARY_OPTIMIZED NAMES SPIRV PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 find_library(glslang_LIBRARY_DEBUG NAMES glslangd glslang PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 find_library(glslang_LIBRARY_DEBUG NAMES glslangd glslang PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 find_library(glslangHLSL_LIBRARY_DEBUG NAMES HLSLd HLSL PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 find_library(glslangHLSL_LIBRARY_DEBUG NAMES HLSLd HLSL PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 find_library(glslangOSDependent_LIBRARY_DEBUG NAMES OSDependentd OSDependent PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 find_library(glslangOSDependent_LIBRARY_DEBUG NAMES OSDependentd OSDependent PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 find_library(glslangOGLCompiler_LIBRARY_DEBUG NAMES OGLCompilerd OGLCompiler PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 find_library(glslangOGLCompiler_LIBRARY_DEBUG NAMES OGLCompilerd OGLCompiler PATHS ${glslang_LIBRARY_SEARCH_DIRS})
+find_library(glslangSPIRV_LIBRARY_DEBUG NAMES SPIRVd PATHS ${glslang_LIBRARY_SEARCH_DIRS})
 
 
 if(glslang_INCLUDE_DIR AND 
 if(glslang_INCLUDE_DIR AND 
 	glslang_LIBRARY_OPTIMIZED AND glslang_LIBRARY_DEBUG AND
 	glslang_LIBRARY_OPTIMIZED AND glslang_LIBRARY_DEBUG AND
 	glslangHLSL_LIBRARY_OPTIMIZED AND glslangHLSL_LIBRARY_DEBUG AND
 	glslangHLSL_LIBRARY_OPTIMIZED AND glslangHLSL_LIBRARY_DEBUG AND
 	glslangOSDependent_LIBRARY_OPTIMIZED AND glslangOSDependent_LIBRARY_DEBUG AND
 	glslangOSDependent_LIBRARY_OPTIMIZED AND glslangOSDependent_LIBRARY_DEBUG AND
-	glslangOGLCompiler_LIBRARY_OPTIMIZED AND glslangOGLCompiler_LIBRARY_DEBUG
+	glslangOGLCompiler_LIBRARY_OPTIMIZED AND glslangOGLCompiler_LIBRARY_DEBUG AND
+	glslangSPIRV_LIBRARY_OPTIMIZED AND glslangSPIRV_LIBRARY_DEBUG
 	)
 	)
 	set(glslang_FOUND TRUE)
 	set(glslang_FOUND TRUE)
 endif()
 endif()
@@ -64,7 +67,12 @@ if(glslang_FOUND)
 	add_library(glslangOGLCompiler STATIC IMPORTED)
 	add_library(glslangOGLCompiler STATIC IMPORTED)
 	set_target_properties(glslangOGLCompiler PROPERTIES IMPORTED_LOCATION_DEBUG "${glslangOGLCompiler_LIBRARY_DEBUG}")
 	set_target_properties(glslangOGLCompiler PROPERTIES IMPORTED_LOCATION_DEBUG "${glslangOGLCompiler_LIBRARY_DEBUG}")
 	set_target_properties(glslangOGLCompiler PROPERTIES IMPORTED_LOCATION_OPTIMIZEDDEBUG "${glslangOGLCompiler_LIBRARY_DEBUG}")
 	set_target_properties(glslangOGLCompiler PROPERTIES IMPORTED_LOCATION_OPTIMIZEDDEBUG "${glslangOGLCompiler_LIBRARY_DEBUG}")
-	set_target_properties(glslangOGLCompiler PROPERTIES IMPORTED_LOCATION_RELEASE "${glslangOGLCompiler_LIBRARY_OPTIMIZED}")	
+	set_target_properties(glslangOGLCompiler PROPERTIES IMPORTED_LOCATION_RELEASE "${glslangOGLCompiler_LIBRARY_OPTIMIZED}")
+
+	add_library(glslangSPIRV STATIC IMPORTED)
+	set_target_properties(glslangSPIRV PROPERTIES IMPORTED_LOCATION_DEBUG "${glslangSPIRV_LIBRARY_DEBUG}")
+	set_target_properties(glslangSPIRV PROPERTIES IMPORTED_LOCATION_OPTIMIZEDDEBUG "${glslangSPIRV_LIBRARY_DEBUG}")
+	set_target_properties(glslangSPIRV PROPERTIES IMPORTED_LOCATION_RELEASE "${glslangSPIRV_LIBRARY_OPTIMIZED}")	
 endif()
 endif()
 
 
 mark_as_advanced(
 mark_as_advanced(
@@ -73,11 +81,13 @@ mark_as_advanced(
 	glslang_LIBRARY_OPTIMIZED 
 	glslang_LIBRARY_OPTIMIZED 
 	glslangHLSL_LIBRARY_OPTIMIZED 
 	glslangHLSL_LIBRARY_OPTIMIZED 
 	glslangOSDependent_LIBRARY_OPTIMIZED
 	glslangOSDependent_LIBRARY_OPTIMIZED
+	glslangSPIRV_LIBRARY_OPTIMIZED
 	glslangOGLCompiler_LIBRARY_OPTIMIZED
 	glslangOGLCompiler_LIBRARY_OPTIMIZED
 	glslang_LIBRARY_DEBUG
 	glslang_LIBRARY_DEBUG
 	glslangHLSL_LIBRARY_DEBUG
 	glslangHLSL_LIBRARY_DEBUG
 	glslangOSDependent_LIBRARY_DEBUG
 	glslangOSDependent_LIBRARY_DEBUG
-	glslangOGLCompiler_LIBRARY_DEBUG)
+	glslangOGLCompiler_LIBRARY_DEBUG
+	glslangSPIRV_LIBRARY_DEBUG)
 
 
 set(glslang_INCLUDE_DIRS ${glslang_INCLUDE_DIR})
 set(glslang_INCLUDE_DIRS ${glslang_INCLUDE_DIR})
-set(glslang_LIBRARIES glslang glslangHLSL glslangOSDependent glslangOGLCompiler)
+set(glslang_LIBRARIES glslang glslangHLSL glslangOSDependent glslangOGLCompiler glslangSPIRV)