Commit e2535df1 by Nicolas Capens Committed by Nicolas Capens

Implement 1D array image sampling

Treat it as a 2D array image by setting the second coordinate to 0 and assigning the layer coordinate to the third. Bug: b/129523279 Test: dEQP-VK.pipeline.image.* Test: dEQP-VK.pipeline.sampler.* Change-Id: I82e9a8081c2b7d7a2f62ffc016b860925bd853ad Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30708 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarChris Forbes <chrisforbes@google.com>
parent 68e4141b
......@@ -70,7 +70,7 @@ namespace sw
TEXTURE_3D,
TEXTURE_RECTANGLE, // TODO(b/129523279): Eliminate
TEXTURE_CUBE,
TEXTURE_1D_ARRAY,
TEXTURE_1D_ARRAY, // Treated as 2D texture with second coordinate 0.
TEXTURE_2D_ARRAY,
TEXTURE_CUBE_ARRAY,
......
......@@ -1431,7 +1431,7 @@ namespace sw
if(hasThirdCoordinate())
{
if(state.textureType != TEXTURE_2D_ARRAY)
if(state.textureType == TEXTURE_3D)
{
if(!texelFetch)
{
......@@ -2092,11 +2092,7 @@ namespace sw
Short4 SamplerCore::address(Float4 &uw, AddressingMode addressingMode, Pointer<Byte> &mipmap)
{
if(addressingMode == ADDRESSING_LAYER && state.textureType != TEXTURE_2D_ARRAY)
{
return Short4(); // Unused
}
else if(addressingMode == ADDRESSING_LAYER && state.textureType == TEXTURE_2D_ARRAY)
if(addressingMode == ADDRESSING_LAYER)
{
return Min(Max(Short4(RoundInt(uw)), Short4(0)), *Pointer<Short4>(mipmap + OFFSET(Mipmap, depth)) - Short4(1));
}
......@@ -2134,11 +2130,6 @@ namespace sw
void SamplerCore::address(Float4 &uvw, Int4 &xyz0, Int4 &xyz1, Float4 &f, Pointer<Byte> &mipmap, Float4 &texOffset, Int4 &filter, int whd, AddressingMode addressingMode, SamplerFunction function)
{
if(addressingMode == ADDRESSING_LAYER && state.textureType != TEXTURE_2D_ARRAY)
{
return; // Unused
}
Int4 dim = Int4(*Pointer<Short4>(mipmap + whd, 16));
Int4 maxXYZ = dim - Int4(1);
......@@ -2146,7 +2137,7 @@ namespace sw
{
xyz0 = Min(Max(((function.option == Offset) && (addressingMode != ADDRESSING_LAYER)) ? As<Int4>(uvw) + As<Int4>(texOffset) : As<Int4>(uvw), Int4(0)), maxXYZ);
}
else if(addressingMode == ADDRESSING_LAYER && state.textureType == TEXTURE_2D_ARRAY) // Note: Offset does not apply to array layers
else if(addressingMode == ADDRESSING_LAYER) // Note: Offset does not apply to array layers
{
xyz0 = Min(Max(RoundInt(uvw), Int4(0)), maxXYZ);
}
......@@ -2336,7 +2327,9 @@ namespace sw
bool SamplerCore::hasThirdCoordinate() const
{
return (state.textureType == TEXTURE_3D) || (state.textureType == TEXTURE_2D_ARRAY);
return (state.textureType == TEXTURE_3D) ||
(state.textureType == TEXTURE_2D_ARRAY) ||
(state.textureType == TEXTURE_1D_ARRAY); // Treated as 2D texture with second coordinate 0.
}
bool SamplerCore::has16bitTextureFormat() const
......
......@@ -515,7 +515,7 @@ namespace sw
// Parameters are passed to the sampling routine in this order:
uint32_t coordinates : 3; // 1-4 (does not contain projection component)
// uint32_t dref : 1; // Indicated by Variant::ProjDref|Dref
// uint32_t dref : 1; // Indicated by Variant::ProjDref|Dref
// uint32_t lodOrBias : 1; // Indicated by SamplerMethod::Lod|Bias
uint32_t gradComponents : 2; // 0-3 (for each of dx / dy)
uint32_t offsetComponents : 2; // 0-3
......
......@@ -69,7 +69,11 @@ SpirvShader::ImageSampler *SpirvShader::getImageSampler(uint32_t inst, const vk:
samplerState.compareEnable = (sampler->compareEnable == VK_TRUE);
samplerState.compareOp = sampler->compareOp;
ASSERT(sampler->anisotropyEnable == VK_FALSE); // TODO(b/129523279)
if(sampler->anisotropyEnable != VK_FALSE)
{
UNSUPPORTED("anisotropyEnable");
}
ASSERT(sampler->unnormalizedCoordinates == VK_FALSE); // TODO(b/129523279)
auto fptr = emitSamplerFunction(instruction, samplerState);
......@@ -113,11 +117,15 @@ SpirvShader::ImageSampler *SpirvShader::emitSamplerFunction(ImageInstruction ins
// TODO(b/129523279): Currently 1D textures are treated as 2D by setting the second coordinate to 0.
// Implement optimized 1D sampling.
if(samplerState.textureType == TEXTURE_1D ||
samplerState.textureType == TEXTURE_1D_ARRAY)
if(samplerState.textureType == TEXTURE_1D)
{
uvw[1] = SIMD::Float(0);
}
else if(samplerState.textureType == TEXTURE_1D_ARRAY)
{
uvw[1] = SIMD::Float(0);
uvw[2] = in[1]; // Move 1D layer coordinate to 2D layer coordinate index.
}
if(instruction.samplerMethod == Lod || instruction.samplerMethod == Bias)
{
......@@ -165,7 +173,7 @@ sw::TextureType SpirvShader::convertTextureType(VkImageViewType imageViewType)
case VK_IMAGE_VIEW_TYPE_2D: return TEXTURE_2D;
case VK_IMAGE_VIEW_TYPE_3D: return TEXTURE_3D;
case VK_IMAGE_VIEW_TYPE_CUBE: return TEXTURE_CUBE;
// case VK_IMAGE_VIEW_TYPE_1D_ARRAY: return TEXTURE_1D_ARRAY;
case VK_IMAGE_VIEW_TYPE_1D_ARRAY: return TEXTURE_1D_ARRAY;
case VK_IMAGE_VIEW_TYPE_2D_ARRAY: return TEXTURE_2D_ARRAY;
// case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return TEXTURE_CUBE_ARRAY;
default:
......@@ -233,8 +241,7 @@ sw::AddressingMode SpirvShader::convertAddressingMode(int coordinateIndex, VkSam
case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_3D:
break;
// case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
break;
case VK_IMAGE_VIEW_TYPE_1D_ARRAY: // Treated as 2D texture with second coordinate 0.
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
if(coordinateIndex == 2)
{
......@@ -261,7 +268,7 @@ sw::AddressingMode SpirvShader::convertAddressingMode(int coordinateIndex, VkSam
case VK_IMAGE_VIEW_TYPE_1D:
case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_3D:
// case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
break;
default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment