// 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 "SamplerCore.hpp"

#include "Constants.hpp"
#include "PixelRoutine.hpp"
#include "System/Debug.hpp"
#include "Vulkan/VkSampler.hpp"

namespace sw {

SamplerCore::SamplerCore(Pointer<Byte> &constants, const Sampler &state)
    : constants(constants)
    , state(state)
{
}
Vector4f SamplerCore::sampleTexture(Pointer<Byte> &texture, Float4 uvwa[4], Float4 &dRef, Float &&lodOrBias, Float4 &dsx, Float4 &dsy, Vector4i &offset, Int4 &sample, SamplerFunction function)
{
	Vector4f c;

	Float4 u = uvwa[0];
	Float4 v = uvwa[1];
	Float4 w = uvwa[2];
	Float4 a;  // Array layer coordinate
	switch(state.textureType)
	{
		case VK_IMAGE_VIEW_TYPE_1D_ARRAY: a = uvwa[1]; break;
		case VK_IMAGE_VIEW_TYPE_2D_ARRAY: a = uvwa[2]; break;
		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: a = uvwa[3]; break;
		default: break;
	}

	Float lod;
	Float anisotropy;
	Float4 uDelta;
	Float4 vDelta;
	Float4 M;  // Major axis

	if(state.isCube())
	{
		Int4 face = cubeFace(u, v, uvwa[0], uvwa[1], uvwa[2], M);
		w = As<Float4>(face);
	}

	if(function == Implicit || function == Bias || function == Grad || function == Query)
	{
		if(state.is1D())
		{
			computeLod1D(texture, lod, u, dsx, dsy, function);
		}
		else if(state.is2D())
		{
			computeLod2D(texture, lod, anisotropy, uDelta, vDelta, u, v, dsx, dsy, function);
		}
		else if(state.isCube())
		{
			computeLodCube(texture, lod, uvwa[0], uvwa[1], uvwa[2], dsx, dsy, M, function);
		}
		else
		{
			computeLod3D(texture, lod, u, v, w, dsx, dsy, function);
		}

		Float bias = state.mipLodBias;

		if(function == Bias)
		{
			// Add SPIR-V Bias operand to the sampler provided bias and clamp to maxSamplerLodBias limit.
			bias = Min(Max(bias + lodOrBias, -vk::MAX_SAMPLER_LOD_BIAS), vk::MAX_SAMPLER_LOD_BIAS);
		}

		lod += bias;
	}
	else if(function == Lod)
	{
		// Vulkan 1.1: "The absolute value of mipLodBias must be less than or equal to VkPhysicalDeviceLimits::maxSamplerLodBias"
		// Hence no explicit clamping to maxSamplerLodBias is required in this case.
		lod = lodOrBias + state.mipLodBias;
	}
	else if(function == Fetch)
	{
		// TODO: Eliminate int-float-int conversion.
		lod = Float(As<Int>(lodOrBias));
	}
	else if(function == Base || function == Gather)
	{
		lod = Float(0);
	}
	else
		UNREACHABLE("Sampler function %d", int(function));

	if(function != Base && function != Fetch && function != Gather)
	{
		if(function == Query)
		{
			c.y = Float4(lod);  // Unclamped LOD.
		}

		lod = Max(lod, state.minLod);
		lod = Min(lod, state.maxLod);

		if(function == Query)
		{
			if(state.mipmapFilter == MIPMAP_POINT)
			{
				lod = Round(lod);  // TODO: Preferred formula is ceil(lod + 0.5) - 1
			}

			c.x = lod;
			//	c.y contains unclamped LOD.

			return c;
		}
	}

	bool force32BitFiltering = state.highPrecisionFiltering && !isYcbcrFormat() && (state.textureFilter != FILTER_POINT);
	bool use32BitFiltering = hasFloatTexture() || hasUnnormalizedIntegerTexture() || force32BitFiltering ||
	                         state.isCube() || state.unnormalizedCoordinates || state.compareEnable ||
	                         borderModeActive() || (function == Gather) || (function == Fetch);

	if(use32BitFiltering)
	{
		c = sampleFloatFilter(texture, u, v, w, a, dRef, offset, sample, lod, anisotropy, uDelta, vDelta, function);

		if(!hasFloatTexture() && !hasUnnormalizedIntegerTexture() && !state.compareEnable)
		{
			switch(state.textureFormat)
			{
				case VK_FORMAT_R5G6B5_UNORM_PACK16:
					c.x *= Float4(1.0f / 0xF800);
					c.y *= Float4(1.0f / 0xFC00);
					c.z *= Float4(1.0f / 0xF800);
					break;
				case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
					c.x *= Float4(1.0f / 0xF000);
					c.y *= Float4(1.0f / 0xF000);
					c.z *= Float4(1.0f / 0xF000);
					c.w *= Float4(1.0f / 0xF000);
					break;
				case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
					c.x *= Float4(1.0f / 0xF800);
					c.y *= Float4(1.0f / 0xF800);
					c.z *= Float4(1.0f / 0xF800);
					c.w *= Float4(1.0f / 0x8000);
					break;
				case VK_FORMAT_R8_SNORM:
				case VK_FORMAT_R8G8_SNORM:
				case VK_FORMAT_R8G8B8A8_SNORM:
				case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
					c.x = Max(c.x * Float4(1.0f / 0x7F00), Float4(-1.0f));
					c.y = Max(c.y * Float4(1.0f / 0x7F00), Float4(-1.0f));
					c.z = Max(c.z * Float4(1.0f / 0x7F00), Float4(-1.0f));
					c.w = Max(c.w * Float4(1.0f / 0x7F00), Float4(-1.0f));
					break;
				case VK_FORMAT_R8_UNORM:
				case VK_FORMAT_R8G8_UNORM:
				case VK_FORMAT_R8G8B8A8_UNORM:
				case VK_FORMAT_B8G8R8A8_UNORM:
				case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
				case VK_FORMAT_B8G8R8A8_SRGB:
				case VK_FORMAT_R8G8B8A8_SRGB:
				case VK_FORMAT_R8_SRGB:
				case VK_FORMAT_R8G8_SRGB:
					c.x *= Float4(1.0f / 0xFF00u);
					c.y *= Float4(1.0f / 0xFF00u);
					c.z *= Float4(1.0f / 0xFF00u);
					c.w *= Float4(1.0f / 0xFF00u);
					break;
				case VK_FORMAT_R16_SNORM:
				case VK_FORMAT_R16G16_SNORM:
				case VK_FORMAT_R16G16B16A16_SNORM:
					c.x = Max(c.x * Float4(1.0f / 0x7FFF), Float4(-1.0f));
					c.y = Max(c.y * Float4(1.0f / 0x7FFF), Float4(-1.0f));
					c.z = Max(c.z * Float4(1.0f / 0x7FFF), Float4(-1.0f));
					c.w = Max(c.w * Float4(1.0f / 0x7FFF), Float4(-1.0f));
					break;
				default:
					for(int component = 0; component < textureComponentCount(); component++)
					{
						c[component] *= Float4(hasUnsignedTextureComponent(component) ? 1.0f / 0xFFFF : 1.0f / 0x7FFF);
					}
			}
		}
	}
	else  // 16-bit filtering.
	{
		Vector4s cs = sampleFilter(texture, u, v, w, a, offset, sample, lod, anisotropy, uDelta, vDelta, function);

		switch(state.textureFormat)
		{
			case VK_FORMAT_R5G6B5_UNORM_PACK16:
				c.x = Float4(As<UShort4>(cs.x)) * Float4(1.0f / 0xF800);
				c.y = Float4(As<UShort4>(cs.y)) * Float4(1.0f / 0xFC00);
				c.z = Float4(As<UShort4>(cs.z)) * Float4(1.0f / 0xF800);
				break;
			case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
				c.x = Float4(As<UShort4>(cs.x)) * Float4(1.0f / 0xF000);
				c.y = Float4(As<UShort4>(cs.y)) * Float4(1.0f / 0xF000);
				c.z = Float4(As<UShort4>(cs.z)) * Float4(1.0f / 0xF000);
				c.w = Float4(As<UShort4>(cs.w)) * Float4(1.0f / 0xF000);
				break;
			case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
				c.x = Float4(As<UShort4>(cs.x)) * Float4(1.0f / 0xF800);
				c.y = Float4(As<UShort4>(cs.y)) * Float4(1.0f / 0xF800);
				c.z = Float4(As<UShort4>(cs.z)) * Float4(1.0f / 0xF800);
				c.w = Float4(As<UShort4>(cs.w)) * Float4(1.0f / 0x8000);
				break;
			case VK_FORMAT_R8_SNORM:
			case VK_FORMAT_R8G8_SNORM:
			case VK_FORMAT_R8G8B8A8_SNORM:
			case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
				c.x = Max(Float4(cs.x) * Float4(1.0f / 0x7F00), Float4(-1.0f));
				c.y = Max(Float4(cs.y) * Float4(1.0f / 0x7F00), Float4(-1.0f));
				c.z = Max(Float4(cs.z) * Float4(1.0f / 0x7F00), Float4(-1.0f));
				c.w = Max(Float4(cs.w) * Float4(1.0f / 0x7F00), Float4(-1.0f));
				break;
			case VK_FORMAT_R8_UNORM:
			case VK_FORMAT_R8G8_UNORM:
			case VK_FORMAT_R8G8B8A8_UNORM:
			case VK_FORMAT_B8G8R8A8_UNORM:
			case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
			case VK_FORMAT_B8G8R8A8_SRGB:
			case VK_FORMAT_R8G8B8A8_SRGB:
			case VK_FORMAT_R8_SRGB:
			case VK_FORMAT_R8G8_SRGB:
				c.x = Float4(As<UShort4>(cs.x)) * Float4(1.0f / 0xFF00u);
				c.y = Float4(As<UShort4>(cs.y)) * Float4(1.0f / 0xFF00u);
				c.z = Float4(As<UShort4>(cs.z)) * Float4(1.0f / 0xFF00u);
				c.w = Float4(As<UShort4>(cs.w)) * Float4(1.0f / 0xFF00u);
				break;
			case VK_FORMAT_R16_SNORM:
			case VK_FORMAT_R16G16_SNORM:
			case VK_FORMAT_R16G16B16A16_SNORM:
				c.x = Max(Float4(cs.x) * Float4(1.0f / 0x7FFF), Float4(-1.0f));
				c.y = Max(Float4(cs.y) * Float4(1.0f / 0x7FFF), Float4(-1.0f));
				c.z = Max(Float4(cs.z) * Float4(1.0f / 0x7FFF), Float4(-1.0f));
				c.w = Max(Float4(cs.w) * Float4(1.0f / 0x7FFF), Float4(-1.0f));
				break;
			default:
				for(int component = 0; component < textureComponentCount(); component++)
				{
					if(hasUnsignedTextureComponent(component))
					{
						convertUnsigned16(c[component], cs[component]);
					}
					else
					{
						convertSigned15(c[component], cs[component]);
					}
				}
		}
	}

	if(state.textureFilter != FILTER_GATHER)
	{
		if((state.swizzle.r != VK_COMPONENT_SWIZZLE_R) ||
		   (state.swizzle.g != VK_COMPONENT_SWIZZLE_G) ||
		   (state.swizzle.b != VK_COMPONENT_SWIZZLE_B) ||
		   (state.swizzle.a != VK_COMPONENT_SWIZZLE_A))
		{
			const Vector4f col = c;
			bool integer = hasUnnormalizedIntegerTexture();
			c.x = applySwizzle(col, state.swizzle.r, integer);
			c.y = applySwizzle(col, state.swizzle.g, integer);
			c.z = applySwizzle(col, state.swizzle.b, integer);
			c.w = applySwizzle(col, state.swizzle.a, integer);
		}
	}
	else  // Gather
	{
		VkComponentSwizzle swizzle = gatherSwizzle();

		// R/G/B/A swizzles affect the component collected from each texel earlier.
		// Handle the ZERO and ONE cases here because we don't need to know the format.

		if(swizzle == VK_COMPONENT_SWIZZLE_ZERO)
		{
			c.x = c.y = c.z = c.w = Float4(0);
		}
		else if(swizzle == VK_COMPONENT_SWIZZLE_ONE)
		{
			bool integer = hasUnnormalizedIntegerTexture();
			c.x = c.y = c.z = c.w = integer ? As<Float4>(Int4(1)) : RValue<Float4>(Float4(1.0f));
		}
	}

	return c;
}

Float4 SamplerCore::applySwizzle(const Vector4f &c, VkComponentSwizzle swizzle, bool integer)
{
	switch(swizzle)
	{
		default: UNSUPPORTED("VkComponentSwizzle %d", (int)swizzle);
		case VK_COMPONENT_SWIZZLE_R: return c.x;
		case VK_COMPONENT_SWIZZLE_G: return c.y;
		case VK_COMPONENT_SWIZZLE_B: return c.z;
		case VK_COMPONENT_SWIZZLE_A: return c.w;
		case VK_COMPONENT_SWIZZLE_ZERO: return Float4(0.0f, 0.0f, 0.0f, 0.0f);
		case VK_COMPONENT_SWIZZLE_ONE:
			if(integer)
			{
				return Float4(As<Float4>(sw::Int4(1, 1, 1, 1)));
			}
			else
			{
				return Float4(1.0f, 1.0f, 1.0f, 1.0f);
			}
			break;
	}
};

Short4 SamplerCore::offsetSample(Short4 &uvw, Pointer<Byte> &mipmap, int halfOffset, bool wrap, int count, Float &lod)
{
	Short4 offset = *Pointer<Short4>(mipmap + halfOffset);

	if(state.textureFilter == FILTER_MIN_LINEAR_MAG_POINT)
	{
		offset &= Short4(CmpNLE(Float4(lod), Float4(0.0f)));
	}
	else if(state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
	{
		offset &= Short4(CmpLE(Float4(lod), Float4(0.0f)));
	}

	if(wrap)
	{
		switch(count)
		{
			case -1: return uvw - offset;
			case 0: return uvw;
			case +1: return uvw + offset;
			case 2: return uvw + offset + offset;
		}
	}
	else  // Clamp or mirror
	{
		switch(count)
		{
			case -1: return SubSat(As<UShort4>(uvw), As<UShort4>(offset));
			case 0: return uvw;
			case +1: return AddSat(As<UShort4>(uvw), As<UShort4>(offset));
			case 2: return AddSat(AddSat(As<UShort4>(uvw), As<UShort4>(offset)), As<UShort4>(offset));
		}
	}

	return uvw;
}

Vector4s SamplerCore::sampleFilter(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, const Float4 &a, Vector4i &offset, const Int4 &sample, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, SamplerFunction function)
{
	Vector4s c = sampleAniso(texture, u, v, w, a, offset, sample, lod, anisotropy, uDelta, vDelta, false, function);

	if(function == Fetch)
	{
		return c;
	}

	if(state.mipmapFilter == MIPMAP_LINEAR)
	{
		Vector4s cc = sampleAniso(texture, u, v, w, a, offset, sample, lod, anisotropy, uDelta, vDelta, true, function);

		lod *= Float(1 << 16);

		UShort4 utri = UShort4(Float4(lod));  // FIXME: Optimize
		Short4 stri = utri >> 1;              // FIXME: Optimize

		if(hasUnsignedTextureComponent(0))
			cc.x = MulHigh(As<UShort4>(cc.x), utri);
		else
			cc.x = MulHigh(cc.x, stri);
		if(hasUnsignedTextureComponent(1))
			cc.y = MulHigh(As<UShort4>(cc.y), utri);
		else
			cc.y = MulHigh(cc.y, stri);
		if(hasUnsignedTextureComponent(2))
			cc.z = MulHigh(As<UShort4>(cc.z), utri);
		else
			cc.z = MulHigh(cc.z, stri);
		if(hasUnsignedTextureComponent(3))
			cc.w = MulHigh(As<UShort4>(cc.w), utri);
		else
			cc.w = MulHigh(cc.w, stri);

		utri = ~utri;
		stri = Short4(0x7FFF) - stri;

		if(hasUnsignedTextureComponent(0))
			c.x = MulHigh(As<UShort4>(c.x), utri);
		else
			c.x = MulHigh(c.x, stri);
		if(hasUnsignedTextureComponent(1))
			c.y = MulHigh(As<UShort4>(c.y), utri);
		else
			c.y = MulHigh(c.y, stri);
		if(hasUnsignedTextureComponent(2))
			c.z = MulHigh(As<UShort4>(c.z), utri);
		else
			c.z = MulHigh(c.z, stri);
		if(hasUnsignedTextureComponent(3))
			c.w = MulHigh(As<UShort4>(c.w), utri);
		else
			c.w = MulHigh(c.w, stri);

		c.x += cc.x;
		c.y += cc.y;
		c.z += cc.z;
		c.w += cc.w;

		if(!hasUnsignedTextureComponent(0)) c.x += c.x;
		if(!hasUnsignedTextureComponent(1)) c.y += c.y;
		if(!hasUnsignedTextureComponent(2)) c.z += c.z;
		if(!hasUnsignedTextureComponent(3)) c.w += c.w;
	}

	return c;
}

Vector4s SamplerCore::sampleAniso(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, const Float4 &a, Vector4i &offset, const Int4 &sample, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, bool secondLOD, SamplerFunction function)
{
	Vector4s c;

	if(state.textureFilter != FILTER_ANISOTROPIC)
	{
		c = sampleQuad(texture, u, v, w, a, offset, sample, lod, secondLOD, function);
	}
	else
	{
		Int N = RoundInt(anisotropy);

		Vector4s cSum;

		cSum.x = Short4(0);
		cSum.y = Short4(0);
		cSum.z = Short4(0);
		cSum.w = Short4(0);

		Float4 A = *Pointer<Float4>(constants + OFFSET(Constants, uvWeight) + 16 * N);
		Float4 B = *Pointer<Float4>(constants + OFFSET(Constants, uvStart) + 16 * N);
		UShort4 cw = *Pointer<UShort4>(constants + OFFSET(Constants, cWeight) + 8 * N);
		Short4 sw = Short4(cw >> 1);

		Float4 du = uDelta;
		Float4 dv = vDelta;

		Float4 u0 = u + B * du;
		Float4 v0 = v + B * dv;

		du *= A;
		dv *= A;

		Int i = 0;

		Do
		{
			c = sampleQuad(texture, u0, v0, w, a, offset, sample, lod, secondLOD, function);

			u0 += du;
			v0 += dv;

			if(hasUnsignedTextureComponent(0))
				cSum.x += As<Short4>(MulHigh(As<UShort4>(c.x), cw));
			else
				cSum.x += MulHigh(c.x, sw);
			if(hasUnsignedTextureComponent(1))
				cSum.y += As<Short4>(MulHigh(As<UShort4>(c.y), cw));
			else
				cSum.y += MulHigh(c.y, sw);
			if(hasUnsignedTextureComponent(2))
				cSum.z += As<Short4>(MulHigh(As<UShort4>(c.z), cw));
			else
				cSum.z += MulHigh(c.z, sw);
			if(hasUnsignedTextureComponent(3))
				cSum.w += As<Short4>(MulHigh(As<UShort4>(c.w), cw));
			else
				cSum.w += MulHigh(c.w, sw);

			i++;
		}
		Until(i >= N);

		if(hasUnsignedTextureComponent(0))
			c.x = cSum.x;
		else
			c.x = AddSat(cSum.x, cSum.x);
		if(hasUnsignedTextureComponent(1))
			c.y = cSum.y;
		else
			c.y = AddSat(cSum.y, cSum.y);
		if(hasUnsignedTextureComponent(2))
			c.z = cSum.z;
		else
			c.z = AddSat(cSum.z, cSum.z);
		if(hasUnsignedTextureComponent(3))
			c.w = cSum.w;
		else
			c.w = AddSat(cSum.w, cSum.w);
	}

	return c;
}

Vector4s SamplerCore::sampleQuad(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, const Float4 &a, Vector4i &offset, const Int4 &sample, Float &lod, bool secondLOD, SamplerFunction function)
{
	if(state.textureType != VK_IMAGE_VIEW_TYPE_3D)
	{
		return sampleQuad2D(texture, u, v, w, a, offset, sample, lod, secondLOD, function);
	}
	else
	{
		return sample3D(texture, u, v, w, offset, sample, lod, secondLOD, function);
	}
}

Vector4s SamplerCore::sampleQuad2D(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, const Float4 &a, Vector4i &offset, const Int4 &sample, Float &lod, bool secondLOD, SamplerFunction function)
{
	Vector4s c;

	int componentCount = textureComponentCount();
	bool gather = (state.textureFilter == FILTER_GATHER);

	Pointer<Byte> mipmap;
	Pointer<Byte> buffer;
	selectMipmap(texture, mipmap, buffer, lod, secondLOD);

	Short4 uuuu = address(u, state.addressingModeU, mipmap);
	Short4 vvvv = address(v, state.addressingModeV, mipmap);
	Short4 wwww = address(w, state.addressingModeW, mipmap);
	Short4 layerIndex = computeLayerIndex(a, mipmap);

	if(state.textureFilter == FILTER_POINT)
	{
		c = sampleTexel(uuuu, vvvv, wwww, layerIndex, offset, sample, mipmap, buffer, function);
	}
	else
	{
		Short4 uuuu0 = offsetSample(uuuu, mipmap, OFFSET(Mipmap, uHalf), state.addressingModeU == ADDRESSING_WRAP, -1, lod);
		Short4 vvvv0 = offsetSample(vvvv, mipmap, OFFSET(Mipmap, vHalf), state.addressingModeV == ADDRESSING_WRAP, -1, lod);
		Short4 uuuu1 = offsetSample(uuuu, mipmap, OFFSET(Mipmap, uHalf), state.addressingModeU == ADDRESSING_WRAP, +1, lod);
		Short4 vvvv1 = offsetSample(vvvv, mipmap, OFFSET(Mipmap, vHalf), state.addressingModeV == ADDRESSING_WRAP, +1, lod);

		Vector4s c00 = sampleTexel(uuuu0, vvvv0, wwww, layerIndex, offset, sample, mipmap, buffer, function);
		Vector4s c10 = sampleTexel(uuuu1, vvvv0, wwww, layerIndex, offset, sample, mipmap, buffer, function);
		Vector4s c01 = sampleTexel(uuuu0, vvvv1, wwww, layerIndex, offset, sample, mipmap, buffer, function);
		Vector4s c11 = sampleTexel(uuuu1, vvvv1, wwww, layerIndex, offset, sample, mipmap, buffer, function);

		if(!gather)  // Blend
		{
			// Fractions
			UShort4 f0u = As<UShort4>(uuuu0) * UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, width)));
			UShort4 f0v = As<UShort4>(vvvv0) * UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, height)));

			UShort4 f1u = ~f0u;
			UShort4 f1v = ~f0v;

			UShort4 f0u0v = MulHigh(f0u, f0v);
			UShort4 f1u0v = MulHigh(f1u, f0v);
			UShort4 f0u1v = MulHigh(f0u, f1v);
			UShort4 f1u1v = MulHigh(f1u, f1v);

			// Signed fractions
			Short4 f1u1vs;
			Short4 f0u1vs;
			Short4 f1u0vs;
			Short4 f0u0vs;

			if(!hasUnsignedTextureComponent(0) || !hasUnsignedTextureComponent(1) || !hasUnsignedTextureComponent(2) || !hasUnsignedTextureComponent(3))
			{
				f1u1vs = f1u1v >> 1;
				f0u1vs = f0u1v >> 1;
				f1u0vs = f1u0v >> 1;
				f0u0vs = f0u0v >> 1;
			}

			// Bilinear interpolation
			if(componentCount >= 1)
			{
				if(has16bitTextureComponents() && hasUnsignedTextureComponent(0))
				{
					c00.x = As<UShort4>(c00.x) - MulHigh(As<UShort4>(c00.x), f0u) + MulHigh(As<UShort4>(c10.x), f0u);
					c01.x = As<UShort4>(c01.x) - MulHigh(As<UShort4>(c01.x), f0u) + MulHigh(As<UShort4>(c11.x), f0u);
					c.x = As<UShort4>(c00.x) - MulHigh(As<UShort4>(c00.x), f0v) + MulHigh(As<UShort4>(c01.x), f0v);
				}
				else
				{
					if(hasUnsignedTextureComponent(0))
					{
						c00.x = MulHigh(As<UShort4>(c00.x), f1u1v);
						c10.x = MulHigh(As<UShort4>(c10.x), f0u1v);
						c01.x = MulHigh(As<UShort4>(c01.x), f1u0v);
						c11.x = MulHigh(As<UShort4>(c11.x), f0u0v);
					}
					else
					{
						c00.x = MulHigh(c00.x, f1u1vs);
						c10.x = MulHigh(c10.x, f0u1vs);
						c01.x = MulHigh(c01.x, f1u0vs);
						c11.x = MulHigh(c11.x, f0u0vs);
					}

					c.x = (c00.x + c10.x) + (c01.x + c11.x);
					if(!hasUnsignedTextureComponent(0)) c.x = AddSat(c.x, c.x);  // Correct for signed fractions
				}
			}

			if(componentCount >= 2)
			{
				if(has16bitTextureComponents() && hasUnsignedTextureComponent(1))
				{
					c00.y = As<UShort4>(c00.y) - MulHigh(As<UShort4>(c00.y), f0u) + MulHigh(As<UShort4>(c10.y), f0u);
					c01.y = As<UShort4>(c01.y) - MulHigh(As<UShort4>(c01.y), f0u) + MulHigh(As<UShort4>(c11.y), f0u);
					c.y = As<UShort4>(c00.y) - MulHigh(As<UShort4>(c00.y), f0v) + MulHigh(As<UShort4>(c01.y), f0v);
				}
				else
				{
					if(hasUnsignedTextureComponent(1))
					{
						c00.y = MulHigh(As<UShort4>(c00.y), f1u1v);
						c10.y = MulHigh(As<UShort4>(c10.y), f0u1v);
						c01.y = MulHigh(As<UShort4>(c01.y), f1u0v);
						c11.y = MulHigh(As<UShort4>(c11.y), f0u0v);
					}
					else
					{
						c00.y = MulHigh(c00.y, f1u1vs);
						c10.y = MulHigh(c10.y, f0u1vs);
						c01.y = MulHigh(c01.y, f1u0vs);
						c11.y = MulHigh(c11.y, f0u0vs);
					}

					c.y = (c00.y + c10.y) + (c01.y + c11.y);
					if(!hasUnsignedTextureComponent(1)) c.y = AddSat(c.y, c.y);  // Correct for signed fractions
				}
			}

			if(componentCount >= 3)
			{
				if(has16bitTextureComponents() && hasUnsignedTextureComponent(2))
				{
					c00.z = As<UShort4>(c00.z) - MulHigh(As<UShort4>(c00.z), f0u) + MulHigh(As<UShort4>(c10.z), f0u);
					c01.z = As<UShort4>(c01.z) - MulHigh(As<UShort4>(c01.z), f0u) + MulHigh(As<UShort4>(c11.z), f0u);
					c.z = As<UShort4>(c00.z) - MulHigh(As<UShort4>(c00.z), f0v) + MulHigh(As<UShort4>(c01.z), f0v);
				}
				else
				{
					if(hasUnsignedTextureComponent(2))
					{
						c00.z = MulHigh(As<UShort4>(c00.z), f1u1v);
						c10.z = MulHigh(As<UShort4>(c10.z), f0u1v);
						c01.z = MulHigh(As<UShort4>(c01.z), f1u0v);
						c11.z = MulHigh(As<UShort4>(c11.z), f0u0v);
					}
					else
					{
						c00.z = MulHigh(c00.z, f1u1vs);
						c10.z = MulHigh(c10.z, f0u1vs);
						c01.z = MulHigh(c01.z, f1u0vs);
						c11.z = MulHigh(c11.z, f0u0vs);
					}

					c.z = (c00.z + c10.z) + (c01.z + c11.z);
					if(!hasUnsignedTextureComponent(2)) c.z = AddSat(c.z, c.z);  // Correct for signed fractions
				}
			}

			if(componentCount >= 4)
			{
				if(has16bitTextureComponents() && hasUnsignedTextureComponent(3))
				{
					c00.w = As<UShort4>(c00.w) - MulHigh(As<UShort4>(c00.w), f0u) + MulHigh(As<UShort4>(c10.w), f0u);
					c01.w = As<UShort4>(c01.w) - MulHigh(As<UShort4>(c01.w), f0u) + MulHigh(As<UShort4>(c11.w), f0u);
					c.w = As<UShort4>(c00.w) - MulHigh(As<UShort4>(c00.w), f0v) + MulHigh(As<UShort4>(c01.w), f0v);
				}
				else
				{
					if(hasUnsignedTextureComponent(3))
					{
						c00.w = MulHigh(As<UShort4>(c00.w), f1u1v);
						c10.w = MulHigh(As<UShort4>(c10.w), f0u1v);
						c01.w = MulHigh(As<UShort4>(c01.w), f1u0v);
						c11.w = MulHigh(As<UShort4>(c11.w), f0u0v);
					}
					else
					{
						c00.w = MulHigh(c00.w, f1u1vs);
						c10.w = MulHigh(c10.w, f0u1vs);
						c01.w = MulHigh(c01.w, f1u0vs);
						c11.w = MulHigh(c11.w, f0u0vs);
					}

					c.w = (c00.w + c10.w) + (c01.w + c11.w);
					if(!hasUnsignedTextureComponent(3)) c.w = AddSat(c.w, c.w);  // Correct for signed fractions
				}
			}
		}
		else  // Gather
		{
			VkComponentSwizzle swizzle = gatherSwizzle();
			switch(swizzle)
			{
				case VK_COMPONENT_SWIZZLE_ZERO:
				case VK_COMPONENT_SWIZZLE_ONE:
					// Handled at the final component swizzle.
					break;
				default:
					c.x = c01[swizzle - VK_COMPONENT_SWIZZLE_R];
					c.y = c11[swizzle - VK_COMPONENT_SWIZZLE_R];
					c.z = c10[swizzle - VK_COMPONENT_SWIZZLE_R];
					c.w = c00[swizzle - VK_COMPONENT_SWIZZLE_R];
					break;
			}
		}
	}

	return c;
}

Vector4s SamplerCore::sample3D(Pointer<Byte> &texture, Float4 &u_, Float4 &v_, Float4 &w_, Vector4i &offset, const Int4 &sample, Float &lod, bool secondLOD, SamplerFunction function)
{
	Vector4s c_;

	int componentCount = textureComponentCount();

	Pointer<Byte> mipmap;
	Pointer<Byte> buffer;
	selectMipmap(texture, mipmap, buffer, lod, secondLOD);

	Short4 uuuu = address(u_, state.addressingModeU, mipmap);
	Short4 vvvv = address(v_, state.addressingModeV, mipmap);
	Short4 wwww = address(w_, state.addressingModeW, mipmap);

	if(state.textureFilter == FILTER_POINT)
	{
		c_ = sampleTexel(uuuu, vvvv, wwww, 0, offset, sample, mipmap, buffer, function);
	}
	else
	{
		Vector4s c[2][2][2];

		Short4 u[2][2][2];
		Short4 v[2][2][2];
		Short4 s[2][2][2];

		for(int i = 0; i < 2; i++)
		{
			for(int j = 0; j < 2; j++)
			{
				for(int k = 0; k < 2; k++)
				{
					u[i][j][k] = offsetSample(uuuu, mipmap, OFFSET(Mipmap, uHalf), state.addressingModeU == ADDRESSING_WRAP, i * 2 - 1, lod);
					v[i][j][k] = offsetSample(vvvv, mipmap, OFFSET(Mipmap, vHalf), state.addressingModeV == ADDRESSING_WRAP, j * 2 - 1, lod);
					s[i][j][k] = offsetSample(wwww, mipmap, OFFSET(Mipmap, wHalf), state.addressingModeW == ADDRESSING_WRAP, k * 2 - 1, lod);
				}
			}
		}

		// Fractions
		UShort4 f0u = As<UShort4>(u[0][0][0]) * UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, width)));
		UShort4 f0v = As<UShort4>(v[0][0][0]) * UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, height)));
		UShort4 f0s = As<UShort4>(s[0][0][0]) * UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, depth)));

		UShort4 f1u = ~f0u;
		UShort4 f1v = ~f0v;
		UShort4 f1s = ~f0s;

		UShort4 f[2][2][2];
		Short4 fs[2][2][2];

		f[1][1][1] = MulHigh(f1u, f1v);
		f[0][1][1] = MulHigh(f0u, f1v);
		f[1][0][1] = MulHigh(f1u, f0v);
		f[0][0][1] = MulHigh(f0u, f0v);
		f[1][1][0] = MulHigh(f1u, f1v);
		f[0][1][0] = MulHigh(f0u, f1v);
		f[1][0][0] = MulHigh(f1u, f0v);
		f[0][0][0] = MulHigh(f0u, f0v);

		f[1][1][1] = MulHigh(f[1][1][1], f1s);
		f[0][1][1] = MulHigh(f[0][1][1], f1s);
		f[1][0][1] = MulHigh(f[1][0][1], f1s);
		f[0][0][1] = MulHigh(f[0][0][1], f1s);
		f[1][1][0] = MulHigh(f[1][1][0], f0s);
		f[0][1][0] = MulHigh(f[0][1][0], f0s);
		f[1][0][0] = MulHigh(f[1][0][0], f0s);
		f[0][0][0] = MulHigh(f[0][0][0], f0s);

		// Signed fractions
		if(!hasUnsignedTextureComponent(0) || !hasUnsignedTextureComponent(1) || !hasUnsignedTextureComponent(2) || !hasUnsignedTextureComponent(3))
		{
			fs[0][0][0] = f[0][0][0] >> 1;
			fs[0][0][1] = f[0][0][1] >> 1;
			fs[0][1][0] = f[0][1][0] >> 1;
			fs[0][1][1] = f[0][1][1] >> 1;
			fs[1][0][0] = f[1][0][0] >> 1;
			fs[1][0][1] = f[1][0][1] >> 1;
			fs[1][1][0] = f[1][1][0] >> 1;
			fs[1][1][1] = f[1][1][1] >> 1;
		}

		for(int i = 0; i < 2; i++)
		{
			for(int j = 0; j < 2; j++)
			{
				for(int k = 0; k < 2; k++)
				{
					c[i][j][k] = sampleTexel(u[i][j][k], v[i][j][k], s[i][j][k], 0, offset, sample, mipmap, buffer, function);

					if(componentCount >= 1)
					{
						if(hasUnsignedTextureComponent(0))
							c[i][j][k].x = MulHigh(As<UShort4>(c[i][j][k].x), f[1 - i][1 - j][1 - k]);
						else
							c[i][j][k].x = MulHigh(c[i][j][k].x, fs[1 - i][1 - j][1 - k]);
					}
					if(componentCount >= 2)
					{
						if(hasUnsignedTextureComponent(1))
							c[i][j][k].y = MulHigh(As<UShort4>(c[i][j][k].y), f[1 - i][1 - j][1 - k]);
						else
							c[i][j][k].y = MulHigh(c[i][j][k].y, fs[1 - i][1 - j][1 - k]);
					}
					if(componentCount >= 3)
					{
						if(hasUnsignedTextureComponent(2))
							c[i][j][k].z = MulHigh(As<UShort4>(c[i][j][k].z), f[1 - i][1 - j][1 - k]);
						else
							c[i][j][k].z = MulHigh(c[i][j][k].z, fs[1 - i][1 - j][1 - k]);
					}
					if(componentCount >= 4)
					{
						if(hasUnsignedTextureComponent(3))
							c[i][j][k].w = MulHigh(As<UShort4>(c[i][j][k].w), f[1 - i][1 - j][1 - k]);
						else
							c[i][j][k].w = MulHigh(c[i][j][k].w, fs[1 - i][1 - j][1 - k]);
					}

					if(i != 0 || j != 0 || k != 0)
					{
						if(componentCount >= 1) c[0][0][0].x += c[i][j][k].x;
						if(componentCount >= 2) c[0][0][0].y += c[i][j][k].y;
						if(componentCount >= 3) c[0][0][0].z += c[i][j][k].z;
						if(componentCount >= 4) c[0][0][0].w += c[i][j][k].w;
					}
				}
			}
		}

		if(componentCount >= 1) c_.x = c[0][0][0].x;
		if(componentCount >= 2) c_.y = c[0][0][0].y;
		if(componentCount >= 3) c_.z = c[0][0][0].z;
		if(componentCount >= 4) c_.w = c[0][0][0].w;

		// Correct for signed fractions
		if(componentCount >= 1)
			if(!hasUnsignedTextureComponent(0)) c_.x = AddSat(c_.x, c_.x);
		if(componentCount >= 2)
			if(!hasUnsignedTextureComponent(1)) c_.y = AddSat(c_.y, c_.y);
		if(componentCount >= 3)
			if(!hasUnsignedTextureComponent(2)) c_.z = AddSat(c_.z, c_.z);
		if(componentCount >= 4)
			if(!hasUnsignedTextureComponent(3)) c_.w = AddSat(c_.w, c_.w);
	}

	return c_;
}

Vector4f SamplerCore::sampleFloatFilter(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, const Float4 &a, Float4 &dRef, Vector4i &offset, const Int4 &sample, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, SamplerFunction function)
{
	Vector4f c = sampleFloatAniso(texture, u, v, w, a, dRef, offset, sample, lod, anisotropy, uDelta, vDelta, false, function);

	if(function == Fetch)
	{
		return c;
	}

	if(state.mipmapFilter == MIPMAP_LINEAR)
	{
		Vector4f cc = sampleFloatAniso(texture, u, v, w, a, dRef, offset, sample, lod, anisotropy, uDelta, vDelta, true, function);

		Float4 lod4 = Float4(Frac(lod));

		c.x = (cc.x - c.x) * lod4 + c.x;
		c.y = (cc.y - c.y) * lod4 + c.y;
		c.z = (cc.z - c.z) * lod4 + c.z;
		c.w = (cc.w - c.w) * lod4 + c.w;
	}

	return c;
}

Vector4f SamplerCore::sampleFloatAniso(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, const Float4 &a, Float4 &dRef, Vector4i &offset, const Int4 &sample, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, bool secondLOD, SamplerFunction function)
{
	Vector4f c;

	if(state.textureFilter != FILTER_ANISOTROPIC)
	{
		c = sampleFloat(texture, u, v, w, a, dRef, offset, sample, lod, secondLOD, function);
	}
	else
	{
		Int N = RoundInt(anisotropy);

		Vector4f cSum;

		cSum.x = Float4(0.0f);
		cSum.y = Float4(0.0f);
		cSum.z = Float4(0.0f);
		cSum.w = Float4(0.0f);

		Float4 A = *Pointer<Float4>(constants + OFFSET(Constants, uvWeight) + 16 * N);
		Float4 B = *Pointer<Float4>(constants + OFFSET(Constants, uvStart) + 16 * N);

		Float4 du = uDelta;
		Float4 dv = vDelta;

		Float4 u0 = u + B * du;
		Float4 v0 = v + B * dv;

		du *= A;
		dv *= A;

		Int i = 0;

		Do
		{
			c = sampleFloat(texture, u0, v0, w, a, dRef, offset, sample, lod, secondLOD, function);

			u0 += du;
			v0 += dv;

			cSum.x += c.x * A;
			cSum.y += c.y * A;
			cSum.z += c.z * A;
			cSum.w += c.w * A;

			i++;
		}
		Until(i >= N);

		c.x = cSum.x;
		c.y = cSum.y;
		c.z = cSum.z;
		c.w = cSum.w;
	}

	return c;
}

Vector4f SamplerCore::sampleFloat(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, const Float4 &a, Float4 &dRef, Vector4i &offset, const Int4 &sample, Float &lod, bool secondLOD, SamplerFunction function)
{
	if(state.textureType != VK_IMAGE_VIEW_TYPE_3D)
	{
		return sampleFloat2D(texture, u, v, w, a, dRef, offset, sample, lod, secondLOD, function);
	}
	else
	{
		return sampleFloat3D(texture, u, v, w, dRef, offset, sample, lod, secondLOD, function);
	}
}

Vector4f SamplerCore::sampleFloat2D(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, const Float4 &a, Float4 &dRef, Vector4i &offset, const Int4 &sample, Float &lod, bool secondLOD, SamplerFunction function)
{
	Vector4f c;

	int componentCount = textureComponentCount();
	bool gather = (state.textureFilter == FILTER_GATHER);

	Pointer<Byte> mipmap;
	Pointer<Byte> buffer;
	selectMipmap(texture, mipmap, buffer, lod, secondLOD);

	Int4 x0, x1, y0, y1;
	Float4 fu, fv;
	Int4 filter = computeFilterOffset(lod);
	address(u, x0, x1, fu, mipmap, offset.x, filter, OFFSET(Mipmap, width), state.addressingModeU, function);
	address(v, y0, y1, fv, mipmap, offset.y, filter, OFFSET(Mipmap, height), state.addressingModeV, function);

	Int4 pitchP = *Pointer<Int4>(mipmap + OFFSET(Mipmap, pitchP), 16);
	y0 *= pitchP;

	Int4 z;
	if(state.isCube() || state.isArrayed())
	{
		Int4 face = As<Int4>(w);
		Int4 layerIndex = computeLayerIndex(a, mipmap, function);

		// For cube maps, the layer argument is per cube, each of which has 6 layers
		if(state.textureType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
		{
			layerIndex *= Int4(6);
		}

		z = state.isCube() ? face : layerIndex;

		if(state.textureType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
		{
			z += layerIndex;
		}

		z *= *Pointer<Int4>(mipmap + OFFSET(Mipmap, sliceP), 16);
	}

	if(state.textureFilter == FILTER_POINT || (function == Fetch))
	{
		c = sampleTexel(x0, y0, z, dRef, sample, mipmap, buffer, function);
	}
	else
	{
		y1 *= pitchP;

		Vector4f c00 = sampleTexel(x0, y0, z, dRef, sample, mipmap, buffer, function);
		Vector4f c10 = sampleTexel(x1, y0, z, dRef, sample, mipmap, buffer, function);
		Vector4f c01 = sampleTexel(x0, y1, z, dRef, sample, mipmap, buffer, function);
		Vector4f c11 = sampleTexel(x1, y1, z, dRef, sample, mipmap, buffer, function);

		if(!gather)  // Blend
		{
			if(componentCount >= 1) c00.x = c00.x + fu * (c10.x - c00.x);
			if(componentCount >= 2) c00.y = c00.y + fu * (c10.y - c00.y);
			if(componentCount >= 3) c00.z = c00.z + fu * (c10.z - c00.z);
			if(componentCount >= 4) c00.w = c00.w + fu * (c10.w - c00.w);

			if(componentCount >= 1) c01.x = c01.x + fu * (c11.x - c01.x);
			if(componentCount >= 2) c01.y = c01.y + fu * (c11.y - c01.y);
			if(componentCount >= 3) c01.z = c01.z + fu * (c11.z - c01.z);
			if(componentCount >= 4) c01.w = c01.w + fu * (c11.w - c01.w);

			if(componentCount >= 1) c.x = c00.x + fv * (c01.x - c00.x);
			if(componentCount >= 2) c.y = c00.y + fv * (c01.y - c00.y);
			if(componentCount >= 3) c.z = c00.z + fv * (c01.z - c00.z);
			if(componentCount >= 4) c.w = c00.w + fv * (c01.w - c00.w);
		}
		else  // Gather
		{
			VkComponentSwizzle swizzle = gatherSwizzle();
			switch(swizzle)
			{
				case VK_COMPONENT_SWIZZLE_ZERO:
				case VK_COMPONENT_SWIZZLE_ONE:
					// Handled at the final component swizzle.
					break;
				default:
					c.x = c01[swizzle - VK_COMPONENT_SWIZZLE_R];
					c.y = c11[swizzle - VK_COMPONENT_SWIZZLE_R];
					c.z = c10[swizzle - VK_COMPONENT_SWIZZLE_R];
					c.w = c00[swizzle - VK_COMPONENT_SWIZZLE_R];
					break;
			}
		}
	}

	return c;
}

Vector4f SamplerCore::sampleFloat3D(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Float4 &dRef, Vector4i &offset, const Int4 &sample, Float &lod, bool secondLOD, SamplerFunction function)
{
	Vector4f c;

	int componentCount = textureComponentCount();

	Pointer<Byte> mipmap;
	Pointer<Byte> buffer;
	selectMipmap(texture, mipmap, buffer, lod, secondLOD);

	Int4 x0, x1, y0, y1, z0, z1;
	Float4 fu, fv, fw;
	Int4 filter = computeFilterOffset(lod);
	address(u, x0, x1, fu, mipmap, offset.x, filter, OFFSET(Mipmap, width), state.addressingModeU, function);
	address(v, y0, y1, fv, mipmap, offset.y, filter, OFFSET(Mipmap, height), state.addressingModeV, function);
	address(w, z0, z1, fw, mipmap, offset.z, filter, OFFSET(Mipmap, depth), state.addressingModeW, function);

	Int4 pitchP = *Pointer<Int4>(mipmap + OFFSET(Mipmap, pitchP), 16);
	Int4 sliceP = *Pointer<Int4>(mipmap + OFFSET(Mipmap, sliceP), 16);
	y0 *= pitchP;
	z0 *= sliceP;

	if(state.textureFilter == FILTER_POINT || (function == Fetch))
	{
		c = sampleTexel(x0, y0, z0, dRef, sample, mipmap, buffer, function);
	}
	else
	{
		y1 *= pitchP;
		z1 *= sliceP;

		Vector4f c000 = sampleTexel(x0, y0, z0, dRef, sample, mipmap, buffer, function);
		Vector4f c100 = sampleTexel(x1, y0, z0, dRef, sample, mipmap, buffer, function);
		Vector4f c010 = sampleTexel(x0, y1, z0, dRef, sample, mipmap, buffer, function);
		Vector4f c110 = sampleTexel(x1, y1, z0, dRef, sample, mipmap, buffer, function);
		Vector4f c001 = sampleTexel(x0, y0, z1, dRef, sample, mipmap, buffer, function);
		Vector4f c101 = sampleTexel(x1, y0, z1, dRef, sample, mipmap, buffer, function);
		Vector4f c011 = sampleTexel(x0, y1, z1, dRef, sample, mipmap, buffer, function);
		Vector4f c111 = sampleTexel(x1, y1, z1, dRef, sample, mipmap, buffer, function);

		// Blend first slice
		if(componentCount >= 1) c000.x = c000.x + fu * (c100.x - c000.x);
		if(componentCount >= 2) c000.y = c000.y + fu * (c100.y - c000.y);
		if(componentCount >= 3) c000.z = c000.z + fu * (c100.z - c000.z);
		if(componentCount >= 4) c000.w = c000.w + fu * (c100.w - c000.w);

		if(componentCount >= 1) c010.x = c010.x + fu * (c110.x - c010.x);
		if(componentCount >= 2) c010.y = c010.y + fu * (c110.y - c010.y);
		if(componentCount >= 3) c010.z = c010.z + fu * (c110.z - c010.z);
		if(componentCount >= 4) c010.w = c010.w + fu * (c110.w - c010.w);

		if(componentCount >= 1) c000.x = c000.x + fv * (c010.x - c000.x);
		if(componentCount >= 2) c000.y = c000.y + fv * (c010.y - c000.y);
		if(componentCount >= 3) c000.z = c000.z + fv * (c010.z - c000.z);
		if(componentCount >= 4) c000.w = c000.w + fv * (c010.w - c000.w);

		// Blend second slice
		if(componentCount >= 1) c001.x = c001.x + fu * (c101.x - c001.x);
		if(componentCount >= 2) c001.y = c001.y + fu * (c101.y - c001.y);
		if(componentCount >= 3) c001.z = c001.z + fu * (c101.z - c001.z);
		if(componentCount >= 4) c001.w = c001.w + fu * (c101.w - c001.w);

		if(componentCount >= 1) c011.x = c011.x + fu * (c111.x - c011.x);
		if(componentCount >= 2) c011.y = c011.y + fu * (c111.y - c011.y);
		if(componentCount >= 3) c011.z = c011.z + fu * (c111.z - c011.z);
		if(componentCount >= 4) c011.w = c011.w + fu * (c111.w - c011.w);

		if(componentCount >= 1) c001.x = c001.x + fv * (c011.x - c001.x);
		if(componentCount >= 2) c001.y = c001.y + fv * (c011.y - c001.y);
		if(componentCount >= 3) c001.z = c001.z + fv * (c011.z - c001.z);
		if(componentCount >= 4) c001.w = c001.w + fv * (c011.w - c001.w);

		// Blend slices
		if(componentCount >= 1) c.x = c000.x + fw * (c001.x - c000.x);
		if(componentCount >= 2) c.y = c000.y + fw * (c001.y - c000.y);
		if(componentCount >= 3) c.z = c000.z + fw * (c001.z - c000.z);
		if(componentCount >= 4) c.w = c000.w + fw * (c001.w - c000.w);
	}

	return c;
}

static Float log2sqrt(Float lod)
{
	// log2(sqrt(lod))                              // Equals 0.25 * log2(lod^2).
	lod *= lod;                                     // Squaring doubles the exponent and produces an extra bit of precision.
	lod = Float(As<Int>(lod)) - Float(0x3F800000);  // Interpret as integer and subtract the exponent bias.
	lod *= As<Float>(Int(0x33000000));              // Scale by 0.25 * 2^-23 (mantissa length).

	return lod;
}

static Float log2(Float lod)
{
	lod *= lod;                                     // Squaring doubles the exponent and produces an extra bit of precision.
	lod = Float(As<Int>(lod)) - Float(0x3F800000);  // Interpret as integer and subtract the exponent bias.
	lod *= As<Float>(Int(0x33800000));              // Scale by 0.5 * 2^-23 (mantissa length).

	return lod;
}

void SamplerCore::computeLod1D(Pointer<Byte> &texture, Float &lod, Float4 &uuuu, Float4 &dsx, Float4 &dsy, SamplerFunction function)
{
	Float4 dudxy;

	if(function != Grad)  // Implicit
	{
		dudxy = uuuu.yz - uuuu.xx;
	}
	else
	{
		dudxy = UnpackLow(dsx, dsy);
	}

	// Scale by texture dimensions.
	Float4 dUdxy = dudxy * *Pointer<Float4>(texture + OFFSET(Texture, widthWidthHeightHeight));

	// Note we could take the absolute value here and omit the square root below,
	// but this is more consistent with the 2D calculation and still cheap.
	Float4 dU2dxy = dUdxy * dUdxy;

	lod = Max(Float(dU2dxy.x), Float(dU2dxy.y));
	lod = log2sqrt(lod);
}

void SamplerCore::computeLod2D(Pointer<Byte> &texture, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, Float4 &uuuu, Float4 &vvvv, Float4 &dsx, Float4 &dsy, SamplerFunction function)
{
	Float4 duvdxy;

	if(function != Grad)  // Implicit
	{
		duvdxy = Float4(uuuu.yz, vvvv.yz) - Float4(uuuu.xx, vvvv.xx);
	}
	else
	{
		Float4 dudxy = Float4(dsx.xx, dsy.xx);
		Float4 dvdxy = Float4(dsx.yy, dsy.yy);

		duvdxy = Float4(dudxy.xz, dvdxy.xz);
	}

	// Scale by texture dimensions.
	Float4 dUVdxy = duvdxy * *Pointer<Float4>(texture + OFFSET(Texture, widthWidthHeightHeight));

	Float4 dUV2dxy = dUVdxy * dUVdxy;
	Float4 dUV2 = dUV2dxy.xy + dUV2dxy.zw;

	lod = Max(Float(dUV2.x), Float(dUV2.y));  // Square length of major axis

	if(state.textureFilter == FILTER_ANISOTROPIC)
	{
		Float det = Abs(Float(dUVdxy.x) * Float(dUVdxy.w) - Float(dUVdxy.y) * Float(dUVdxy.z));

		Float4 dudx = duvdxy.xxxx;
		Float4 dudy = duvdxy.yyyy;
		Float4 dvdx = duvdxy.zzzz;
		Float4 dvdy = duvdxy.wwww;

		Int4 mask = As<Int4>(CmpNLT(dUV2.x, dUV2.y));
		uDelta = As<Float4>((As<Int4>(dudx) & mask) | ((As<Int4>(dudy) & ~mask)));
		vDelta = As<Float4>((As<Int4>(dvdx) & mask) | ((As<Int4>(dvdy) & ~mask)));

		anisotropy = lod * Rcp_pp(det);
		anisotropy = Min(anisotropy, state.maxAnisotropy);

		lod *= Rcp_pp(anisotropy * anisotropy);
	}

	lod = log2sqrt(lod);  // log2(sqrt(lod))
}

void SamplerCore::computeLodCube(Pointer<Byte> &texture, Float &lod, Float4 &u, Float4 &v, Float4 &w, Float4 &dsx, Float4 &dsy, Float4 &M, SamplerFunction function)
{
	Float4 dudxy, dvdxy, dsdxy;

	if(function != Grad)  // Implicit
	{
		Float4 U = u * M;
		Float4 V = v * M;
		Float4 W = w * M;

		dudxy = Abs(U - U.xxxx);
		dvdxy = Abs(V - V.xxxx);
		dsdxy = Abs(W - W.xxxx);
	}
	else
	{
		dudxy = Float4(dsx.xx, dsy.xx);
		dvdxy = Float4(dsx.yy, dsy.yy);
		dsdxy = Float4(dsx.zz, dsy.zz);

		dudxy = Abs(dudxy * Float4(M.x));
		dvdxy = Abs(dvdxy * Float4(M.x));
		dsdxy = Abs(dsdxy * Float4(M.x));
	}

	// Compute the largest Manhattan distance in two dimensions.
	// This takes the footprint across adjacent faces into account.
	Float4 duvdxy = dudxy + dvdxy;
	Float4 dusdxy = dudxy + dsdxy;
	Float4 dvsdxy = dvdxy + dsdxy;

	dudxy = Max(Max(duvdxy, dusdxy), dvsdxy);

	lod = Max(Float(dudxy.y), Float(dudxy.z));  // FIXME: Max(dudxy.y, dudxy.z);

	// Scale by texture dimension.
	lod *= *Pointer<Float>(texture + OFFSET(Texture, width));

	lod = log2(lod);
}

void SamplerCore::computeLod3D(Pointer<Byte> &texture, Float &lod, Float4 &uuuu, Float4 &vvvv, Float4 &wwww, Float4 &dsx, Float4 &dsy, SamplerFunction function)
{
	Float4 dudxy, dvdxy, dsdxy;

	if(function != Grad)  // Implicit
	{
		dudxy = uuuu - uuuu.xxxx;
		dvdxy = vvvv - vvvv.xxxx;
		dsdxy = wwww - wwww.xxxx;
	}
	else
	{
		dudxy = Float4(dsx.xx, dsy.xx);
		dvdxy = Float4(dsx.yy, dsy.yy);
		dsdxy = Float4(dsx.zz, dsy.zz);
	}

	// Scale by texture dimensions.
	dudxy *= *Pointer<Float4>(texture + OFFSET(Texture, width));
	dvdxy *= *Pointer<Float4>(texture + OFFSET(Texture, height));
	dsdxy *= *Pointer<Float4>(texture + OFFSET(Texture, depth));

	dudxy *= dudxy;
	dvdxy *= dvdxy;
	dsdxy *= dsdxy;

	dudxy += dvdxy;
	dudxy += dsdxy;

	lod = Max(Float(dudxy.y), Float(dudxy.z));  // FIXME: Max(dudxy.y, dudxy.z);

	lod = log2sqrt(lod);  // log2(sqrt(lod))
}

Int4 SamplerCore::cubeFace(Float4 &U, Float4 &V, Float4 &x, Float4 &y, Float4 &z, Float4 &M)
{
	// TODO: Comply with Vulkan recommendation:
	// Vulkan 1.1: "The rules should have as the first rule that rz wins over ry and rx, and the second rule that ry wins over rx."

	Int4 xn = CmpLT(x, Float4(0.0f));  // x < 0
	Int4 yn = CmpLT(y, Float4(0.0f));  // y < 0
	Int4 zn = CmpLT(z, Float4(0.0f));  // z < 0

	Float4 absX = Abs(x);
	Float4 absY = Abs(y);
	Float4 absZ = Abs(z);

	Int4 xy = CmpNLE(absX, absY);  // abs(x) > abs(y)
	Int4 yz = CmpNLE(absY, absZ);  // abs(y) > abs(z)
	Int4 zx = CmpNLE(absZ, absX);  // abs(z) > abs(x)
	Int4 xMajor = xy & ~zx;        // abs(x) > abs(y) && abs(x) > abs(z)
	Int4 yMajor = yz & ~xy;        // abs(y) > abs(z) && abs(y) > abs(x)
	Int4 zMajor = zx & ~yz;        // abs(z) > abs(x) && abs(z) > abs(y)

	// FACE_POSITIVE_X = 000b
	// FACE_NEGATIVE_X = 001b
	// FACE_POSITIVE_Y = 010b
	// FACE_NEGATIVE_Y = 011b
	// FACE_POSITIVE_Z = 100b
	// FACE_NEGATIVE_Z = 101b

	Int yAxis = SignMask(yMajor);
	Int zAxis = SignMask(zMajor);

	Int4 n = ((xn & xMajor) | (yn & yMajor) | (zn & zMajor)) & Int4(0x80000000);
	Int negative = SignMask(n);

	Int faces = *Pointer<Int>(constants + OFFSET(Constants, transposeBit0) + negative * 4);
	faces |= *Pointer<Int>(constants + OFFSET(Constants, transposeBit1) + yAxis * 4);
	faces |= *Pointer<Int>(constants + OFFSET(Constants, transposeBit2) + zAxis * 4);

	Int4 face;
	face.x = faces & 0x7;
	face.y = (faces >> 4) & 0x7;
	face.z = (faces >> 8) & 0x7;
	face.w = (faces >> 12) & 0x7;

	M = Max(Max(absX, absY), absZ);

	// U = xMajor ? (neg ^ -z) : ((zMajor & neg) ^ x)
	U = As<Float4>((xMajor & (n ^ As<Int4>(-z))) | (~xMajor & ((zMajor & n) ^ As<Int4>(x))));

	// V = !yMajor ? -y : (n ^ z)
	V = As<Float4>((~yMajor & As<Int4>(-y)) | (yMajor & (n ^ As<Int4>(z))));

	M = reciprocal(M) * Float4(0.5f);
	U = U * M + Float4(0.5f);
	V = V * M + Float4(0.5f);

	return face;
}

Short4 SamplerCore::applyOffset(Short4 &uvw, Int4 &offset, const Int4 &whd, AddressingMode mode)
{
	Int4 tmp = Int4(As<UShort4>(uvw));
	tmp = tmp + offset;

	switch(mode)
	{
		case AddressingMode::ADDRESSING_WRAP:
			tmp = (tmp + whd * Int4(-MIN_TEXEL_OFFSET)) % whd;
			break;
		case AddressingMode::ADDRESSING_CLAMP:
		case AddressingMode::ADDRESSING_MIRROR:
		case AddressingMode::ADDRESSING_MIRRORONCE:
		case AddressingMode::ADDRESSING_BORDER:  // FIXME: Implement and test ADDRESSING_MIRROR, ADDRESSING_MIRRORONCE, ADDRESSING_BORDER
			tmp = Min(Max(tmp, Int4(0)), whd - Int4(1));
			break;
		case AddressingMode::ADDRESSING_SEAMLESS:
			ASSERT(false);  // Cube sampling doesn't support offset.
		default:
			ASSERT(false);
	}

	return As<Short4>(UShort4(tmp));
}

void SamplerCore::computeIndices(UInt index[4], Short4 uuuu, Short4 vvvv, Short4 wwww, const Short4 &layerIndex, Vector4i &offset, const Int4 &sample, const Pointer<Byte> &mipmap, SamplerFunction function)
{
	uuuu = MulHigh(As<UShort4>(uuuu), UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, width))));

	if(function.offset)
	{
		uuuu = applyOffset(uuuu, offset.x, *Pointer<Int4>(mipmap + OFFSET(Mipmap, width)), state.addressingModeU);
	}

	UInt4 indices = Int4(uuuu);

	if(state.is2D() || state.is3D() || state.isCube())
	{
		vvvv = MulHigh(As<UShort4>(vvvv), UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, height))));

		if(function.offset)
		{
			vvvv = applyOffset(vvvv, offset.y, *Pointer<Int4>(mipmap + OFFSET(Mipmap, height)), state.addressingModeV);
		}

		Short4 uv0uv1 = As<Short4>(UnpackLow(uuuu, vvvv));
		Short4 uv2uv3 = As<Short4>(UnpackHigh(uuuu, vvvv));
		Int2 i01 = MulAdd(uv0uv1, *Pointer<Short4>(mipmap + OFFSET(Mipmap, onePitchP)));
		Int2 i23 = MulAdd(uv2uv3, *Pointer<Short4>(mipmap + OFFSET(Mipmap, onePitchP)));

		indices = UInt4(As<UInt2>(i01), As<UInt2>(i23));
	}

	if(state.is3D())
	{
		wwww = MulHigh(As<UShort4>(wwww), UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, depth))));

		if(function.offset)
		{
			wwww = applyOffset(wwww, offset.z, *Pointer<Int4>(mipmap + OFFSET(Mipmap, depth)), state.addressingModeW);
		}

		indices += As<UInt4>(Int4(As<UShort4>(wwww))) * *Pointer<UInt4>(mipmap + OFFSET(Mipmap, sliceP));
	}

	if(state.isArrayed())
	{
		Int4 layer = Int4(As<UShort4>(layerIndex));

		if(state.textureType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
		{
			layer *= Int4(6);
		}

		UInt4 layerOffset = As<UInt4>(layer) * *Pointer<UInt4>(mipmap + OFFSET(Mipmap, sliceP));

		indices += layerOffset;
	}

	if(function.sample)
	{
		UInt4 sampleOffset = Min(As<UInt4>(sample), *Pointer<UInt4>(mipmap + OFFSET(Mipmap, sampleMax), 16)) *
		                     *Pointer<UInt4>(mipmap + OFFSET(Mipmap, samplePitchP), 16);
		indices += sampleOffset;
	}

	index[0] = Extract(indices, 0);
	index[1] = Extract(indices, 1);
	index[2] = Extract(indices, 2);
	index[3] = Extract(indices, 3);
}

void SamplerCore::computeIndices(UInt index[4], Int4 uuuu, Int4 vvvv, Int4 wwww, const Int4 &sample, Int4 valid, const Pointer<Byte> &mipmap, SamplerFunction function)
{
	UInt4 indices = uuuu;

	if(state.is2D() || state.is3D() || state.isCube())
	{
		indices += As<UInt4>(vvvv);
	}

	if(state.is3D() || state.isCube() || state.isArrayed())
	{
		indices += As<UInt4>(wwww);
	}

	if(function.sample)
	{
		indices += Min(As<UInt4>(sample), *Pointer<UInt4>(mipmap + OFFSET(Mipmap, sampleMax), 16)) *
		           *Pointer<UInt4>(mipmap + OFFSET(Mipmap, samplePitchP), 16);
	}

	if(borderModeActive())
	{
		// Texels out of range are still sampled before being replaced
		// with the border color, so sample them at linear index 0.
		indices &= As<UInt4>(valid);
	}

	for(int i = 0; i < 4; i++)
	{
		index[i] = Extract(As<Int4>(indices), i);
	}
}

Vector4s SamplerCore::sampleTexel(UInt index[4], Pointer<Byte> buffer)
{
	Vector4s c;

	if(has16bitPackedTextureFormat())
	{
		c.x = Insert(c.x, Pointer<Short>(buffer)[index[0]], 0);
		c.x = Insert(c.x, Pointer<Short>(buffer)[index[1]], 1);
		c.x = Insert(c.x, Pointer<Short>(buffer)[index[2]], 2);
		c.x = Insert(c.x, Pointer<Short>(buffer)[index[3]], 3);

		switch(state.textureFormat)
		{
			case VK_FORMAT_R5G6B5_UNORM_PACK16:
				c.z = (c.x & Short4(0x001Fu)) << 11;
				c.y = (c.x & Short4(0x07E0u)) << 5;
				c.x = (c.x & Short4(0xF800u));
				break;
			case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
				c.w = (c.x << 12) & Short4(0xF000u);
				c.z = (c.x) & Short4(0xF000u);
				c.y = (c.x << 4) & Short4(0xF000u);
				c.x = (c.x << 8) & Short4(0xF000u);
				break;
			case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
				c.w = (c.x) & Short4(0x8000u);
				c.z = (c.x << 11) & Short4(0xF800u);
				c.y = (c.x << 6) & Short4(0xF800u);
				c.x = (c.x << 1) & Short4(0xF800u);
				break;
			default:
				ASSERT(false);
		}
	}
	else if(has8bitTextureComponents())
	{
		switch(textureComponentCount())
		{
			case 4:
			{
				Byte4 c0 = Pointer<Byte4>(buffer)[index[0]];
				Byte4 c1 = Pointer<Byte4>(buffer)[index[1]];
				Byte4 c2 = Pointer<Byte4>(buffer)[index[2]];
				Byte4 c3 = Pointer<Byte4>(buffer)[index[3]];
				c.x = Unpack(c0, c1);
				c.y = Unpack(c2, c3);

				switch(state.textureFormat)
				{
					case VK_FORMAT_B8G8R8A8_UNORM:
					case VK_FORMAT_B8G8R8A8_SRGB:
						c.z = As<Short4>(UnpackLow(c.x, c.y));
						c.x = As<Short4>(UnpackHigh(c.x, c.y));
						c.y = c.z;
						c.w = c.x;
						c.z = UnpackLow(As<Byte8>(Short4(0)), As<Byte8>(c.z));
						c.y = UnpackHigh(As<Byte8>(Short4(0)), As<Byte8>(c.y));
						c.x = UnpackLow(As<Byte8>(Short4(0)), As<Byte8>(c.x));
						c.w = UnpackHigh(As<Byte8>(Short4(0)), As<Byte8>(c.w));
						break;
					case VK_FORMAT_R8G8B8A8_UNORM:
					case VK_FORMAT_R8G8B8A8_SNORM:
					case VK_FORMAT_R8G8B8A8_SINT:
					case VK_FORMAT_R8G8B8A8_SRGB:
					case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
					case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
					case VK_FORMAT_A8B8G8R8_SINT_PACK32:
					case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
						c.z = As<Short4>(UnpackHigh(c.x, c.y));
						c.x = As<Short4>(UnpackLow(c.x, c.y));
						c.y = c.x;
						c.w = c.z;
						c.x = UnpackLow(As<Byte8>(Short4(0)), As<Byte8>(c.x));
						c.y = UnpackHigh(As<Byte8>(Short4(0)), As<Byte8>(c.y));
						c.z = UnpackLow(As<Byte8>(Short4(0)), As<Byte8>(c.z));
						c.w = UnpackHigh(As<Byte8>(Short4(0)), As<Byte8>(c.w));
						// Propagate sign bit
						if(state.textureFormat == VK_FORMAT_R8G8B8A8_SINT ||
						   state.textureFormat == VK_FORMAT_A8B8G8R8_SINT_PACK32)
						{
							c.x >>= 8;
							c.y >>= 8;
							c.z >>= 8;
							c.w >>= 8;
						}
						break;
					case VK_FORMAT_R8G8B8A8_UINT:
					case VK_FORMAT_A8B8G8R8_UINT_PACK32:
						c.z = As<Short4>(UnpackHigh(c.x, c.y));
						c.x = As<Short4>(UnpackLow(c.x, c.y));
						c.y = c.x;
						c.w = c.z;
						c.x = UnpackLow(As<Byte8>(c.x), As<Byte8>(Short4(0)));
						c.y = UnpackHigh(As<Byte8>(c.y), As<Byte8>(Short4(0)));
						c.z = UnpackLow(As<Byte8>(c.z), As<Byte8>(Short4(0)));
						c.w = UnpackHigh(As<Byte8>(c.w), As<Byte8>(Short4(0)));
						break;
					default:
						ASSERT(false);
				}
			}
			break;
			case 2:
				c.x = Insert(c.x, Pointer<Short>(buffer)[index[0]], 0);
				c.x = Insert(c.x, Pointer<Short>(buffer)[index[1]], 1);
				c.x = Insert(c.x, Pointer<Short>(buffer)[index[2]], 2);
				c.x = Insert(c.x, Pointer<Short>(buffer)[index[3]], 3);

				switch(state.textureFormat)
				{
					case VK_FORMAT_R8G8_UNORM:
					case VK_FORMAT_R8G8_SNORM:
					case VK_FORMAT_R8G8_SRGB:
						c.y = (c.x & Short4(0xFF00u));
						c.x = (c.x << 8);
						break;
					case VK_FORMAT_R8G8_SINT:
						c.y = c.x >> 8;
						c.x = (c.x << 8) >> 8;  // Propagate sign bit
						break;
					case VK_FORMAT_R8G8_UINT:
						c.y = As<Short4>(As<UShort4>(c.x) >> 8);
						c.x &= Short4(0x00FFu);
						break;
					default:
						ASSERT(false);
				}
				break;
			case 1:
			{
				Int c0 = Int(*Pointer<Byte>(buffer + index[0]));
				Int c1 = Int(*Pointer<Byte>(buffer + index[1]));
				Int c2 = Int(*Pointer<Byte>(buffer + index[2]));
				Int c3 = Int(*Pointer<Byte>(buffer + index[3]));
				c0 = c0 | (c1 << 8) | (c2 << 16) | (c3 << 24);

				switch(state.textureFormat)
				{
					case VK_FORMAT_R8_SINT:
					case VK_FORMAT_R8_UINT:
					case VK_FORMAT_S8_UINT:
					{
						Int zero(0);
						c.x = Unpack(As<Byte4>(c0), As<Byte4>(zero));
						// Propagate sign bit
						if(state.textureFormat == VK_FORMAT_R8_SINT)
						{
							c.x = (c.x << 8) >> 8;
						}
					}
					break;
					case VK_FORMAT_R8_SNORM:
					case VK_FORMAT_R8_UNORM:
					case VK_FORMAT_R8_SRGB:
						// TODO: avoid populating the low bits at all.
						c.x = Unpack(As<Byte4>(c0));
						c.x &= Short4(0xFF00u);
						break;
					default:
						c.x = Unpack(As<Byte4>(c0));
						break;
				}
			}
			break;
			default:
				ASSERT(false);
		}
	}
	else if(has16bitTextureComponents())
	{
		switch(textureComponentCount())
		{
			case 4:
				c.x = Pointer<Short4>(buffer)[index[0]];
				c.y = Pointer<Short4>(buffer)[index[1]];
				c.z = Pointer<Short4>(buffer)[index[2]];
				c.w = Pointer<Short4>(buffer)[index[3]];
				transpose4x4(c.x, c.y, c.z, c.w);
				break;
			case 3:
				c.x = Pointer<Short4>(buffer)[index[0]];
				c.y = Pointer<Short4>(buffer)[index[1]];
				c.z = Pointer<Short4>(buffer)[index[2]];
				c.w = Pointer<Short4>(buffer)[index[3]];
				transpose4x3(c.x, c.y, c.z, c.w);
				break;
			case 2:
				c.x = *Pointer<Short4>(buffer + 4 * index[0]);
				c.x = As<Short4>(UnpackLow(c.x, *Pointer<Short4>(buffer + 4 * index[1])));
				c.z = *Pointer<Short4>(buffer + 4 * index[2]);
				c.z = As<Short4>(UnpackLow(c.z, *Pointer<Short4>(buffer + 4 * index[3])));
				c.y = c.x;
				c.x = UnpackLow(As<Int2>(c.x), As<Int2>(c.z));
				c.y = UnpackHigh(As<Int2>(c.y), As<Int2>(c.z));
				break;
			case 1:
				c.x = Insert(c.x, Pointer<Short>(buffer)[index[0]], 0);
				c.x = Insert(c.x, Pointer<Short>(buffer)[index[1]], 1);
				c.x = Insert(c.x, Pointer<Short>(buffer)[index[2]], 2);
				c.x = Insert(c.x, Pointer<Short>(buffer)[index[3]], 3);
				break;
			default:
				ASSERT(false);
		}
	}
	else if(state.textureFormat == VK_FORMAT_A2B10G10R10_UNORM_PACK32)
	{
		Int4 cc;
		cc = Insert(cc, Pointer<Int>(buffer)[index[0]], 0);
		cc = Insert(cc, Pointer<Int>(buffer)[index[1]], 1);
		cc = Insert(cc, Pointer<Int>(buffer)[index[2]], 2);
		cc = Insert(cc, Pointer<Int>(buffer)[index[3]], 3);

		c = a2b10g10r10Unpack(cc);
	}
	else if(state.textureFormat == VK_FORMAT_A2R10G10B10_UNORM_PACK32)
	{
		Int4 cc;
		cc = Insert(cc, Pointer<Int>(buffer)[index[0]], 0);
		cc = Insert(cc, Pointer<Int>(buffer)[index[1]], 1);
		cc = Insert(cc, Pointer<Int>(buffer)[index[2]], 2);
		cc = Insert(cc, Pointer<Int>(buffer)[index[3]], 3);

		c = a2r10g10b10Unpack(cc);
	}
	else if(state.textureFormat == VK_FORMAT_A2B10G10R10_UINT_PACK32)
	{
		Int4 cc;
		cc = Insert(cc, Pointer<Int>(buffer)[index[0]], 0);
		cc = Insert(cc, Pointer<Int>(buffer)[index[1]], 1);
		cc = Insert(cc, Pointer<Int>(buffer)[index[2]], 2);
		cc = Insert(cc, Pointer<Int>(buffer)[index[3]], 3);

		c.x = Short4((cc & Int4(0x3FF)));
		c.y = Short4(((cc >> 10) & Int4(0x3FF)));
		c.z = Short4(((cc >> 20) & Int4(0x3FF)));
		c.w = Short4(((cc >> 30) & Int4(0x3)));
	}
	else if(state.textureFormat == VK_FORMAT_A2R10G10B10_UINT_PACK32)
	{
		Int4 cc;
		cc = Insert(cc, Pointer<Int>(buffer)[index[0]], 0);
		cc = Insert(cc, Pointer<Int>(buffer)[index[1]], 1);
		cc = Insert(cc, Pointer<Int>(buffer)[index[2]], 2);
		cc = Insert(cc, Pointer<Int>(buffer)[index[3]], 3);

		c.z = Short4((cc & Int4(0x3FF)));
		c.y = Short4(((cc >> 10) & Int4(0x3FF)));
		c.x = Short4(((cc >> 20) & Int4(0x3FF)));
		c.w = Short4(((cc >> 30) & Int4(0x3)));
	}
	else
		ASSERT(false);

	if(state.textureFormat.isSRGBformat())
	{
		for(int i = 0; i < textureComponentCount(); i++)
		{
			if(isRGBComponent(i))
			{
				// The current table-based sRGB conversion requires 0xFF00 to represent 1.0.
				ASSERT(state.textureFormat.has8bitTextureComponents());

				sRGBtoLinearFF00(c[i]);
			}
		}
	}

	return c;
}

Vector4s SamplerCore::sampleTexel(Short4 &uuuu, Short4 &vvvv, Short4 &wwww, const Short4 &layerIndex, Vector4i &offset, const Int4 &sample, Pointer<Byte> &mipmap, Pointer<Byte> buffer, SamplerFunction function)
{
	Vector4s c;

	UInt index[4];
	computeIndices(index, uuuu, vvvv, wwww, layerIndex, offset, sample, mipmap, function);

	if(isYcbcrFormat())
	{
		// Pointers to the planes of YCbCr images are stored in consecutive mipmap levels.
		Pointer<Byte> bufferY = buffer;                                                                         // *Pointer<Pointer<Byte>>(mipmap + 0 * sizeof(Mipmap) + OFFSET(Mipmap, buffer));
		Pointer<Byte> bufferU = *Pointer<Pointer<Byte>>(mipmap + 1 * sizeof(Mipmap) + OFFSET(Mipmap, buffer));  // U/V for 2-plane interleaved formats.
		Pointer<Byte> bufferV = *Pointer<Pointer<Byte>>(mipmap + 2 * sizeof(Mipmap) + OFFSET(Mipmap, buffer));

		// Luminance
		Int c0 = Int(bufferY[index[0]]);
		Int c1 = Int(bufferY[index[1]]);
		Int c2 = Int(bufferY[index[2]]);
		Int c3 = Int(bufferY[index[3]]);
		c0 = c0 | (c1 << 8) | (c2 << 16) | (c3 << 24);
		UShort4 Y = As<UShort4>(Unpack(As<Byte4>(c0)));

		UShort4 Cb, Cr;

		// Chroma
		{
			computeIndices(index, uuuu, vvvv, wwww, layerIndex, offset, sample, mipmap + sizeof(Mipmap), function);
			UShort4 U, V;

			if(state.textureFormat == VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM)
			{
				c0 = Int(bufferU[index[0]]);
				c1 = Int(bufferU[index[1]]);
				c2 = Int(bufferU[index[2]]);
				c3 = Int(bufferU[index[3]]);
				c0 = c0 | (c1 << 8) | (c2 << 16) | (c3 << 24);
				U = As<UShort4>(Unpack(As<Byte4>(c0)));

				c0 = Int(bufferV[index[0]]);
				c1 = Int(bufferV[index[1]]);
				c2 = Int(bufferV[index[2]]);
				c3 = Int(bufferV[index[3]]);
				c0 = c0 | (c1 << 8) | (c2 << 16) | (c3 << 24);
				V = As<UShort4>(Unpack(As<Byte4>(c0)));
			}
			else if(state.textureFormat == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM)
			{
				Short4 UV;
				UV = Insert(UV, Pointer<Short>(bufferU)[index[0]], 0);  // TODO: Insert(UShort4, UShort)
				UV = Insert(UV, Pointer<Short>(bufferU)[index[1]], 1);
				UV = Insert(UV, Pointer<Short>(bufferU)[index[2]], 2);
				UV = Insert(UV, Pointer<Short>(bufferU)[index[3]], 3);
				U = (UV & Short4(0x00FFu)) | (UV << 8);
				V = (UV & Short4(0xFF00u)) | As<Short4>(As<UShort4>(UV) >> 8);
			}
			else
				UNSUPPORTED("state.textureFormat %d", (int)state.textureFormat);

			if(!state.swappedChroma)
			{
				Cb = U;
				Cr = V;
			}
			else
			{
				Cb = V;
				Cr = U;
			}
		}

		if(state.ycbcrModel == VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY)
		{
			// YCbCr formats are treated as signed 15-bit.
			c.x = Cr >> 1;
			c.y = Y >> 1;
			c.z = Cb >> 1;
		}
		else
		{
			// Scaling and bias for studio-swing range: Y = [16 .. 235], U/V = [16 .. 240]
			// Scale down by 0x0101 to normalize the 8.8 samples, and up by 0x7FFF for signed 15-bit output.
			float yOffset = static_cast<float>(state.studioSwing ? 16 * 0x0101 : 0);
			float uvOffset = static_cast<float>(128 * 0x0101);
			float yFactor = static_cast<float>(0x7FFF) / static_cast<float>(state.studioSwing ? 219 * 0x0101 : 255 * 0x0101);
			float uvFactor = static_cast<float>(0x7FFF) / static_cast<float>(state.studioSwing ? 224 * 0x0101 : 255 * 0x0101);

			Float4 y = (Float4(Y) - Float4(yOffset)) * Float4(yFactor);
			Float4 u = (Float4(Cb) - Float4(uvOffset)) * Float4(uvFactor);
			Float4 v = (Float4(Cr) - Float4(uvOffset)) * Float4(uvFactor);

			if(state.ycbcrModel == VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY)
			{
				c.x = Short4(v);
				c.y = Short4(y);
				c.z = Short4(u);
			}
			else
			{
				// Generic YCbCr to RGB transformation:
				// R = Y                               +           2 * (1 - Kr) * Cr
				// G = Y - 2 * Kb * (1 - Kb) / Kg * Cb - 2 * Kr * (1 - Kr) / Kg * Cr
				// B = Y +           2 * (1 - Kb) * Cb

				float Kb = 0.114f;
				float Kr = 0.299f;

				switch(state.ycbcrModel)
				{
					case VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709:
						Kb = 0.0722f;
						Kr = 0.2126f;
						break;
					case VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601:
						Kb = 0.114f;
						Kr = 0.299f;
						break;
					case VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020:
						Kb = 0.0593f;
						Kr = 0.2627f;
						break;
					default:
						UNSUPPORTED("ycbcrModel %d", int(state.ycbcrModel));
				}

				const float Kg = 1.0f - Kr - Kb;

				const float Rr = 2 * (1 - Kr);
				const float Gb = -2 * Kb * (1 - Kb) / Kg;
				const float Gr = -2 * Kr * (1 - Kr) / Kg;
				const float Bb = 2 * (1 - Kb);

				Float4 r = y + Float4(Rr) * v;
				Float4 g = y + Float4(Gb) * u + Float4(Gr) * v;
				Float4 b = y + Float4(Bb) * u;

				c.x = Short4(r);
				c.y = Short4(g);
				c.z = Short4(b);
			}
		}
	}
	else
	{
		return sampleTexel(index, buffer);
	}

	return c;
}

Vector4f SamplerCore::sampleTexel(Int4 &uuuu, Int4 &vvvv, Int4 &wwww, Float4 &dRef, const Int4 &sample, Pointer<Byte> &mipmap, Pointer<Byte> buffer, SamplerFunction function)
{
	Int4 valid;

	if(borderModeActive())
	{
		// Valid texels have positive coordinates.
		Int4 negative = uuuu;
		if(state.is2D() || state.is3D() || state.isCube()) negative |= vvvv;
		if(state.is3D() || state.isCube() || state.isArrayed()) negative |= wwww;
		valid = CmpNLT(negative, Int4(0));
	}

	UInt index[4];
	computeIndices(index, uuuu, vvvv, wwww, sample, valid, mipmap, function);

	Vector4f c;

	if(hasFloatTexture() || has32bitIntegerTextureComponents())
	{
		UInt4 t0, t1, t2, t3;

		switch(state.textureFormat)
		{
			case VK_FORMAT_R16_SFLOAT:
				t0 = Int4(*Pointer<UShort4>(buffer + index[0] * 2));
				t1 = Int4(*Pointer<UShort4>(buffer + index[1] * 2));
				t2 = Int4(*Pointer<UShort4>(buffer + index[2] * 2));
				t3 = Int4(*Pointer<UShort4>(buffer + index[3] * 2));

				c.x.x = Extract(As<Float4>(halfToFloatBits(t0)), 0);
				c.x.y = Extract(As<Float4>(halfToFloatBits(t1)), 0);
				c.x.z = Extract(As<Float4>(halfToFloatBits(t2)), 0);
				c.x.w = Extract(As<Float4>(halfToFloatBits(t3)), 0);
				break;
			case VK_FORMAT_R16G16_SFLOAT:
				t0 = Int4(*Pointer<UShort4>(buffer + index[0] * 4));
				t1 = Int4(*Pointer<UShort4>(buffer + index[1] * 4));
				t2 = Int4(*Pointer<UShort4>(buffer + index[2] * 4));
				t3 = Int4(*Pointer<UShort4>(buffer + index[3] * 4));

				// FIXME: shuffles
				c.x = As<Float4>(halfToFloatBits(t0));
				c.y = As<Float4>(halfToFloatBits(t1));
				c.z = As<Float4>(halfToFloatBits(t2));
				c.w = As<Float4>(halfToFloatBits(t3));
				transpose4x4(c.x, c.y, c.z, c.w);
				break;
			case VK_FORMAT_R16G16B16A16_SFLOAT:
				t0 = Int4(*Pointer<UShort4>(buffer + index[0] * 8));
				t1 = Int4(*Pointer<UShort4>(buffer + index[1] * 8));
				t2 = Int4(*Pointer<UShort4>(buffer + index[2] * 8));
				t3 = Int4(*Pointer<UShort4>(buffer + index[3] * 8));

				c.x = As<Float4>(halfToFloatBits(t0));
				c.y = As<Float4>(halfToFloatBits(t1));
				c.z = As<Float4>(halfToFloatBits(t2));
				c.w = As<Float4>(halfToFloatBits(t3));
				transpose4x4(c.x, c.y, c.z, c.w);
				break;
			case VK_FORMAT_R32_SFLOAT:
			case VK_FORMAT_R32_SINT:
			case VK_FORMAT_R32_UINT:
			case VK_FORMAT_D32_SFLOAT:
				// FIXME: Optimal shuffling?
				c.x.x = *Pointer<Float>(buffer + index[0] * 4);
				c.x.y = *Pointer<Float>(buffer + index[1] * 4);
				c.x.z = *Pointer<Float>(buffer + index[2] * 4);
				c.x.w = *Pointer<Float>(buffer + index[3] * 4);
				break;
			case VK_FORMAT_R32G32_SFLOAT:
			case VK_FORMAT_R32G32_SINT:
			case VK_FORMAT_R32G32_UINT:
				// FIXME: Optimal shuffling?
				c.x.xy = *Pointer<Float4>(buffer + index[0] * 8);
				c.x.zw = *Pointer<Float4>(buffer + index[1] * 8 - 8);
				c.z.xy = *Pointer<Float4>(buffer + index[2] * 8);
				c.z.zw = *Pointer<Float4>(buffer + index[3] * 8 - 8);
				c.y = c.x;
				c.x = Float4(c.x.xz, c.z.xz);
				c.y = Float4(c.y.yw, c.z.yw);
				break;
			case VK_FORMAT_R32G32B32_SFLOAT:
			case VK_FORMAT_R32G32B32_SINT:
			case VK_FORMAT_R32G32B32_UINT:
				c.x = *Pointer<Float4>(buffer + index[0] * 16, 16);
				c.y = *Pointer<Float4>(buffer + index[1] * 16, 16);
				c.z = *Pointer<Float4>(buffer + index[2] * 16, 16);
				c.w = *Pointer<Float4>(buffer + index[3] * 16, 16);
				transpose4x3(c.x, c.y, c.z, c.w);
				break;
			case VK_FORMAT_R32G32B32A32_SFLOAT:
			case VK_FORMAT_R32G32B32A32_SINT:
			case VK_FORMAT_R32G32B32A32_UINT:
				c.x = *Pointer<Float4>(buffer + index[0] * 16, 16);
				c.y = *Pointer<Float4>(buffer + index[1] * 16, 16);
				c.z = *Pointer<Float4>(buffer + index[2] * 16, 16);
				c.w = *Pointer<Float4>(buffer + index[3] * 16, 16);
				transpose4x4(c.x, c.y, c.z, c.w);
				break;
			case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
			{
				Float4 t;  // TODO: add Insert(UInt4, RValue<UInt>)
				t.x = *Pointer<Float>(buffer + index[0] * 4);
				t.y = *Pointer<Float>(buffer + index[1] * 4);
				t.z = *Pointer<Float>(buffer + index[2] * 4);
				t.w = *Pointer<Float>(buffer + index[3] * 4);
				t0 = As<UInt4>(t);
				c.w = Float4(UInt4(1) << ((t0 >> 27) & UInt4(0x1F))) * Float4(1.0f / (1 << 24));
				c.x = Float4(t0 & UInt4(0x1FF)) * c.w;
				c.y = Float4((t0 >> 9) & UInt4(0x1FF)) * c.w;
				c.z = Float4((t0 >> 18) & UInt4(0x1FF)) * c.w;
				break;
			}
			case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
			{
				Float4 t;  // TODO: add Insert(UInt4, RValue<UInt>)
				t.x = *Pointer<Float>(buffer + index[0] * 4);
				t.y = *Pointer<Float>(buffer + index[1] * 4);
				t.z = *Pointer<Float>(buffer + index[2] * 4);
				t.w = *Pointer<Float>(buffer + index[3] * 4);
				t0 = As<UInt4>(t);
				c.x = As<Float4>(halfToFloatBits((t0 << 4) & UInt4(0x7FF0)));
				c.y = As<Float4>(halfToFloatBits((t0 >> 7) & UInt4(0x7FF0)));
				c.z = As<Float4>(halfToFloatBits((t0 >> 17) & UInt4(0x7FE0)));
				break;
			}
			default:
				UNSUPPORTED("Format %d", VkFormat(state.textureFormat));
		}
	}
	else
	{
		ASSERT(!isYcbcrFormat());

		Vector4s cs = sampleTexel(index, buffer);

		bool isInteger = state.textureFormat.isUnnormalizedInteger();
		int componentCount = textureComponentCount();
		for(int n = 0; n < componentCount; n++)
		{
			if(hasUnsignedTextureComponent(n))
			{
				if(isInteger)
				{
					c[n] = As<Float4>(Int4(As<UShort4>(cs[n])));
				}
				else
				{
					c[n] = Float4(As<UShort4>(cs[n]));
				}
			}
			else
			{
				if(isInteger)
				{
					c[n] = As<Float4>(Int4(cs[n]));
				}
				else
				{
					c[n] = Float4(cs[n]);
				}
			}
		}
	}

	if(state.compareEnable)
	{
		Float4 ref = dRef;

		if(!hasFloatTexture())
		{
			// D16_UNORM: clamp reference, normalize texel value
			ref = Min(Max(ref, Float4(0.0f)), Float4(1.0f));
			c.x = c.x * Float4(1.0f / 0xFFFF);
		}

		Int4 boolean;

		switch(state.compareOp)
		{
			case VK_COMPARE_OP_LESS_OR_EQUAL: boolean = CmpLE(ref, c.x); break;
			case VK_COMPARE_OP_GREATER_OR_EQUAL: boolean = CmpNLT(ref, c.x); break;
			case VK_COMPARE_OP_LESS: boolean = CmpLT(ref, c.x); break;
			case VK_COMPARE_OP_GREATER: boolean = CmpNLE(ref, c.x); break;
			case VK_COMPARE_OP_EQUAL: boolean = CmpEQ(ref, c.x); break;
			case VK_COMPARE_OP_NOT_EQUAL: boolean = CmpNEQ(ref, c.x); break;
			case VK_COMPARE_OP_ALWAYS: boolean = Int4(-1); break;
			case VK_COMPARE_OP_NEVER: boolean = Int4(0); break;
			default: ASSERT(false);
		}

		c.x = As<Float4>(boolean & As<Int4>(Float4(1.0f)));
		c.y = Float4(0.0f);
		c.z = Float4(0.0f);
		c.w = Float4(1.0f);
	}

	if(borderModeActive())
	{
		c = replaceBorderTexel(c, valid);
	}

	return c;
}

Vector4f SamplerCore::replaceBorderTexel(const Vector4f &c, Int4 valid)
{
	Int4 borderRGB;
	Int4 borderA;

	bool scaled = !hasFloatTexture() && !hasUnnormalizedIntegerTexture() && !state.compareEnable;
	bool sign = !hasUnsignedTextureComponent(0);
	Int4 float_one = scaled ? As<Int4>(Float4(static_cast<float>(sign ? 0x7FFF : 0xFFFF))) : As<Int4>(Float4(1.0f));

	switch(state.border)
	{
		case VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK:
		case VK_BORDER_COLOR_INT_TRANSPARENT_BLACK:
			borderRGB = Int4(0);
			borderA = Int4(0);
			break;
		case VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK:
			borderRGB = Int4(0);
			borderA = float_one;
			break;
		case VK_BORDER_COLOR_INT_OPAQUE_BLACK:
			borderRGB = Int4(0);
			borderA = Int4(1);
			break;
		case VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE:
			borderRGB = float_one;
			borderA = float_one;
			break;
		case VK_BORDER_COLOR_INT_OPAQUE_WHITE:
			borderRGB = Int4(1);
			borderA = Int4(1);
			break;
		default:
			UNSUPPORTED("sint/uint/sfloat border: %u", state.border);
	}

	Vector4f out;
	out.x = As<Float4>((valid & As<Int4>(c.x)) | (~valid & borderRGB));  // TODO: IfThenElse()
	out.y = As<Float4>((valid & As<Int4>(c.y)) | (~valid & borderRGB));
	out.z = As<Float4>((valid & As<Int4>(c.z)) | (~valid & borderRGB));
	out.w = As<Float4>((valid & As<Int4>(c.w)) | (~valid & borderA));

	return out;
}

void SamplerCore::selectMipmap(const Pointer<Byte> &texture, Pointer<Byte> &mipmap, Pointer<Byte> &buffer, const Float &lod, bool secondLOD)
{
	Pointer<Byte> mipmap0 = texture + OFFSET(Texture, mipmap[0]);

	if(state.mipmapFilter == MIPMAP_NONE)
	{
		mipmap = mipmap0;
	}
	else
	{
		Int ilod;

		if(state.mipmapFilter == MIPMAP_POINT)
		{
			// TODO: Preferred formula is ceil(lod + 0.5) - 1
			ilod = RoundInt(lod);
		}
		else  // MIPMAP_LINEAR
		{
			ilod = Int(lod);
		}

		mipmap = mipmap0 + ilod * sizeof(Mipmap) + secondLOD * sizeof(Mipmap);
	}

	buffer = *Pointer<Pointer<Byte>>(mipmap + OFFSET(Mipmap, buffer));
}

Int4 SamplerCore::computeFilterOffset(Float &lod)
{
	if(state.textureFilter == FILTER_POINT)
	{
		return Int4(0);
	}
	else if(state.textureFilter == FILTER_MIN_LINEAR_MAG_POINT)
	{
		return CmpNLE(Float4(lod), Float4(0.0f));
	}
	else if(state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
	{
		return CmpLE(Float4(lod), Float4(0.0f));
	}

	return Int4(~0);
}

Short4 SamplerCore::address(const Float4 &uw, AddressingMode addressingMode, Pointer<Byte> &mipmap)
{
	if(addressingMode == ADDRESSING_UNUSED)
	{
		return Short4(0);  // TODO(b/134669567): Optimize for 1D filtering
	}
	else if(addressingMode == ADDRESSING_CLAMP || addressingMode == ADDRESSING_BORDER)
	{
		Float4 clamp = Min(Max(uw, Float4(0.0f)), Float4(65535.0f / 65536.0f));

		return Short4(Int4(clamp * Float4(1 << 16)));
	}
	else if(addressingMode == ADDRESSING_MIRROR)
	{
		Int4 convert = Int4(uw * Float4(1 << 16));
		Int4 mirror = (convert << 15) >> 31;

		convert ^= mirror;

		return Short4(convert);
	}
	else if(addressingMode == ADDRESSING_MIRRORONCE)
	{
		// Absolute value
		Int4 convert = Int4(Abs(uw * Float4(1 << 16)));

		// Clamp
		convert -= Int4(0x00008000, 0x00008000, 0x00008000, 0x00008000);
		convert = As<Int4>(PackSigned(convert, convert));

		return As<Short4>(Int2(convert)) + Short4(0x8000u);
	}
	else  // Wrap
	{
		return Short4(Int4(uw * Float4(1 << 16)));
	}
}

Short4 SamplerCore::computeLayerIndex(const Float4 &a, Pointer<Byte> &mipmap)
{
	if(!state.isArrayed())
	{
		return {};
	}

	Int4 layers = *Pointer<Int4>(mipmap + OFFSET(Mipmap, depth));

	return Short4(Min(Max(RoundInt(a), Int4(0)), layers - Int4(1)));
}

// TODO: Eliminate when the gather + mirror addressing case is handled by mirroring the footprint.
static Int4 mirror(Int4 n)
{
	auto positive = CmpNLT(n, Int4(0));
	return (positive & n) | (~positive & (-(Int4(1) + n)));
}

static Int4 mod(Int4 n, Int4 d)
{
	auto x = n % d;
	auto positive = CmpNLT(x, Int4(0));
	return (positive & x) | (~positive & (x + d));
}

void SamplerCore::address(const Float4 &uvw, Int4 &xyz0, Int4 &xyz1, Float4 &f, Pointer<Byte> &mipmap, Int4 &offset, Int4 &filter, int whd, AddressingMode addressingMode, SamplerFunction function)
{
	if(addressingMode == ADDRESSING_UNUSED)
	{
		f = Float4(0.0f);  // TODO(b/134669567): Optimize for 1D filtering
		return;
	}

	Int4 dim = *Pointer<Int4>(mipmap + whd, 16);
	Int4 maxXYZ = dim - Int4(1);

	if(function == Fetch)  // Unnormalized coordinates
	{
		Int4 xyz = function.offset ? As<Int4>(uvw) + offset : As<Int4>(uvw);
		xyz0 = Min(Max(xyz, Int4(0)), maxXYZ);

		// VK_EXT_image_robustness requires checking for out-of-bounds accesses.
		// TODO(b/162327166): Only perform bounds checks when VK_EXT_image_robustness is enabled.
		// If the above clamping altered the result, the access is out-of-bounds.
		// In that case set the coordinate to -1 to perform texel replacement later.
		Int4 outOfBounds = CmpNEQ(xyz, xyz0);
		xyz0 |= outOfBounds;
	}
	else if(addressingMode == ADDRESSING_CUBEFACE)
	{
		xyz0 = As<Int4>(uvw);
	}
	else
	{
		const int halfBits = 0x3EFFFFFF;  // Value just under 0.5f
		const int oneBits = 0x3F7FFFFF;   // Value just under 1.0f
		const int twoBits = 0x3FFFFFFF;   // Value just under 2.0f

		Float4 coord = uvw;

		if(state.unnormalizedCoordinates)
		{
			switch(addressingMode)
			{
				case ADDRESSING_CLAMP:
					coord = Min(Max(coord, Float4(0.0f)), Float4(dim) * As<Float4>(Int4(oneBits)));
					break;
				case ADDRESSING_BORDER:
					// Don't map to a valid range here.
					break;
				default:
					// "If unnormalizedCoordinates is VK_TRUE, addressModeU and addressModeV must each be
					//  either VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE or VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER"
					UNREACHABLE("addressingMode %d", int(addressingMode));
					break;
			}
		}
		else if(state.textureFilter == FILTER_GATHER && addressingMode == ADDRESSING_MIRROR)
		{
			// Gather requires the 'footprint' of the texels from which a component is taken, to also mirror around.
			// Therefore we can't just compute one texel's location and find the other ones at +1 offsets from it.
			// Here we handle that case separately by doing the mirroring per texel coordinate.
			// TODO: Mirror the footprint by adjusting the sign of the 0.5f and 1 offsets.

			coord = coord * Float4(dim);
			coord -= Float4(0.5f);
			Float4 floor = Floor(coord);
			xyz0 = Int4(floor);

			if(function.offset)
			{
				xyz0 += offset;
			}

			xyz1 = xyz0 + Int4(1);

			xyz0 = (maxXYZ)-mirror(mod(xyz0, Int4(2) * dim) - dim);
			xyz1 = (maxXYZ)-mirror(mod(xyz1, Int4(2) * dim) - dim);

			return;
		}
		else
		{
			if(!function.offset)
			{
				switch(addressingMode)
				{
					case ADDRESSING_CLAMP:
					case ADDRESSING_SEAMLESS:
						// While cube face coordinates are nominally already in the [0.0, 1.0] range
						// due to the projection, and numerical imprecision is tolerated due to the
						// border of pixels for seamless filtering, the projection doesn't cause
						// range normalization for Inf and NaN values. So we always clamp.
						{
							Float4 one = As<Float4>(Int4(oneBits));
							coord = Min(Max(coord, Float4(0.0f)), one);
						}
						break;
					case ADDRESSING_MIRROR:
					{
						Float4 half = As<Float4>(Int4(halfBits));
						Float4 one = As<Float4>(Int4(oneBits));
						Float4 two = As<Float4>(Int4(twoBits));
						coord = one - Abs(two * Frac(coord * half) - one);
					}
					break;
					case ADDRESSING_MIRRORONCE:
					{
						Float4 half = As<Float4>(Int4(halfBits));
						Float4 one = As<Float4>(Int4(oneBits));
						Float4 two = As<Float4>(Int4(twoBits));
						coord = one - Abs(two * Frac(Min(Max(coord, -one), two) * half) - one);
					}
					break;
					case ADDRESSING_BORDER:
						// Don't map to a valid range here.
						break;
					default:  // Wrap
						coord = Frac(coord);
						break;
				}
			}

			coord = coord * Float4(dim);
		}

		if(state.textureFilter == FILTER_POINT)
		{
			if(addressingMode == ADDRESSING_BORDER || function.offset)
			{
				xyz0 = Int4(Floor(coord));
			}
			else  // Can't have negative coordinates, so floor() is redundant when casting to int.
			{
				xyz0 = Int4(coord);
			}
		}
		else
		{
			if(state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR ||
			   state.textureFilter == FILTER_MIN_LINEAR_MAG_POINT)
			{
				coord -= As<Float4>(As<Int4>(Float4(0.5f)) & filter);
			}
			else
			{
				coord -= Float4(0.5f);
			}

			Float4 floor = Floor(coord);
			xyz0 = Int4(floor);
			f = coord - floor;
		}

		if(function.offset)
		{
			xyz0 += offset;
		}

		if(addressingMode == ADDRESSING_SEAMLESS)  // Adjust for border.
		{
			xyz0 += Int4(1);
		}

		xyz1 = xyz0 - filter;  // Increment

		if(addressingMode == ADDRESSING_BORDER)
		{
			// Replace the coordinates with -1 if they're out of range.
			Int4 border0 = CmpLT(xyz0, Int4(0)) | CmpNLT(xyz0, dim);
			Int4 border1 = CmpLT(xyz1, Int4(0)) | CmpNLT(xyz1, dim);
			xyz0 |= border0;
			xyz1 |= border1;
		}
		else if(function.offset)
		{
			switch(addressingMode)
			{
				case ADDRESSING_SEAMLESS:
					UNREACHABLE("addressingMode %d", int(addressingMode));  // Cube sampling doesn't support offset.
				case ADDRESSING_MIRROR:
				case ADDRESSING_MIRRORONCE:
					// TODO: Implement ADDRESSING_MIRROR and ADDRESSING_MIRRORONCE.
					// Fall through to Clamp.
				case ADDRESSING_CLAMP:
					xyz0 = Min(Max(xyz0, Int4(0)), maxXYZ);
					xyz1 = Min(Max(xyz1, Int4(0)), maxXYZ);
					break;
				default:  // Wrap
					xyz0 = mod(xyz0, dim);
					xyz1 = mod(xyz1, dim);
					break;
			}
		}
		else if(state.textureFilter != FILTER_POINT)
		{
			switch(addressingMode)
			{
				case ADDRESSING_SEAMLESS:
					break;
				case ADDRESSING_MIRROR:
				case ADDRESSING_MIRRORONCE:
				case ADDRESSING_CLAMP:
					xyz0 = Max(xyz0, Int4(0));
					xyz1 = Min(xyz1, maxXYZ);
					break;
				default:  // Wrap
				{
					Int4 under = CmpLT(xyz0, Int4(0));
					xyz0 = (under & maxXYZ) | (~under & xyz0);  // xyz < 0 ? dim - 1 : xyz   // TODO: IfThenElse()

					Int4 nover = CmpLT(xyz1, dim);
					xyz1 = nover & xyz1;  // xyz >= dim ? 0 : xyz
				}
				break;
			}
		}
	}
}

Int4 SamplerCore::computeLayerIndex(const Float4 &a, Pointer<Byte> &mipmap, SamplerFunction function)
{
	if(!state.isArrayed())
	{
		return {};
	}

	Int4 layers = *Pointer<Int4>(mipmap + OFFSET(Mipmap, depth), 16);
	Int4 maxLayer = layers - Int4(1);

	if(function == Fetch)  // Unnormalized coordinates
	{
		Int4 xyz = As<Int4>(a);
		Int4 xyz0 = Min(Max(xyz, Int4(0)), maxLayer);

		// VK_EXT_image_robustness requires checking for out-of-bounds accesses.
		// TODO(b/162327166): Only perform bounds checks when VK_EXT_image_robustness is enabled.
		// If the above clamping altered the result, the access is out-of-bounds.
		// In that case set the coordinate to -1 to perform texel replacement later.
		Int4 outOfBounds = CmpNEQ(xyz, xyz0);
		xyz0 |= outOfBounds;

		return xyz0;
	}
	else
	{
		return Min(Max(RoundInt(a), Int4(0)), maxLayer);
	}
}

void SamplerCore::convertSigned15(Float4 &cf, Short4 &cs)
{
	cf = Float4(cs) * Float4(1.0f / 0x7FFF);
}

void SamplerCore::convertUnsigned16(Float4 &cf, Short4 &cs)
{
	cf = Float4(As<UShort4>(cs)) * Float4(1.0f / 0xFFFF);
}

void SamplerCore::sRGBtoLinearFF00(Short4 &c)
{
	c = As<UShort4>(c) >> 8;

	Pointer<Byte> LUT = Pointer<Byte>(constants + OFFSET(Constants, sRGBtoLinearFF_FF00));

	c = Insert(c, *Pointer<Short>(LUT + 2 * Int(Extract(c, 0))), 0);
	c = Insert(c, *Pointer<Short>(LUT + 2 * Int(Extract(c, 1))), 1);
	c = Insert(c, *Pointer<Short>(LUT + 2 * Int(Extract(c, 2))), 2);
	c = Insert(c, *Pointer<Short>(LUT + 2 * Int(Extract(c, 3))), 3);
}

bool SamplerCore::hasFloatTexture() const
{
	return state.textureFormat.isFloatFormat();
}

bool SamplerCore::hasUnnormalizedIntegerTexture() const
{
	return state.textureFormat.isUnnormalizedInteger();
}

bool SamplerCore::hasUnsignedTextureComponent(int component) const
{
	return state.textureFormat.isUnsignedComponent(component);
}

int SamplerCore::textureComponentCount() const
{
	return state.textureFormat.componentCount();
}

bool SamplerCore::has16bitPackedTextureFormat() const
{
	return state.textureFormat.has16bitPackedTextureFormat();
}

bool SamplerCore::has8bitTextureComponents() const
{
	return state.textureFormat.has8bitTextureComponents();
}

bool SamplerCore::has16bitTextureComponents() const
{
	return state.textureFormat.has16bitTextureComponents();
}

bool SamplerCore::has32bitIntegerTextureComponents() const
{
	return state.textureFormat.has32bitIntegerTextureComponents();
}

bool SamplerCore::isYcbcrFormat() const
{
	return state.textureFormat.isYcbcrFormat();
}

bool SamplerCore::isRGBComponent(int component) const
{
	return state.textureFormat.isRGBComponent(component);
}

bool SamplerCore::borderModeActive() const
{
	return state.addressingModeU == ADDRESSING_BORDER ||
	       state.addressingModeV == ADDRESSING_BORDER ||
	       state.addressingModeW == ADDRESSING_BORDER;
}

VkComponentSwizzle SamplerCore::gatherSwizzle() const
{
	switch(state.gatherComponent)
	{
		case 0: return state.swizzle.r;
		case 1: return state.swizzle.g;
		case 2: return state.swizzle.b;
		case 3: return state.swizzle.a;
		default:
			UNREACHABLE("Invalid component");
			return VK_COMPONENT_SWIZZLE_R;
	}
}

}  // namespace sw
