|
@@ -1,6 +1,8 @@
|
|
|
import { GPUTextureFormat, GPUAddressMode, GPUFilterMode, GPUTextureDimension } from './constants.js';
|
|
|
import { VideoTexture, CubeTexture, Texture, NearestFilter, NearestMipmapNearestFilter, NearestMipmapLinearFilter, LinearFilter, RepeatWrapping, MirroredRepeatWrapping, RGB_ETC2_Format, RGBA_ETC2_EAC_Format,
|
|
|
- RGBAFormat, RedFormat, RGFormat, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, UnsignedByteType, FloatType, HalfFloatType, SRGBColorSpace, DepthFormat, DepthTexture
|
|
|
+ RGBAFormat, RedFormat, RGFormat, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, UnsignedByteType, FloatType, HalfFloatType, SRGBColorSpace, DepthFormat, DepthTexture,
|
|
|
+ RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format,
|
|
|
+ RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format
|
|
|
} from 'three';
|
|
|
import WebGPUTextureUtils from './WebGPUTextureUtils.js';
|
|
|
|
|
@@ -580,6 +582,32 @@ class WebGPUTextures {
|
|
|
if ( format === GPUTextureFormat.BC6HRGBUFloat || format === GPUTextureFormat.BC6HRGBFloat ) return { byteLength: 16, width: 4, height: 4 }; // BPTC (float)
|
|
|
if ( format === GPUTextureFormat.BC7RGBAUnorm || format === GPUTextureFormat.BC7RGBAUnormSRGB ) return { byteLength: 16, width: 4, height: 4 }; // BPTC (unorm)
|
|
|
|
|
|
+ if ( format === GPUTextureFormat.ETC2RGB8Unorm || format === GPUTextureFormat.ETC2RGB8UnormSRGB ) return { byteLength: 8, width: 4, height: 4 };
|
|
|
+ if ( format === GPUTextureFormat.ETC2RGB8A1Unorm || format === GPUTextureFormat.ETC2RGB8A1UnormSRGB ) return { byteLength: 8, width: 4, height: 4 };
|
|
|
+ if ( format === GPUTextureFormat.ETC2RGBA8Unorm || format === GPUTextureFormat.ETC2RGBA8UnormSRGB ) return { byteLength: 16, width: 4, height: 4 };
|
|
|
+ if ( format === GPUTextureFormat.EACR11Unorm ) return { byteLength: 8, width: 4, height: 4 };
|
|
|
+ if ( format === GPUTextureFormat.EACR11Snorm ) return { byteLength: 8, width: 4, height: 4 };
|
|
|
+ if ( format === GPUTextureFormat.EACRG11Unorm ) return { byteLength: 16, width: 4, height: 4 };
|
|
|
+ if ( format === GPUTextureFormat.EACRG11Snorm ) return { byteLength: 16, width: 4, height: 4 };
|
|
|
+
|
|
|
+ if ( format === GPUTextureFormat.ASTC4x4Unorm || format === GPUTextureFormat.ASTC4x4UnormSRGB ) return { byteLength: 16, width: 4, height: 4 };
|
|
|
+ if ( format === GPUTextureFormat.ASTC5x4Unorm || format === GPUTextureFormat.ASTC5x4UnormSRGB ) return { byteLength: 16, width: 5, height: 4 };
|
|
|
+ if ( format === GPUTextureFormat.ASTC5x5Unorm || format === GPUTextureFormat.ASTC5x5UnormSRGB ) return { byteLength: 16, width: 5, height: 5 };
|
|
|
+ if ( format === GPUTextureFormat.ASTC6x5Unorm || format === GPUTextureFormat.ASTC6x5UnormSRGB ) return { byteLength: 16, width: 6, height: 5 };
|
|
|
+ if ( format === GPUTextureFormat.ASTC6x6Unorm || format === GPUTextureFormat.ASTC6x6UnormSRGB ) return { byteLength: 16, width: 6, height: 6 };
|
|
|
+ if ( format === GPUTextureFormat.ASTC8x5Unorm || format === GPUTextureFormat.ASTC8x5UnormSRGB ) return { byteLength: 16, width: 8, height: 5 };
|
|
|
+ if ( format === GPUTextureFormat.ASTC8x6Unorm || format === GPUTextureFormat.ASTC8x6UnormSRGB ) return { byteLength: 16, width: 8, height: 6 };
|
|
|
+ if ( format === GPUTextureFormat.ASTC8x8Unorm || format === GPUTextureFormat.ASTC8x8UnormSRGB ) return { byteLength: 16, width: 8, height: 8 };
|
|
|
+ if ( format === GPUTextureFormat.ASTC10x5Unorm || format === GPUTextureFormat.ASTC10x5UnormSRGB ) return { byteLength: 16, width: 10, height: 5 };
|
|
|
+ if ( format === GPUTextureFormat.ASTC10x6Unorm || format === GPUTextureFormat.ASTC10x6UnormSRGB ) return { byteLength: 16, width: 10, height: 6 };
|
|
|
+ if ( format === GPUTextureFormat.ASTC10x8Unorm || format === GPUTextureFormat.ASTC10x8UnormSRGB ) return { byteLength: 16, width: 10, height: 8 };
|
|
|
+ if ( format === GPUTextureFormat.ASTC10x10Unorm || format === GPUTextureFormat.ASTC10x10UnormSRGB ) return { byteLength: 16, width: 10, height: 10 };
|
|
|
+ if ( format === GPUTextureFormat.ASTC12x10Unorm || format === GPUTextureFormat.ASTC12x10UnormSRGB ) return { byteLength: 16, width: 12, height: 10 };
|
|
|
+ if ( format === GPUTextureFormat.ASTC12x12Unorm || format === GPUTextureFormat.ASTC12x12UnormSRGB ) return { byteLength: 16, width: 12, height: 12 };
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
_getBytesPerTexel( format ) {
|
|
@@ -622,103 +650,172 @@ class WebGPUTextures {
|
|
|
|
|
|
let formatGPU;
|
|
|
|
|
|
- switch ( format ) {
|
|
|
+ if ( texture.isCompressedTexture === true ) {
|
|
|
|
|
|
- case RGBA_S3TC_DXT1_Format:
|
|
|
- formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.BC1RGBAUnormSRGB : GPUTextureFormat.BC1RGBAUnorm;
|
|
|
- break;
|
|
|
+ switch ( format ) {
|
|
|
|
|
|
- case RGBA_S3TC_DXT3_Format:
|
|
|
- formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.BC2RGBAUnormSRGB : GPUTextureFormat.BC2RGBAUnorm;
|
|
|
- break;
|
|
|
+ case RGBA_S3TC_DXT1_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.BC1RGBAUnormSRGB : GPUTextureFormat.BC1RGBAUnorm;
|
|
|
+ break;
|
|
|
|
|
|
- case RGBA_S3TC_DXT5_Format:
|
|
|
- formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.BC3RGBAUnormSRGB : GPUTextureFormat.BC3RGBAUnorm;
|
|
|
- break;
|
|
|
+ case RGBA_S3TC_DXT3_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.BC2RGBAUnormSRGB : GPUTextureFormat.BC2RGBAUnorm;
|
|
|
+ break;
|
|
|
|
|
|
- case RGB_ETC2_Format:
|
|
|
- formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ETC2RGB8UnormSRGB : GPUTextureFormat.ETC2RGB8Unorm;
|
|
|
- break;
|
|
|
+ case RGBA_S3TC_DXT5_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.BC3RGBAUnormSRGB : GPUTextureFormat.BC3RGBAUnorm;
|
|
|
+ break;
|
|
|
|
|
|
- case RGBA_ETC2_EAC_Format:
|
|
|
- formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ETC2RGBA8UnormSRGB : GPUTextureFormat.ETC2RGBA8Unorm;
|
|
|
- break;
|
|
|
+ case RGB_ETC2_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ETC2RGB8UnormSRGB : GPUTextureFormat.ETC2RGB8Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- case DepthFormat:
|
|
|
- formatGPU = GPUTextureFormat.Depth32Float;
|
|
|
- break;
|
|
|
+ case RGBA_ETC2_EAC_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ETC2RGBA8UnormSRGB : GPUTextureFormat.ETC2RGBA8Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- case RGBAFormat:
|
|
|
+ case RGBA_ASTC_4x4_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC4x4UnormSRGB : GPUTextureFormat.ASTC4x4Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- switch ( type ) {
|
|
|
+ case RGBA_ASTC_5x4_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC5x4UnormSRGB : GPUTextureFormat.ASTC5x4Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- case UnsignedByteType:
|
|
|
- formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.RGBA8UnormSRGB : GPUTextureFormat.RGBA8Unorm;
|
|
|
- break;
|
|
|
+ case RGBA_ASTC_5x5_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC5x5UnormSRGB : GPUTextureFormat.ASTC5x5Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- case HalfFloatType:
|
|
|
- formatGPU = GPUTextureFormat.RGBA16Float;
|
|
|
- break;
|
|
|
+ case RGBA_ASTC_6x5_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC6x5UnormSRGB : GPUTextureFormat.ASTC6x5Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- case FloatType:
|
|
|
- formatGPU = GPUTextureFormat.RGBA32Float;
|
|
|
- break;
|
|
|
+ case RGBA_ASTC_6x6_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC6x6UnormSRGB : GPUTextureFormat.ASTC6x6Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- default:
|
|
|
- console.error( 'WebGPURenderer: Unsupported texture type with RGBAFormat.', type );
|
|
|
+ case RGBA_ASTC_8x5_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC8x5UnormSRGB : GPUTextureFormat.ASTC8x5Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- }
|
|
|
+ case RGBA_ASTC_8x6_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC8x6UnormSRGB : GPUTextureFormat.ASTC8x6Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- break;
|
|
|
+ case RGBA_ASTC_8x8_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC8x8UnormSRGB : GPUTextureFormat.ASTC8x8Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- case RedFormat:
|
|
|
+ case RGBA_ASTC_10x5_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC10x5UnormSRGB : GPUTextureFormat.ASTC10x5Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- switch ( type ) {
|
|
|
+ case RGBA_ASTC_10x6_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC10x6UnormSRGB : GPUTextureFormat.ASTC10x6Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- case UnsignedByteType:
|
|
|
- formatGPU = GPUTextureFormat.R8Unorm;
|
|
|
- break;
|
|
|
+ case RGBA_ASTC_10x8_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC10x8UnormSRGB : GPUTextureFormat.ASTC10x8Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- case HalfFloatType:
|
|
|
- formatGPU = GPUTextureFormat.R16Float;
|
|
|
- break;
|
|
|
+ case RGBA_ASTC_10x10_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC10x10UnormSRGB : GPUTextureFormat.ASTC10x10Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- case FloatType:
|
|
|
- formatGPU = GPUTextureFormat.R32Float;
|
|
|
- break;
|
|
|
+ case RGBA_ASTC_12x10_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC12x10UnormSRGB : GPUTextureFormat.ASTC12x10Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- default:
|
|
|
- console.error( 'WebGPURenderer: Unsupported texture type with RedFormat.', type );
|
|
|
+ case RGBA_ASTC_12x12_Format:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC12x12UnormSRGB : GPUTextureFormat.ASTC12x12Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- }
|
|
|
+ case DepthFormat:
|
|
|
+ formatGPU = GPUTextureFormat.Depth32Float;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ console.error( 'WebGPURenderer: Unsupported texture format.', format );
|
|
|
|
|
|
- break;
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
|
|
|
- case RGFormat:
|
|
|
+ switch ( format ) {
|
|
|
|
|
|
- switch ( type ) {
|
|
|
+ case RGBAFormat:
|
|
|
|
|
|
- case UnsignedByteType:
|
|
|
- formatGPU = GPUTextureFormat.RG8Unorm;
|
|
|
- break;
|
|
|
+ switch ( type ) {
|
|
|
|
|
|
- case HalfFloatType:
|
|
|
- formatGPU = GPUTextureFormat.RG16Float;
|
|
|
- break;
|
|
|
+ case UnsignedByteType:
|
|
|
+ formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.RGBA8UnormSRGB : GPUTextureFormat.RGBA8Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- case FloatType:
|
|
|
- formatGPU = GPUTextureFormat.RG32Float;
|
|
|
- break;
|
|
|
+ case HalfFloatType:
|
|
|
+ formatGPU = GPUTextureFormat.RGBA16Float;
|
|
|
+ break;
|
|
|
|
|
|
- default:
|
|
|
- console.error( 'WebGPURenderer: Unsupported texture type with RGFormat.', type );
|
|
|
+ case FloatType:
|
|
|
+ formatGPU = GPUTextureFormat.RGBA32Float;
|
|
|
+ break;
|
|
|
|
|
|
- }
|
|
|
+ default:
|
|
|
+ console.error( 'WebGPURenderer: Unsupported texture type with RGBAFormat.', type );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ case RedFormat:
|
|
|
+
|
|
|
+ switch ( type ) {
|
|
|
|
|
|
- break;
|
|
|
+ case UnsignedByteType:
|
|
|
+ formatGPU = GPUTextureFormat.R8Unorm;
|
|
|
+ break;
|
|
|
|
|
|
- default:
|
|
|
- console.error( 'WebGPURenderer: Unsupported texture format.', format );
|
|
|
+ case HalfFloatType:
|
|
|
+ formatGPU = GPUTextureFormat.R16Float;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case FloatType:
|
|
|
+ formatGPU = GPUTextureFormat.R32Float;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ console.error( 'WebGPURenderer: Unsupported texture type with RedFormat.', type );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ case RGFormat:
|
|
|
+
|
|
|
+ switch ( type ) {
|
|
|
+
|
|
|
+ case UnsignedByteType:
|
|
|
+ formatGPU = GPUTextureFormat.RG8Unorm;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case HalfFloatType:
|
|
|
+ formatGPU = GPUTextureFormat.RG16Float;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case FloatType:
|
|
|
+ formatGPU = GPUTextureFormat.RG32Float;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ console.error( 'WebGPURenderer: Unsupported texture type with RGFormat.', type );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ console.error( 'WebGPURenderer: Unsupported texture format.', format );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|