From d23d247ed9683d3ba897e1a8076f40094c027eb5 Mon Sep 17 00:00:00 2001 From: Andrzej Janik Date: Sat, 13 Apr 2024 22:57:22 +0000 Subject: [PATCH] Clean up surface functions --- ptx/lib/zluda_ptx_impl.bc | Bin 221240 -> 187868 bytes ptx/lib/zluda_ptx_impl.cpp | 319 +++++++++++-------------------------- zluda/src/impl/surface.rs | 112 ++----------- zluda/src/impl/surfref.rs | 15 +- 4 files changed, 109 insertions(+), 337 deletions(-) diff --git a/ptx/lib/zluda_ptx_impl.bc b/ptx/lib/zluda_ptx_impl.bc index 1d13514a1fa89af898d9f82bf0f3f9356a455886..c014e5872b3e97f3b9c5d837d2fa3d758dea6672 100644 GIT binary patch literal 187868 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]$F`N_x4jSiwI|=elAA!E{iseS!x2(OZd|h$3)* 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 F{D0a}rwaf8 diff --git a/ptx/lib/zluda_ptx_impl.cpp b/ptx/lib/zluda_ptx_impl.cpp index 0330ba3..d023d30 100644 --- a/ptx/lib/zluda_ptx_impl.cpp +++ b/ptx/lib/zluda_ptx_impl.cpp @@ -11,6 +11,7 @@ // https://llvm.org/docs/AMDGPUUsage.html #include +#include #include #define HIP_NO_HALF #include @@ -162,13 +163,24 @@ typedef uint8 CONSTANT_SPACE *surface_ptr; template static __device__ To transmute(From f) { - union + if constexpr (sizeof(To) == sizeof(From)) { - To t; - From f; - } u = {To{0}}; - u.f = f; - return u.t; + return std::bit_cast(f); + } + else if constexpr (sizeof(To) > sizeof(From)) + { + union + { + To t; + From f; + } u = {To{0}}; + u.f = f; + return u.t; + } + else + { + static_assert(sizeof(To) == 0); + } } enum class ImageGeometry @@ -231,10 +243,10 @@ static __device__ void image_store_pck(T value, typename Coordinates::type } else { - static_assert(!std::is_same::value, "Invalid geometry"); + static_assert(sizeof(T) == 0, "Invalid geometry"); } } - else if constexpr (sizeof(T) == sizeof(uint2)) + else if constexpr (sizeof(T) == sizeof(uint2::Native_vec_)) { uint2::Native_vec_ value_dword2 = transmute(value); if constexpr (geo == ImageGeometry::_1D) @@ -259,10 +271,10 @@ static __device__ void image_store_pck(T value, typename Coordinates::type } else { - static_assert(!std::is_same::value, "Invalid geometry"); + static_assert(sizeof(T) == 0, "Invalid geometry"); } } - else if constexpr (sizeof(T) == sizeof(uint4)) + else if constexpr (sizeof(T) == sizeof(uint4::Native_vec_)) { uint4::Native_vec_ value_dword4 = transmute(value); if constexpr (geo == ImageGeometry::_1D) @@ -287,12 +299,12 @@ static __device__ void image_store_pck(T value, typename Coordinates::type } else { - static_assert(!std::is_same::value, "Invalid geometry"); + static_assert(sizeof(T) == 0, "Invalid geometry"); } } else { - static_assert(!std::is_same::value, "Invalid vector size"); + static_assert(sizeof(T) == 0, "Invalid vector size"); } } @@ -323,7 +335,7 @@ static __device__ uint4::Native_vec_ image_load_pck_full(typename Coordinates::value, "Invalid geometry"); + static_assert(sizeof(ImageGeometry) == 0, "Invalid geometry"); } return data; } @@ -331,14 +343,36 @@ static __device__ uint4::Native_vec_ image_load_pck_full(typename Coordinates static __device__ void image_store_pck_full_with(uint4::Native_vec_ data, T value, typename Coordinates::type coord, surface_ptr surface) { - union + // We avoid unions for types smaller than sizeof(uint32_t), + // because in those cases we get this garbage: + // ds_write_b128 v2, v[5:8] + // ds_write_b16 v2, v9 + // ds_read_b128 v[5:8], v2 + // tested with ROCm 5.7.1 + if constexpr (sizeof(T) == sizeof(uint8_t)) { - uint4::Native_vec_ full_vec; - T value; - } u = {0}; - u.full_vec = data; - u.value = value; - image_store_pck(u.full_vec, coord, surface); + uint32_t x = uint32_t(std::bit_cast(value)); + uint32_t data_0 = ((data[0]) >> 8) << 8; + data[0] = data_0 | x; + } + else if constexpr (sizeof(T) == sizeof(uint16_t)) + { + uint32_t x = uint32_t(std::bit_cast(value)); + uint32_t data_0 = ((data[0]) >> 16) << 16; + data[0] = data_0 | x; + } + else + { + union + { + uint4::Native_vec_ full_vec; + T value; + } u = {0}; + u.full_vec = data; + u.value = value; + data = u.full_vec; + } + image_store_pck(data, coord, surface); } constexpr auto IMAGE_RESERVED_TOP_BITS = 3; @@ -348,13 +382,45 @@ static __device__ surface_ptr get_surface_pointer(uint64_t s) return (surface_ptr)((s << IMAGE_RESERVED_TOP_BITS) >> IMAGE_RESERVED_TOP_BITS); } +static __device__ surface_ptr get_surface_pointer(struct textureReference GLOBAL_SPACE *surf_ref) +{ + return (surface_ptr)(surf_ref->textureObject); +} + static __device__ uint32_t x_coordinate_shift(uint64_t s) { return uint32_t(s >> (64 - IMAGE_RESERVED_TOP_BITS)); } -template -static __device__ void sust_b_indirect_zero(uint64_t surf_arg, typename Coordinates::type coord, T data) +static __device__ uint32_t x_coordinate_shift(struct textureReference GLOBAL_SPACE *ptr) +{ + uint32_t channels = uint32_t(ptr->numChannels); + uint32_t format_width = 0; + hipArray_Format format = ptr->format; + switch (format) + { + case hipArray_Format::HIP_AD_FORMAT_UNSIGNED_INT8: + case hipArray_Format::HIP_AD_FORMAT_SIGNED_INT8: + format_width = 1; + break; + case hipArray_Format::HIP_AD_FORMAT_UNSIGNED_INT16: + case hipArray_Format::HIP_AD_FORMAT_SIGNED_INT16: + case hipArray_Format::HIP_AD_FORMAT_HALF: + format_width = 2; + break; + case hipArray_Format::HIP_AD_FORMAT_UNSIGNED_INT32: + case hipArray_Format::HIP_AD_FORMAT_SIGNED_INT32: + case hipArray_Format::HIP_AD_FORMAT_FLOAT: + format_width = 4; + break; + default: + __builtin_unreachable(); + } + return uint32_t(__builtin_ctz(format_width * channels)); +} + +template +static __device__ void sust_b_indirect_zero(Surface surf_arg, typename Coordinates::type coord, T data) { surface_ptr surface = get_surface_pointer(surf_arg); uint32_t shift_x = x_coordinate_shift(surf_arg); @@ -835,34 +901,6 @@ extern "C" suld_b_a2d_vec(_v4, b32, uint4); // suld_b_a2d_vec(_v4, b64, ulong4); - static __device__ uint64_t repack(struct textureReference GLOBAL_SPACE *ptr) - { - uint32_t channels = uint32_t(ptr->numChannels); - uint32_t format_width = 0; - hipArray_Format format = ptr->format; - switch (format) - { - case hipArray_Format::HIP_AD_FORMAT_UNSIGNED_INT8: - case hipArray_Format::HIP_AD_FORMAT_SIGNED_INT8: - format_width = 1; - break; - case hipArray_Format::HIP_AD_FORMAT_UNSIGNED_INT16: - case hipArray_Format::HIP_AD_FORMAT_SIGNED_INT16: - case hipArray_Format::HIP_AD_FORMAT_HALF: - format_width = 2; - break; - case hipArray_Format::HIP_AD_FORMAT_UNSIGNED_INT32: - case hipArray_Format::HIP_AD_FORMAT_SIGNED_INT32: - case hipArray_Format::HIP_AD_FORMAT_FLOAT: - format_width = 4; - break; - default: - __builtin_unreachable(); - } - uint64_t shift_size = uint64_t(__builtin_ctz(format_width * channels)); - return uint64_t(ptr->textureObject) | (shift_size << (64 - 3)); - } - #define SUST_B_ZERO(TYPE, GEOMETRY, HIP_TYPE) \ void FUNC(sust_b_indirect_##TYPE##_zero)(uint64_t surf_arg, typename Coordinates::type coord, HIP_TYPE::Native_vec_ data) \ { \ @@ -870,8 +908,7 @@ extern "C" } \ void FUNC(sust_b_##TYPE##_zero)(struct textureReference GLOBAL_SPACE * ptr, typename Coordinates::type coord, HIP_TYPE::Native_vec_ data) \ { \ - FUNC_CALL(sust_b_indirect_##TYPE##_zero) \ - (repack(ptr), coord, data); \ + sust_b_indirect_zero(ptr, coord, data); \ } #define SUST_B_ZERO_ARRAY(TYPE, GEOMETRY, HIP_TYPE) \ @@ -882,8 +919,8 @@ extern "C" } \ void FUNC(sust_b_##TYPE##_zero)(struct textureReference GLOBAL_SPACE * ptr, uint32_t layer, typename Coordinates::arg_type coord, HIP_TYPE::Native_vec_ data) \ { \ - FUNC_CALL(sust_b_indirect_##TYPE##_zero) \ - (repack(ptr), layer, coord, data); \ + auto coord_array = Coordinates::pack_layer(layer, coord); \ + sust_b_indirect_zero(ptr, coord_array, data); \ } SUST_B_ZERO(1d_b8, ImageGeometry::_1D, uchar1); @@ -942,180 +979,6 @@ extern "C" SUST_B_ZERO_ARRAY(a2d_v4_b16, ImageGeometry::A2D, ushort4); SUST_B_ZERO_ARRAY(a2d_v4_b32, ImageGeometry::A2D, uint4); -#define sust_b_1d_vec(VEC, TYPE, HIP_TYPE) \ - void FUNC(sust_b_1d##VEC##_##TYPE##_trap)(struct textureReference GLOBAL_SPACE * ptr, int1::Native_vec_ coord, HIP_TYPE::Native_vec_ data) \ - { \ - hipTextureObject_t textureObject = ptr->textureObject; \ - TEXTURE_OBJECT_PARAMETERS_INIT; \ - (void)s; \ - int byte_coord = __hipGetPixelAddr(coord.x, __ockl_image_channel_data_type_1D(i), __ockl_image_channel_order_1D(i)); \ - HIP_TYPE hip_data; \ - hip_data.data = data; \ - auto tmp = __pack_to_float4(hip_data); \ - __ockl_image_store_1D(i, byte_coord, tmp); \ - } \ - void FUNC(sust_b_indirect_1d##VEC##_##TYPE##_trap)(uint64_t serf_arg, int1::Native_vec_ coord, HIP_TYPE::Native_vec_ data) \ - { \ - hipSurfaceObject_t surfObj = (hipSurfaceObject_t)serf_arg; \ - HIP_TYPE hip_data; \ - hip_data.data = data; \ - surf1Dwrite(hip_data, surfObj, coord.x); \ - } - - sust_b_1d_vec(, b8, uchar1); - sust_b_1d_vec(, b16, ushort1); - sust_b_1d_vec(, b32, uint1); - // sust_b_1d_vec(, b64, ulong1); - sust_b_1d_vec(_v2, b8, uchar2); - sust_b_1d_vec(_v2, b16, ushort2); - sust_b_1d_vec(_v2, b32, uint2); - // sust_b_1d_vec(_v2, b64, ulong2); - sust_b_1d_vec(_v4, b8, uchar4); - sust_b_1d_vec(_v4, b16, ushort4); - sust_b_1d_vec(_v4, b32, uint4); - // sust_b_1d_vec(_v4, b64, ulong4); - -#define sust_b_2d_vec(VEC, TYPE, HIP_TYPE) \ - void FUNC(sust_b_2d##VEC##_##TYPE##_trap)(struct textureReference GLOBAL_SPACE * ptr, int2::Native_vec_ coord, HIP_TYPE::Native_vec_ data) \ - { \ - hipTextureObject_t textureObject = ptr->textureObject; \ - TEXTURE_OBJECT_PARAMETERS_INIT; \ - (void)s; \ - int byte_coord = __hipGetPixelAddr(coord.x, __ockl_image_channel_data_type_2D(i), __ockl_image_channel_order_2D(i)); \ - HIP_TYPE hip_data; \ - hip_data.data = data; \ - auto tmp = __pack_to_float4(hip_data); \ - __ockl_image_store_2D(i, int2(byte_coord, coord.y).data, tmp); \ - } \ - void FUNC(sust_b_indirect_2d##VEC##_##TYPE##_trap)(uint64_t serf_arg, int2::Native_vec_ coord, HIP_TYPE::Native_vec_ data) \ - { \ - hipSurfaceObject_t surfObj = (hipSurfaceObject_t)serf_arg; \ - HIP_TYPE hip_data; \ - hip_data.data = data; \ - surf2Dwrite(hip_data, surfObj, coord.x, coord.y); \ - } - - sust_b_2d_vec(, b8, uchar1); - sust_b_2d_vec(, b16, ushort1); - sust_b_2d_vec(, b32, uint1); - // sust_b_2d_vec(, b64, ulong1); - sust_b_2d_vec(_v2, b8, uchar2); - sust_b_2d_vec(_v2, b16, ushort2); - sust_b_2d_vec(_v2, b32, uint2); - // sust_b_2d_vec(_v2, b64, ulong2); - sust_b_2d_vec(_v4, b8, uchar4); - sust_b_2d_vec(_v4, b16, ushort4); - sust_b_2d_vec(_v4, b32, uint4); - // sust_b_2d_vec(_v4, b64, ulong4); - -#define sust_b_3d_vec(VEC, TYPE, HIP_TYPE) \ - void FUNC(sust_b_3d##VEC##_##TYPE##_trap)(struct textureReference GLOBAL_SPACE * ptr, int4::Native_vec_ coord, HIP_TYPE::Native_vec_ data) \ - { \ - hipTextureObject_t textureObject = ptr->textureObject; \ - TEXTURE_OBJECT_PARAMETERS_INIT; \ - (void)s; \ - int byte_coord = __hipGetPixelAddr(coord.x, __ockl_image_channel_data_type_3D(i), __ockl_image_channel_order_3D(i)); \ - HIP_TYPE hip_data; \ - hip_data.data = data; \ - auto tmp = __pack_to_float4(hip_data); \ - __ockl_image_store_3D(i, int4(byte_coord, coord.y, coord.z, 0).data, tmp); \ - } \ - void FUNC(sust_b_indirect_3d##VEC##_##TYPE##_trap)(uint64_t serf_arg, int4::Native_vec_ coord, HIP_TYPE::Native_vec_ data) \ - { \ - hipSurfaceObject_t surfObj = (hipSurfaceObject_t)serf_arg; \ - __HIP_SURFACE_OBJECT_PARAMETERS_INIT; \ - int byte_coord = __hipGetPixelAddr(coord.x, __ockl_image_channel_data_type_3D(i), __ockl_image_channel_order_3D(i)); \ - HIP_TYPE hip_data; \ - hip_data.data = data; \ - auto tmp = __pack_to_float4(hip_data); \ - __ockl_image_store_3D(i, int4(byte_coord, coord.y, coord.z, 0).data, tmp); \ - } - - sust_b_3d_vec(, b8, uchar1); - sust_b_3d_vec(, b16, ushort1); - sust_b_3d_vec(, b32, uint1); - // sust_b_3d_vec(, b64, ulong1); - sust_b_3d_vec(_v2, b8, uchar2); - sust_b_3d_vec(_v2, b16, ushort2); - sust_b_3d_vec(_v2, b32, uint2); - // sust_b_3d_vec(_v2, b64, ulong2); - sust_b_3d_vec(_v4, b8, uchar4); - sust_b_3d_vec(_v4, b16, ushort4); - sust_b_3d_vec(_v4, b32, uint4); - // sust_b_3d_vec(_v4, b64, ulong4); - -#define sust_b_a1d_vec(VEC, TYPE, HIP_TYPE) \ - void FUNC(sust_b_a1d##VEC##_##TYPE##_trap)(struct textureReference GLOBAL_SPACE * ptr, uint layer, int x, HIP_TYPE::Native_vec_ data) \ - { \ - hipTextureObject_t textureObject = ptr->textureObject; \ - TEXTURE_OBJECT_PARAMETERS_INIT; \ - (void)s; \ - int byte_coord = __hipGetPixelAddr(x, __ockl_image_channel_data_type_1Da(i), __ockl_image_channel_order_1Da(i)); \ - HIP_TYPE hip_data; \ - hip_data.data = data; \ - auto tmp = __pack_to_float4(hip_data); \ - __ockl_image_store_1Da(i, int2(byte_coord, int(layer)).data, tmp); \ - } \ - void FUNC(sust_b_indirect_a1d##VEC##_##TYPE##_trap)(uint64_t serf_arg, uint layer, int x, HIP_TYPE::Native_vec_ data) \ - { \ - hipSurfaceObject_t surfObj = (hipSurfaceObject_t)serf_arg; \ - __HIP_SURFACE_OBJECT_PARAMETERS_INIT; \ - int byte_coord = __hipGetPixelAddr(x, __ockl_image_channel_data_type_1Da(i), __ockl_image_channel_order_1Da(i)); \ - HIP_TYPE hip_data; \ - hip_data.data = data; \ - auto tmp = __pack_to_float4(hip_data); \ - __ockl_image_store_1Da(i, int2(byte_coord, int(layer)).data, tmp); \ - } - - sust_b_a1d_vec(, b8, uchar1); - sust_b_a1d_vec(, b16, ushort1); - sust_b_a1d_vec(, b32, uint1); - // sust_b_a1d_vec(, b64, ulong1); - sust_b_a1d_vec(_v2, b8, uchar2); - sust_b_a1d_vec(_v2, b16, ushort2); - sust_b_a1d_vec(_v2, b32, uint2); - // sust_b_a1d_vec(_v2, b64, ulong2); - sust_b_a1d_vec(_v4, b8, uchar4); - sust_b_a1d_vec(_v4, b16, ushort4); - sust_b_a1d_vec(_v4, b32, uint4); - // sust_b_a1d_vec(_v4, b64, ulong4); - -#define sust_b_a2d_vec(VEC, TYPE, HIP_TYPE) \ - void FUNC(sust_b_a2d##VEC##_##TYPE##_trap)(struct textureReference GLOBAL_SPACE * ptr, uint layer, int x, int y, HIP_TYPE::Native_vec_ data) \ - { \ - hipTextureObject_t textureObject = ptr->textureObject; \ - TEXTURE_OBJECT_PARAMETERS_INIT; \ - (void)s; \ - int byte_coord = __hipGetPixelAddr(x, __ockl_image_channel_data_type_2Da(i), __ockl_image_channel_order_2Da(i)); \ - HIP_TYPE hip_data; \ - hip_data.data = data; \ - auto tmp = __pack_to_float4(hip_data); \ - __ockl_image_store_2Da(i, int4(byte_coord, y, int(layer), 0).data, tmp); \ - } \ - void FUNC(sust_b_indirect_a2d##VEC##_##TYPE##_trap)(uint64_t serf_arg, uint layer, int x, int y, HIP_TYPE::Native_vec_ data) \ - { \ - hipSurfaceObject_t surfObj = (hipSurfaceObject_t)serf_arg; \ - __HIP_SURFACE_OBJECT_PARAMETERS_INIT; \ - int byte_coord = __hipGetPixelAddr(x, __ockl_image_channel_data_type_2Da(i), __ockl_image_channel_order_2Da(i)); \ - HIP_TYPE hip_data; \ - hip_data.data = data; \ - auto tmp = __pack_to_float4(hip_data); \ - __ockl_image_store_2Da(i, int4(byte_coord, y, int(layer), 0).data, tmp); \ - } - - sust_b_a2d_vec(, b8, uchar1); - sust_b_a2d_vec(, b16, ushort1); - sust_b_a2d_vec(, b32, uint1); - // sust_b_a2d_vec(, b64, ulong1); - sust_b_a2d_vec(_v2, b8, uchar2); - sust_b_a2d_vec(_v2, b16, ushort2); - sust_b_a2d_vec(_v2, b32, uint2); - // sust_b_a2d_vec(_v2, b64, ulong2); - sust_b_a2d_vec(_v4, b8, uchar4); - sust_b_a2d_vec(_v4, b16, ushort4); - sust_b_a2d_vec(_v4, b32, uint4); - // sust_b_a2d_vec(_v4, b64, ulong4); - __device__ static inline bool is_upper_warp() { return FUNC_CALL(COMPILATION_MODE) == CompilationMode::DoubleWave32OnWave64 && __lane_id() >= 32; diff --git a/zluda/src/impl/surface.rs b/zluda/src/impl/surface.rs index 519e76e..5d11f7b 100644 --- a/zluda/src/impl/surface.rs +++ b/zluda/src/impl/surface.rs @@ -1,10 +1,11 @@ +use super::hipfix; +use crate::hip_call_cuda; use cuda_types::*; use hip_runtime_sys::*; use std::{mem, ptr}; -use crate::hip_call_cuda; - -use super::{hipfix, FromCuda}; +// Same as in zluda_ptx_impl.cpp +const IMAGE_RESERVED_TOP_BITS: u32 = 3; pub(crate) unsafe fn create( result: *mut hipSurfaceObject_t, @@ -14,23 +15,24 @@ pub(crate) unsafe fn create( return Err(CUresult::CUDA_ERROR_INVALID_VALUE); } let desc = to_surface_desc(*p_res_desc)?; + // We need to check array format and channel count to set top bits of the surface object. + // HIP does not support non-Array sources anyway + if desc.resType != hipResourceType::hipResourceTypeArray { + return Err(CUresult::CUDA_ERROR_NOT_SUPPORTED); + } let mut surf_obj = mem::zeroed(); hip_call_cuda!(hipCreateSurfaceObject(&mut surf_obj, &desc)); - if desc.resType != hipResourceType::hipResourceTypeArray { - panic!() - } - let format_size = format_size((&*desc.res.array.array).Format); + let format_size = format_size((&*desc.res.array.array).Format)?; let channels = (&*desc.res.array.array).NumChannels; let pixel_size = format_size * channels as usize; - let shift_amount = (pixel_size.trailing_zeros() as usize) << (64 - 3); + let shift_amount = (pixel_size.trailing_zeros() as usize) << (64 - IMAGE_RESERVED_TOP_BITS); surf_obj = (surf_obj as usize | shift_amount) as _; - dbg!(surf_obj); *result = surf_obj; Ok(()) } -pub(crate) fn format_size(f: hipArray_Format) -> usize { - match f { +pub(crate) fn format_size(f: hipArray_Format) -> Result { + Ok(match f { hipArray_Format::HIP_AD_FORMAT_UNSIGNED_INT8 | hipArray_Format::HIP_AD_FORMAT_SIGNED_INT8 => 1, hipArray_Format::HIP_AD_FORMAT_UNSIGNED_INT16 @@ -39,8 +41,8 @@ pub(crate) fn format_size(f: hipArray_Format) -> usize { hipArray_Format::HIP_AD_FORMAT_UNSIGNED_INT32 | hipArray_Format::HIP_AD_FORMAT_SIGNED_INT32 | hipArray_Format::HIP_AD_FORMAT_FLOAT => 4, - _ => panic!(), - } + _ => return Err(CUresult::CUDA_ERROR_NOT_SUPPORTED), + }) } unsafe fn to_surface_desc(res_desc: CUDA_RESOURCE_DESC) -> Result { @@ -51,92 +53,10 @@ unsafe fn to_surface_desc(res_desc: CUDA_RESOURCE_DESC) -> Result hipResourceDesc__bindgen_ty_1 { - mipmap: hipResourceDesc__bindgen_ty_1__bindgen_ty_2 { - mipmap: mem::transmute(res_desc.res.mipmap.hMipmappedArray), - }, - }, - CUresourcetype::CU_RESOURCE_TYPE_LINEAR => hipResourceDesc__bindgen_ty_1 { - linear: hipResourceDesc__bindgen_ty_1__bindgen_ty_3 { - devPtr: res_desc.res.linear.devPtr.0, - desc: channel_format_desc( - FromCuda::from_cuda(res_desc.res.linear.format), - res_desc.res.linear.numChannels, - )?, - sizeInBytes: res_desc.res.linear.sizeInBytes, - }, - }, - CUresourcetype::CU_RESOURCE_TYPE_PITCH2D => hipResourceDesc__bindgen_ty_1 { - pitch2D: hipResourceDesc__bindgen_ty_1__bindgen_ty_4 { - devPtr: res_desc.res.pitch2D.devPtr.0, - desc: channel_format_desc( - FromCuda::from_cuda(res_desc.res.pitch2D.format), - res_desc.res.pitch2D.numChannels, - )?, - width: res_desc.res.pitch2D.width, - height: res_desc.res.pitch2D.height, - pitchInBytes: res_desc.res.pitch2D.pitchInBytes, - }, - }, - _ => todo!(), + _ => return Err(CUresult::CUDA_ERROR_NOT_SUPPORTED), }; Ok(hipResourceDesc { resType: res_type, res, }) } - -fn channel_format_desc( - format: hipArray_Format, - num_channels: u32, -) -> Result { - let mut bits = match num_channels { - 1 => (1, 0, 0, 0), - 2 => (1, 1, 0, 0), - 3 => (1, 1, 1, 0), - 4 => (1, 1, 1, 1), - _ => return Err(CUresult::CUDA_ERROR_INVALID_VALUE), - }; - let (kind, bit_width) = match format { - hipArray_Format::HIP_AD_FORMAT_UNSIGNED_INT8 => { - (hipChannelFormatKind::hipChannelFormatKindUnsigned, u8::BITS) - } - hipArray_Format::HIP_AD_FORMAT_UNSIGNED_INT16 => ( - hipChannelFormatKind::hipChannelFormatKindUnsigned, - u16::BITS, - ), - hipArray_Format::HIP_AD_FORMAT_UNSIGNED_INT32 => ( - hipChannelFormatKind::hipChannelFormatKindUnsigned, - u32::BITS, - ), - hipArray_Format::HIP_AD_FORMAT_SIGNED_INT8 => { - (hipChannelFormatKind::hipChannelFormatKindSigned, i8::BITS) - } - hipArray_Format::HIP_AD_FORMAT_SIGNED_INT16 => { - (hipChannelFormatKind::hipChannelFormatKindSigned, i16::BITS) - } - hipArray_Format::HIP_AD_FORMAT_SIGNED_INT32 => { - (hipChannelFormatKind::hipChannelFormatKindSigned, i32::BITS) - } - hipArray_Format::HIP_AD_FORMAT_HALF => ( - hipChannelFormatKind::hipChannelFormatKindFloat, - mem::size_of::() as u32 * u8::BITS, - ), - hipArray_Format::HIP_AD_FORMAT_FLOAT => ( - hipChannelFormatKind::hipChannelFormatKindFloat, - mem::size_of::() as u32 * u8::BITS, - ), - _ => return Err(CUresult::CUDA_ERROR_INVALID_VALUE), - }; - bits.0 *= bit_width; - bits.1 *= bit_width; - bits.2 *= bit_width; - bits.3 *= bit_width; - Ok(hipChannelFormatDesc { - x: bits.0 as i32, - y: bits.0 as i32, - z: bits.0 as i32, - w: bits.0 as i32, - f: kind, - }) -} diff --git a/zluda/src/impl/surfref.rs b/zluda/src/impl/surfref.rs index c1526f9..457f9c4 100644 --- a/zluda/src/impl/surfref.rs +++ b/zluda/src/impl/surfref.rs @@ -1,10 +1,7 @@ -use crate::{ - hip_call_cuda, - r#impl::{hipfix, surface}, -}; +use crate::{hip_call_cuda, r#impl::hipfix}; use cuda_types::{CUarray, CUresult}; use hip_runtime_sys::*; -use std::{mem, ptr}; +use std::ptr; pub(crate) unsafe fn set_array( surfref: *mut textureReference, @@ -21,14 +18,6 @@ pub(crate) unsafe fn set_array( array.Format, array.NumChannels as i32, )); - //assert_eq!(hipError_t::hipSuccess, hipHostGetDevicePointer(&mut dev_ptr, surfref.cast(), 0)); - dbg!(surfref); - // TODO: clear bits on the old textureobject hip_call_cuda!(hipTexRefSetArray(surfref, array, HIP_TRSA_OVERRIDE_FORMAT)); - let format_size = surface::format_size(array.Format); - let pixel_size = format_size * array.NumChannels as usize; - let shift_amount = (pixel_size.trailing_zeros() as usize) << (64 - 3); - let mut surfref = &mut *surfref; - surfref.textureObject = (surfref.textureObject as usize | shift_amount) as _; Ok(()) }