|
|
|
@ -804,6 +804,38 @@ private: |
|
|
|
return {}; |
|
|
|
} |
|
|
|
|
|
|
|
Id GetTextureSampler(Operation operation) { |
|
|
|
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta()); |
|
|
|
const auto entry = sampler_images.at(static_cast<u32>(meta->sampler.GetIndex())); |
|
|
|
return Emit(OpLoad(entry.sampled_image_type, entry.sampler)); |
|
|
|
} |
|
|
|
|
|
|
|
Id GetTextureImage(Operation operation) { |
|
|
|
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta()); |
|
|
|
const auto entry = sampler_images.at(static_cast<u32>(meta->sampler.GetIndex())); |
|
|
|
return Emit(OpImage(entry.image_type, GetTextureSampler(operation))); |
|
|
|
} |
|
|
|
|
|
|
|
Id GetTextureCoordinates(Operation operation) { |
|
|
|
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta()); |
|
|
|
std::vector<Id> coords; |
|
|
|
for (std::size_t i = 0; i < operation.GetOperandsCount(); ++i) { |
|
|
|
coords.push_back(Visit(operation[i])); |
|
|
|
} |
|
|
|
if (meta->sampler.IsArray()) { |
|
|
|
const Id array_integer = BitcastTo<Type::Int>(Visit(meta->array)); |
|
|
|
coords.push_back(Emit(OpConvertSToF(t_float, array_integer))); |
|
|
|
} |
|
|
|
if (meta->sampler.IsShadow()) { |
|
|
|
coords.push_back(Visit(meta->depth_compare)); |
|
|
|
} |
|
|
|
|
|
|
|
const std::array<Id, 4> t_float_lut = {nullptr, t_float2, t_float3, t_float4}; |
|
|
|
return coords.size() == 1 |
|
|
|
? coords[0] |
|
|
|
: Emit(OpCompositeConstruct(t_float_lut.at(coords.size() - 1), coords)); |
|
|
|
} |
|
|
|
|
|
|
|
Id Texture(Operation operation) { |
|
|
|
UNIMPLEMENTED(); |
|
|
|
return {}; |
|
|
|
|