Browse Source

Vulkan & GL: Expose vendor for shader workarounds

Panagiotis Christopoulos Charitos 9 years ago
parent
commit
65fe2d349c

+ 1 - 1
CMakeLists.txt

@@ -228,7 +228,7 @@ if(SDL)
 		DOWNLOAD_COMMAND ""
 		DOWNLOAD_COMMAND ""
 		PREFIX "${CMAKE_CURRENT_BINARY_DIR}/sdl2_build"
 		PREFIX "${CMAKE_CURRENT_BINARY_DIR}/sdl2_build"
 		SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/SDL2"
 		SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/SDL2"
-		CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/sdl2_build -DSDL_SHARED=OFF -DSDL_STATIC=ON -DCMAKE_BUILD_TYPE=Release -DDIRECTX=OFF -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DVIDEO_MIR=OFF)
+		CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/sdl2_build -DSDL_SHARED=OFF -DSDL_STATIC=ON -DCMAKE_BUILD_TYPE=Release -DDIRECTX=OFF -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DVIDEO_MIR=OFF -DSNDIO=OFF)
 
 
 	ExternalProject_Get_Property(SDL2_PROJECT install_dir)
 	ExternalProject_Get_Property(SDL2_PROJECT install_dir)
 	set(SDL2_INSTALL_DIR ${install_dir})
 	set(SDL2_INSTALL_DIR ${install_dir})

+ 13 - 0
include/anki/gr/Common.h

@@ -64,6 +64,19 @@ enum GrObjectType : U16
 	COUNT
 	COUNT
 };
 };
 
 
+/// Knowing the ventor allows some optimizations
+enum class GpuVendor : U8
+{
+	UNKNOWN,
+	ARM,
+	NVIDIA,
+	AMD,
+	INTEL,
+	COUNT
+};
+
+extern Array<CString, U(GpuVendor::COUNT)> GPU_VENDOR_STR;
+
 /// The type of the allocator for heap allocations
 /// The type of the allocator for heap allocations
 template<typename T>
 template<typename T>
 using GrAllocator = HeapAllocator<T>;
 using GrAllocator = HeapAllocator<T>;

+ 0 - 8
include/anki/gr/gl/GlState.h

@@ -17,14 +17,6 @@ class ConfigSet;
 /// @addtogroup opengl
 /// @addtogroup opengl
 /// @{
 /// @{
 
 
-/// Knowing the ventor allows some optimizations
-enum class GpuVendor : U8
-{
-	UNKNOWN,
-	ARM,
-	NVIDIA
-};
-
 /// Part of the global state. It's essentialy a cache of the state mainly used
 /// Part of the global state. It's essentialy a cache of the state mainly used
 /// for optimizations and other stuff
 /// for optimizations and other stuff
 class GlState
 class GlState

+ 6 - 0
include/anki/gr/vulkan/GrManagerImpl.h

@@ -203,6 +203,11 @@ public:
 		return *m_texUploader;
 		return *m_texUploader;
 	}
 	}
 
 
+	GpuVendor getGpuVendor() const
+	{
+		return m_vendor;
+	}
+
 private:
 private:
 	GrManager* m_manager = nullptr;
 	GrManager* m_manager = nullptr;
 
 
@@ -210,6 +215,7 @@ private:
 
 
 	VkInstance m_instance = VK_NULL_HANDLE;
 	VkInstance m_instance = VK_NULL_HANDLE;
 	VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE;
 	VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE;
+	GpuVendor m_vendor = GpuVendor::UNKNOWN;
 	VkDevice m_device = VK_NULL_HANDLE;
 	VkDevice m_device = VK_NULL_HANDLE;
 	U32 m_queueIdx = MAX_U32;
 	U32 m_queueIdx = MAX_U32;
 	VkQueue m_queue = VK_NULL_HANDLE;
 	VkQueue m_queue = VK_NULL_HANDLE;

+ 1 - 0
src/gr/gl/GlState.cpp

@@ -111,6 +111,7 @@ void GlState::initRenderThread()
 	{
 	{
 		m_gpu = GpuVendor::NVIDIA;
 		m_gpu = GpuVendor::NVIDIA;
 	}
 	}
+	ANKI_LOGI("GPU vendor is %s", &GPU_VENDOR_STR[m_gpu][0]);
 
 
 // Enable debug messages
 // Enable debug messages
 #if ANKI_GL == ANKI_GL_DESKTOP
 #if ANKI_GL == ANKI_GL_DESKTOP

+ 4 - 0
src/gr/gl/ShaderImpl.cpp

@@ -5,6 +5,8 @@
 
 
 #include <anki/gr/gl/ShaderImpl.h>
 #include <anki/gr/gl/ShaderImpl.h>
 #include <anki/gr/GrManager.h>
 #include <anki/gr/GrManager.h>
+#include <anki/gr/gl/GrManagerImpl.h>
+#include <anki/gr/gl/GlState.h>
 #include <anki/gr/common/Misc.h>
 #include <anki/gr/common/Misc.h>
 #include <anki/util/StringList.h>
 #include <anki/util/StringList.h>
 #include <anki/util/Logger.h>
 #include <anki/util/Logger.h>
@@ -33,6 +35,7 @@ static void deleteShaders(GLsizei n, const GLuint* names)
 
 
 static const char* SHADER_HEADER = R"(#version %u %s
 static const char* SHADER_HEADER = R"(#version %u %s
 #define ANKI_GL 1
 #define ANKI_GL 1
+#define ANKI_VENDOR_%s
 #define %s
 #define %s
 #define ANKI_UBO_BINDING(set_, binding_) binding = set_ * %u + binding_
 #define ANKI_UBO_BINDING(set_, binding_) binding = set_ * %u + binding_
 #define ANKI_SS_BINDING(set_, binding_) binding = set_ * %u + binding_
 #define ANKI_SS_BINDING(set_, binding_) binding = set_ * %u + binding_
@@ -103,6 +106,7 @@ Error ShaderImpl::init(ShaderType type, const CString& source)
 	fullSrc.sprintf(SHADER_HEADER,
 	fullSrc.sprintf(SHADER_HEADER,
 		version,
 		version,
 		versionType,
 		versionType,
+		&GPU_VENDOR_STR[getManager().getImplementation().getState().m_gpu][0],
 		shaderName[U(type)],
 		shaderName[U(type)],
 		MAX_UNIFORM_BUFFER_BINDINGS,
 		MAX_UNIFORM_BUFFER_BINDINGS,
 		MAX_STORAGE_BUFFER_BINDINGS,
 		MAX_STORAGE_BUFFER_BINDINGS,

+ 16 - 0
src/gr/vulkan/GrManagerImpl.cpp

@@ -291,6 +291,22 @@ Error GrManagerImpl::initInstance(const GrManagerInitInfo& init)
 
 
 	vkGetPhysicalDeviceProperties(m_physicalDevice, &m_devProps);
 	vkGetPhysicalDeviceProperties(m_physicalDevice, &m_devProps);
 
 
+	// Find vendor
+	switch(m_devProps.vendorID)
+	{
+	case 0x13B5:
+		m_vendor = GpuVendor::ARM;
+		break;
+	case 0x10DE:
+		m_vendor = GpuVendor::NVIDIA;
+		break;
+	case 0x1002:
+	case 0x1022:
+		m_vendor = GpuVendor::AMD;
+		break;
+	}
+	ANKI_LOGI("GPU vendor is %s", &GPU_VENDOR_STR[m_vendor][0]);
+
 	return ErrorCode::NONE;
 	return ErrorCode::NONE;
 }
 }
 
 

+ 3 - 0
src/gr/vulkan/ShaderImpl.cpp

@@ -4,6 +4,7 @@
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
 #include <anki/gr/vulkan/ShaderImpl.h>
 #include <anki/gr/vulkan/ShaderImpl.h>
+#include <anki/gr/vulkan/GrManagerImpl.h>
 #include <anki/gr/common/Misc.h>
 #include <anki/gr/common/Misc.h>
 #include <glslang/Public/ShaderLang.h>
 #include <glslang/Public/ShaderLang.h>
 #include <SPIRV/GlslangToSpv.h>
 #include <SPIRV/GlslangToSpv.h>
@@ -151,6 +152,7 @@ static const TBuiltInResource GLSLANG_LIMITS = setLimits();
 
 
 static const char* SHADER_HEADER = R"(#version 450 core
 static const char* SHADER_HEADER = R"(#version 450 core
 #define ANKI_VK 1
 #define ANKI_VK 1
+#define ANKI_VENDOR_%s
 #define %s
 #define %s
 #define gl_VertexID gl_VertexIndex
 #define gl_VertexID gl_VertexIndex
 #define gl_InstanceID gl_InstanceIndex
 #define gl_InstanceID gl_InstanceIndex
@@ -236,6 +238,7 @@ Error ShaderImpl::init(ShaderType shaderType, const CString& source)
 		"COMPUTE_SHADER"}};
 		"COMPUTE_SHADER"}};
 
 
 	fullSrc.sprintf(SHADER_HEADER,
 	fullSrc.sprintf(SHADER_HEADER,
+		&GPU_VENDOR_STR[getGrManagerImpl().getGpuVendor()][0],
 		shaderName[shaderType],
 		shaderName[shaderType],
 		0,
 		0,
 		MAX_TEXTURE_BINDINGS,
 		MAX_TEXTURE_BINDINGS,