Add supprot for tex.level

This commit is contained in:
Andrzej Janik 2024-02-29 12:25:57 +01:00
parent c910a85685
commit 7d501f8d08
6 changed files with 173 additions and 65 deletions

Binary file not shown.

View file

@ -321,16 +321,26 @@ extern "C"
tex_1d_f16(s32, int, tex1Dfetch_f16);
tex_1d_f16(f32, float, tex1D_f16);
#define tex_2d(CHANNEL_TYPE, HIP_CHANNEL_TYPE, COORD_TYPE, HIP_COORD_TYPE) \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_2d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(struct textureReference GLOBAL_SPACE * ptr, HIP_COORD_TYPE##2 ::Native_vec_ coord) \
{ \
hipTextureObject_t textureObject = ptr->textureObject; \
return tex2D<HIP_CHANNEL_TYPE##4>(textureObject, float(coord.x), float(coord.y)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_indirect_2d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(uint64_t texobj, HIP_COORD_TYPE##2 ::Native_vec_ coord) \
{ \
hipTextureObject_t textureObject = (hipTextureObject_t)texobj; \
return tex2D<HIP_CHANNEL_TYPE##4>(textureObject, float(coord.x), float(coord.y)).data; \
#define tex_2d(CHANNEL_TYPE, HIP_CHANNEL_TYPE, COORD_TYPE, HIP_COORD_TYPE) \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_2d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(struct textureReference GLOBAL_SPACE * ptr, HIP_COORD_TYPE##2 ::Native_vec_ coord) \
{ \
hipTextureObject_t textureObject = ptr->textureObject; \
return tex2D<HIP_CHANNEL_TYPE##4>(textureObject, float(coord.x), float(coord.y)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_level_2d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(struct textureReference GLOBAL_SPACE * ptr, HIP_COORD_TYPE##2 ::Native_vec_ coord, HIP_COORD_TYPE lod) \
{ \
hipTextureObject_t textureObject = ptr->textureObject; \
return tex2DLod<HIP_CHANNEL_TYPE##4>(textureObject, float(coord.x), float(coord.y), float(lod)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_indirect_2d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(uint64_t texobj, HIP_COORD_TYPE##2 ::Native_vec_ coord) \
{ \
hipTextureObject_t textureObject = (hipTextureObject_t)texobj; \
return tex2D<HIP_CHANNEL_TYPE##4>(textureObject, float(coord.x), float(coord.y)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_level_indirect_2d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(uint64_t texobj, HIP_COORD_TYPE##2 ::Native_vec_ coord, HIP_COORD_TYPE lod) \
{ \
hipTextureObject_t textureObject = (hipTextureObject_t)texobj; \
return tex2DLod<HIP_CHANNEL_TYPE##4>(textureObject, float(coord.x), float(coord.y), float(lod)).data; \
}
__device__ half4 __ockl_image_sampleh_2D(unsigned int CONSTANT_SPACE *i, unsigned int ADDRESS_SPACE_CONSTANT *s, float2::Native_vec_ c);
@ -357,16 +367,26 @@ extern "C"
tex_2d_f16(s32, int);
tex_2d_f16(f32, float);
#define tex_3d(CHANNEL_TYPE, HIP_CHANNEL_TYPE, COORD_TYPE, HIP_COORD_TYPE) \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_3d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(struct textureReference GLOBAL_SPACE * ptr, HIP_COORD_TYPE##4 ::Native_vec_ coord) \
{ \
hipTextureObject_t textureObject = ptr->textureObject; \
return tex3D<HIP_CHANNEL_TYPE##4>(textureObject, float(coord.x), float(coord.y), float(coord.z)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_indirect_3d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(uint64_t texobj, HIP_COORD_TYPE##4 ::Native_vec_ coord) \
{ \
hipTextureObject_t textureObject = (hipTextureObject_t)texobj; \
return tex3D<HIP_CHANNEL_TYPE##4>(textureObject, float(coord.x), float(coord.y), float(coord.z)).data; \
#define tex_3d(CHANNEL_TYPE, HIP_CHANNEL_TYPE, COORD_TYPE, HIP_COORD_TYPE) \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_3d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(struct textureReference GLOBAL_SPACE * ptr, HIP_COORD_TYPE##4 ::Native_vec_ coord) \
{ \
hipTextureObject_t textureObject = ptr->textureObject; \
return tex3D<HIP_CHANNEL_TYPE##4>(textureObject, float(coord.x), float(coord.y), float(coord.z)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_level_3d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(struct textureReference GLOBAL_SPACE * ptr, HIP_COORD_TYPE##4 ::Native_vec_ coord, HIP_COORD_TYPE lod) \
{ \
hipTextureObject_t textureObject = ptr->textureObject; \
return tex3DLod<HIP_CHANNEL_TYPE##4>(textureObject, float(coord.x), float(coord.y), float(coord.z), float(lod)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_indirect_3d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(uint64_t texobj, HIP_COORD_TYPE##4 ::Native_vec_ coord) \
{ \
hipTextureObject_t textureObject = (hipTextureObject_t)texobj; \
return tex3D<HIP_CHANNEL_TYPE##4>(textureObject, float(coord.x), float(coord.y), float(coord.z)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_level_indirect_3d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(uint64_t texobj, HIP_COORD_TYPE##4 ::Native_vec_ coord, HIP_COORD_TYPE lod) \
{ \
hipTextureObject_t textureObject = (hipTextureObject_t)texobj; \
return tex3DLod<HIP_CHANNEL_TYPE##4>(textureObject, float(coord.x), float(coord.y), float(coord.z), float(lod)).data; \
}
__device__ half4 __ockl_image_sampleh_3D(unsigned int CONSTANT_SPACE *i, unsigned int ADDRESS_SPACE_CONSTANT *s, float4::Native_vec_ c);
@ -393,16 +413,26 @@ extern "C"
tex_3d_f16(s32, int);
tex_3d_f16(f32, float);
#define tex_a1d(CHANNEL_TYPE, HIP_CHANNEL_TYPE, COORD_TYPE, HIP_COORD_TYPE) \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_a1d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(struct textureReference GLOBAL_SPACE * ptr, uint32_t layer, HIP_COORD_TYPE x) \
{ \
hipTextureObject_t textureObject = ptr->textureObject; \
return tex1DLayered<HIP_CHANNEL_TYPE##4>(textureObject, float(x), int(layer)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_indirect_a1d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(uint64_t texobj, uint32_t layer, HIP_COORD_TYPE x) \
{ \
hipTextureObject_t textureObject = (hipTextureObject_t)texobj; \
return tex1DLayered<HIP_CHANNEL_TYPE##4>(textureObject, float(x), int(layer)).data; \
#define tex_a1d(CHANNEL_TYPE, HIP_CHANNEL_TYPE, COORD_TYPE, HIP_COORD_TYPE) \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_a1d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(struct textureReference GLOBAL_SPACE * ptr, uint32_t layer, HIP_COORD_TYPE x) \
{ \
hipTextureObject_t textureObject = ptr->textureObject; \
return tex1DLayered<HIP_CHANNEL_TYPE##4>(textureObject, float(x), int(layer)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_level_a1d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(struct textureReference GLOBAL_SPACE * ptr, uint32_t layer, HIP_COORD_TYPE x, HIP_COORD_TYPE lod) \
{ \
hipTextureObject_t textureObject = ptr->textureObject; \
return tex1DLayeredLod<HIP_CHANNEL_TYPE##4>(textureObject, float(x), int(layer), float(lod)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_indirect_a1d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(uint64_t texobj, uint32_t layer, HIP_COORD_TYPE x) \
{ \
hipTextureObject_t textureObject = (hipTextureObject_t)texobj; \
return tex1DLayered<HIP_CHANNEL_TYPE##4>(textureObject, float(x), int(layer)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_level_indirect_a1d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(uint64_t texobj, uint32_t layer, HIP_COORD_TYPE x, HIP_COORD_TYPE lod) \
{ \
hipTextureObject_t textureObject = (hipTextureObject_t)texobj; \
return tex1DLayeredLod<HIP_CHANNEL_TYPE##4>(textureObject, float(x), int(layer), float(lod)).data; \
}
__device__ half4 __ockl_image_sampleh_1Da(unsigned int CONSTANT_SPACE *i, unsigned int ADDRESS_SPACE_CONSTANT *s, float2::Native_vec_ c);
@ -429,16 +459,26 @@ extern "C"
tex_a1d_f16(s32, int);
tex_a1d_f16(f32, float);
#define tex_a2d(CHANNEL_TYPE, HIP_CHANNEL_TYPE, COORD_TYPE, HIP_COORD_TYPE) \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_a2d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(struct textureReference GLOBAL_SPACE * ptr, uint32_t layer, HIP_COORD_TYPE x, HIP_COORD_TYPE y) \
{ \
hipTextureObject_t textureObject = ptr->textureObject; \
return tex2DLayered<HIP_CHANNEL_TYPE##4>(textureObject, float(x), float(y), int(layer)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_indirect_a2d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(uint64_t texobj, uint32_t layer, HIP_COORD_TYPE x, HIP_COORD_TYPE y) \
{ \
hipTextureObject_t textureObject = (hipTextureObject_t)texobj; \
return tex2DLayered<HIP_CHANNEL_TYPE##4>(textureObject, float(x), float(y), int(layer)).data; \
#define tex_a2d(CHANNEL_TYPE, HIP_CHANNEL_TYPE, COORD_TYPE, HIP_COORD_TYPE) \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_a2d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(struct textureReference GLOBAL_SPACE * ptr, uint32_t layer, HIP_COORD_TYPE x, HIP_COORD_TYPE y) \
{ \
hipTextureObject_t textureObject = ptr->textureObject; \
return tex2DLayered<HIP_CHANNEL_TYPE##4>(textureObject, float(x), float(y), int(layer)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_level_a2d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(struct textureReference GLOBAL_SPACE * ptr, uint32_t layer, HIP_COORD_TYPE x, HIP_COORD_TYPE y, HIP_COORD_TYPE lod) \
{ \
hipTextureObject_t textureObject = ptr->textureObject; \
return tex2DLayeredLod<HIP_CHANNEL_TYPE##4>(textureObject, float(x), float(y), int(layer), float(lod)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_indirect_a2d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(uint64_t texobj, uint32_t layer, HIP_COORD_TYPE x, HIP_COORD_TYPE y) \
{ \
hipTextureObject_t textureObject = (hipTextureObject_t)texobj; \
return tex2DLayered<HIP_CHANNEL_TYPE##4>(textureObject, float(x), float(y), int(layer)).data; \
} \
HIP_CHANNEL_TYPE##4 ::Native_vec_ FUNC(tex_level_indirect_a2d_v4_##CHANNEL_TYPE##_##COORD_TYPE)(uint64_t texobj, uint32_t layer, HIP_COORD_TYPE x, HIP_COORD_TYPE y, HIP_COORD_TYPE lod) \
{ \
hipTextureObject_t textureObject = (hipTextureObject_t)texobj; \
return tex2DLayeredLod<HIP_CHANNEL_TYPE##4>(textureObject, float(x), float(y), int(layer), float(lod)).data; \
}
__device__ half4 __ockl_image_sampleh_2Da(unsigned int CONSTANT_SPACE *i, unsigned int ADDRESS_SPACE_CONSTANT *s, float4::Native_vec_ c);

View file

@ -459,8 +459,8 @@ pub enum Instruction<P: ArgParams> {
Membar {
level: MemScope,
},
Tex(TexDetails, Arg4Tex<P>),
Suld(SurfaceDetails, Arg4Tex<P>),
Tex(TexDetails, Arg5Tex<P>),
Suld(SurfaceDetails, Arg5Tex<P>),
Sust(SurfaceDetails, Arg4Sust<P>),
Shfl(ShflMode, Arg5Shfl<P>),
Shf(FunnelShift, Arg4<P>),
@ -616,13 +616,6 @@ pub struct Arg4Setp<P: ArgParams> {
pub src2: P::Operand,
}
pub struct Arg4Tex<P: ArgParams> {
pub dst: P::Operand,
pub image: P::Operand,
pub layer: Option<P::Operand>,
pub coordinates: P::Operand,
}
pub struct Arg4Sust<P: ArgParams> {
pub image: P::Operand,
pub coordinates: P::Operand,
@ -638,6 +631,14 @@ pub struct Arg5<P: ArgParams> {
pub src4: P::Operand,
}
pub struct Arg5Tex<P: ArgParams> {
pub dst: P::Operand,
pub image: P::Operand,
pub layer: Option<P::Operand>,
pub coordinates: P::Operand,
pub lod: Option<P::Operand>,
}
pub struct Arg5Setp<P: ArgParams> {
pub dst1: P::Id,
pub dst2: Option<P::Id>,
@ -1316,7 +1317,7 @@ pub enum TuningDirective {
MaxNtid(u32, u32, u32),
ReqNtid(u32, u32, u32),
MinNCtaPerSm(u32),
Noreturn
Noreturn,
}
#[repr(u8)]

View file

@ -97,6 +97,7 @@ match {
".l",
".le",
".leu",
".level",
".lo",
".loc",
".local",
@ -2065,11 +2066,23 @@ InstMembar: ast::Instruction<ast::ParsedArgParams<'input>> = {
// https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#texture-instructions-tex
InstTex: ast::Instruction<ast::ParsedArgParams<'input>> = {
"tex" <geometry: UnlayeredTextureGeometry> ".v4" <channel_type:TextureChannelType> <coordinate_type:TextureCoordinateType> <dst:DstOperandVec> "," "[" <image:Operand> "," <coordinates:SrcOperandVec> "]" => {
let args = ast::Arg4Tex {
let args = ast::Arg5Tex {
dst,
image,
coordinates,
layer: None
layer: None,
lod: None
};
let details = ast::TexDetails { geometry, channel_type, coordinate_type, direct: false };
ast::Instruction::Tex(details, args)
},
"tex" ".level" <geometry: UnlayeredTextureGeometry> ".v4" <channel_type:TextureChannelType> <coordinate_type:TextureCoordinateType> <dst:DstOperandVec> "," "[" <image:Operand> "," <coordinates:SrcOperandVec> "]" "," <lod:Operand> => {
let args = ast::Arg5Tex {
dst,
image,
coordinates,
layer: None,
lod: Some(lod)
};
let details = ast::TexDetails { geometry, channel_type, coordinate_type, direct: false };
ast::Instruction::Tex(details, args)
@ -2080,11 +2093,25 @@ InstTex: ast::Instruction<ast::ParsedArgParams<'input>> = {
"tex" ".a1d" ".v4" <channel_type:TextureChannelType> <coordinate_type:TextureCoordinateType>
<dst:DstOperandVec> "," "[" <image:SrcOperand> "," "{" <layer:SrcOperand> "," <x:RegOrImmediate> "}" "]" => {
let geometry = ast::TextureGeometry::Array1D;
let args = ast::Arg4Tex {
let args = ast::Arg5Tex {
dst,
image,
coordinates: ast::Operand::VecPack(vec![x]),
layer: Some(layer)
layer: Some(layer),
lod: None
};
let details = ast::TexDetails { geometry, channel_type, coordinate_type, direct: false };
ast::Instruction::Tex(details, args)
},
"tex" ".level" ".a1d" ".v4" <channel_type:TextureChannelType> <coordinate_type:TextureCoordinateType>
<dst:DstOperandVec> "," "[" <image:SrcOperand> "," "{" <layer:SrcOperand> "," <x:RegOrImmediate> "}" "]" "," <lod:Operand> => {
let geometry = ast::TextureGeometry::Array1D;
let args = ast::Arg5Tex {
dst,
image,
coordinates: ast::Operand::VecPack(vec![x]),
layer: Some(layer),
lod: Some(lod)
};
let details = ast::TexDetails { geometry, channel_type, coordinate_type, direct: false };
ast::Instruction::Tex(details, args)
@ -2092,11 +2119,25 @@ InstTex: ast::Instruction<ast::ParsedArgParams<'input>> = {
"tex" ".a2d" ".v4" <channel_type:TextureChannelType> <coordinate_type:TextureCoordinateType>
<dst:DstOperandVec> "," "[" <image:SrcOperand> "," "{" <layer:SrcOperand> "," <x:RegOrImmediate> "," <y:RegOrImmediate> "," RegOrImmediate "}" "]" => {
let geometry = ast::TextureGeometry::Array2D;
let args = ast::Arg4Tex {
let args = ast::Arg5Tex {
dst,
image,
coordinates: ast::Operand::VecPack(vec![x, y]),
layer: Some(layer)
layer: Some(layer),
lod: None
};
let details = ast::TexDetails { geometry, channel_type, coordinate_type, direct: false };
ast::Instruction::Tex(details, args)
},
"tex" ".level" ".a2d" ".v4" <channel_type:TextureChannelType> <coordinate_type:TextureCoordinateType>
<dst:DstOperandVec> "," "[" <image:SrcOperand> "," "{" <layer:SrcOperand> "," <x:RegOrImmediate> "," <y:RegOrImmediate> "," RegOrImmediate "}" "]" "," <lod:Operand> => {
let geometry = ast::TextureGeometry::Array2D;
let args = ast::Arg5Tex {
dst,
image,
coordinates: ast::Operand::VecPack(vec![x, y]),
layer: Some(layer),
lod: Some(lod)
};
let details = ast::TexDetails { geometry, channel_type, coordinate_type, direct: false };
ast::Instruction::Tex(details, args)
@ -2106,33 +2147,36 @@ InstTex: ast::Instruction<ast::ParsedArgParams<'input>> = {
// https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#surface-instructions-suld
InstSuld: ast::Instruction<ast::ParsedArgParams<'input>> = {
"suld" ".b" <geometry: UnlayeredTextureGeometry> <vector:VectorPrefix?> <type_:AnyBitType> ".trap" <dst:DstOperandVec> "," "[" <image:Operand> "," <coordinates:SrcOperandVec> "]" => {
let args = ast::Arg4Tex {
let args = ast::Arg5Tex {
dst,
image,
coordinates,
layer: None,
lod: None,
};
let details = ast::SurfaceDetails { geometry, vector, type_, direct: false, };
ast::Instruction::Suld(details, args)
},
"suld" ".b" ".a1d" <vector:VectorPrefix?> <type_:AnyBitType> ".trap" <dst:DstOperandVec> "," "[" <image:Operand> "," "{" <layer:SrcOperand> "," <x:RegOrImmediate> "}" "]" => {
let geometry = ast::TextureGeometry::Array1D;
let args = ast::Arg4Tex {
let args = ast::Arg5Tex {
dst,
image,
coordinates: ast::Operand::VecPack(vec![x]),
layer: Some(layer),
lod: None,
};
let details = ast::SurfaceDetails { geometry, vector, type_, direct: false, };
ast::Instruction::Suld(details, args)
},
"suld" ".b" ".a2d" <vector:VectorPrefix?> <type_:AnyBitType> ".trap" <dst:DstOperandVec> "," "[" <image:Operand> "," "{" <layer:SrcOperand> "," <x:RegOrImmediate> "," <y:RegOrImmediate> "," RegOrImmediate "}" "]" => {
let geometry = ast::TextureGeometry::Array2D;
let args = ast::Arg4Tex {
let args = ast::Arg5Tex {
dst,
image,
coordinates: ast::Operand::VecPack(vec![x, y]),
layer: Some(layer),
lod: None,
};
let details = ast::SurfaceDetails { geometry, vector, type_, direct: false, };
ast::Instruction::Suld(details, args)

View file

@ -2996,11 +2996,12 @@ fn convert_optix_builtin_variable_and_attribute_access_single_function<'input>(
}
Statement::Instruction(ast::Instruction::Tex(
tex,
ast::Arg4Tex {
ast::Arg5Tex {
dst,
image,
layer,
coordinates,
lod,
},
)) => {
if let Some(StateSpaceRemapping::ToBlock(id, ast::StateSpace::Global, offset)) =
@ -3014,11 +3015,12 @@ fn convert_optix_builtin_variable_and_attribute_access_single_function<'input>(
)?;
result.push(Statement::Instruction(ast::Instruction::Tex(
tex,
ast::Arg4Tex {
ast::Arg5Tex {
dst,
image,
layer,
coordinates,
lod,
},
)));
} else {

View file

@ -2775,9 +2775,14 @@ fn replace_instructions_with_builtins_impl<'input>(
}
Statement::Instruction(ast::Instruction::Tex(tex, arg)) => {
let geometry = tex.geometry.as_ptx();
let op_name = if arg.lod.is_none() {
"tex"
} else {
"tex_level"
};
let fn_name = [
ZLUDA_PTX_PREFIX,
"tex",
op_name,
tex.suffix(),
"_",
geometry,
@ -8089,7 +8094,7 @@ fn texture_geometry_to_vec_length(geometry: ast::TextureGeometry) -> u8 {
}
}
impl<T: ArgParamsEx> ast::Arg4Tex<T> {
impl<T: ArgParamsEx> ast::Arg5Tex<T> {
fn map<U: ArgParamsEx, V: ArgumentMapVisitor<T, U>>(
self,
visitor: &mut V,
@ -8097,7 +8102,7 @@ impl<T: ArgParamsEx> ast::Arg4Tex<T> {
geometry: ast::TextureGeometry,
value_type: ast::Type,
coordinate_type: ast::ScalarType,
) -> Result<ast::Arg4Tex<U>, TranslateError> {
) -> Result<ast::Arg5Tex<U>, TranslateError> {
let dst = visitor.operand(
ArgumentDescriptor {
op: self.dst,
@ -8144,11 +8149,27 @@ impl<T: ArgParamsEx> ast::Arg4Tex<T> {
&ast::Type::Vector(coordinate_type, coord_length),
ast::StateSpace::Reg,
)?;
Ok(ast::Arg4Tex {
let lod = self
.lod
.map(|lod| {
visitor.operand(
ArgumentDescriptor {
op: lod,
is_dst: false,
is_memory_access: false,
non_default_implicit_conversion: None,
},
&ast::Type::Scalar(coordinate_type),
ast::StateSpace::Reg,
)
})
.transpose()?;
Ok(ast::Arg5Tex {
dst,
image,
layer,
coordinates,
lod,
})
}
}