Implement Image clear

Use the blitter to implement Image::clear.

The image can be easily packed into a sw::Surface. For now,
the surface is a temporary, but it may become a member in
the future if it makes sense.

Bug b/119620767

Change-Id: I122a321509dc8cc5b624ddd776bd9059eee0cbc4
Reviewed-on: https://swiftshader-review.googlesource.com/c/23109
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/Vulkan/VkImage.cpp b/src/Vulkan/VkImage.cpp
index 574b9aa..d81e45c 100644
--- a/src/Vulkan/VkImage.cpp
+++ b/src/Vulkan/VkImage.cpp
@@ -15,6 +15,7 @@
 #include "VkDeviceMemory.hpp"
 #include "VkBuffer.hpp"
 #include "VkImage.hpp"
+#include "Device/Blitter.hpp"
 #include "Device/Surface.hpp"
 #include <cstring>
 
@@ -232,7 +233,28 @@
 		UNIMPLEMENTED();
 	}
 
-	UNIMPLEMENTED();
+	// Set the proper format for the clear value, as described here:
+	// https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#clears-values
+	VkFormat clearFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
+	if(sw::Surface::isSignedNonNormalizedInteger(format))
+	{
+		clearFormat = VK_FORMAT_R32G32B32A32_SINT;
+	}
+	else if(sw::Surface::isUnsignedNonNormalizedInteger(format))
+	{
+		clearFormat = VK_FORMAT_R32G32B32A32_UINT;
+	}
+
+	const sw::Rect rect(renderArea.offset.x, renderArea.offset.y,
+	                    renderArea.offset.x + renderArea.extent.width,
+	                    renderArea.offset.y + renderArea.extent.height);
+	const sw::SliceRect dRect(rect);
+
+	sw::Surface* surface = sw::Surface::create(extent.width, extent.height, extent.depth, format,
+		Cast(deviceMemory)->getOffsetPointer(memoryOffset), rowPitchBytes(), slicePitchBytes());
+	sw::Blitter blitter;
+	blitter.clear((void*)clearValue.color.float32, clearFormat, surface, dRect, 0xF);
+	delete surface;
 }
 
 } // namespace vk
\ No newline at end of file