|
|
|
@ -119,8 +119,7 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
|
|
|
|
|
coords.push_back(op_a);
|
|
|
|
|
coords.push_back(op_b);
|
|
|
|
|
}
|
|
|
|
|
std::vector<Node> extras;
|
|
|
|
|
extras.push_back(Immediate(static_cast<u32>(instr.tld4s.component)));
|
|
|
|
|
const Node component = Immediate(static_cast<u32>(instr.tld4s.component));
|
|
|
|
|
|
|
|
|
|
const auto& sampler =
|
|
|
|
|
GetSampler(instr.sampler, TextureType::Texture2D, false, depth_compare);
|
|
|
|
@ -128,7 +127,7 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
|
|
|
|
|
Node4 values;
|
|
|
|
|
for (u32 element = 0; element < values.size(); ++element) {
|
|
|
|
|
auto coords_copy = coords;
|
|
|
|
|
MetaTexture meta{sampler, {}, {}, extras, element};
|
|
|
|
|
MetaTexture meta{sampler, {}, {}, {}, {}, component, element};
|
|
|
|
|
values[element] = Operation(OperationCode::TextureGather, meta, std::move(coords_copy));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -153,7 +152,7 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
|
|
|
|
|
if (!instr.txq.IsComponentEnabled(element)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
MetaTexture meta{sampler, {}, {}, {}, element};
|
|
|
|
|
MetaTexture meta{sampler, {}, {}, {}, {}, {}, element};
|
|
|
|
|
const Node value =
|
|
|
|
|
Operation(OperationCode::TextureQueryDimensions, meta, GetRegister(instr.gpr8));
|
|
|
|
|
SetTemporal(bb, indexer++, value);
|
|
|
|
@ -203,7 +202,7 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
|
|
|
|
|
|
|
|
|
|
for (u32 element = 0; element < 2; ++element) {
|
|
|
|
|
auto params = coords;
|
|
|
|
|
MetaTexture meta{sampler, {}, {}, {}, element};
|
|
|
|
|
MetaTexture meta{sampler, {}, {}, {}, {}, {}, element};
|
|
|
|
|
const Node value = Operation(OperationCode::TextureQueryLod, meta, std::move(params));
|
|
|
|
|
SetTemporal(bb, element, value);
|
|
|
|
|
}
|
|
|
|
@ -347,25 +346,35 @@ Node4 ShaderIR::GetTextureCode(Instruction instr, TextureType texture_type,
|
|
|
|
|
(texture_type == Tegra::Shader::TextureType::TextureCube && is_array && is_shadow));
|
|
|
|
|
|
|
|
|
|
const OperationCode read_method =
|
|
|
|
|
lod_needed && gl_lod_supported ? OperationCode::TextureLod : OperationCode::Texture;
|
|
|
|
|
(lod_needed && gl_lod_supported) ? OperationCode::TextureLod : OperationCode::Texture;
|
|
|
|
|
|
|
|
|
|
UNIMPLEMENTED_IF(process_mode != TextureProcessMode::None && !gl_lod_supported);
|
|
|
|
|
|
|
|
|
|
std::vector<Node> extras;
|
|
|
|
|
Node bias = {};
|
|
|
|
|
Node lod = {};
|
|
|
|
|
if (process_mode != TextureProcessMode::None && gl_lod_supported) {
|
|
|
|
|
if (process_mode == TextureProcessMode::LZ) {
|
|
|
|
|
extras.push_back(Immediate(0.0f));
|
|
|
|
|
} else {
|
|
|
|
|
switch (process_mode) {
|
|
|
|
|
case TextureProcessMode::LZ:
|
|
|
|
|
lod = Immediate(0.0f);
|
|
|
|
|
break;
|
|
|
|
|
case TextureProcessMode::LB:
|
|
|
|
|
// If present, lod or bias are always stored in the register indexed by the gpr20
|
|
|
|
|
// field with an offset depending on the usage of the other registers
|
|
|
|
|
extras.push_back(GetRegister(instr.gpr20.Value() + bias_offset));
|
|
|
|
|
bias = GetRegister(instr.gpr20.Value() + bias_offset);
|
|
|
|
|
break;
|
|
|
|
|
case TextureProcessMode::LL:
|
|
|
|
|
lod = GetRegister(instr.gpr20.Value() + bias_offset);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
UNIMPLEMENTED_MSG("Unimplemented process mode={}", static_cast<u32>(process_mode));
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Node4 values;
|
|
|
|
|
for (u32 element = 0; element < values.size(); ++element) {
|
|
|
|
|
auto copy_coords = coords;
|
|
|
|
|
MetaTexture meta{sampler, array, depth_compare, extras, element};
|
|
|
|
|
MetaTexture meta{sampler, array, depth_compare, bias, lod, {}, element};
|
|
|
|
|
values[element] = Operation(read_method, meta, std::move(copy_coords));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -462,7 +471,7 @@ Node4 ShaderIR::GetTld4Code(Instruction instr, TextureType texture_type, bool de
|
|
|
|
|
Node4 values;
|
|
|
|
|
for (u32 element = 0; element < values.size(); ++element) {
|
|
|
|
|
auto coords_copy = coords;
|
|
|
|
|
MetaTexture meta{sampler, GetRegister(array_register), {}, {}, element};
|
|
|
|
|
MetaTexture meta{sampler, GetRegister(array_register), {}, {}, {}, {}, element};
|
|
|
|
|
values[element] = Operation(OperationCode::TextureGather, meta, std::move(coords_copy));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -498,7 +507,7 @@ Node4 ShaderIR::GetTldsCode(Instruction instr, TextureType texture_type, bool is
|
|
|
|
|
Node4 values;
|
|
|
|
|
for (u32 element = 0; element < values.size(); ++element) {
|
|
|
|
|
auto coords_copy = coords;
|
|
|
|
|
MetaTexture meta{sampler, array, {}, {lod}, element};
|
|
|
|
|
MetaTexture meta{sampler, array, {}, {}, lod, {}, element};
|
|
|
|
|
values[element] = Operation(OperationCode::TexelFetch, meta, std::move(coords_copy));
|
|
|
|
|
}
|
|
|
|
|
return values;
|
|
|
|
|