|
@@ -162,8 +162,10 @@ Id Texture(EmitContext& ctx, IR::TextureInstInfo info, [[maybe_unused]] const IR
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-Id TextureImage(EmitContext& ctx, IR::TextureInstInfo info,
|
|
|
|
|
- [[maybe_unused]] const IR::Value& index) {
|
|
|
|
|
|
|
+Id TextureImage(EmitContext& ctx, IR::TextureInstInfo info, const IR::Value& index) {
|
|
|
|
|
+ if (!index.IsImmediate() || index.U32() != 0) {
|
|
|
|
|
+ throw NotImplementedException("Indirect image indexing");
|
|
|
|
|
+ }
|
|
|
if (info.type == TextureType::Buffer) {
|
|
if (info.type == TextureType::Buffer) {
|
|
|
const TextureBufferDefinition& def{ctx.texture_buffers.at(info.descriptor_index)};
|
|
const TextureBufferDefinition& def{ctx.texture_buffers.at(info.descriptor_index)};
|
|
|
if (def.count > 1) {
|
|
if (def.count > 1) {
|
|
@@ -182,14 +184,14 @@ Id TextureImage(EmitContext& ctx, IR::TextureInstInfo info,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Id Image(EmitContext& ctx, const IR::Value& index, IR::TextureInstInfo info) {
|
|
Id Image(EmitContext& ctx, const IR::Value& index, IR::TextureInstInfo info) {
|
|
|
- if (!index.IsImmediate()) {
|
|
|
|
|
|
|
+ if (!index.IsImmediate() || index.U32() != 0) {
|
|
|
throw NotImplementedException("Indirect image indexing");
|
|
throw NotImplementedException("Indirect image indexing");
|
|
|
}
|
|
}
|
|
|
if (info.type == TextureType::Buffer) {
|
|
if (info.type == TextureType::Buffer) {
|
|
|
- const ImageBufferDefinition def{ctx.image_buffers.at(index.U32())};
|
|
|
|
|
|
|
+ const ImageBufferDefinition def{ctx.image_buffers.at(info.descriptor_index)};
|
|
|
return ctx.OpLoad(def.image_type, def.id);
|
|
return ctx.OpLoad(def.image_type, def.id);
|
|
|
} else {
|
|
} else {
|
|
|
- const ImageDefinition def{ctx.images.at(index.U32())};
|
|
|
|
|
|
|
+ const ImageDefinition def{ctx.images.at(info.descriptor_index)};
|
|
|
return ctx.OpLoad(def.image_type, def.id);
|
|
return ctx.OpLoad(def.image_type, def.id);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|