Support for usage in memory requirements

Buffer usage was ignored in memory requirements. Usage support
was added for the purpose of computing the proper required alignment.

Fixes:
dEQP-VK.memory.requirements.core.buffer.regular

Bug b/118383648

Change-Id: Ib66e8d85f1b468765e24edba598fa06f4b5888c9
Reviewed-on: https://swiftshader-review.googlesource.com/c/23928
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/Vulkan/VkBuffer.cpp b/src/Vulkan/VkBuffer.cpp
index 1a772cc..721f75e 100644
--- a/src/Vulkan/VkBuffer.cpp
+++ b/src/Vulkan/VkBuffer.cpp
@@ -43,7 +43,22 @@
 const VkMemoryRequirements Buffer::getMemoryRequirements() const
 {
 	VkMemoryRequirements memoryRequirements = {};
-	memoryRequirements.alignment = vk::REQUIRED_MEMORY_ALIGNMENT;
+	if(usage & (VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT))

+	{

+		memoryRequirements.alignment = vk::MIN_TEXEL_BUFFER_OFFSET_ALIGNMENT;

+	}

+	else if(usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)

+	{

+		memoryRequirements.alignment = vk::MIN_STORAGE_BUFFER_OFFSET_ALIGNMENT;

+	}

+	else if(usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)

+	{

+		memoryRequirements.alignment = vk::MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT;

+	}

+	else

+	{

+		memoryRequirements.alignment = REQUIRED_MEMORY_ALIGNMENT;

+	}
 	memoryRequirements.memoryTypeBits = vk::MEMORY_TYPE_GENERIC_BIT;
 	memoryRequirements.size = size; // TODO: also reserve space for a header containing
 		                            // the size of the buffer (for robust buffer access)
diff --git a/src/Vulkan/VkConfig.h b/src/Vulkan/VkConfig.h
index e9541ff..70722b6 100644
--- a/src/Vulkan/VkConfig.h
+++ b/src/Vulkan/VkConfig.h
@@ -38,6 +38,9 @@
 enum
 {
 	REQUIRED_MEMORY_ALIGNMENT = 8, // For 64 bit formats on ARM64
+	MIN_TEXEL_BUFFER_OFFSET_ALIGNMENT = 256,
+	MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 256,
+	MIN_STORAGE_BUFFER_OFFSET_ALIGNMENT = 256,
 	MEMORY_TYPE_GENERIC_BIT = 0x1, // Generic system memory.
 };
 
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp
index c002daf..92b518d 100644
--- a/src/Vulkan/VkPhysicalDevice.cpp
+++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -204,9 +204,9 @@
 		{ -8192, 8191 }, // viewportBoundsRange[2]
 		0, // viewportSubPixelBits
 		64, // minMemoryMapAlignment
-		256, // minTexelBufferOffsetAlignment
-		256, // minUniformBufferOffsetAlignment
-		256, // minStorageBufferOffsetAlignment
+		vk::MIN_TEXEL_BUFFER_OFFSET_ALIGNMENT, // minTexelBufferOffsetAlignment
+		vk::MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT, // minUniformBufferOffsetAlignment
+		vk::MIN_STORAGE_BUFFER_OFFSET_ALIGNMENT, // minStorageBufferOffsetAlignment
 		-8, // minTexelOffset
 		7, // maxTexelOffset
 		-8, // minTexelGatherOffset