|
|
|
@ -25,6 +25,13 @@ std::string Image(EmitContext& ctx, const IR::TextureInstInfo& info, const IR::V |
|
|
|
return fmt::format("img{}{}", def.binding, index_offset); |
|
|
|
} |
|
|
|
|
|
|
|
bool IsTextureMsaa(EmitContext& ctx, const IR::TextureInstInfo& info) { |
|
|
|
if (info.type == TextureType::Buffer) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
return ctx.info.texture_descriptors.at(info.descriptor_index).is_multisample; |
|
|
|
} |
|
|
|
|
|
|
|
std::string CastToIntVec(std::string_view value, const IR::TextureInstInfo& info) { |
|
|
|
switch (info.type) { |
|
|
|
case TextureType::Color1D: |
|
|
|
@ -463,26 +470,33 @@ void EmitImageQueryDimensions(EmitContext& ctx, IR::Inst& inst, const IR::Value& |
|
|
|
std::string_view lod, const IR::Value& skip_mips_val) { |
|
|
|
const auto info{inst.Flags<IR::TextureInstInfo>()}; |
|
|
|
const auto texture{Texture(ctx, info, index)}; |
|
|
|
const bool is_msaa{IsTextureMsaa(ctx, info)}; |
|
|
|
const bool skip_mips{skip_mips_val.U1()}; |
|
|
|
const auto mips{ |
|
|
|
[&] { return skip_mips ? "0u" : fmt::format("uint(textureQueryLevels({}))", texture); }}; |
|
|
|
const auto mips{skip_mips ? "0u" : fmt::format("uint(textureQueryLevels({}))", texture)}; |
|
|
|
if (is_msaa && !skip_mips) { |
|
|
|
throw NotImplementedException("EmitImageQueryDimensions MSAA QueryLevels"); |
|
|
|
} |
|
|
|
if (info.type == TextureType::Buffer && !skip_mips) { |
|
|
|
throw NotImplementedException("EmitImageQueryDimensions TextureType::Buffer QueryLevels"); |
|
|
|
} |
|
|
|
const bool uses_lod{!is_msaa && info.type != TextureType::Buffer}; |
|
|
|
const auto lod_str{uses_lod ? fmt::format(",int({})", lod) : ""}; |
|
|
|
switch (info.type) { |
|
|
|
case TextureType::Color1D: |
|
|
|
return ctx.AddU32x4("{}=uvec4(uint(textureSize({},int({}))),0u,0u,{});", inst, texture, lod, |
|
|
|
mips()); |
|
|
|
return ctx.AddU32x4("{}=uvec4(uint(textureSize({}{})),0u,0u,{});", inst, texture, lod_str, |
|
|
|
mips); |
|
|
|
case TextureType::ColorArray1D: |
|
|
|
case TextureType::Color2D: |
|
|
|
case TextureType::ColorCube: |
|
|
|
case TextureType::Color2DRect: |
|
|
|
return ctx.AddU32x4("{}=uvec4(uvec2(textureSize({},int({}))),0u,{});", inst, texture, lod, |
|
|
|
mips()); |
|
|
|
return ctx.AddU32x4("{}=uvec4(uvec2(textureSize({}{})),0u,{});", inst, texture, lod_str, |
|
|
|
mips); |
|
|
|
case TextureType::ColorArray2D: |
|
|
|
case TextureType::Color3D: |
|
|
|
case TextureType::ColorArrayCube: |
|
|
|
return ctx.AddU32x4("{}=uvec4(uvec3(textureSize({},int({}))),{});", inst, texture, lod, |
|
|
|
mips()); |
|
|
|
return ctx.AddU32x4("{}=uvec4(uvec3(textureSize({}{})),{});", inst, texture, lod_str, mips); |
|
|
|
case TextureType::Buffer: |
|
|
|
throw NotImplementedException("EmitImageQueryDimensions Texture buffers"); |
|
|
|
return ctx.AddU32x4("{}=uvec4(uint(textureSize({})),0u,0u,{});", inst, texture, mips); |
|
|
|
} |
|
|
|
throw LogicError("Unspecified image type {}", info.type.Value()); |
|
|
|
} |
|
|
|
|