File indexing completed on 2026-04-09 07:49:11
0001
0002 #include <sstream>
0003 #include <cstring>
0004 #include <cassert>
0005 #include <iostream>
0006
0007 #include "scuda.h"
0008 #include "squad.h"
0009 #include "NP.hh"
0010
0011 #if defined(MOCK_TEXTURE) || defined(MOCK_CUDA)
0012 #include "stexture.h"
0013 #else
0014 #include <cuda_runtime.h>
0015 #include "cudaCheckErrors.h"
0016 #include "QU.hh"
0017 #endif
0018
0019 #include "QTex.hh"
0020
0021
0022 template<typename T>
0023 QTex<T>::QTex(size_t width_, size_t height_ , const void* src_, char filterMode_, bool normalizedCoords_, const NP* a_ )
0024 :
0025 width(width_),
0026 height(height_),
0027 src(src_),
0028 filterMode(filterMode_),
0029 normalizedCoords(normalizedCoords_),
0030 origin(nullptr),
0031 a(a_),
0032 #if defined(MOCK_TEXTURE) || defined(MOCK_CUDA)
0033 #else
0034 cuArray(nullptr),
0035 channelDesc(cudaCreateChannelDesc<T>()),
0036 #endif
0037 texObj(0),
0038 meta(new quad4),
0039 d_meta(nullptr)
0040 {
0041 init();
0042 }
0043
0044 template<typename T>
0045 void QTex<T>::setOrigin(const void* origin_)
0046 {
0047 origin = origin_ ;
0048 }
0049 template<typename T>
0050 const void* QTex<T>::getOrigin() const
0051 {
0052 return origin ;
0053 }
0054
0055 template<typename T>
0056 void QTex<T>::setHDFactor(unsigned hd_factor)
0057 {
0058 meta->q0.u.w = hd_factor ;
0059 }
0060
0061 template<typename T>
0062 unsigned QTex<T>::getHDFactor() const
0063 {
0064 return meta->q0.u.w ;
0065 }
0066
0067 template<typename T>
0068 char QTex<T>::getFilterMode() const
0069 {
0070 return filterMode ;
0071 }
0072
0073 template<typename T>
0074 bool QTex<T>::getNormalizedCoords() const
0075 {
0076 return normalizedCoords ;
0077 }
0078
0079
0080 template<typename T>
0081 QTex<T>::~QTex()
0082 {
0083 #if defined(MOCK_TEXTURE) || defined(MOCK_CUDA)
0084 #else
0085 cudaDestroyTextureObject(texObj);
0086 cudaFreeArray(cuArray);
0087 #endif
0088 }
0089
0090 template<typename T>
0091 void QTex<T>::init()
0092 {
0093 #if defined(MOCK_TEXTURE) || defined(MOCK_CUDA)
0094 assert(a);
0095 MockTextureManager::Add(a) ;
0096 #else
0097 createArray();
0098 uploadToArray();
0099 createTextureObject();
0100 #endif
0101
0102 meta->q0.u.x = width ;
0103 meta->q0.u.y = height ;
0104 meta->q0.u.z = 0 ;
0105 meta->q0.u.w = 0 ;
0106 }
0107
0108
0109 template<typename T>
0110 void QTex<T>::setMetaDomainX( const quad* domx )
0111 {
0112 meta->q1.f.x = domx->f.x ;
0113 meta->q1.f.y = domx->f.y ;
0114 meta->q1.f.z = domx->f.z ;
0115 meta->q1.f.w = domx->f.w ;
0116 }
0117
0118 template<typename T>
0119 void QTex<T>::setMetaDomainY( const quad* domy )
0120 {
0121 meta->q2.f.x = domy->f.x ;
0122 meta->q2.f.y = domy->f.y ;
0123 meta->q2.f.z = domy->f.z ;
0124 meta->q2.f.w = domy->f.w ;
0125 }
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136 template<typename T>
0137 void QTex<T>::uploadMeta()
0138 {
0139 #if defined(MOCK_TEXTURE) || defined(MOCK_CUDA)
0140 d_meta = meta ;
0141 #else
0142 d_meta = QU::UploadArray<quad4>(meta, 1, "QTex::uploadMeta" );
0143 #endif
0144 }
0145
0146
0147
0148
0149
0150 template<typename T>
0151 std::string QTex<T>::desc() const
0152 {
0153 std::stringstream ss ;
0154
0155 ss << "QTex"
0156 << " width " << width
0157 << " height " << height
0158 << " texObj " << texObj
0159 << " meta " << meta
0160 << " d_meta " << d_meta
0161 ;
0162
0163 std::string s = ss.str();
0164 return s ;
0165 }
0166
0167
0168 #if defined(MOCK_TEXTURE) || defined(MOCK_CUDA)
0169 #else
0170
0171 template<typename T>
0172 void QTex<T>::createArray()
0173 {
0174 cudaMallocArray(&cuArray, &channelDesc, width, height );
0175 cudaCheckErrors("cudaMallocArray");
0176 }
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220 template<typename T>
0221 void QTex<T>::uploadToArray()
0222 {
0223 cudaArray_t dst = cuArray ;
0224 size_t wOffset = 0 ;
0225 size_t hOffset = 0 ;
0226 cudaMemcpyKind kind = cudaMemcpyHostToDevice ;
0227
0228 size_t spitch = width*sizeof(T);
0229 size_t width_bytes = width*sizeof(T);
0230 size_t height_rows = height ;
0231
0232 cudaMemcpy2DToArray(dst, wOffset, hOffset, src, spitch, width_bytes, height_rows, kind );
0233
0234 cudaCheckErrors("cudaMemcpy2DToArray");
0235 }
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249 template<typename T>
0250 void QTex<T>::createTextureObject()
0251 {
0252 struct cudaResourceDesc resDesc;
0253 memset(&resDesc, 0, sizeof(resDesc));
0254 resDesc.resType = cudaResourceTypeArray;
0255 resDesc.res.array.array = cuArray;
0256
0257
0258 struct cudaTextureDesc texDesc;
0259 memset(&texDesc, 0, sizeof(texDesc));
0260 texDesc.addressMode[0] = cudaAddressModeWrap;
0261 texDesc.addressMode[1] = cudaAddressModeWrap;
0262
0263 assert( filterMode == 'P' || filterMode == 'L' );
0264 switch(filterMode)
0265 {
0266 case 'L': texDesc.filterMode = cudaFilterModeLinear ; break ;
0267 case 'P': texDesc.filterMode = cudaFilterModePoint ; break ;
0268
0269 }
0270
0271 texDesc.readMode = cudaReadModeElementType;
0272 texDesc.normalizedCoords = normalizedCoords ;
0273
0274
0275 cudaCreateTextureObject(&texObj, &resDesc, &texDesc, NULL);
0276 }
0277
0278 #endif
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304 template struct QUDARAP_API QTex<uchar4>;
0305
0306 #pragma GCC diagnostic push
0307 #pragma GCC diagnostic ignored "-Wattributes"
0308
0309 template struct QUDARAP_API QTex<float>;
0310 template struct QUDARAP_API QTex<float4>;
0311 #pragma GCC diagnostic pop
0312
0313
0314
0315
0316
0317
0318