Browse Source

Fix a bug when GL reports lower alignments than 16

Panagiotis Christopoulos Charitos 7 years ago
parent
commit
06fc19221b
3 changed files with 14 additions and 11 deletions
  1. 4 4
      src/anki/gr/ShaderCompiler.cpp
  2. 3 3
      src/anki/gr/gl/GlState.cpp
  3. 7 4
      src/anki/gr/vulkan/GrManagerImpl.cpp

+ 4 - 4
src/anki/gr/ShaderCompiler.cpp

@@ -35,10 +35,10 @@ static const char* SHADER_HEADER = R"(#version 450 core
 #define ANKI_%s_SHADER 1
 
 #if defined(ANKI_BACKEND_GL) 
-#	define ANKI_UBO_BINDING(set_, binding_) binding = set_ * %u + binding_
-#	define ANKI_SS_BINDING(set_, binding_) binding = set_ * %u + binding_
-#	define ANKI_TEX_BINDING(set_, binding_) binding = set_ * %u + binding_
-#	define ANKI_IMAGE_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_TEX_BINDING(set_, binding_) binding = (set_) * %u + (binding_)
+#	define ANKI_IMAGE_BINDING(set_, binding_) binding = (set_) * %u + (binding_)
 #	define ANKI_SPEC_CONST(binding_, type_, name_) const type_ name_ = _anki_spec_const_ ## binding_
 #	define ANKI_PUSH_CONSTANTS(struct_, name_) layout(location = %u) uniform struct_ name_
 #else

+ 3 - 3
src/anki/gr/gl/GlState.cpp

@@ -155,13 +155,13 @@ void GlState::initRenderThread()
 
 	I64 val;
 	glGetInteger64v(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &val);
-	m_uboAlignment = val;
+	m_uboAlignment = max<U32>(ANKI_SAFE_ALIGNMENT, val); // Some GPU have really low requirements
 
 	glGetInteger64v(GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT, &val);
-	m_ssboAlignment = val;
+	m_ssboAlignment = max<U32>(ANKI_SAFE_ALIGNMENT, val); // Some GPU have really low requirements
 
 	glGetInteger64v(GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, &val);
-	m_tboAlignment = val;
+	m_tboAlignment = max<U32>(ANKI_SAFE_ALIGNMENT, val); // Some GPU have really low requirements
 
 	glGetInteger64v(GL_MAX_UNIFORM_BLOCK_SIZE, &val);
 	m_uniBlockMaxSize = val;

+ 7 - 4
src/anki/gr/vulkan/GrManagerImpl.cpp

@@ -9,7 +9,7 @@
 #include <anki/gr/CommandBuffer.h>
 #include <anki/gr/Fence.h>
 #include <anki/gr/vulkan/FenceImpl.h>
-
+#include <anki/util/Functions.h>
 #include <anki/core/Config.h>
 #include <glslang/Public/ShaderLang.h>
 
@@ -407,11 +407,14 @@ Error GrManagerImpl::initInstance(const GrManagerInitInfo& init)
 	vkGetPhysicalDeviceFeatures(m_physicalDevice, &m_devFeatures);
 
 	// Set limits
-	m_capabilities.m_uniformBufferBindOffsetAlignment = m_devProps.limits.minUniformBufferOffsetAlignment;
+	m_capabilities.m_uniformBufferBindOffsetAlignment =
+		max<U32>(ANKI_SAFE_ALIGNMENT, m_devProps.limits.minUniformBufferOffsetAlignment);
 	m_capabilities.m_uniformBufferMaxRange = m_devProps.limits.maxUniformBufferRange;
-	m_capabilities.m_storageBufferBindOffsetAlignment = m_devProps.limits.minStorageBufferOffsetAlignment;
+	m_capabilities.m_storageBufferBindOffsetAlignment =
+		max<U32>(ANKI_SAFE_ALIGNMENT, m_devProps.limits.minStorageBufferOffsetAlignment);
 	m_capabilities.m_storageBufferMaxRange = m_devProps.limits.maxStorageBufferRange;
-	m_capabilities.m_textureBufferBindOffsetAlignment = m_devProps.limits.minTexelBufferOffsetAlignment;
+	m_capabilities.m_textureBufferBindOffsetAlignment =
+		max<U32>(ANKI_SAFE_ALIGNMENT, m_devProps.limits.minTexelBufferOffsetAlignment);
 	m_capabilities.m_textureBufferMaxRange = MAX_U32;
 
 	return Error::NONE;