@@ -60,14 +60,10 @@ namespace
60
60
#else
61
61
constexpr size_t MAX_TEXTURE_SIZE = UINT32_MAX;
62
62
#endif
63
- }
64
-
65
63
66
64
// -------------------------------------------------------------------------------------
67
65
// 2D z-order curve
68
66
// -------------------------------------------------------------------------------------
69
- namespace
70
- {
71
67
constexpr uint16_t STANDARD_SWIZZLE_MASK_8 = 0b1010101000001111 ;
72
68
constexpr uint16_t STANDARD_SWIZZLE_MASK_16 = 0b1010101010001111 ;
73
69
constexpr uint16_t STANDARD_SWIZZLE_MASK_32 = 0b1010101010001111 ;
@@ -199,24 +195,90 @@ namespace
199
195
200
196
return S_OK;
201
197
}
198
+
199
+
200
+ // -------------------------------------------------------------------------------------
201
+ // 3D z-order curve
202
+ // -------------------------------------------------------------------------------------
203
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_X_8 = 0b1001000000001111 ;
204
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_X_16 = 0b1001000000001111 ;
205
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_X_32 = 0b1001001000001111 ;
206
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_X_64 = 0b1001001100001111 ;
207
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_X_128 = 0b1001001100001111 ;
208
+
209
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Y_8 = 0b0100101000110000 ;
210
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Y_16 = 0b0100101000110001 ;
211
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Y_32 = 0b0100100100110011 ;
212
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Y_64 = 0b0100100000110111 ;
213
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Y_128 = 0b0100100000111111 ;
214
+
215
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Z_8 = 0b0010010111000000 ;
216
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Z_16 = 0b0010010111000001 ;
217
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Z_32 = 0b0010010011000011 ;
218
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Z_64 = 0b0010010011000111 ;
219
+ constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Z_128 = 0b0010010011001111 ;
220
+
221
+ inline int GetSwizzleMask3D_X (size_t bytesPerPixel) noexcept
222
+ {
223
+ switch (bytesPerPixel)
224
+ {
225
+ case 1 : return VOLUME_STANDARD_SWIZZLE_X_8;
226
+ case 2 : return VOLUME_STANDARD_SWIZZLE_X_16;
227
+ case 8 : return VOLUME_STANDARD_SWIZZLE_X_64;
228
+ case 16 : return VOLUME_STANDARD_SWIZZLE_X_128;
229
+ default : return VOLUME_STANDARD_SWIZZLE_X_32;
230
+ }
231
+ }
232
+
233
+ inline int GetSwizzleMask3D_Y (size_t bytesPerPixel) noexcept
234
+ {
235
+ switch (bytesPerPixel)
236
+ {
237
+ case 1 : return VOLUME_STANDARD_SWIZZLE_Y_8;
238
+ case 2 : return VOLUME_STANDARD_SWIZZLE_Y_16;
239
+ case 8 : return VOLUME_STANDARD_SWIZZLE_Y_64;
240
+ case 16 : return VOLUME_STANDARD_SWIZZLE_Y_128;
241
+ default : return VOLUME_STANDARD_SWIZZLE_Y_32;
242
+ }
243
+ }
244
+
245
+ inline int GetSwizzleMask3D_Z (size_t bytesPerPixel) noexcept
246
+ {
247
+ switch (bytesPerPixel)
248
+ {
249
+ case 1 : return VOLUME_STANDARD_SWIZZLE_Z_8;
250
+ case 2 : return VOLUME_STANDARD_SWIZZLE_Z_16;
251
+ case 8 : return VOLUME_STANDARD_SWIZZLE_Z_64;
252
+ case 16 : return VOLUME_STANDARD_SWIZZLE_Z_128;
253
+ default : return VOLUME_STANDARD_SWIZZLE_Z_32;
254
+ }
255
+ }
202
256
}
203
257
258
+
259
+ // =====================================================================================
260
+ // Entry points
261
+ // =====================================================================================
262
+
204
263
_Use_decl_annotations_
205
264
HRESULT DirectX::StandardSwizzle (
206
265
const Image& srcImage,
207
266
bool toSwizzle,
208
267
ScratchImage& result) noexcept
209
268
{
210
- if (srcImage.height == 1
269
+ if (( srcImage.height == 1 )
211
270
|| (srcImage.width > MAX_TEXTURE_DIMENSION) || (srcImage.height > MAX_TEXTURE_DIMENSION))
212
271
{
213
272
// Standard Swizzle is not defined for 1D textures or textures larger than 16k
214
- return E_INVALIDARG ;
273
+ return HRESULT_E_NOT_SUPPORTED ;
215
274
}
216
275
217
276
if (IsPlanar (srcImage.format ) || IsPalettized (srcImage.format ) || (srcImage.format == DXGI_FORMAT_R1_UNORM))
218
277
return HRESULT_E_NOT_SUPPORTED;
219
278
279
+ if (!srcImage.pixels )
280
+ return E_POINTER;
281
+
220
282
HRESULT hr = result.Initialize2D (srcImage.format , srcImage.width , srcImage.height , 1 , 1 );
221
283
if (FAILED (hr))
222
284
return hr;
@@ -296,11 +358,16 @@ HRESULT DirectX::StandardSwizzle(
296
358
bool toSwizzle,
297
359
ScratchImage& result) noexcept
298
360
{
299
- if (!srcImages || !nimages
300
- || (metadata.dimension != TEX_DIMENSION_TEXTURE2D)
301
- || (metadata.width > MAX_TEXTURE_DIMENSION) || (metadata.height > MAX_TEXTURE_DIMENSION))
361
+ if (!srcImages || !nimages)
302
362
return E_INVALIDARG;
303
363
364
+ if (((metadata.dimension != TEX_DIMENSION_TEXTURE2D) && (metadata.dimension != TEX_DIMENSION_TEXTURE3D))
365
+ || (metadata.width > MAX_TEXTURE_DIMENSION) || (metadata.height > MAX_TEXTURE_DIMENSION))
366
+ {
367
+ // Standard Swizzle is not defined for 1D textures or textures larger than 16k
368
+ return HRESULT_E_NOT_SUPPORTED;
369
+ }
370
+
304
371
if (IsPlanar (metadata.format ) || IsPalettized (metadata.format ) || (metadata.format == DXGI_FORMAT_R1_UNORM))
305
372
return HRESULT_E_NOT_SUPPORTED;
306
373
@@ -329,141 +396,95 @@ HRESULT DirectX::StandardSwizzle(
329
396
return E_POINTER;
330
397
}
331
398
332
- for (size_t index = 0 ; index < nimages; ++index )
399
+ if (metadata.dimension == TEX_DIMENSION_TEXTURE3D)
400
+ {
401
+ // TODO -
402
+ return E_NOTIMPL;
403
+ }
404
+ else
333
405
{
334
- const Image& src = srcImages[ index ];
335
- if (src. format != metadata. format )
406
+ // Handle the 2D case for TEX_DIMENSION_TEXTURE2D
407
+ for ( size_t index = 0 ; index < nimages; ++ index )
336
408
{
337
- result.Release ();
338
- return E_FAIL;
339
- }
409
+ const Image& src = srcImages[index ];
410
+ if (src.format != metadata.format )
411
+ {
412
+ result.Release ();
413
+ return E_FAIL;
414
+ }
340
415
341
- if ((src.width > MAX_TEXTURE_DIMENSION) || (src.height > MAX_TEXTURE_DIMENSION))
342
- return E_FAIL;
416
+ if ((src.width > MAX_TEXTURE_DIMENSION) || (src.height > MAX_TEXTURE_DIMENSION))
417
+ {
418
+ result.Release ();
419
+ return E_FAIL;
420
+ }
343
421
344
- const Image& dst = dest[index ];
345
- assert (dst.format == metadata.format );
422
+ const Image& dst = dest[index ];
423
+ assert (dst.format == metadata.format );
346
424
347
- if (src.width != dst.width || src.height != dst.height )
348
- {
349
- result.Release ();
350
- return E_FAIL;
351
- }
425
+ if (src.width != dst.width || src.height != dst.height )
426
+ {
427
+ result.Release ();
428
+ return E_FAIL;
429
+ }
352
430
353
- if (toSwizzle)
354
- {
355
- switch (bytesPerPixel)
431
+ if (toSwizzle)
356
432
{
357
- case 1 :
358
- hr = LinearToStandardSwizzle2D<STANDARD_SWIZZLE_MASK_8, 1 >(src, dst, false );
359
- break ;
360
- case 2 :
361
- hr = LinearToStandardSwizzle2D<STANDARD_SWIZZLE_MASK_16, 2 >(src, dst, false );
362
- break ;
363
- case 8 :
364
- hr = LinearToStandardSwizzle2D<STANDARD_SWIZZLE_MASK_64, 8 >(src, dst, isCompressed);
365
- break ;
366
- case 16 :
367
- hr = LinearToStandardSwizzle2D<STANDARD_SWIZZLE_MASK_128, 16 >(src, dst, isCompressed);
368
- break ;
369
- default :
370
- hr = LinearToStandardSwizzle2D<STANDARD_SWIZZLE_MASK_32, 4 >(src, dst, false );
371
- break ;
433
+ switch (bytesPerPixel)
434
+ {
435
+ case 1 :
436
+ hr = LinearToStandardSwizzle2D<STANDARD_SWIZZLE_MASK_8, 1 >(src, dst, false );
437
+ break ;
438
+ case 2 :
439
+ hr = LinearToStandardSwizzle2D<STANDARD_SWIZZLE_MASK_16, 2 >(src, dst, false );
440
+ break ;
441
+ case 8 :
442
+ hr = LinearToStandardSwizzle2D<STANDARD_SWIZZLE_MASK_64, 8 >(src, dst, isCompressed);
443
+ break ;
444
+ case 16 :
445
+ hr = LinearToStandardSwizzle2D<STANDARD_SWIZZLE_MASK_128, 16 >(src, dst, isCompressed);
446
+ break ;
447
+ default :
448
+ hr = LinearToStandardSwizzle2D<STANDARD_SWIZZLE_MASK_32, 4 >(src, dst, false );
449
+ break ;
450
+ }
372
451
}
373
- }
374
- else
375
- {
376
- switch (bytesPerPixel)
452
+ else
377
453
{
378
- case 1 :
379
- hr = StandardSwizzleToLinear2D<STANDARD_SWIZZLE_MASK_8, 1 >(src, dst, false );
380
- break ;
381
- case 2 :
382
- hr = StandardSwizzleToLinear2D<STANDARD_SWIZZLE_MASK_16, 2 >(src, dst, false );
383
- break ;
384
- case 8 :
385
- hr = StandardSwizzleToLinear2D<STANDARD_SWIZZLE_MASK_64, 8 >(src, dst, isCompressed);
386
- break ;
387
- case 16 :
388
- hr = StandardSwizzleToLinear2D<STANDARD_SWIZZLE_MASK_128, 16 >(src, dst, isCompressed);
389
- break ;
390
- default :
391
- hr = StandardSwizzleToLinear2D<STANDARD_SWIZZLE_MASK_32, 4 >(src, dst, false );
392
- break ;
454
+ switch (bytesPerPixel)
455
+ {
456
+ case 1 :
457
+ hr = StandardSwizzleToLinear2D<STANDARD_SWIZZLE_MASK_8, 1 >(src, dst, false );
458
+ break ;
459
+ case 2 :
460
+ hr = StandardSwizzleToLinear2D<STANDARD_SWIZZLE_MASK_16, 2 >(src, dst, false );
461
+ break ;
462
+ case 8 :
463
+ hr = StandardSwizzleToLinear2D<STANDARD_SWIZZLE_MASK_64, 8 >(src, dst, isCompressed);
464
+ break ;
465
+ case 16 :
466
+ hr = StandardSwizzleToLinear2D<STANDARD_SWIZZLE_MASK_128, 16 >(src, dst, isCompressed);
467
+ break ;
468
+ default :
469
+ hr = StandardSwizzleToLinear2D<STANDARD_SWIZZLE_MASK_32, 4 >(src, dst, false );
470
+ break ;
471
+ }
393
472
}
394
- }
395
473
396
- if (FAILED (hr))
397
- {
398
- result.Release ();
399
- return hr;
474
+ if (FAILED (hr))
475
+ {
476
+ result.Release ();
477
+ return hr;
478
+ }
400
479
}
401
480
}
402
481
403
482
return S_OK;
404
483
}
405
484
406
485
407
- // -------------------------------------------------------------------------------------
408
- // 3D z-order curve
409
- // -------------------------------------------------------------------------------------
410
- namespace
411
- {
412
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_X_8 = 0b1001000000001111 ;
413
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_X_16 = 0b1001000000001111 ;
414
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_X_32 = 0b1001001000001111 ;
415
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_X_64 = 0b1001001100001111 ;
416
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_X_128 = 0b1001001100001111 ;
417
-
418
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Y_8 = 0b0100101000110000 ;
419
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Y_16 = 0b0100101000110001 ;
420
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Y_32 = 0b0100100100110011 ;
421
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Y_64 = 0b0100100000110111 ;
422
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Y_128 = 0b0100100000111111 ;
423
-
424
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Z_8 = 0b0010010111000000 ;
425
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Z_16 = 0b0010010111000001 ;
426
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Z_32 = 0b0010010011000011 ;
427
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Z_64 = 0b0010010011000111 ;
428
- constexpr uint16_t VOLUME_STANDARD_SWIZZLE_Z_128 = 0b0010010011001111 ;
429
-
430
- inline int GetSwizzleMask3D_X (size_t bytesPerPixel) noexcept
431
- {
432
- switch (bytesPerPixel)
433
- {
434
- case 1 : return VOLUME_STANDARD_SWIZZLE_X_8;
435
- case 2 : return VOLUME_STANDARD_SWIZZLE_X_16;
436
- case 8 : return VOLUME_STANDARD_SWIZZLE_X_64;
437
- case 16 : return VOLUME_STANDARD_SWIZZLE_X_128;
438
- default : return VOLUME_STANDARD_SWIZZLE_X_32;
439
- }
440
- }
441
-
442
- inline int GetSwizzleMask3D_Y (size_t bytesPerPixel) noexcept
443
- {
444
- switch (bytesPerPixel)
445
- {
446
- case 1 : return VOLUME_STANDARD_SWIZZLE_Y_8;
447
- case 2 : return VOLUME_STANDARD_SWIZZLE_Y_16;
448
- case 8 : return VOLUME_STANDARD_SWIZZLE_Y_64;
449
- case 16 : return VOLUME_STANDARD_SWIZZLE_Y_128;
450
- default : return VOLUME_STANDARD_SWIZZLE_Y_32;
451
- }
452
- }
453
-
454
- inline int GetSwizzleMask3D_Z (size_t bytesPerPixel) noexcept
455
- {
456
- switch (bytesPerPixel)
457
- {
458
- case 1 : return VOLUME_STANDARD_SWIZZLE_Z_8;
459
- case 2 : return VOLUME_STANDARD_SWIZZLE_Z_16;
460
- case 8 : return VOLUME_STANDARD_SWIZZLE_Z_64;
461
- case 16 : return VOLUME_STANDARD_SWIZZLE_Z_128;
462
- default : return VOLUME_STANDARD_SWIZZLE_Z_32;
463
- }
464
- }
465
- }
466
-
486
+ #if 0
487
+ // TODO: merging into main based on metadata
467
488
_Use_decl_annotations_
468
489
HRESULT DirectX::StandardSwizzle3D(
469
490
const Image* srcImages,
@@ -566,3 +587,4 @@ HRESULT DirectX::StandardSwizzle3D(
566
587
567
588
return S_OK;
568
589
}
590
+ #endif
0 commit comments