// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "Blitter.hpp"

#include "Pipeline/ShaderCore.hpp"
#include "Reactor/Reactor.hpp"
#include "System/Half.hpp"
#include "System/Memory.hpp"
#include "Vulkan/VkDebug.hpp"
#include "Vulkan/VkImage.hpp"
#include "Vulkan/VkBuffer.hpp"

#include <utility>

namespace sw {

Blitter::Blitter() :
	blitMutex(),
	blitCache(1024),
	cornerUpdateMutex(),
	cornerUpdateCache(64) // We only need one of these per format
{
}

Blitter::~Blitter()
{
}

void Blitter::clear(void *pixel, vk::Format format, vk::Image *dest, const vk::Format& viewFormat, const VkImageSubresourceRange& subresourceRange, const VkRect2D* renderArea)
{
	VkImageAspectFlagBits aspect = static_cast<VkImageAspectFlagBits>(subresourceRange.aspectMask);
	vk::Format dstFormat = viewFormat.getAspectFormat(aspect);
	if(dstFormat == VK_FORMAT_UNDEFINED)
	{
		return;
	}

	float *pPixel = static_cast<float *>(pixel);
	if(viewFormat.isUnsignedNormalized())
	{
		pPixel[0] = sw::clamp(pPixel[0], 0.0f, 1.0f);
		pPixel[1] = sw::clamp(pPixel[1], 0.0f, 1.0f);
		pPixel[2] = sw::clamp(pPixel[2], 0.0f, 1.0f);
		pPixel[3] = sw::clamp(pPixel[3], 0.0f, 1.0f);
	}
	else if(viewFormat.isSignedNormalized())
	{
		pPixel[0] = sw::clamp(pPixel[0], -1.0f, 1.0f);
		pPixel[1] = sw::clamp(pPixel[1], -1.0f, 1.0f);
		pPixel[2] = sw::clamp(pPixel[2], -1.0f, 1.0f);
		pPixel[3] = sw::clamp(pPixel[3], -1.0f, 1.0f);
	}

	if(fastClear(pixel, format, dest, dstFormat, subresourceRange, renderArea))
	{
		return;
	}

	State state(format, dstFormat, 1, dest->getSampleCountFlagBits(), Options{ 0xF });
	auto blitRoutine = getBlitRoutine(state);
	if(!blitRoutine)
	{
		return;
	}

	VkImageSubresourceLayers subresLayers =
	{
		subresourceRange.aspectMask,
		subresourceRange.baseMipLevel,
		subresourceRange.baseArrayLayer,
		1
	};

	uint32_t lastMipLevel = dest->getLastMipLevel(subresourceRange);
	uint32_t lastLayer = dest->getLastLayerIndex(subresourceRange);

	VkRect2D area = { { 0, 0 }, { 0, 0 } };
	if(renderArea)
	{
		ASSERT(subresourceRange.levelCount == 1);
		area = *renderArea;
	}

	for(; subresLayers.mipLevel <= lastMipLevel; subresLayers.mipLevel++)
	{
		VkExtent3D extent = dest->getMipLevelExtent(aspect, subresLayers.mipLevel);
		if(!renderArea)
		{
			area.extent.width = extent.width;
			area.extent.height = extent.height;
		}

		BlitData data =
		{
			pixel, nullptr, // source, dest

			format.bytes(),                                       // sPitchB
			dest->rowPitchBytes(aspect, subresLayers.mipLevel),   // dPitchB
			0,                                                    // sSliceB (unused in clear operations)
			dest->slicePitchBytes(aspect, subresLayers.mipLevel), // dSliceB

			0.5f, 0.5f, 0.0f, 0.0f, // x0, y0, w, h

			area.offset.y, static_cast<int>(area.offset.y + area.extent.height), // y0d, y1d
			area.offset.x, static_cast<int>(area.offset.x + area.extent.width),  // x0d, x1d

			0, 0, // sWidth, sHeight
		};

		if(renderArea && dest->is3DSlice())
		{
			// Reinterpret layers as depth slices
			subresLayers.baseArrayLayer = 0;
			subresLayers.layerCount = 1;
			for(uint32_t depth = subresourceRange.baseArrayLayer; depth <= lastLayer; depth++)
			{
				data.dest = dest->getTexelPointer({0, 0, static_cast<int32_t>(depth)}, subresLayers);
				blitRoutine(&data);
			}
		}
		else
		{
			for(subresLayers.baseArrayLayer = subresourceRange.baseArrayLayer; subresLayers.baseArrayLayer <= lastLayer; subresLayers.baseArrayLayer++)
			{
				for(uint32_t depth = 0; depth < extent.depth; depth++)
				{
					data.dest = dest->getTexelPointer({ 0, 0, static_cast<int32_t>(depth) }, subresLayers);

					blitRoutine(&data);
				}
			}
		}
	}
}

bool Blitter::fastClear(void *pixel, vk::Format format, vk::Image *dest, const vk::Format& viewFormat, const VkImageSubresourceRange& subresourceRange, const VkRect2D* renderArea)
{
	if(format != VK_FORMAT_R32G32B32A32_SFLOAT)
	{
		return false;
	}

	float *color = (float*)pixel;
	float r = color[0];
	float g = color[1];
	float b = color[2];
	float a = color[3];

	uint32_t packed;

	VkImageAspectFlagBits aspect = static_cast<VkImageAspectFlagBits>(subresourceRange.aspectMask);
	switch(viewFormat)
	{
	case VK_FORMAT_R5G6B5_UNORM_PACK16:
		packed = ((uint16_t)(31 * b + 0.5f) << 0) |
			        ((uint16_t)(63 * g + 0.5f) << 5) |
			        ((uint16_t)(31 * r + 0.5f) << 11);
		break;
	case VK_FORMAT_B5G6R5_UNORM_PACK16:
		packed = ((uint16_t)(31 * r + 0.5f) << 0) |
			        ((uint16_t)(63 * g + 0.5f) << 5) |
			        ((uint16_t)(31 * b + 0.5f) << 11);
		break;
	case VK_FORMAT_A8B8G8R8_UINT_PACK32:
	case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
	case VK_FORMAT_R8G8B8A8_UNORM:
		packed = ((uint32_t)(255 * a + 0.5f) << 24) |
		         ((uint32_t)(255 * b + 0.5f) << 16) |
		         ((uint32_t)(255 * g + 0.5f) << 8) |
		         ((uint32_t)(255 * r + 0.5f) << 0);
		break;
	case VK_FORMAT_B8G8R8A8_UNORM:
		packed = ((uint32_t)(255 * a + 0.5f) << 24) |
		         ((uint32_t)(255 * r + 0.5f) << 16) |
		         ((uint32_t)(255 * g + 0.5f) << 8) |
		         ((uint32_t)(255 * b + 0.5f) << 0);
		break;
	case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
		packed = R11G11B10F(color);
		break;
	case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
		packed = RGB9E5(color);
		break;
	default:
		return false;
	}

	VkImageSubresourceLayers subresLayers =
	{
		subresourceRange.aspectMask,
		subresourceRange.baseMipLevel,
		subresourceRange.baseArrayLayer,
		1
	};
	uint32_t lastMipLevel = dest->getLastMipLevel(subresourceRange);
	uint32_t lastLayer = dest->getLastLayerIndex(subresourceRange);

	VkRect2D area = { { 0, 0 }, { 0, 0 } };
	if(renderArea)
	{
		ASSERT(subresourceRange.levelCount == 1);
		area = *renderArea;
	}

	for(; subresLayers.mipLevel <= lastMipLevel; subresLayers.mipLevel++)
	{
		int rowPitchBytes = dest->rowPitchBytes(aspect, subresLayers.mipLevel);
		int slicePitchBytes = dest->slicePitchBytes(aspect, subresLayers.mipLevel);
		VkExtent3D extent = dest->getMipLevelExtent(aspect, subresLayers.mipLevel);
		if(!renderArea)
		{
			area.extent.width = extent.width;
			area.extent.height = extent.height;
		}
		if(dest->is3DSlice())
		{
			extent.depth = 1; // The 3D image is instead interpreted as a 2D image with layers
		}

		for(subresLayers.baseArrayLayer = subresourceRange.baseArrayLayer; subresLayers.baseArrayLayer <= lastLayer; subresLayers.baseArrayLayer++)
		{
			for(uint32_t depth = 0; depth < extent.depth; depth++)
			{
				uint8_t *slice = (uint8_t*)dest->getTexelPointer(
					{ area.offset.x, area.offset.y, static_cast<int32_t>(depth) }, subresLayers);

				for(int j = 0; j < dest->getSampleCountFlagBits(); j++)
				{
					uint8_t *d = slice;

					switch(viewFormat.bytes())
					{
					case 2:
						for(uint32_t i = 0; i < area.extent.height; i++)
						{
							ASSERT(d < dest->end());
							sw::clear((uint16_t*)d, static_cast<uint16_t>(packed), area.extent.width);
							d += rowPitchBytes;
						}
						break;
					case 4:
						for(uint32_t i = 0; i < area.extent.height; i++)
						{
							ASSERT(d < dest->end());
							sw::clear((uint32_t*)d, packed, area.extent.width);
							d += rowPitchBytes;
						}
						break;
					default:
						assert(false);
					}

					slice += slicePitchBytes;
				}
			}
		}
	}

	return true;
}

Float4 Blitter::readFloat4(Pointer<Byte> element, const State &state)
{
	Float4 c(0.0f, 0.0f, 0.0f, 1.0f);

	switch(state.sourceFormat)
	{
	case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
		c.w = Float(Int(*Pointer<Byte>(element)) & Int(0xF));
		c.x = Float((Int(*Pointer<Byte>(element)) >> 4) & Int(0xF));
		c.y = Float(Int(*Pointer<Byte>(element + 1)) & Int(0xF));
		c.z = Float((Int(*Pointer<Byte>(element + 1)) >> 4) & Int(0xF));
		break;
	case VK_FORMAT_R8_SINT:
	case VK_FORMAT_R8_SNORM:
		c.x = Float(Int(*Pointer<SByte>(element)));
		c.w = float(0x7F);
		break;
	case VK_FORMAT_R8_UNORM:
	case VK_FORMAT_R8_UINT:
	case VK_FORMAT_R8_SRGB:
		c.x = Float(Int(*Pointer<Byte>(element)));
		c.w = float(0xFF);
		break;
	case VK_FORMAT_R16_SINT:
	case VK_FORMAT_R16_SNORM:
		c.x = Float(Int(*Pointer<Short>(element)));
		c.w = float(0x7FFF);
		break;
	case VK_FORMAT_R16_UNORM:
	case VK_FORMAT_R16_UINT:
		c.x = Float(Int(*Pointer<UShort>(element)));
		c.w = float(0xFFFF);
		break;
	case VK_FORMAT_R32_SINT:
		c.x = Float(*Pointer<Int>(element));
		c.w = float(0x7FFFFFFF);
		break;
	case VK_FORMAT_R32_UINT:
		c.x = Float(*Pointer<UInt>(element));
		c.w = float(0xFFFFFFFF);
		break;
	case VK_FORMAT_B8G8R8A8_SRGB:
	case VK_FORMAT_B8G8R8A8_UNORM:
		c = Float4(*Pointer<Byte4>(element)).zyxw;
		break;
	case VK_FORMAT_A8B8G8R8_SINT_PACK32:
	case VK_FORMAT_R8G8B8A8_SINT:
	case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
	case VK_FORMAT_R8G8B8A8_SNORM:
		c = Float4(*Pointer<SByte4>(element));
		break;
	case VK_FORMAT_A8B8G8R8_UINT_PACK32:
	case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
	case VK_FORMAT_R8G8B8A8_UNORM:
	case VK_FORMAT_R8G8B8A8_UINT:
	case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
	case VK_FORMAT_R8G8B8A8_SRGB:
		c = Float4(*Pointer<Byte4>(element));
		break;
	case VK_FORMAT_R16G16B16A16_SINT:
		c = Float4(*Pointer<Short4>(element));
		break;
	case VK_FORMAT_R16G16B16A16_UNORM:
	case VK_FORMAT_R16G16B16A16_UINT:
		c = Float4(*Pointer<UShort4>(element));
		break;
	case VK_FORMAT_R32G32B32A32_SINT:
		c = Float4(*Pointer<Int4>(element));
		break;
	case VK_FORMAT_R32G32B32A32_UINT:
		c = Float4(*Pointer<UInt4>(element));
		break;
	case VK_FORMAT_R8G8_SINT:
	case VK_FORMAT_R8G8_SNORM:
		c.x = Float(Int(*Pointer<SByte>(element + 0)));
		c.y = Float(Int(*Pointer<SByte>(element + 1)));
		c.w = float(0x7F);
		break;
	case VK_FORMAT_R8G8_UNORM:
	case VK_FORMAT_R8G8_UINT:
	case VK_FORMAT_R8G8_SRGB:
		c.x = Float(Int(*Pointer<Byte>(element + 0)));
		c.y = Float(Int(*Pointer<Byte>(element + 1)));
		c.w = float(0xFF);
		break;
	case VK_FORMAT_R16G16_SINT:
	case VK_FORMAT_R16G16_SNORM:
		c.x = Float(Int(*Pointer<Short>(element + 0)));
		c.y = Float(Int(*Pointer<Short>(element + 2)));
		c.w = float(0x7FFF);
		break;
	case VK_FORMAT_R16G16_UNORM:
	case VK_FORMAT_R16G16_UINT:
		c.x = Float(Int(*Pointer<UShort>(element + 0)));
		c.y = Float(Int(*Pointer<UShort>(element + 2)));
		c.w = float(0xFFFF);
		break;
	case VK_FORMAT_R32G32_SINT:
		c.x = Float(*Pointer<Int>(element + 0));
		c.y = Float(*Pointer<Int>(element + 4));
		c.w = float(0x7FFFFFFF);
		break;
	case VK_FORMAT_R32G32_UINT:
		c.x = Float(*Pointer<UInt>(element + 0));
		c.y = Float(*Pointer<UInt>(element + 4));
		c.w = float(0xFFFFFFFF);
		break;
	case VK_FORMAT_R32G32B32A32_SFLOAT:
		c = *Pointer<Float4>(element);
		break;
	case VK_FORMAT_R32G32_SFLOAT:
		c.x = *Pointer<Float>(element + 0);
		c.y = *Pointer<Float>(element + 4);
		break;
	case VK_FORMAT_R32_SFLOAT:
		c.x = *Pointer<Float>(element);
		break;
	case VK_FORMAT_R16G16B16A16_SFLOAT:
		c.w = Float(*Pointer<Half>(element + 6));
	case VK_FORMAT_R16G16B16_SFLOAT:
		c.z = Float(*Pointer<Half>(element + 4));
	case VK_FORMAT_R16G16_SFLOAT:
		c.y = Float(*Pointer<Half>(element + 2));
	case VK_FORMAT_R16_SFLOAT:
		c.x = Float(*Pointer<Half>(element));
		break;
	case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
		c = r11g11b10Unpack(*Pointer<UInt>(element));
		break;
	case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
		// This type contains a common 5 bit exponent (E) and a 9 bit the mantissa for R, G and B.
		c.x = Float(*Pointer<UInt>(element) & UInt(0x000001FF));         // R's mantissa (bits 0-8)
		c.y = Float((*Pointer<UInt>(element) & UInt(0x0003FE00)) >> 9);  // G's mantissa (bits 9-17)
		c.z = Float((*Pointer<UInt>(element) & UInt(0x07FC0000)) >> 18); // B's mantissa (bits 18-26)
		c *= Float4(
			// 2^E, using the exponent (bits 27-31) and treating it as an unsigned integer value
			Float(UInt(1) << ((*Pointer<UInt>(element) & UInt(0xF8000000)) >> 27)) *
			// Since the 9 bit mantissa values currently stored in RGB were converted straight
			// from int to float (in the [0, 1<<9] range instead of the [0, 1] range), they
			// are (1 << 9) times too high.
			// Also, the exponent has 5 bits and we compute the exponent bias of floating point
			// formats using "2^(k-1) - 1", so, in this case, the exponent bias is 2^(5-1)-1 = 15
			// Exponent bias (15) + number of mantissa bits per component (9) = 24
			Float(1.0f / (1 << 24)));
		c.w = 1.0f;
		break;
	case VK_FORMAT_R5G6B5_UNORM_PACK16:
		c.x = Float(Int((*Pointer<UShort>(element) & UShort(0xF800)) >> UShort(11)));
		c.y = Float(Int((*Pointer<UShort>(element) & UShort(0x07E0)) >> UShort(5)));
		c.z = Float(Int(*Pointer<UShort>(element) & UShort(0x001F)));
		break;
	case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
		c.w = Float(Int((*Pointer<UShort>(element) & UShort(0x8000)) >> UShort(15)));
		c.x = Float(Int((*Pointer<UShort>(element) & UShort(0x7C00)) >> UShort(10)));
		c.y = Float(Int((*Pointer<UShort>(element) & UShort(0x03E0)) >> UShort(5)));
		c.z = Float(Int(*Pointer<UShort>(element) & UShort(0x001F)));
		break;
	case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
	case VK_FORMAT_A2B10G10R10_UINT_PACK32:
		c.x = Float(Int((*Pointer<UInt>(element) & UInt(0x000003FF))));
		c.y = Float(Int((*Pointer<UInt>(element) & UInt(0x000FFC00)) >> 10));
		c.z = Float(Int((*Pointer<UInt>(element) & UInt(0x3FF00000)) >> 20));
		c.w = Float(Int((*Pointer<UInt>(element) & UInt(0xC0000000)) >> 30));
		break;
	case VK_FORMAT_D16_UNORM:
		c.x = Float(Int((*Pointer<UShort>(element))));
		break;
	case VK_FORMAT_X8_D24_UNORM_PACK32:
		c.x = Float(Int((*Pointer<UInt>(element) & UInt(0xFFFFFF00)) >> 8));
		break;
	case VK_FORMAT_D32_SFLOAT:
		c.x = *Pointer<Float>(element);
		break;
	case VK_FORMAT_S8_UINT:
		c.x = Float(Int(*Pointer<Byte>(element)));
		break;
	default:
		UNSUPPORTED("Blitter source format %d", (int)state.sourceFormat);
	}

	return c;
}

void Blitter::write(Float4 &c, Pointer<Byte> element, const State &state)
{
	bool writeR = state.writeRed;
	bool writeG = state.writeGreen;
	bool writeB = state.writeBlue;
	bool writeA = state.writeAlpha;
	bool writeRGBA = writeR && writeG && writeB && writeA;

	switch(state.destFormat)
	{
	case VK_FORMAT_R4G4_UNORM_PACK8:
		if(writeR | writeG)
		{
			if(!writeR)
			{
				*Pointer<Byte>(element) = (Byte(RoundInt(Float(c.y))) & Byte(0xF)) |
			                              (*Pointer<Byte>(element) & Byte(0xF0));
			}
			else if(!writeG)
			{
				*Pointer<Byte>(element) = (*Pointer<Byte>(element) & Byte(0xF)) |
			                              (Byte(RoundInt(Float(c.x))) << Byte(4));
			}
			else
			{
				*Pointer<Byte>(element) = (Byte(RoundInt(Float(c.y))) & Byte(0xF)) |
			                              (Byte(RoundInt(Float(c.x))) << Byte(4));
			}
		}
		break;
	case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
		if(writeR || writeG || writeB || writeA)
		{
			*Pointer<UShort>(element) = (writeR ? ((UShort(RoundInt(Float(c.x))) & UShort(0xF)) << UShort(12)) :
			                                      (*Pointer<UShort>(element) & UShort(0x000F))) |
			                            (writeG ? ((UShort(RoundInt(Float(c.y))) & UShort(0xF)) << UShort(8)) :
			                                      (*Pointer<UShort>(element) & UShort(0x00F0))) |
			                            (writeB ? ((UShort(RoundInt(Float(c.z))) & UShort(0xF)) << UShort(4)) :
		                                          (*Pointer<UShort>(element) & UShort(0x0F00))) |
		                                (writeA ? (UShort(RoundInt(Float(c.w))) & UShort(0xF)) :
		                                          (*Pointer<UShort>(element) & UShort(0xF000)));
		}
		break;
	case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
		if(writeRGBA)
		{
			*Pointer<UShort>(element) = UShort(RoundInt(Float(c.w)) & Int(0xF)) |
			                            UShort((RoundInt(Float(c.x)) & Int(0xF)) << 4) |
			                            UShort((RoundInt(Float(c.y)) & Int(0xF)) << 8) |
			                            UShort((RoundInt(Float(c.z)) & Int(0xF)) << 12);
		}
		else
		{
			unsigned short mask = (writeA ? 0x000F : 0x0000) |
			                      (writeR ? 0x00F0 : 0x0000) |
			                      (writeG ? 0x0F00 : 0x0000) |
			                      (writeB ? 0xF000 : 0x0000);
			unsigned short unmask = ~mask;
			*Pointer<UShort>(element) = (*Pointer<UShort>(element) & UShort(unmask)) |
			                            ((UShort(RoundInt(Float(c.w)) & Int(0xF)) |
			                              UShort((RoundInt(Float(c.x)) & Int(0xF)) << 4) |
			                              UShort((RoundInt(Float(c.y)) & Int(0xF)) << 8) |
			                              UShort((RoundInt(Float(c.z)) & Int(0xF)) << 12)) & UShort(mask));
		}
		break;
	case VK_FORMAT_B8G8R8A8_SRGB:
	case VK_FORMAT_B8G8R8A8_UNORM:
		if(writeRGBA)
		{
			Short4 c0 = RoundShort4(c.zyxw);
			*Pointer<Byte4>(element) = Byte4(PackUnsigned(c0, c0));
		}
		else
		{
			if(writeB) { *Pointer<Byte>(element + 0) = Byte(RoundInt(Float(c.z))); }
			if(writeG) { *Pointer<Byte>(element + 1) = Byte(RoundInt(Float(c.y))); }
			if(writeR) { *Pointer<Byte>(element + 2) = Byte(RoundInt(Float(c.x))); }
			if(writeA) { *Pointer<Byte>(element + 3) = Byte(RoundInt(Float(c.w))); }
		}
		break;
	case VK_FORMAT_B8G8R8_SNORM:
		if(writeB) { *Pointer<SByte>(element + 0) = SByte(RoundInt(Float(c.z))); }
		if(writeG) { *Pointer<SByte>(element + 1) = SByte(RoundInt(Float(c.y))); }
		if(writeR) { *Pointer<SByte>(element + 2) = SByte(RoundInt(Float(c.x))); }
		break;
	case VK_FORMAT_B8G8R8_UNORM:
	case VK_FORMAT_B8G8R8_SRGB:
		if(writeB) { *Pointer<Byte>(element + 0) = Byte(RoundInt(Float(c.z))); }
		if(writeG) { *Pointer<Byte>(element + 1) = Byte(RoundInt(Float(c.y))); }
		if(writeR) { *Pointer<Byte>(element + 2) = Byte(RoundInt(Float(c.x))); }
		break;
	case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
	case VK_FORMAT_R8G8B8A8_UNORM:
	case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
	case VK_FORMAT_R8G8B8A8_SRGB:
	case VK_FORMAT_A8B8G8R8_UINT_PACK32:
	case VK_FORMAT_R8G8B8A8_UINT:
	case VK_FORMAT_R8G8B8A8_USCALED:
	case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
		if(writeRGBA)
		{
			Short4 c0 = RoundShort4(c);
			*Pointer<Byte4>(element) = Byte4(PackUnsigned(c0, c0));
		}
		else
		{
			if(writeR) { *Pointer<Byte>(element + 0) = Byte(RoundInt(Float(c.x))); }
			if(writeG) { *Pointer<Byte>(element + 1) = Byte(RoundInt(Float(c.y))); }
			if(writeB) { *Pointer<Byte>(element + 2) = Byte(RoundInt(Float(c.z))); }
			if(writeA) { *Pointer<Byte>(element + 3) = Byte(RoundInt(Float(c.w))); }
		}
		break;
	case VK_FORMAT_R32G32B32A32_SFLOAT:
		if(writeRGBA)
		{
			*Pointer<Float4>(element) = c;
		}
		else
		{
			if(writeR) { *Pointer<Float>(element) = c.x; }
			if(writeG) { *Pointer<Float>(element + 4) = c.y; }
			if(writeB) { *Pointer<Float>(element + 8) = c.z; }
			if(writeA) { *Pointer<Float>(element + 12) = c.w; }
		}
		break;
	case VK_FORMAT_R32G32B32_SFLOAT:
		if(writeR) { *Pointer<Float>(element) = c.x; }
		if(writeG) { *Pointer<Float>(element + 4) = c.y; }
		if(writeB) { *Pointer<Float>(element + 8) = c.z; }
		break;
	case VK_FORMAT_R32G32_SFLOAT:
		if(writeR && writeG)
		{
			*Pointer<Float2>(element) = Float2(c);
		}
		else
		{
			if(writeR) { *Pointer<Float>(element) = c.x; }
			if(writeG) { *Pointer<Float>(element + 4) = c.y; }
		}
		break;
	case VK_FORMAT_R32_SFLOAT:
		if(writeR) { *Pointer<Float>(element) = c.x; }
		break;
	case VK_FORMAT_R16G16B16A16_SFLOAT:
		if(writeA) { *Pointer<Half>(element + 6) = Half(c.w); }
	case VK_FORMAT_R16G16B16_SFLOAT:
		if(writeB) { *Pointer<Half>(element + 4) = Half(c.z); }
	case VK_FORMAT_R16G16_SFLOAT:
		if(writeG) { *Pointer<Half>(element + 2) = Half(c.y); }
	case VK_FORMAT_R16_SFLOAT:
		if(writeR) { *Pointer<Half>(element) = Half(c.x); }
		break;
	case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
		{
			UInt rgb = r11g11b10Pack(c);

			UInt old = *Pointer<UInt>(element);

			unsigned int mask = (writeR ? 0x000007FF : 0) |
			                    (writeG ? 0x003FF800 : 0) |
			                    (writeB ? 0xFFC00000 : 0);

			*Pointer<UInt>(element) = (rgb & mask) | (old & ~mask);
		}
		break;
	case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
		{
			ASSERT(writeRGBA);  // Can't sensibly write just part of this format.

			// Vulkan 1.1.117 section 15.2.1 RGB to Shared Exponent Conversion

			constexpr int N = 9;       // number of mantissa bits per component
			constexpr int B = 15;      // exponent bias
			constexpr int E_max = 31;  // maximum possible biased exponent value

			// Maximum representable value.
			constexpr float sharedexp_max = ((static_cast<float>(1 << N) - 1) / static_cast<float>(1 << N)) * static_cast<float>(1 << (E_max - B));

			// Clamp components to valid range. NaN becomes 0.
			Float red_c =   Min(IfThenElse(!(c.x > 0), Float(0), Float(c.x)), sharedexp_max);
			Float green_c = Min(IfThenElse(!(c.y > 0), Float(0), Float(c.y)), sharedexp_max);
			Float blue_c =  Min(IfThenElse(!(c.z > 0), Float(0), Float(c.z)), sharedexp_max);

			// We're reducing the mantissa to 9 bits, so we must round up if the next
			// bit is 1. In other words add 0.5 to the new mantissa's position and
			// allow overflow into the exponent so we can scale correctly.
			constexpr int half = 1 << (23 - N);
			Float red_r = As<Float>(As<Int>(red_c) + half);
			Float green_r = As<Float>(As<Int>(green_c) + half);
			Float blue_r = As<Float>(As<Int>(blue_c) + half);

			// The largest component determines the shared exponent. It can't be lower
			// than 0 (after bias subtraction) so also limit to the mimimum representable.
			constexpr float min_s = 0.5f / (1 << B);
			Float max_s = Max(Max(red_r, green_r), Max(blue_r, min_s));

			// Obtain the reciprocal of the shared exponent by inverting the bits,
			// and scale by the new mantissa's size. Note that the IEEE-754 single-precision
			// format has an implicit leading 1, but this shared component format does not.
			Float scale = As<Float>((As<Int>(max_s) & 0x7F800000) ^ 0x7F800000) * (1 << (N - 2));

			UInt R9 = RoundInt(red_c * scale);
			UInt G9 = UInt(RoundInt(green_c * scale));
			UInt B9 = UInt(RoundInt(blue_c * scale));
			UInt E5 = (As<UInt>(max_s) >> 23) - 127 + 15 + 1;

			UInt E5B9G9R9 = (E5 << 27) | (B9 << 18) | (G9 << 9) | R9;

			*Pointer<UInt>(element) = E5B9G9R9;
		}
		break;
	case VK_FORMAT_B8G8R8A8_SNORM:
		if(writeB) { *Pointer<SByte>(element) = SByte(RoundInt(Float(c.z))); }
		if(writeG) { *Pointer<SByte>(element + 1) = SByte(RoundInt(Float(c.y))); }
		if(writeR) { *Pointer<SByte>(element + 2) = SByte(RoundInt(Float(c.x))); }
		if(writeA) { *Pointer<SByte>(element + 3) = SByte(RoundInt(Float(c.w))); }
		break;
	case VK_FORMAT_A8B8G8R8_SINT_PACK32:
	case VK_FORMAT_R8G8B8A8_SINT:
	case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
	case VK_FORMAT_R8G8B8A8_SNORM:
	case VK_FORMAT_R8G8B8A8_SSCALED:
	case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
		if(writeA) { *Pointer<SByte>(element + 3) = SByte(RoundInt(Float(c.w))); }
	case VK_FORMAT_R8G8B8_SINT:
	case VK_FORMAT_R8G8B8_SNORM:
	case VK_FORMAT_R8G8B8_SSCALED:
		if(writeB) { *Pointer<SByte>(element + 2) = SByte(RoundInt(Float(c.z))); }
	case VK_FORMAT_R8G8_SINT:
	case VK_FORMAT_R8G8_SNORM:
	case VK_FORMAT_R8G8_SSCALED:
		if(writeG) { *Pointer<SByte>(element + 1) = SByte(RoundInt(Float(c.y))); }
	case VK_FORMAT_R8_SINT:
	case VK_FORMAT_R8_SNORM:
	case VK_FORMAT_R8_SSCALED:
		if(writeR) { *Pointer<SByte>(element) = SByte(RoundInt(Float(c.x))); }
		break;
	case VK_FORMAT_R8G8B8_UINT:
	case VK_FORMAT_R8G8B8_UNORM:
	case VK_FORMAT_R8G8B8_USCALED:
	case VK_FORMAT_R8G8B8_SRGB:
		if(writeB) { *Pointer<Byte>(element + 2) = Byte(RoundInt(Float(c.z))); }
	case VK_FORMAT_R8G8_UINT:
	case VK_FORMAT_R8G8_UNORM:
	case VK_FORMAT_R8G8_USCALED:
	case VK_FORMAT_R8G8_SRGB:
		if(writeG) { *Pointer<Byte>(element + 1) = Byte(RoundInt(Float(c.y))); }
	case VK_FORMAT_R8_UINT:
	case VK_FORMAT_R8_UNORM:
	case VK_FORMAT_R8_USCALED:
	case VK_FORMAT_R8_SRGB:
		if(writeR) { *Pointer<Byte>(element) = Byte(RoundInt(Float(c.x))); }
		break;
	case VK_FORMAT_R16G16B16A16_SINT:
	case VK_FORMAT_R16G16B16A16_SNORM:
	case VK_FORMAT_R16G16B16A16_SSCALED:
		if(writeRGBA)
		{
			*Pointer<Short4>(element) = Short4(RoundInt(c));
		}
		else
		{
			if(writeR) { *Pointer<Short>(element) = Short(RoundInt(Float(c.x))); }
			if(writeG) { *Pointer<Short>(element + 2) = Short(RoundInt(Float(c.y))); }
			if(writeB) { *Pointer<Short>(element + 4) = Short(RoundInt(Float(c.z))); }
			if(writeA) { *Pointer<Short>(element + 6) = Short(RoundInt(Float(c.w))); }
		}
		break;
	case VK_FORMAT_R16G16B16_SINT:
	case VK_FORMAT_R16G16B16_SNORM:
	case VK_FORMAT_R16G16B16_SSCALED:
		if(writeR) { *Pointer<Short>(element) = Short(RoundInt(Float(c.x))); }
		if(writeG) { *Pointer<Short>(element + 2) = Short(RoundInt(Float(c.y))); }
		if(writeB) { *Pointer<Short>(element + 4) = Short(RoundInt(Float(c.z))); }
		break;
	case VK_FORMAT_R16G16_SINT:
	case VK_FORMAT_R16G16_SNORM:
	case VK_FORMAT_R16G16_SSCALED:
		if(writeR && writeG)
		{
			*Pointer<Short2>(element) = Short2(Short4(RoundInt(c)));
		}
		else
		{
			if(writeR) { *Pointer<Short>(element) = Short(RoundInt(Float(c.x))); }
			if(writeG) { *Pointer<Short>(element + 2) = Short(RoundInt(Float(c.y))); }
		}
		break;
	case VK_FORMAT_R16_SINT:
	case VK_FORMAT_R16_SNORM:
	case VK_FORMAT_R16_SSCALED:
		if(writeR) { *Pointer<Short>(element) = Short(RoundInt(Float(c.x))); }
		break;
	case VK_FORMAT_R16G16B16A16_UINT:
	case VK_FORMAT_R16G16B16A16_UNORM:
	case VK_FORMAT_R16G16B16A16_USCALED:
		if(writeRGBA)
		{
			*Pointer<UShort4>(element) = UShort4(RoundInt(c));
		}
		else
		{
			if(writeR) { *Pointer<UShort>(element) = UShort(RoundInt(Float(c.x))); }
			if(writeG) { *Pointer<UShort>(element + 2) = UShort(RoundInt(Float(c.y))); }
			if(writeB) { *Pointer<UShort>(element + 4) = UShort(RoundInt(Float(c.z))); }
			if(writeA) { *Pointer<UShort>(element + 6) = UShort(RoundInt(Float(c.w))); }
		}
		break;
	case VK_FORMAT_R16G16B16_UINT:
	case VK_FORMAT_R16G16B16_UNORM:
	case VK_FORMAT_R16G16B16_USCALED:
		if(writeR) { *Pointer<UShort>(element) = UShort(RoundInt(Float(c.x))); }
		if(writeG) { *Pointer<UShort>(element + 2) = UShort(RoundInt(Float(c.y))); }
		if(writeB) { *Pointer<UShort>(element + 4) = UShort(RoundInt(Float(c.z))); }
		break;
	case VK_FORMAT_R16G16_UINT:
	case VK_FORMAT_R16G16_UNORM:
	case VK_FORMAT_R16G16_USCALED:
		if(writeR && writeG)
		{
			*Pointer<UShort2>(element) = UShort2(UShort4(RoundInt(c)));
		}
		else
		{
			if(writeR) { *Pointer<UShort>(element) = UShort(RoundInt(Float(c.x))); }
			if(writeG) { *Pointer<UShort>(element + 2) = UShort(RoundInt(Float(c.y))); }
		}
		break;
	case VK_FORMAT_R16_UINT:
	case VK_FORMAT_R16_UNORM:
	case VK_FORMAT_R16_USCALED:
		if(writeR) { *Pointer<UShort>(element) = UShort(RoundInt(Float(c.x))); }
		break;
	case VK_FORMAT_R32G32B32A32_SINT:
		if(writeRGBA)
		{
			*Pointer<Int4>(element) = RoundInt(c);
		}
		else
		{
			if(writeR) { *Pointer<Int>(element) = RoundInt(Float(c.x)); }
			if(writeG) { *Pointer<Int>(element + 4) = RoundInt(Float(c.y)); }
			if(writeB) { *Pointer<Int>(element + 8) = RoundInt(Float(c.z)); }
			if(writeA) { *Pointer<Int>(element + 12) = RoundInt(Float(c.w)); }
		}
		break;
	case VK_FORMAT_R32G32B32_SINT:
		if(writeB) { *Pointer<Int>(element + 8) = RoundInt(Float(c.z)); }
	case VK_FORMAT_R32G32_SINT:
		if(writeG) { *Pointer<Int>(element + 4) = RoundInt(Float(c.y)); }
	case VK_FORMAT_R32_SINT:
		if(writeR) { *Pointer<Int>(element) = RoundInt(Float(c.x)); }
		break;
	case VK_FORMAT_R32G32B32A32_UINT:
		if(writeRGBA)
		{
			*Pointer<UInt4>(element) = UInt4(RoundInt(c));
		}
		else
		{
			if(writeR) { *Pointer<UInt>(element) = As<UInt>(RoundInt(Float(c.x))); }
			if(writeG) { *Pointer<UInt>(element + 4) = As<UInt>(RoundInt(Float(c.y))); }
			if(writeB) { *Pointer<UInt>(element + 8) = As<UInt>(RoundInt(Float(c.z))); }
			if(writeA) { *Pointer<UInt>(element + 12) = As<UInt>(RoundInt(Float(c.w))); }
		}
		break;
	case VK_FORMAT_R32G32B32_UINT:
		if(writeB) { *Pointer<UInt>(element + 8) = As<UInt>(RoundInt(Float(c.z))); }
	case VK_FORMAT_R32G32_UINT:
		if(writeG) { *Pointer<UInt>(element + 4) = As<UInt>(RoundInt(Float(c.y))); }
	case VK_FORMAT_R32_UINT:
		if(writeR) { *Pointer<UInt>(element) = As<UInt>(RoundInt(Float(c.x))); }
		break;
	case VK_FORMAT_R5G6B5_UNORM_PACK16:
		if(writeR && writeG && writeB)
		{
			*Pointer<UShort>(element) = UShort(RoundInt(Float(c.z)) |
			                                  (RoundInt(Float(c.y)) << Int(5)) |
			                                  (RoundInt(Float(c.x)) << Int(11)));
		}
		else
		{
			unsigned short mask = (writeB ? 0x001F : 0x0000) | (writeG ? 0x07E0 : 0x0000) | (writeR ? 0xF800 : 0x0000);
			unsigned short unmask = ~mask;
			*Pointer<UShort>(element) = (*Pointer<UShort>(element) & UShort(unmask)) |
			                            (UShort(RoundInt(Float(c.z)) |
			                                   (RoundInt(Float(c.y)) << Int(5)) |
			                                   (RoundInt(Float(c.x)) << Int(11))) & UShort(mask));
		}
		break;
	case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
		if(writeRGBA)
		{
			*Pointer<UShort>(element) = UShort(RoundInt(Float(c.w)) |
			                                  (RoundInt(Float(c.z)) << Int(1)) |
			                                  (RoundInt(Float(c.y)) << Int(6)) |
			                                  (RoundInt(Float(c.x)) << Int(11)));
		}
		else
		{
			unsigned short mask = (writeA ? 0x8000 : 0x0000) |
			                      (writeR ? 0x7C00 : 0x0000) |
			                      (writeG ? 0x03E0 : 0x0000) |
			                      (writeB ? 0x001F : 0x0000);
			unsigned short unmask = ~mask;
			*Pointer<UShort>(element) = (*Pointer<UShort>(element) & UShort(unmask)) |
			                            (UShort(RoundInt(Float(c.w)) |
			                                   (RoundInt(Float(c.z)) << Int(1)) |
			                                   (RoundInt(Float(c.y)) << Int(6)) |
			                                   (RoundInt(Float(c.x)) << Int(11))) & UShort(mask));
		}
		break;
	case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
		if(writeRGBA)
		{
			*Pointer<UShort>(element) = UShort(RoundInt(Float(c.w)) |
			                                  (RoundInt(Float(c.x)) << Int(1)) |
			                                  (RoundInt(Float(c.y)) << Int(6)) |
			                                  (RoundInt(Float(c.z)) << Int(11)));
		}
		else
		{
			unsigned short mask = (writeA ? 0x8000 : 0x0000) |
			                      (writeR ? 0x7C00 : 0x0000) |
			                      (writeG ? 0x03E0 : 0x0000) |
			                      (writeB ? 0x001F : 0x0000);
			unsigned short unmask = ~mask;
			*Pointer<UShort>(element) = (*Pointer<UShort>(element) & UShort(unmask)) |
			                            (UShort(RoundInt(Float(c.w)) |
			                                   (RoundInt(Float(c.x)) << Int(1)) |
			                                   (RoundInt(Float(c.y)) << Int(6)) |
			                                   (RoundInt(Float(c.z)) << Int(11))) & UShort(mask));
		}
		break;
	case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
		if(writeRGBA)
		{
			*Pointer<UShort>(element) = UShort(RoundInt(Float(c.z)) |
			                                  (RoundInt(Float(c.y)) << Int(5)) |
			                                  (RoundInt(Float(c.x)) << Int(10)) |
			                                  (RoundInt(Float(c.w)) << Int(15)));
		}
		else
		{
			unsigned short mask = (writeA ? 0x8000 : 0x0000) |
			                      (writeR ? 0x7C00 : 0x0000) |
			                      (writeG ? 0x03E0 : 0x0000) |
			                      (writeB ? 0x001F : 0x0000);
			unsigned short unmask = ~mask;
			*Pointer<UShort>(element) = (*Pointer<UShort>(element) & UShort(unmask)) |
			                            (UShort(RoundInt(Float(c.z)) |
			                                   (RoundInt(Float(c.y)) << Int(5)) |
			                                   (RoundInt(Float(c.x)) << Int(10)) |
			                                   (RoundInt(Float(c.w)) << Int(15))) & UShort(mask));
		}
		break;
	case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
	case VK_FORMAT_A2B10G10R10_UINT_PACK32:
	case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
		if(writeRGBA)
		{
			*Pointer<UInt>(element) = UInt(RoundInt(Float(c.x)) |
			                              (RoundInt(Float(c.y)) << 10) |
			                              (RoundInt(Float(c.z)) << 20) |
			                              (RoundInt(Float(c.w)) << 30));
		}
		else
		{
			unsigned int mask = (writeA ? 0xC0000000 : 0x0000) |
			                    (writeB ? 0x3FF00000 : 0x0000) |
			                    (writeG ? 0x000FFC00 : 0x0000) |
			                    (writeR ? 0x000003FF : 0x0000);
			unsigned int unmask = ~mask;
			*Pointer<UInt>(element) = (*Pointer<UInt>(element) & UInt(unmask)) |
			                            (UInt(RoundInt(Float(c.x)) |
			                                 (RoundInt(Float(c.y)) << 10) |
			                                 (RoundInt(Float(c.z)) << 20) |
			                                 (RoundInt(Float(c.w)) << 30)) & UInt(mask));
		}
		break;
	case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
	case VK_FORMAT_A2R10G10B10_UINT_PACK32:
	case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
		if(writeRGBA)
		{
			*Pointer<UInt>(element) = UInt(RoundInt(Float(c.z)) |
			                              (RoundInt(Float(c.y)) << 10) |
			                              (RoundInt(Float(c.x)) << 20) |
			                              (RoundInt(Float(c.w)) << 30));
		}
		else
		{
			unsigned int mask = (writeA ? 0xC0000000 : 0x0000) |
			                    (writeR ? 0x3FF00000 : 0x0000) |
			                    (writeG ? 0x000FFC00 : 0x0000) |
			                    (writeB ? 0x000003FF : 0x0000);
			unsigned int unmask = ~mask;
			*Pointer<UInt>(element) = (*Pointer<UInt>(element) & UInt(unmask)) |
			                            (UInt(RoundInt(Float(c.z)) |
			                                 (RoundInt(Float(c.y)) << 10) |
			                                 (RoundInt(Float(c.x)) << 20) |
			                                 (RoundInt(Float(c.w)) << 30)) & UInt(mask));
		}
		break;
	case VK_FORMAT_D16_UNORM:
		*Pointer<UShort>(element) = UShort(RoundInt(Float(c.x)));
		break;
	case VK_FORMAT_X8_D24_UNORM_PACK32:
		*Pointer<UInt>(element) = UInt(RoundInt(Float(c.x)) << 8);
		break;
	case VK_FORMAT_D32_SFLOAT:
		*Pointer<Float>(element) = c.x;
		break;
	case VK_FORMAT_S8_UINT:
		*Pointer<Byte>(element) = Byte(RoundInt(Float(c.x)));
		break;
	default:
		UNSUPPORTED("Blitter destination format %d", (int)state.destFormat);
		break;
	}
}

Int4 Blitter::readInt4(Pointer<Byte> element, const State &state)
{
	Int4 c(0, 0, 0, 1);

	switch(state.sourceFormat)
	{
	case VK_FORMAT_A8B8G8R8_SINT_PACK32:
	case VK_FORMAT_R8G8B8A8_SINT:
		c = Insert(c, Int(*Pointer<SByte>(element + 3)), 3);
		c = Insert(c, Int(*Pointer<SByte>(element + 2)), 2);
	case VK_FORMAT_R8G8_SINT:
		c = Insert(c, Int(*Pointer<SByte>(element + 1)), 1);
	case VK_FORMAT_R8_SINT:
		c = Insert(c, Int(*Pointer<SByte>(element)), 0);
		break;
	case VK_FORMAT_A2B10G10R10_UINT_PACK32:
		c = Insert(c, Int((*Pointer<UInt>(element) & UInt(0x000003FF))), 0);
		c = Insert(c, Int((*Pointer<UInt>(element) & UInt(0x000FFC00)) >> 10), 1);
		c = Insert(c, Int((*Pointer<UInt>(element) & UInt(0x3FF00000)) >> 20), 2);
		c = Insert(c, Int((*Pointer<UInt>(element) & UInt(0xC0000000)) >> 30), 3);
		break;
	case VK_FORMAT_A8B8G8R8_UINT_PACK32:
	case VK_FORMAT_R8G8B8A8_UINT:
		c = Insert(c, Int(*Pointer<Byte>(element + 3)), 3);
		c = Insert(c, Int(*Pointer<Byte>(element + 2)), 2);
	case VK_FORMAT_R8G8_UINT:
		c = Insert(c, Int(*Pointer<Byte>(element + 1)), 1);
	case VK_FORMAT_R8_UINT:
	case VK_FORMAT_S8_UINT:
		c = Insert(c, Int(*Pointer<Byte>(element)), 0);
		break;
	case VK_FORMAT_R16G16B16A16_SINT:
		c = Insert(c, Int(*Pointer<Short>(element + 6)), 3);
		c = Insert(c, Int(*Pointer<Short>(element + 4)), 2);
	case VK_FORMAT_R16G16_SINT:
		c = Insert(c, Int(*Pointer<Short>(element + 2)), 1);
	case VK_FORMAT_R16_SINT:
		c = Insert(c, Int(*Pointer<Short>(element)), 0);
		break;
	case VK_FORMAT_R16G16B16A16_UINT:
		c = Insert(c, Int(*Pointer<UShort>(element + 6)), 3);
		c = Insert(c, Int(*Pointer<UShort>(element + 4)), 2);
	case VK_FORMAT_R16G16_UINT:
		c = Insert(c, Int(*Pointer<UShort>(element + 2)), 1);
	case VK_FORMAT_R16_UINT:
		c = Insert(c, Int(*Pointer<UShort>(element)), 0);
		break;
	case VK_FORMAT_R32G32B32A32_SINT:
	case VK_FORMAT_R32G32B32A32_UINT:
		c = *Pointer<Int4>(element);
		break;
	case VK_FORMAT_R32G32_SINT:
	case VK_FORMAT_R32G32_UINT:
		c = Insert(c, *Pointer<Int>(element + 4), 1);
	case VK_FORMAT_R32_SINT:
	case VK_FORMAT_R32_UINT:
		c = Insert(c, *Pointer<Int>(element), 0);
		break;
	default:
		UNSUPPORTED("Blitter source format %d", (int)state.sourceFormat);
	}

	return c;
}

void Blitter::write(Int4 &c, Pointer<Byte> element, const State &state)
{
	bool writeR = state.writeRed;
	bool writeG = state.writeGreen;
	bool writeB = state.writeBlue;
	bool writeA = state.writeAlpha;
	bool writeRGBA = writeR && writeG && writeB && writeA;

	switch(state.destFormat)
	{
	case VK_FORMAT_A2B10G10R10_UINT_PACK32:
		c = Min(As<UInt4>(c), UInt4(0x03FF, 0x03FF, 0x03FF, 0x0003));
		break;
	case VK_FORMAT_A8B8G8R8_UINT_PACK32:
	case VK_FORMAT_R8G8B8A8_UINT:
	case VK_FORMAT_R8G8B8_UINT:
	case VK_FORMAT_R8G8_UINT:
	case VK_FORMAT_R8_UINT:
	case VK_FORMAT_R8G8B8A8_USCALED:
	case VK_FORMAT_R8G8B8_USCALED:
	case VK_FORMAT_R8G8_USCALED:
	case VK_FORMAT_R8_USCALED:
	case VK_FORMAT_S8_UINT:
		c = Min(As<UInt4>(c), UInt4(0xFF));
		break;
	case VK_FORMAT_R16G16B16A16_UINT:
	case VK_FORMAT_R16G16B16_UINT:
	case VK_FORMAT_R16G16_UINT:
	case VK_FORMAT_R16_UINT:
	case VK_FORMAT_R16G16B16A16_USCALED:
	case VK_FORMAT_R16G16B16_USCALED:
	case VK_FORMAT_R16G16_USCALED:
	case VK_FORMAT_R16_USCALED:
		c = Min(As<UInt4>(c), UInt4(0xFFFF));
		break;
	case VK_FORMAT_A8B8G8R8_SINT_PACK32:
	case VK_FORMAT_R8G8B8A8_SINT:
	case VK_FORMAT_R8G8_SINT:
	case VK_FORMAT_R8_SINT:
	case VK_FORMAT_R8G8B8A8_SSCALED:
	case VK_FORMAT_R8G8B8_SSCALED:
	case VK_FORMAT_R8G8_SSCALED:
	case VK_FORMAT_R8_SSCALED:
		c = Min(Max(c, Int4(-0x80)), Int4(0x7F));
		break;
	case VK_FORMAT_R16G16B16A16_SINT:
	case VK_FORMAT_R16G16B16_SINT:
	case VK_FORMAT_R16G16_SINT:
	case VK_FORMAT_R16_SINT:
	case VK_FORMAT_R16G16B16A16_SSCALED:
	case VK_FORMAT_R16G16B16_SSCALED:
	case VK_FORMAT_R16G16_SSCALED:
	case VK_FORMAT_R16_SSCALED:
		c = Min(Max(c, Int4(-0x8000)), Int4(0x7FFF));
		break;
	default:
		break;
	}

	switch(state.destFormat)
	{
	case VK_FORMAT_B8G8R8A8_SINT:
	case VK_FORMAT_B8G8R8A8_SSCALED:
		if(writeA) { *Pointer<SByte>(element + 3) = SByte(Extract(c, 3)); }
	case VK_FORMAT_B8G8R8_SINT:
	case VK_FORMAT_B8G8R8_SSCALED:
		if(writeB) { *Pointer<SByte>(element) = SByte(Extract(c, 2)); }
		if(writeG) { *Pointer<SByte>(element + 1) = SByte(Extract(c, 1)); }
		if(writeR) { *Pointer<SByte>(element + 2) = SByte(Extract(c, 0)); }
		break;
	case VK_FORMAT_A8B8G8R8_SINT_PACK32:
	case VK_FORMAT_R8G8B8A8_SINT:
	case VK_FORMAT_R8G8B8A8_SSCALED:
	case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
		if(writeA) { *Pointer<SByte>(element + 3) = SByte(Extract(c, 3)); }
	case VK_FORMAT_R8G8B8_SINT:
	case VK_FORMAT_R8G8B8_SSCALED:
		if(writeB) { *Pointer<SByte>(element + 2) = SByte(Extract(c, 2)); }
	case VK_FORMAT_R8G8_SINT:
	case VK_FORMAT_R8G8_SSCALED:
		if(writeG) { *Pointer<SByte>(element + 1) = SByte(Extract(c, 1)); }
	case VK_FORMAT_R8_SINT:
	case VK_FORMAT_R8_SSCALED:
		if(writeR) { *Pointer<SByte>(element) = SByte(Extract(c, 0)); }
		break;
	case VK_FORMAT_A2B10G10R10_UINT_PACK32:
	case VK_FORMAT_A2B10G10R10_SINT_PACK32:
	case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
	case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
		if(writeRGBA)
		{
			*Pointer<UInt>(element) =
				UInt((Extract(c, 0)) | (Extract(c, 1) << 10) | (Extract(c, 2) << 20) | (Extract(c, 3) << 30));
		}
		else
		{
			unsigned int mask = (writeA ? 0xC0000000 : 0x0000) |
			                    (writeB ? 0x3FF00000 : 0x0000) |
			                    (writeG ? 0x000FFC00 : 0x0000) |
			                    (writeR ? 0x000003FF : 0x0000);
			unsigned int unmask = ~mask;
			*Pointer<UInt>(element) = (*Pointer<UInt>(element) & UInt(unmask)) |
				(UInt(Extract(c, 0) | (Extract(c, 1) << 10) | (Extract(c, 2) << 20) | (Extract(c, 3) << 30)) & UInt(mask));
		}
		break;
	case VK_FORMAT_A2R10G10B10_UINT_PACK32:
	case VK_FORMAT_A2R10G10B10_SINT_PACK32:
	case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
	case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
		if(writeRGBA)
		{
			*Pointer<UInt>(element) =
				UInt((Extract(c, 2)) | (Extract(c, 1) << 10) | (Extract(c, 0) << 20) | (Extract(c, 3) << 30));
		}
		else
		{
			unsigned int mask = (writeA ? 0xC0000000 : 0x0000) |
			                    (writeR ? 0x3FF00000 : 0x0000) |
			                    (writeG ? 0x000FFC00 : 0x0000) |
			                    (writeB ? 0x000003FF : 0x0000);
			unsigned int unmask = ~mask;
			*Pointer<UInt>(element) = (*Pointer<UInt>(element) & UInt(unmask)) |
				(UInt(Extract(c, 2) | (Extract(c, 1) << 10) | (Extract(c, 0) << 20) | (Extract(c, 3) << 30)) & UInt(mask));
		}
		break;
	case VK_FORMAT_B8G8R8A8_UINT:
	case VK_FORMAT_B8G8R8A8_USCALED:
		if(writeA) { *Pointer<Byte>(element + 3) = Byte(Extract(c, 3)); }
	case VK_FORMAT_B8G8R8_UINT:
	case VK_FORMAT_B8G8R8_USCALED:
	case VK_FORMAT_B8G8R8_SRGB:
		if(writeB) { *Pointer<Byte>(element) = Byte(Extract(c, 2)); }
		if(writeG) { *Pointer<Byte>(element + 1) = Byte(Extract(c, 1)); }
		if(writeR) { *Pointer<Byte>(element + 2) = Byte(Extract(c, 0)); }
		break;
	case VK_FORMAT_A8B8G8R8_UINT_PACK32:
	case VK_FORMAT_R8G8B8A8_UINT:
	case VK_FORMAT_R8G8B8A8_USCALED:
	case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
		if(writeA) { *Pointer<Byte>(element + 3) = Byte(Extract(c, 3)); }
	case VK_FORMAT_R8G8B8_UINT:
	case VK_FORMAT_R8G8B8_USCALED:
		if(writeB) { *Pointer<Byte>(element + 2) = Byte(Extract(c, 2)); }
	case VK_FORMAT_R8G8_UINT:
	case VK_FORMAT_R8G8_USCALED:
		if(writeG) { *Pointer<Byte>(element + 1) = Byte(Extract(c, 1)); }
	case VK_FORMAT_R8_UINT:
	case VK_FORMAT_R8_USCALED:
	case VK_FORMAT_S8_UINT:
		if(writeR) { *Pointer<Byte>(element) = Byte(Extract(c, 0)); }
		break;
	case VK_FORMAT_R16G16B16A16_SINT:
	case VK_FORMAT_R16G16B16A16_SSCALED:
		if(writeA) { *Pointer<Short>(element + 6) = Short(Extract(c, 3)); }
	case VK_FORMAT_R16G16B16_SINT:
	case VK_FORMAT_R16G16B16_SSCALED:
		if(writeB) { *Pointer<Short>(element + 4) = Short(Extract(c, 2)); }
	case VK_FORMAT_R16G16_SINT:
	case VK_FORMAT_R16G16_SSCALED:
		if(writeG) { *Pointer<Short>(element + 2) = Short(Extract(c, 1)); }
	case VK_FORMAT_R16_SINT:
	case VK_FORMAT_R16_SSCALED:
		if(writeR) { *Pointer<Short>(element) = Short(Extract(c, 0)); }
		break;
	case VK_FORMAT_R16G16B16A16_UINT:
	case VK_FORMAT_R16G16B16A16_USCALED:
		if(writeA) { *Pointer<UShort>(element + 6) = UShort(Extract(c, 3)); }
	case VK_FORMAT_R16G16B16_UINT:
	case VK_FORMAT_R16G16B16_USCALED:
		if(writeB) { *Pointer<UShort>(element + 4) = UShort(Extract(c, 2)); }
	case VK_FORMAT_R16G16_UINT:
	case VK_FORMAT_R16G16_USCALED:
		if(writeG) { *Pointer<UShort>(element + 2) = UShort(Extract(c, 1)); }
	case VK_FORMAT_R16_UINT:
	case VK_FORMAT_R16_USCALED:
		if(writeR) { *Pointer<UShort>(element) = UShort(Extract(c, 0)); }
		break;
	case VK_FORMAT_R32G32B32A32_SINT:
		if(writeRGBA)
		{
			*Pointer<Int4>(element) = c;
		}
		else
		{
			if(writeR) { *Pointer<Int>(element) = Extract(c, 0); }
			if(writeG) { *Pointer<Int>(element + 4) = Extract(c, 1); }
			if(writeB) { *Pointer<Int>(element + 8) = Extract(c, 2); }
			if(writeA) { *Pointer<Int>(element + 12) = Extract(c, 3); }
		}
		break;
	case VK_FORMAT_R32G32B32_SINT:
		if(writeR) { *Pointer<Int>(element) = Extract(c, 0); }
		if(writeG) { *Pointer<Int>(element + 4) = Extract(c, 1); }
		if(writeB) { *Pointer<Int>(element + 8) = Extract(c, 2); }
		break;
	case VK_FORMAT_R32G32_SINT:
		if(writeR) { *Pointer<Int>(element) = Extract(c, 0); }
		if(writeG) { *Pointer<Int>(element + 4) = Extract(c, 1); }
		break;
	case VK_FORMAT_R32_SINT:
		if(writeR) { *Pointer<Int>(element) = Extract(c, 0); }
		break;
	case VK_FORMAT_R32G32B32A32_UINT:
		if(writeRGBA)
		{
			*Pointer<UInt4>(element) = As<UInt4>(c);
		}
		else
		{
			if(writeR) { *Pointer<UInt>(element) = As<UInt>(Extract(c, 0)); }
			if(writeG) { *Pointer<UInt>(element + 4) = As<UInt>(Extract(c, 1)); }
			if(writeB) { *Pointer<UInt>(element + 8) = As<UInt>(Extract(c, 2)); }
			if(writeA) { *Pointer<UInt>(element + 12) = As<UInt>(Extract(c, 3)); }
		}
		break;
	case VK_FORMAT_R32G32B32_UINT:
		if(writeB) { *Pointer<UInt>(element + 8) = As<UInt>(Extract(c, 2)); }
	case VK_FORMAT_R32G32_UINT:
		if(writeG) { *Pointer<UInt>(element + 4) = As<UInt>(Extract(c, 1)); }
	case VK_FORMAT_R32_UINT:
		if(writeR) { *Pointer<UInt>(element) = As<UInt>(Extract(c, 0)); }
		break;
	default:
		UNSUPPORTED("Blitter destination format %d", (int)state.destFormat);
	}
}

void Blitter::ApplyScaleAndClamp(Float4 &value, const State &state, bool preScaled)
{
	float4 scale{}, unscale{};

	if(state.clearOperation &&
	   state.sourceFormat.isNonNormalizedInteger() &&
	   !state.destFormat.isNonNormalizedInteger())
	{
		// If we're clearing a buffer from an int or uint color into a normalized color,
		// then the whole range of the int or uint color must be scaled between 0 and 1.
		switch(state.sourceFormat)
		{
		case VK_FORMAT_R32G32B32A32_SINT:
			unscale = float4(static_cast<float>(0x7FFFFFFF));
			break;
		case VK_FORMAT_R32G32B32A32_UINT:
			unscale = float4(static_cast<float>(0xFFFFFFFF));
			break;
		default:
			UNSUPPORTED("Blitter source format %d", (int)state.sourceFormat);
		}
	}
	else
	{
		unscale = state.sourceFormat.getScale();
	}

	scale = state.destFormat.getScale();

	bool srcSRGB = state.sourceFormat.isSRGBformat();
	bool dstSRGB = state.destFormat.isSRGBformat();

	if(state.allowSRGBConversion && ((srcSRGB && !preScaled) || dstSRGB))   // One of the formats is sRGB encoded.
	{
		value *= preScaled ? Float4(1.0f / scale.x, 1.0f / scale.y, 1.0f / scale.z, 1.0f / scale.w) : // Unapply scale
		                     Float4(1.0f / unscale.x, 1.0f / unscale.y, 1.0f / unscale.z, 1.0f / unscale.w); // Apply unscale
		value = (srcSRGB && !preScaled) ? sRGBtoLinear(value) : LinearToSRGB(value);
		value *= Float4(scale.x, scale.y, scale.z, scale.w); // Apply scale
	}
	else if(unscale != scale)
	{
		value *= Float4(scale.x / unscale.x, scale.y / unscale.y, scale.z / unscale.z, scale.w / unscale.w);
	}

	if(state.sourceFormat.isFloatFormat() && !state.destFormat.isFloatFormat())
	{
		value = Min(value, Float4(scale.x, scale.y, scale.z, scale.w));

		value = Max(value, Float4(state.destFormat.isUnsignedComponent(0) ? 0.0f : -scale.x,
		                          state.destFormat.isUnsignedComponent(1) ? 0.0f : -scale.y,
		                          state.destFormat.isUnsignedComponent(2) ? 0.0f : -scale.z,
		                          state.destFormat.isUnsignedComponent(3) ? 0.0f : -scale.w));
	}
}

Int Blitter::ComputeOffset(Int &x, Int &y, Int &pitchB, int bytes)
{
	return y * pitchB + x * bytes;
}

Float4 Blitter::LinearToSRGB(Float4 &c)
{
	Float4 lc = Min(c, Float4(0.0031308f)) * Float4(12.92f);
	Float4 ec = Float4(1.055f) * power(c, Float4(1.0f / 2.4f)) - Float4(0.055f);

	Float4 s = c;
	s.xyz = Max(lc, ec);

	return s;
}

Float4 Blitter::sRGBtoLinear(Float4 &c)
{
	Float4 lc = c * Float4(1.0f / 12.92f);
	Float4 ec = power((c + Float4(0.055f)) * Float4(1.0f / 1.055f), Float4(2.4f));

	Int4 linear = CmpLT(c, Float4(0.04045f));

	Float4 s = c;
	s.xyz = As<Float4>((linear & As<Int4>(lc)) | (~linear & As<Int4>(ec)));   // TODO: IfThenElse()

	return s;
}

Blitter::BlitRoutineType Blitter::generate(const State &state)
{
	BlitFunction function;
	{
		Pointer<Byte> blit(function.Arg<0>());

		Pointer<Byte> source = *Pointer<Pointer<Byte>>(blit + OFFSET(BlitData,source));
		Pointer<Byte> dest = *Pointer<Pointer<Byte>>(blit + OFFSET(BlitData,dest));
		Int sPitchB = *Pointer<Int>(blit + OFFSET(BlitData,sPitchB));
		Int dPitchB = *Pointer<Int>(blit + OFFSET(BlitData,dPitchB));

		Float x0 = *Pointer<Float>(blit + OFFSET(BlitData,x0));
		Float y0 = *Pointer<Float>(blit + OFFSET(BlitData,y0));
		Float w = *Pointer<Float>(blit + OFFSET(BlitData,w));
		Float h = *Pointer<Float>(blit + OFFSET(BlitData,h));

		Int x0d = *Pointer<Int>(blit + OFFSET(BlitData,x0d));
		Int x1d = *Pointer<Int>(blit + OFFSET(BlitData,x1d));
		Int y0d = *Pointer<Int>(blit + OFFSET(BlitData,y0d));
		Int y1d = *Pointer<Int>(blit + OFFSET(BlitData,y1d));

		Int sWidth = *Pointer<Int>(blit + OFFSET(BlitData,sWidth));
		Int sHeight = *Pointer<Int>(blit + OFFSET(BlitData,sHeight));

		bool intSrc = state.sourceFormat.isNonNormalizedInteger();
		bool intDst = state.destFormat.isNonNormalizedInteger();
		bool intBoth = intSrc && intDst;
		int srcBytes = state.sourceFormat.bytes();
		int dstBytes = state.destFormat.bytes();

		bool hasConstantColorI = false;
		Int4 constantColorI;
		bool hasConstantColorF = false;
		Float4 constantColorF;
		if(state.clearOperation)
		{
			if(intBoth) // Integer types
			{
				constantColorI = readInt4(source, state);
				hasConstantColorI = true;
			}
			else
			{
				constantColorF = readFloat4(source, state);
				hasConstantColorF = true;

				ApplyScaleAndClamp(constantColorF, state);
			}
		}

		For(Int j = y0d, j < y1d, j++)
		{
			Float y = state.clearOperation ? RValue<Float>(y0) : y0 + Float(j) * h;
			Pointer<Byte> destLine = dest + j * dPitchB;

			For(Int i = x0d, i < x1d, i++)
			{
				Float x = state.clearOperation ? RValue<Float>(x0) : x0 + Float(i) * w;
				Pointer<Byte> d = destLine + i * dstBytes;

				if(hasConstantColorI)
				{
					for(int s = 0; s < state.destSamples; s++)
					{
						write(constantColorI, d, state);

						d += *Pointer<Int>(blit + OFFSET(BlitData, dSliceB));
					}
				}
				else if(hasConstantColorF)
				{
					for(int s = 0; s < state.destSamples; s++)
					{
						write(constantColorF, d, state);

						d += *Pointer<Int>(blit + OFFSET(BlitData, dSliceB));
					}
				}
				else if(intBoth) // Integer types do not support filtering
				{
					Int X = Int(x);
					Int Y = Int(y);

					if(state.clampToEdge)
					{
						X = Clamp(X, 0, sWidth - 1);
						Y = Clamp(Y, 0, sHeight - 1);
					}

					Pointer<Byte> s = source + ComputeOffset(X, Y, sPitchB, srcBytes);

					// When both formats are true integer types, we don't go to float to avoid losing precision
					Int4 color = readInt4(s, state);
					for(int s = 0; s < state.destSamples; s++)
					{
						write(color, d, state);

						d += *Pointer<Int>(blit + OFFSET(BlitData,dSliceB));
					}
				}
				else
				{
					Float4 color;

					bool preScaled = false;
					if(!state.filter || intSrc)
					{
						Int X = Int(x);
						Int Y = Int(y);

						if(state.clampToEdge)
						{
							X = Clamp(X, 0, sWidth - 1);
							Y = Clamp(Y, 0, sHeight - 1);
						}

						Pointer<Byte> s = source + ComputeOffset(X, Y, sPitchB, srcBytes);

						color = readFloat4(s, state);

						if(state.srcSamples > 1) // Resolve multisampled source
						{
							if(state.allowSRGBConversion && state.sourceFormat.isSRGBformat()) // sRGB -> RGB
							{
								ApplyScaleAndClamp(color, state);
								preScaled = true;
							}
							Float4 accum = color;
							for(int sample = 1; sample < state.srcSamples; sample++)
							{
								s += *Pointer<Int>(blit + OFFSET(BlitData, sSliceB));
								color = readFloat4(s, state);

								if(state.allowSRGBConversion && state.sourceFormat.isSRGBformat()) // sRGB -> RGB
								{
									ApplyScaleAndClamp(color, state);
									preScaled = true;
								}
								accum += color;
							}
							color = accum * Float4(1.0f / static_cast<float>(state.srcSamples));
						}
					}
					else   // Bilinear filtering
					{
						Float X = x;
						Float Y = y;

						if(state.clampToEdge)
						{
							X = Min(Max(x, 0.5f), Float(sWidth) - 0.5f);
							Y = Min(Max(y, 0.5f), Float(sHeight) - 0.5f);
						}

						Float x0 = X - 0.5f;
						Float y0 = Y - 0.5f;

						Int X0 = Max(Int(x0), 0);
						Int Y0 = Max(Int(y0), 0);

						Int X1 = X0 + 1;
						Int Y1 = Y0 + 1;
						X1 = IfThenElse(X1 >= sWidth, X0, X1);
						Y1 = IfThenElse(Y1 >= sHeight, Y0, Y1);

						Pointer<Byte> s00 = source + ComputeOffset(X0, Y0, sPitchB, srcBytes);
						Pointer<Byte> s01 = source + ComputeOffset(X1, Y0, sPitchB, srcBytes);
						Pointer<Byte> s10 = source + ComputeOffset(X0, Y1, sPitchB, srcBytes);
						Pointer<Byte> s11 = source + ComputeOffset(X1, Y1, sPitchB, srcBytes);

						Float4 c00 = readFloat4(s00, state);
						Float4 c01 = readFloat4(s01, state);
						Float4 c10 = readFloat4(s10, state);
						Float4 c11 = readFloat4(s11, state);

						if(state.allowSRGBConversion && state.sourceFormat.isSRGBformat()) // sRGB -> RGB
						{
							ApplyScaleAndClamp(c00, state);
							ApplyScaleAndClamp(c01, state);
							ApplyScaleAndClamp(c10, state);
							ApplyScaleAndClamp(c11, state);
							preScaled = true;
						}

						Float4 fx = Float4(x0 - Float(X0));
						Float4 fy = Float4(y0 - Float(Y0));
						Float4 ix = Float4(1.0f) - fx;
						Float4 iy = Float4(1.0f) - fy;

						color = (c00 * ix + c01 * fx) * iy +
						        (c10 * ix + c11 * fx) * fy;
					}

					ApplyScaleAndClamp(color, state, preScaled);

					for(int s = 0; s < state.destSamples; s++)
					{
						write(color, d, state);

						d += *Pointer<Int>(blit + OFFSET(BlitData,dSliceB));
					}
				}
			}
		}
	}

	return function("BlitRoutine");
}

Blitter::BlitRoutineType Blitter::getBlitRoutine(const State &state)
{
	std::unique_lock<std::mutex> lock(blitMutex);
	auto blitRoutine = blitCache.query(state);

	if(!blitRoutine)
	{
		blitRoutine = generate(state);
		blitCache.add(state, blitRoutine);
	}

	return blitRoutine;
}

Blitter::CornerUpdateRoutineType Blitter::getCornerUpdateRoutine(const State &state)
{
	std::unique_lock<std::mutex> lock(cornerUpdateMutex);
	auto cornerUpdateRoutine = cornerUpdateCache.query(state);

	if(!cornerUpdateRoutine)
	{
		cornerUpdateRoutine = generateCornerUpdate(state);
		cornerUpdateCache.add(state, cornerUpdateRoutine);
	}

	return cornerUpdateRoutine;
}

void Blitter::blitToBuffer(const vk::Image *src, VkImageSubresourceLayers subresource, VkOffset3D offset, VkExtent3D extent, uint8_t *dst, int bufferRowPitch, int bufferSlicePitch)
{
	auto aspect = static_cast<VkImageAspectFlagBits>(subresource.aspectMask);
	auto format = src->getFormat(aspect);
	State state(format, format, VK_SAMPLE_COUNT_1_BIT, VK_SAMPLE_COUNT_1_BIT, Options{false, false});

	auto blitRoutine = getBlitRoutine(state);
	if(!blitRoutine)
	{
		return;
	}

	BlitData data =
	{
		nullptr, // source
		dst, // dest
		src->rowPitchBytes(aspect, subresource.mipLevel),   // sPitchB
		bufferRowPitch,   // dPitchB
		src->slicePitchBytes(aspect, subresource.mipLevel), // sSliceB
		bufferSlicePitch, // dSliceB

		0, 0, 1, 1,

		0, // y0d
		static_cast<int>(extent.height), // y1d
		0, // x0d
		static_cast<int>(extent.width), // x1d

		static_cast<int>(extent.width), // sWidth
		static_cast<int>(extent.height) // sHeight;
	};

	VkOffset3D srcOffset = { 0, 0, offset.z };

	VkImageSubresourceLayers srcSubresLayers = subresource;
	srcSubresLayers.layerCount = 1;

	VkImageSubresourceRange srcSubresRange =
	{
		subresource.aspectMask,
		subresource.mipLevel,
		1,
		subresource.baseArrayLayer,
		subresource.layerCount
	};

	uint32_t lastLayer = src->getLastLayerIndex(srcSubresRange);

	for(; srcSubresLayers.baseArrayLayer <= lastLayer; srcSubresLayers.baseArrayLayer++)
	{
		srcOffset.z = offset.z;

		for(auto i = 0u; i < extent.depth; i++)
		{
			data.source = src->getTexelPointer(srcOffset, srcSubresLayers);
			ASSERT(data.source < src->end());
			blitRoutine(&data);
			srcOffset.z++;
			data.dest = (dst += bufferSlicePitch);
		}
	}
}

void Blitter::blitFromBuffer(const vk::Image *dst, VkImageSubresourceLayers subresource, VkOffset3D offset, VkExtent3D extent, uint8_t *src, int bufferRowPitch, int bufferSlicePitch)
{
	auto aspect = static_cast<VkImageAspectFlagBits>(subresource.aspectMask);
	auto format = dst->getFormat(aspect);
	State state(format, format, VK_SAMPLE_COUNT_1_BIT, VK_SAMPLE_COUNT_1_BIT, Options{false, false});

	auto blitRoutine = getBlitRoutine(state);
	if(!blitRoutine)
	{
		return;
	}

	BlitData data =
	{
		src, // source
		nullptr, // dest
		bufferRowPitch,   // sPitchB
		dst->rowPitchBytes(aspect, subresource.mipLevel),   // dPitchB
		bufferSlicePitch, // sSliceB
		dst->slicePitchBytes(aspect, subresource.mipLevel), // dSliceB

		static_cast<float>(-offset.x), // x0
		static_cast<float>(-offset.y), // y0
		1.0f, // w
		1.0f, // h

		offset.y, // y0d
		static_cast<int>(offset.y + extent.height), // y1d
		offset.x, // x0d
		static_cast<int>(offset.x + extent.width), // x1d

		static_cast<int>(extent.width), // sWidth
		static_cast<int>(extent.height) // sHeight;
	};

	VkOffset3D dstOffset = { 0, 0, offset.z };

	VkImageSubresourceLayers dstSubresLayers = subresource;
	dstSubresLayers.layerCount = 1;

	VkImageSubresourceRange dstSubresRange =
	{
		subresource.aspectMask,
		subresource.mipLevel,
		1,
		subresource.baseArrayLayer,
		subresource.layerCount
	};

	uint32_t lastLayer = dst->getLastLayerIndex(dstSubresRange);

	for(; dstSubresLayers.baseArrayLayer <= lastLayer; dstSubresLayers.baseArrayLayer++)
	{
		dstOffset.z = offset.z;

		for(auto i = 0u; i < extent.depth; i++)
		{
			data.dest = dst->getTexelPointer(dstOffset, dstSubresLayers);
			ASSERT(data.dest < dst->end());
			blitRoutine(&data);
			dstOffset.z++;
			data.source = (src += bufferSlicePitch);
		}
	}
}

void Blitter::blit(const vk::Image *src, vk::Image *dst, VkImageBlit region, VkFilter filter)
{
	if(dst->getFormat() == VK_FORMAT_UNDEFINED)
	{
		return;
	}

	if((region.srcSubresource.layerCount != region.dstSubresource.layerCount) ||
	   (region.srcSubresource.aspectMask != region.dstSubresource.aspectMask))
	{
		UNIMPLEMENTED("region");
	}

	if(region.dstOffsets[0].x > region.dstOffsets[1].x)
	{
		std::swap(region.srcOffsets[0].x, region.srcOffsets[1].x);
		std::swap(region.dstOffsets[0].x, region.dstOffsets[1].x);
	}

	if(region.dstOffsets[0].y > region.dstOffsets[1].y)
	{
		std::swap(region.srcOffsets[0].y, region.srcOffsets[1].y);
		std::swap(region.dstOffsets[0].y, region.dstOffsets[1].y);
	}

	VkImageAspectFlagBits srcAspect = static_cast<VkImageAspectFlagBits>(region.srcSubresource.aspectMask);
	VkImageAspectFlagBits dstAspect = static_cast<VkImageAspectFlagBits>(region.dstSubresource.aspectMask);
	VkExtent3D srcExtent = src->getMipLevelExtent(srcAspect, region.srcSubresource.mipLevel);

	int32_t numSlices = (region.srcOffsets[1].z - region.srcOffsets[0].z);
	ASSERT(numSlices == (region.dstOffsets[1].z - region.dstOffsets[0].z));

	float widthRatio = static_cast<float>(region.srcOffsets[1].x - region.srcOffsets[0].x) /
	                   static_cast<float>(region.dstOffsets[1].x - region.dstOffsets[0].x);
	float heightRatio = static_cast<float>(region.srcOffsets[1].y - region.srcOffsets[0].y) /
	                    static_cast<float>(region.dstOffsets[1].y - region.dstOffsets[0].y);
	float x0 = region.srcOffsets[0].x + (0.5f - region.dstOffsets[0].x) * widthRatio;
	float y0 = region.srcOffsets[0].y + (0.5f - region.dstOffsets[0].y) * heightRatio;

	auto srcFormat = src->getFormat(srcAspect);
	auto dstFormat = dst->getFormat(dstAspect);

	bool doFilter = (filter != VK_FILTER_NEAREST);
	bool allowSRGBConversion =
		doFilter ||
		(src->getSampleCountFlagBits() > 1) ||
		(srcFormat.isSRGBformat() != dstFormat.isSRGBformat());

	State state(src->getFormat(srcAspect), dst->getFormat(dstAspect), src->getSampleCountFlagBits(), dst->getSampleCountFlagBits(),
	            Options{ doFilter, allowSRGBConversion });
	state.clampToEdge = (region.srcOffsets[0].x < 0) ||
	                    (region.srcOffsets[0].y < 0) ||
	                    (static_cast<uint32_t>(region.srcOffsets[1].x) > srcExtent.width) ||
	                    (static_cast<uint32_t>(region.srcOffsets[1].y) > srcExtent.height) ||
	                    (doFilter && ((x0 < 0.5f) || (y0 < 0.5f)));

	auto blitRoutine = getBlitRoutine(state);
	if(!blitRoutine)
	{
		return;
	}

	BlitData data =
	{
		nullptr, // source
		nullptr, // dest
		src->rowPitchBytes(srcAspect, region.srcSubresource.mipLevel),   // sPitchB
		dst->rowPitchBytes(dstAspect, region.dstSubresource.mipLevel),   // dPitchB
		src->slicePitchBytes(srcAspect, region.srcSubresource.mipLevel), // sSliceB
		dst->slicePitchBytes(dstAspect, region.dstSubresource.mipLevel), // dSliceB

		x0,
		y0,
		widthRatio,
		heightRatio,

		region.dstOffsets[0].y, // y0d
		region.dstOffsets[1].y, // y1d
		region.dstOffsets[0].x, // x0d
		region.dstOffsets[1].x, // x1d

		static_cast<int>(srcExtent.width), // sWidth
		static_cast<int>(srcExtent.height) // sHeight;
	};

	VkOffset3D srcOffset = { 0, 0, region.srcOffsets[0].z };
	VkOffset3D dstOffset = { 0, 0, region.dstOffsets[0].z };

	VkImageSubresourceLayers srcSubresLayers =
	{
		region.srcSubresource.aspectMask,
		region.srcSubresource.mipLevel,
		region.srcSubresource.baseArrayLayer,
		1
	};

	VkImageSubresourceLayers dstSubresLayers =
	{
		region.dstSubresource.aspectMask,
		region.dstSubresource.mipLevel,
		region.dstSubresource.baseArrayLayer,
		1
	};

	VkImageSubresourceRange srcSubresRange =
	{
		region.srcSubresource.aspectMask,
		region.srcSubresource.mipLevel,
		1,
		region.srcSubresource.baseArrayLayer,
		region.srcSubresource.layerCount
	};

	uint32_t lastLayer = src->getLastLayerIndex(srcSubresRange);

	for(; srcSubresLayers.baseArrayLayer <= lastLayer; srcSubresLayers.baseArrayLayer++, dstSubresLayers.baseArrayLayer++)
	{
		srcOffset.z = region.srcOffsets[0].z;
		dstOffset.z = region.dstOffsets[0].z;

		for(int i = 0; i < numSlices; i++)
		{
			data.source = src->getTexelPointer(srcOffset, srcSubresLayers);
			data.dest = dst->getTexelPointer(dstOffset, dstSubresLayers);

			ASSERT(data.source < src->end());
			ASSERT(data.dest < dst->end());

			blitRoutine(&data);
			srcOffset.z++;
			dstOffset.z++;
		}
	}
}

void Blitter::computeCubeCorner(Pointer<Byte>& layer, Int& x0, Int& x1, Int& y0, Int& y1, Int& pitchB, const State& state)
{
	int bytes = state.sourceFormat.bytes();

	Float4 c = readFloat4(layer + ComputeOffset(x0, y1, pitchB, bytes), state) +
	           readFloat4(layer + ComputeOffset(x1, y0, pitchB, bytes), state) +
	           readFloat4(layer + ComputeOffset(x1, y1, pitchB, bytes), state);

	c *= Float4(1.0f / 3.0f);

	write(c, layer + ComputeOffset(x0, y0, pitchB, bytes), state);
}

Blitter::CornerUpdateRoutineType Blitter::generateCornerUpdate(const State& state)
{
	// Reading and writing from/to the same image
	ASSERT(state.sourceFormat == state.destFormat);
	ASSERT(state.srcSamples == state.destSamples);

	if(state.srcSamples != 1)
	{
		UNIMPLEMENTED("state.srcSamples %d", state.srcSamples);
	}

	CornerUpdateFunction function;
	{
		Pointer<Byte> blit(function.Arg<0>());

		Pointer<Byte> layers = *Pointer<Pointer<Byte>>(blit + OFFSET(CubeBorderData, layers));
		Int pitchB = *Pointer<Int>(blit + OFFSET(CubeBorderData, pitchB));
		UInt layerSize = *Pointer<Int>(blit + OFFSET(CubeBorderData, layerSize));
		UInt dim = *Pointer<Int>(blit + OFFSET(CubeBorderData, dim));

		// Low Border, Low Pixel, High Border, High Pixel
		Int LB(-1), LP(0), HB(dim), HP(dim-1);

		for(int face = 0; face < 6; face++)
		{
			computeCubeCorner(layers, LB, LP, LB, LP, pitchB, state);
			computeCubeCorner(layers, LB, LP, HB, HP, pitchB, state);
			computeCubeCorner(layers, HB, HP, LB, LP, pitchB, state);
			computeCubeCorner(layers, HB, HP, HB, HP, pitchB, state);
			layers = layers + layerSize;
		}
	}

	return function("BlitRoutine");
}

void Blitter::updateBorders(vk::Image* image, const VkImageSubresourceLayers& subresourceLayers)
{
	if(image->getArrayLayers() < (subresourceLayers.baseArrayLayer + 6))
	{
		UNIMPLEMENTED("image->getArrayLayers() %d, baseArrayLayer %d",
		              image->getArrayLayers(), subresourceLayers.baseArrayLayer);
	}

	// From Vulkan 1.1 spec, section 11.5. Image Views:
	// "For cube and cube array image views, the layers of the image view starting
	//  at baseArrayLayer correspond to faces in the order +X, -X, +Y, -Y, +Z, -Z."
	VkImageSubresourceLayers posX = subresourceLayers;
	posX.layerCount = 1;
	VkImageSubresourceLayers negX = posX;
	negX.baseArrayLayer++;
	VkImageSubresourceLayers posY = negX;
	posY.baseArrayLayer++;
	VkImageSubresourceLayers negY = posY;
	negY.baseArrayLayer++;
	VkImageSubresourceLayers posZ = negY;
	posZ.baseArrayLayer++;
	VkImageSubresourceLayers negZ = posZ;
	negZ.baseArrayLayer++;

	// Copy top / bottom
	copyCubeEdge(image, posX, BOTTOM, negY, RIGHT);
	copyCubeEdge(image, posY, BOTTOM, posZ, TOP);
	copyCubeEdge(image, posZ, BOTTOM, negY, TOP);
	copyCubeEdge(image, negX, BOTTOM, negY, LEFT);
	copyCubeEdge(image, negY, BOTTOM, negZ, BOTTOM);
	copyCubeEdge(image, negZ, BOTTOM, negY, BOTTOM);

	copyCubeEdge(image, posX, TOP, posY, RIGHT);
	copyCubeEdge(image, posY, TOP, negZ, TOP);
	copyCubeEdge(image, posZ, TOP, posY, BOTTOM);
	copyCubeEdge(image, negX, TOP, posY, LEFT);
	copyCubeEdge(image, negY, TOP, posZ, BOTTOM);
	copyCubeEdge(image, negZ, TOP, posY, TOP);

	// Copy left / right
	copyCubeEdge(image, posX, RIGHT, negZ, LEFT);
	copyCubeEdge(image, posY, RIGHT, posX, TOP);
	copyCubeEdge(image, posZ, RIGHT, posX, LEFT);
	copyCubeEdge(image, negX, RIGHT, posZ, LEFT);
	copyCubeEdge(image, negY, RIGHT, posX, BOTTOM);
	copyCubeEdge(image, negZ, RIGHT, negX, LEFT);

	copyCubeEdge(image, posX, LEFT, posZ, RIGHT);
	copyCubeEdge(image, posY, LEFT, negX, TOP);
	copyCubeEdge(image, posZ, LEFT, negX, RIGHT);
	copyCubeEdge(image, negX, LEFT, negZ, RIGHT);
	copyCubeEdge(image, negY, LEFT, negX, BOTTOM);
	copyCubeEdge(image, negZ, LEFT, posX, RIGHT);

	// Compute corner colors
	VkImageAspectFlagBits aspect = static_cast<VkImageAspectFlagBits>(subresourceLayers.aspectMask);
	vk::Format format = image->getFormat(aspect);
	VkSampleCountFlagBits samples = image->getSampleCountFlagBits();
	State state(format, format, samples, samples, Options{ 0xF });

	if(samples != VK_SAMPLE_COUNT_1_BIT)
	{
		UNIMPLEMENTED("Multi-sampled cube: %d samples", static_cast<int>(samples));
	}

	auto cornerUpdateRoutine = getCornerUpdateRoutine(state);
	if(!cornerUpdateRoutine)
	{
		return;
	}

	VkExtent3D extent = image->getMipLevelExtent(aspect, subresourceLayers.mipLevel);
	CubeBorderData data =
	{
		image->getTexelPointer({ 0, 0, 0 }, posX),
		image->rowPitchBytes(aspect, subresourceLayers.mipLevel),
		static_cast<uint32_t>(image->getLayerSize(aspect)),
		extent.width
	};
	cornerUpdateRoutine(&data);
}

void Blitter::copyCubeEdge(vk::Image* image,
                           const VkImageSubresourceLayers& dstSubresourceLayers, Edge dstEdge,
                           const VkImageSubresourceLayers& srcSubresourceLayers, Edge srcEdge)
{
	ASSERT(srcSubresourceLayers.aspectMask == dstSubresourceLayers.aspectMask);
	ASSERT(srcSubresourceLayers.mipLevel == dstSubresourceLayers.mipLevel);
	ASSERT(srcSubresourceLayers.baseArrayLayer != dstSubresourceLayers.baseArrayLayer);
	ASSERT(srcSubresourceLayers.layerCount == 1);
	ASSERT(dstSubresourceLayers.layerCount == 1);

	// Figure out if the edges to be copied in reverse order respectively from one another
	// The copy should be reversed whenever the same edges are contiguous or if we're
	// copying top <-> right or bottom <-> left. This is explained by the layout, which is:
	//
	//      | +y |
	// | -x | +z | +x | -z |
	//      | -y |

	bool reverse = (srcEdge == dstEdge) ||
	               ((srcEdge == TOP) && (dstEdge == RIGHT)) ||
	               ((srcEdge == RIGHT) && (dstEdge == TOP)) ||
	               ((srcEdge == BOTTOM) && (dstEdge == LEFT)) ||
	               ((srcEdge == LEFT) && (dstEdge == BOTTOM));

	VkImageAspectFlagBits aspect = static_cast<VkImageAspectFlagBits>(srcSubresourceLayers.aspectMask);
	int bytes = image->getFormat(aspect).bytes();
	int pitchB = image->rowPitchBytes(aspect, srcSubresourceLayers.mipLevel);

	VkExtent3D extent = image->getMipLevelExtent(aspect, srcSubresourceLayers.mipLevel);
	int w = extent.width;
	int h = extent.height;
	if(w != h)
	{
		UNSUPPORTED("Cube doesn't have square faces : (%d, %d)", w, h);
	}

	// Src is expressed in the regular [0, width-1], [0, height-1] space
	bool srcHorizontal = ((srcEdge == TOP) || (srcEdge == BOTTOM));
	int srcDelta = srcHorizontal ? bytes : pitchB;
	VkOffset3D srcOffset = { (srcEdge == RIGHT) ? (w - 1) : 0, (srcEdge == BOTTOM) ? (h - 1) : 0, 0 };

	// Dst contains borders, so it is expressed in the [-1, width], [-1, height] space
	bool dstHorizontal = ((dstEdge == TOP) || (dstEdge == BOTTOM));
	int dstDelta = (dstHorizontal ? bytes : pitchB) * (reverse ? -1 : 1);
	VkOffset3D dstOffset = { (dstEdge == RIGHT) ? w : -1, (dstEdge == BOTTOM) ? h : -1, 0 };

	// Don't write in the corners
	if(dstHorizontal)
	{
		dstOffset.x += reverse ? w : 1;
	}
	else
	{
		dstOffset.y += reverse ? h : 1;
	}

	const uint8_t* src = static_cast<const uint8_t*>(image->getTexelPointer(srcOffset, srcSubresourceLayers));
	uint8_t *dst = static_cast<uint8_t*>(image->getTexelPointer(dstOffset, dstSubresourceLayers));
	ASSERT((src < image->end()) && ((src + (w * srcDelta)) < image->end()));
	ASSERT((dst < image->end()) && ((dst + (w * dstDelta)) < image->end()));

	for(int i = 0; i < w; ++i, dst += dstDelta, src += srcDelta)
	{
		memcpy(dst, src, bytes);
	}
}

}  // namepspace sw
