|
@@ -292,33 +292,36 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- std::vector<Node> coords;
|
|
|
|
|
-
|
|
|
|
|
- // TODO: Add coordinates for different samplers once other texture types are implemented.
|
|
|
|
|
- switch (texture_type) {
|
|
|
|
|
- case TextureType::Texture1D:
|
|
|
|
|
- coords.push_back(GetRegister(instr.gpr8));
|
|
|
|
|
- break;
|
|
|
|
|
- case TextureType::Texture2D:
|
|
|
|
|
- coords.push_back(GetRegister(instr.gpr8.Value() + 0));
|
|
|
|
|
- coords.push_back(GetRegister(instr.gpr8.Value() + 1));
|
|
|
|
|
- break;
|
|
|
|
|
- default:
|
|
|
|
|
- UNIMPLEMENTED_MSG("Unhandled texture type {}", static_cast<int>(texture_type));
|
|
|
|
|
|
|
+ const u64 base_index = is_array ? 1 : 0;
|
|
|
|
|
+ const u64 num_components = [texture_type] {
|
|
|
|
|
+ switch (texture_type) {
|
|
|
|
|
+ case TextureType::Texture1D:
|
|
|
|
|
+ return 1;
|
|
|
|
|
+ case TextureType::Texture2D:
|
|
|
|
|
+ return 2;
|
|
|
|
|
+ case TextureType::TextureCube:
|
|
|
|
|
+ return 3;
|
|
|
|
|
+ default:
|
|
|
|
|
+ UNIMPLEMENTED_MSG("Unhandled texture type {}", static_cast<int>(texture_type));
|
|
|
|
|
+ return 2;
|
|
|
|
|
+ }
|
|
|
|
|
+ }();
|
|
|
|
|
+ // TODO: What's the array component used for?
|
|
|
|
|
|
|
|
- // Fallback to interpreting as a 2D texture for now
|
|
|
|
|
- coords.push_back(GetRegister(instr.gpr8.Value() + 0));
|
|
|
|
|
- coords.push_back(GetRegister(instr.gpr8.Value() + 1));
|
|
|
|
|
|
|
+ std::vector<Node> coords;
|
|
|
|
|
+ coords.reserve(num_components);
|
|
|
|
|
+ for (u64 component = 0; component < num_components; ++component) {
|
|
|
|
|
+ coords.push_back(GetRegister(instr.gpr8.Value() + base_index + component));
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
u32 indexer = 0;
|
|
u32 indexer = 0;
|
|
|
for (u32 element = 0; element < 2; ++element) {
|
|
for (u32 element = 0; element < 2; ++element) {
|
|
|
if (!instr.tmml.IsComponentEnabled(element)) {
|
|
if (!instr.tmml.IsComponentEnabled(element)) {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
- auto params = coords;
|
|
|
|
|
MetaTexture meta{*sampler, {}, {}, {}, {}, {}, {}, {}, {}, element, index_var};
|
|
MetaTexture meta{*sampler, {}, {}, {}, {}, {}, {}, {}, {}, element, index_var};
|
|
|
- const Node value = Operation(OperationCode::TextureQueryLod, meta, std::move(params));
|
|
|
|
|
- SetTemporary(bb, indexer++, value);
|
|
|
|
|
|
|
+ Node value = Operation(OperationCode::TextureQueryLod, meta, coords);
|
|
|
|
|
+ SetTemporary(bb, indexer++, std::move(value));
|
|
|
}
|
|
}
|
|
|
for (u32 i = 0; i < indexer; ++i) {
|
|
for (u32 i = 0; i < indexer; ++i) {
|
|
|
SetRegister(bb, instr.gpr0.Value() + i, GetTemporary(i));
|
|
SetRegister(bb, instr.gpr0.Value() + i, GetTemporary(i));
|