Commit b0d00eac by Chris Forbes

Implement OpImageQuerySize

Tests: dEQP-VK.image.image_size.* Bug: b/129523279 Change-Id: I6ec474bb5fcdab8853ac4afaa2967bbc4023c970 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/29268Tested-by: 's avatarChris Forbes <chrisforbes@google.com> Presubmit-Ready: Chris Forbes <chrisforbes@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarBen Clayton <bclayton@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
parent 5822882b
...@@ -680,6 +680,7 @@ namespace sw ...@@ -680,6 +680,7 @@ namespace sw
case spv::OpAtomicLoad: case spv::OpAtomicLoad:
case spv::OpPhi: case spv::OpPhi:
case spv::OpImageSampleImplicitLod: case spv::OpImageSampleImplicitLod:
case spv::OpImageQuerySize:
// Instructions that yield an intermediate value or divergent pointer // Instructions that yield an intermediate value or divergent pointer
DefineResult(insn); DefineResult(insn);
break; break;
...@@ -2135,6 +2136,9 @@ namespace sw ...@@ -2135,6 +2136,9 @@ namespace sw
case spv::OpImageSampleImplicitLod: case spv::OpImageSampleImplicitLod:
return EmitImageSampleImplicitLod(insn, state); return EmitImageSampleImplicitLod(insn, state);
case spv::OpImageQuerySize:
return EmitImageQuerySize(insn, state);
default: default:
UNIMPLEMENTED("opcode: %s", OpcodeName(opcode).c_str()); UNIMPLEMENTED("opcode: %s", OpcodeName(opcode).c_str());
break; break;
...@@ -4350,6 +4354,56 @@ namespace sw ...@@ -4350,6 +4354,56 @@ namespace sw
return EmitResult::Continue; return EmitResult::Continue;
} }
SpirvShader::EmitResult SpirvShader::EmitImageQuerySize(InsnIterator insn, EmitState *state) const
{
auto &resultType = getType(Type::ID(insn.word(1)));
auto imageId = Object::ID(insn.word(3));
auto &image = getObject(imageId);
auto &imageType = getType(image.type);
Object::ID resultId = insn.word(2);
ASSERT(imageType.definition.opcode() == spv::OpTypeImage);
bool isArrayed = imageType.definition.word(5) != 0;
bool isCubeMap = imageType.definition.word(3) == spv::DimCube;
const DescriptorDecorations &d = descriptorDecorations.at(imageId);
uint32_t arrayIndex = 0; // TODO(b/129523279)
auto setLayout = state->routine->pipelineLayout->getDescriptorSetLayout(d.DescriptorSet);
size_t bindingOffset = setLayout->getBindingOffset(d.Binding, arrayIndex);
auto &bindingLayout = setLayout->getBindingLayout(d.Binding);
Pointer<Byte> set = state->routine->descriptorSets[d.DescriptorSet]; // DescriptorSet*
Pointer<Byte> binding = Pointer<Byte>(set + bindingOffset);
auto &dst = state->routine->createIntermediate(resultId, resultType.sizeInComponents);
switch (bindingLayout.descriptorType)
{
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
{
Pointer<Byte> desc = binding; // StorageImageDescriptor*
Pointer<Int> extent = desc + OFFSET(vk::StorageImageDescriptor, extent); // int[3]*
auto dimensions = resultType.sizeInComponents - (isArrayed ? 1 : 0);
for (uint32_t i = 0; i < dimensions; i++)
{
dst.move(i, SIMD::Int(extent[i]));
}
if (isArrayed)
{
auto arrayLayers = *Pointer<Int>(desc + OFFSET(vk::StorageImageDescriptor, arrayLayers)); // uint32_t
auto numElements = isCubeMap ? arrayLayers / 6 : arrayLayers;
dst.move(dimensions, SIMD::Int(numElements));
}
break;
}
default:
UNIMPLEMENTED("EmitImageQuerySize image descriptorType: %d", int(bindingLayout.descriptorType));
}
return EmitResult::Continue;
}
void SpirvShader::emitEpilog(SpirvRoutine *routine) const void SpirvShader::emitEpilog(SpirvRoutine *routine) const
{ {
for (auto insn : *this) for (auto insn : *this)
......
...@@ -723,6 +723,7 @@ namespace sw ...@@ -723,6 +723,7 @@ namespace sw
EmitResult EmitKill(InsnIterator insn, EmitState *state) const; EmitResult EmitKill(InsnIterator insn, EmitState *state) const;
EmitResult EmitPhi(InsnIterator insn, EmitState *state) const; EmitResult EmitPhi(InsnIterator insn, EmitState *state) const;
EmitResult EmitImageSampleImplicitLod(InsnIterator insn, EmitState *state) const; EmitResult EmitImageSampleImplicitLod(InsnIterator insn, EmitState *state) const;
EmitResult EmitImageQuerySize(InsnIterator insn, EmitState *state) const;
// OpcodeName() returns the name of the opcode op. // OpcodeName() returns the name of the opcode op.
// If NDEBUG is defined, then OpcodeName() will only return the numerical code. // If NDEBUG is defined, then OpcodeName() will only return the numerical code.
......
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