6.27. 纹理对象管理

本节介绍 CUDA 运行时应用程序编程接口的底层纹理对象管理功能。纹理对象 API 仅在计算能力为 3.0 或更高的设备上受支持。

函数

__host__cudaChannelFormatDesc cudaCreateChannelDesc ( int  x, int  y, int  z, int  w, cudaChannelFormatKind f )
返回使用指定格式的通道描述符。
__host__cudaError_t cudaCreateTextureObject ( cudaTextureObject_t* pTexObject, const cudaResourceDesc* pResDesc, const cudaTextureDesc* pTexDesc, const cudaResourceViewDesc* pResViewDesc )
创建纹理对象。
__host__cudaError_t cudaDestroyTextureObject ( cudaTextureObject_t texObject )
销毁纹理对象。
__host__cudaError_t cudaGetChannelDesc ( cudaChannelFormatDesc* desc, cudaArray_const_t array )
获取数组的通道描述符。
__host__cudaError_t cudaGetTextureObjectResourceDesc ( cudaResourceDesc* pResDesc, cudaTextureObject_t texObject )
返回纹理对象的资源描述符。
__host__cudaError_t cudaGetTextureObjectResourceViewDesc ( cudaResourceViewDesc* pResViewDesc, cudaTextureObject_t texObject )
返回纹理对象的资源视图描述符。
__host__cudaError_t cudaGetTextureObjectTextureDesc ( cudaTextureDesc* pTexDesc, cudaTextureObject_t texObject )
返回纹理对象的纹理描述符。

函数

__host__cudaChannelFormatDesc cudaCreateChannelDesc ( int  x, int  y, int  z, int  w, cudaChannelFormatKind f )
返回使用指定格式的通道描述符。
参数
x
- X 分量
y
- Y 分量
z
- Z 分量
w
- W 分量
f
- 通道格式
返回值

具有格式的通道描述符f

描述

返回具有格式的通道描述符f以及每个分量的位数x, y, z,以及w。《cudaChannelFormatDesc》定义为

‎  struct cudaChannelFormatDesc {
          int x, y, z, w;
          enum cudaChannelFormatKind 
                  f;
        };

其中 cudaChannelFormatKind 是 cudaChannelFormatKindSignedcudaChannelFormatKindUnsignedcudaChannelFormatKindFloat 之一。

另请参阅

cudaCreateChannelDesc ( C++ API), cudaGetChannelDesc, cudaCreateTextureObject, cudaCreateSurfaceObject

__host__cudaError_t cudaCreateTextureObject ( cudaTextureObject_t* pTexObject, const cudaResourceDesc* pResDesc, const cudaTextureDesc* pTexDesc, const cudaResourceViewDesc* pResViewDesc )
创建纹理对象。
参数
pTexObject
- 要创建的纹理对象
pResDesc
- 资源描述符
pTexDesc
- 纹理描述符
pResViewDesc
- 资源视图描述符
描述

创建纹理对象并在pTexObject. pResDesc中返回它,描述要纹理化的数据。pTexDesc描述应如何采样数据。pResViewDesc是一个可选参数,用于指定由pResDesc描述的数据的备用格式,并描述在纹理化时限制访问的子资源区域。pResViewDesc仅当资源类型为 CUDA 数组或非块压缩格式的 CUDA mipmapped 数组时,才能指定。

纹理对象仅在计算能力为 3.0 或更高的设备上受支持。此外,纹理对象是一个不透明值,因此,应仅通过 CUDA API 调用访问。

cudaResourceDesc》结构定义为

‎        struct cudaResourceDesc {
                  enum cudaResourceType 
                  resType;
                  
                  union {
                      struct {
                          cudaArray_t 
                  array;
                      } array;
                      struct {
                          cudaMipmappedArray_t 
                  mipmap;
                      } mipmap;
                      struct {
                          void *devPtr;
                          struct cudaChannelFormatDesc 
                  desc;
                          size_t sizeInBytes;
                      } linear;
                      struct {
                          void *devPtr;
                          struct cudaChannelFormatDesc 
                  desc;
                          size_t width;
                          size_t height;
                          size_t pitchInBytes;
                      } pitch2D;
                  } res;
              };
其中

如果 cudaResourceDesc::resType 设置为 cudaResourceTypeArray,则 cudaResourceDesc::res::array::array 必须设置为有效的 CUDA 数组句柄。

如果 cudaResourceDesc::resType 设置为 cudaResourceTypeMipmappedArray,则 cudaResourceDesc::res::mipmap::mipmap 必须设置为有效的 CUDA mipmapped 数组句柄,并且 cudaTextureDesc::normalizedCoords 必须设置为 true。

如果 cudaResourceDesc::resType 设置为 cudaResourceTypeLinear,则 cudaResourceDesc::res::linear::devPtr 必须设置为有效的设备指针,该指针与 cudaDeviceProp::textureAlignment 对齐。cudaResourceDesc::res::linear::desc 描述了每个数组元素的格式和分量数。cudaResourceDesc::res::linear::sizeInBytes 指定数组的大小(以字节为单位)。线性地址范围中的元素总数不能超过 cudaDeviceProp::maxTexture1DLinear。元素的数量计算为 (sizeInBytes / sizeof(desc))。

如果 cudaResourceDesc::resType 设置为 cudaResourceTypePitch2D,则 cudaResourceDesc::res::pitch2D::devPtr 必须设置为有效的设备指针,该指针与 cudaDeviceProp::textureAlignment 对齐。cudaResourceDesc::res::pitch2D::desc 描述了每个数组元素的格式和分量数。cudaResourceDesc::res::pitch2D::width 和 cudaResourceDesc::res::pitch2D::height 分别指定数组的宽度和高度(以元素为单位),并且不能超过 cudaDeviceProp::maxTexture2DLinear[0] 和 cudaDeviceProp::maxTexture2DLinear[1]。cudaResourceDesc::res::pitch2D::pitchInBytes 指定两行之间的间距(以字节为单位),并且必须与 cudaDeviceProp::texturePitchAlignment 对齐。间距不能超过 cudaDeviceProp::maxTexture2DLinear[2]。

cudaTextureDesc》结构定义为

‎        struct cudaTextureDesc {
                  enum cudaTextureAddressMode 
                  addressMode[3];
                  enum cudaTextureFilterMode  
                  filterMode;
                  enum cudaTextureReadMode    
                  readMode;
                  int                         sRGB;
                  float                       borderColor[4];
                  int                         normalizedCoords;
                  unsigned int                maxAnisotropy;
                  enum cudaTextureFilterMode  
                  mipmapFilterMode;
                  float                       mipmapLevelBias;
                  float                       minMipmapLevelClamp;
                  float                       maxMipmapLevelClamp;
                  int                         disableTrilinearOptimization;
                  int                         seamlessCubemap;
              };
其中

cudaResourceViewDesc》结构定义为

‎        struct cudaResourceViewDesc {
                  enum cudaResourceViewFormat 
                  format;
                  size_t                      width;
                  size_t                      height;
                  size_t                      depth;
                  unsigned int                firstMipmapLevel;
                  unsigned int                lastMipmapLevel;
                  unsigned int                firstLayer;
                  unsigned int                lastLayer;
              };
其中
  • cudaResourceViewDesc::format 指定应如何解释 CUDA 数组或 CUDA mipmapped 数组中包含的数据。请注意,这可能会导致纹理数据大小发生变化。如果资源视图格式为块压缩格式,则底层 CUDA 数组或 CUDA mipmapped 数组必须具有 32 位无符号整数格式,并且具有 2 个或 4 个通道,具体取决于块压缩格式。例如,BC1 和 BC4 要求底层 CUDA 数组具有 32 位无符号整数和 2 个通道。其他 BC 格式要求底层资源具有相同的 32 位无符号整数格式,但具有 4 个通道。

  • cudaResourceViewDesc::width 指定纹理数据的新宽度。如果资源视图格式为块压缩格式,则此值必须是资源原始宽度的 4 倍。对于非块压缩格式,此值必须等于原始资源的值。

  • cudaResourceViewDesc::height 指定纹理数据的新高度。如果资源视图格式为块压缩格式,则此值必须是资源原始高度的 4 倍。对于非块压缩格式,此值必须等于原始资源的值。

注意

另请参阅

cudaDestroyTextureObject, cuTexObjectCreate

__host__cudaError_t cudaDestroyTextureObject ( cudaTextureObject_t texObject )
销毁纹理对象。
参数
texObject
- 要销毁的纹理对象
描述

销毁由texObject.

注意

另请参阅

cudaCreateTextureObject, cuTexObjectDestroy

__host__cudaError_t cudaGetChannelDesc ( cudaChannelFormatDesc* desc, cudaArray_const_t array )
获取数组的通道描述符。
参数
desc
- 通道格式
array
- 设备上的内存数组
描述

返回值在*descCUDA 数组的通道描述符array.

注意

另请参阅

cudaCreateChannelDesc ( C API), cudaCreateTextureObject, cudaCreateSurfaceObject

__host__cudaError_t cudaGetTextureObjectResourceDesc ( cudaResourceDesc* pResDesc, cudaTextureObject_t texObject )
返回纹理对象的资源描述符。
参数
pResDesc
- 资源描述符
texObject
- 纹理对象
描述

返回由以下函数指定的纹理对象的资源描述符:texObject.

注意

另请参阅

cudaCreateTextureObject, cuTexObjectGetResourceDesc

__host__cudaError_t cudaGetTextureObjectResourceViewDesc ( cudaResourceViewDesc* pResViewDesc, cudaTextureObject_t texObject )
返回纹理对象的资源视图描述符。
参数
pResViewDesc
- 资源视图描述符
texObject
- 纹理对象
描述

返回由以下函数指定的纹理对象的资源视图描述符:texObject. 如果未指定资源视图,则返回 cudaErrorInvalidValue

注意

另请参阅

cudaCreateTextureObject, cuTexObjectGetResourceViewDesc

__host__cudaError_t cudaGetTextureObjectTextureDesc ( cudaTextureDesc* pTexDesc, cudaTextureObject_t texObject )
返回纹理对象的纹理描述符。
参数
pTexDesc
- 纹理描述符
texObject
- 纹理对象
描述

返回由以下函数指定的纹理对象的纹理描述符:texObject.

注意

另请参阅

cudaCreateTextureObject, cuTexObjectGetTextureDesc