Commit b4001ed5 by Ben Clayton

SpirvShader: Implement OpImageQueryLevels

Tests: dEQP-VK.glsl.texture_functions.query.texturequerylevels.* Bug: b/129523279 Change-Id: I385eaa4a8d5fc50c12c7cf284c26037ed93aa469 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31109 Presubmit-Ready: Ben Clayton <bclayton@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarChris Forbes <chrisforbes@google.com> Tested-by: 's avatarBen Clayton <bclayton@google.com>
parent cb9bf9ac
...@@ -901,6 +901,7 @@ namespace sw ...@@ -901,6 +901,7 @@ namespace sw
case spv::OpImageFetch: case spv::OpImageFetch:
case spv::OpImageQuerySize: case spv::OpImageQuerySize:
case spv::OpImageQuerySizeLod: case spv::OpImageQuerySizeLod:
case spv::OpImageQueryLevels:
case spv::OpImageRead: case spv::OpImageRead:
case spv::OpImageTexelPointer: case spv::OpImageTexelPointer:
case spv::OpGroupNonUniformElect: case spv::OpGroupNonUniformElect:
...@@ -2490,6 +2491,9 @@ namespace sw ...@@ -2490,6 +2491,9 @@ namespace sw
case spv::OpImageQuerySizeLod: case spv::OpImageQuerySizeLod:
return EmitImageQuerySizeLod(insn, state); return EmitImageQuerySizeLod(insn, state);
case spv::OpImageQueryLevels:
return EmitImageQueryLevels(insn, state);
case spv::OpImageRead: case spv::OpImageRead:
return EmitImageRead(insn, state); return EmitImageRead(insn, state);
...@@ -4895,6 +4899,38 @@ namespace sw ...@@ -4895,6 +4899,38 @@ namespace sw
} }
} }
SpirvShader::EmitResult SpirvShader::EmitImageQueryLevels(InsnIterator insn, EmitState *state) const
{
auto &resultTy = getType(Type::ID(insn.word(1)));
ASSERT(resultTy.sizeInComponents == 1);
auto resultId = Object::ID(insn.word(2));
auto imageId = Object::ID(insn.word(3));
const DescriptorDecorations &d = descriptorDecorations.at(imageId);
auto setLayout = state->routine->pipelineLayout->getDescriptorSetLayout(d.DescriptorSet);
auto &bindingLayout = setLayout->getBindingLayout(d.Binding);
Pointer<Byte> descriptor = state->routine->getPointer(imageId).base;
Int mipLevels = 0;
switch (bindingLayout.descriptorType)
{
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
{
mipLevels = *Pointer<Int>(descriptor + OFFSET(vk::SampledImageDescriptor, mipLevels)); // uint32_t
break;
}
default:
UNREACHABLE("Image descriptorType: %d", int(bindingLayout.descriptorType));
}
auto &dst = state->routine->createIntermediate(resultId, 1);
dst.move(0, SIMD::Int(mipLevels));
return EmitResult::Continue;
}
SIMD::Pointer SpirvShader::GetTexelAddress(SpirvRoutine const *routine, SIMD::Pointer ptr, GenericValue const & coordinate, Type const & imageType, Pointer<Byte> descriptor, int texelSize, Object::ID sampleId, bool useStencilAspect) const SIMD::Pointer SpirvShader::GetTexelAddress(SpirvRoutine const *routine, SIMD::Pointer ptr, GenericValue const & coordinate, Type const & imageType, Pointer<Byte> descriptor, int texelSize, Object::ID sampleId, bool useStencilAspect) const
{ {
bool isArrayed = imageType.definition.word(5) != 0; bool isArrayed = imageType.definition.word(5) != 0;
......
...@@ -941,6 +941,7 @@ namespace sw ...@@ -941,6 +941,7 @@ namespace sw
EmitResult EmitImageSample(ImageInstruction instruction, InsnIterator insn, EmitState *state) const; EmitResult EmitImageSample(ImageInstruction instruction, InsnIterator insn, EmitState *state) const;
EmitResult EmitImageQuerySize(InsnIterator insn, EmitState *state) const; EmitResult EmitImageQuerySize(InsnIterator insn, EmitState *state) const;
EmitResult EmitImageQuerySizeLod(InsnIterator insn, EmitState *state) const; EmitResult EmitImageQuerySizeLod(InsnIterator insn, EmitState *state) const;
EmitResult EmitImageQueryLevels(InsnIterator insn, EmitState *state) const;
EmitResult EmitImageRead(InsnIterator insn, EmitState *state) const; EmitResult EmitImageRead(InsnIterator insn, EmitState *state) const;
EmitResult EmitImageWrite(InsnIterator insn, EmitState *state) const; EmitResult EmitImageWrite(InsnIterator insn, EmitState *state) const;
EmitResult EmitImageTexelPointer(InsnIterator insn, EmitState *state) const; EmitResult EmitImageTexelPointer(InsnIterator insn, EmitState *state) const;
......
...@@ -314,6 +314,7 @@ void DescriptorSetLayout::WriteDescriptorSet(DescriptorSet *dstSet, VkDescriptor ...@@ -314,6 +314,7 @@ void DescriptorSetLayout::WriteDescriptorSet(DescriptorSet *dstSet, VkDescriptor
auto numElements = bufferView->getElementCount(); auto numElements = bufferView->getElementCount();
imageSampler[i].extent = { numElements, 1, 1 }; imageSampler[i].extent = { numElements, 1, 1 };
imageSampler[i].arrayLayers = 1; imageSampler[i].arrayLayers = 1;
imageSampler[i].mipLevels = 1;
imageSampler[i].texture.widthWidthHeightHeight = sw::vector(numElements, numElements, 1, 1); imageSampler[i].texture.widthWidthHeightHeight = sw::vector(numElements, numElements, 1, 1);
imageSampler[i].texture.width = sw::replicate(numElements); imageSampler[i].texture.width = sw::replicate(numElements);
imageSampler[i].texture.height = sw::replicate(1); imageSampler[i].texture.height = sw::replicate(1);
...@@ -351,6 +352,7 @@ void DescriptorSetLayout::WriteDescriptorSet(DescriptorSet *dstSet, VkDescriptor ...@@ -351,6 +352,7 @@ void DescriptorSetLayout::WriteDescriptorSet(DescriptorSet *dstSet, VkDescriptor
imageSampler[i].imageViewId = imageView->id; imageSampler[i].imageViewId = imageView->id;
imageSampler[i].extent = imageView->getMipLevelExtent(0); imageSampler[i].extent = imageView->getMipLevelExtent(0);
imageSampler[i].arrayLayers = imageView->getSubresourceRange().layerCount; imageSampler[i].arrayLayers = imageView->getSubresourceRange().layerCount;
imageSampler[i].mipLevels = imageView->getSubresourceRange().levelCount;
imageSampler[i].type = imageView->getType(); imageSampler[i].type = imageView->getType();
imageSampler[i].swizzle = imageView->getComponentMapping(); imageSampler[i].swizzle = imageView->getComponentMapping();
imageSampler[i].format = imageView->getFormat(ImageView::SAMPLING); imageSampler[i].format = imageView->getFormat(ImageView::SAMPLING);
......
...@@ -41,6 +41,7 @@ struct alignas(16) SampledImageDescriptor ...@@ -41,6 +41,7 @@ struct alignas(16) SampledImageDescriptor
alignas(16) sw::Texture texture; alignas(16) sw::Texture texture;
VkExtent3D extent; // Of base mip-level. VkExtent3D extent; // Of base mip-level.
int arrayLayers; int arrayLayers;
int mipLevels;
}; };
struct alignas(16) StorageImageDescriptor struct alignas(16) StorageImageDescriptor
......
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