@@ -32,7 +32,9 @@ namespace
32
32
const uint8_t * sptr = xbox.GetPointer ();
33
33
const uint8_t * endPtr = sptr + layout.SizeBytes ;
34
34
35
- for (uint32_t item = 0 ; item < nimages; ++item)
35
+ assert ((nimages > 0 ) && (nimages <= UINT32_MAX));
36
+
37
+ for (size_t item = 0 ; item < nimages; ++item)
36
38
{
37
39
const Image* img = result[item];
38
40
if (!img || !img->pixels )
@@ -49,9 +51,9 @@ namespace
49
51
{
50
52
#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT)
51
53
const UINT64 element = (packed) ? (x >> 1 ) : x;
52
- const size_t offset = computer->GetTexelElementOffsetBytes (0 , level, element, 0 , item, 0 , nullptr );
54
+ const size_t offset = computer->GetTexelElementOffsetBytes (0 , static_cast < uint32_t >( level) , element, 0 , static_cast < uint32_t >( item) , 0 , nullptr );
53
55
#else
54
- const size_t offset = computer->GetTexelElementOffsetBytes (0 , level, x, 0 , item, 0 );
56
+ const size_t offset = computer->GetTexelElementOffsetBytes (0 , static_cast < uint32_t >( level) , x, 0 , static_cast < uint32_t >( item) , 0 );
55
57
#endif
56
58
if (offset == size_t (-1 ))
57
59
return E_FAIL;
@@ -83,7 +85,7 @@ namespace
83
85
_In_reads_ (nimages) const Image** result,
84
86
size_t nimages)
85
87
{
86
- if (!nimages)
88
+ if (!nimages || nimages > UINT32_MAX )
87
89
return E_INVALIDARG;
88
90
89
91
if (!xbox.GetPointer () || !computer || !result || !result[0 ])
@@ -150,7 +152,7 @@ namespace
150
152
return E_FAIL;
151
153
152
154
// Perform detiling
153
- for (uint32_t item = 0 ; item < nimages; ++item)
155
+ for (size_t item = 0 ; item < nimages; ++item)
154
156
{
155
157
const Image* img = result[item];
156
158
if (!img || !img->pixels )
@@ -164,9 +166,9 @@ namespace
164
166
for (size_t x = 0 ; x < img->width ; ++x)
165
167
{
166
168
#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT)
167
- size_t offset = computer->GetTexelElementOffsetBytes (0 , level, x, 0 , item, 0 , nullptr );
169
+ size_t offset = computer->GetTexelElementOffsetBytes (0 , level, x, 0 , static_cast < uint32_t >( item) , 0 , nullptr );
168
170
#else
169
- size_t offset = computer->GetTexelElementOffsetBytes (0 , level, x, 0 , item, 0 );
171
+ size_t offset = computer->GetTexelElementOffsetBytes (0 , level, x, 0 , static_cast < uint32_t >( item) , 0 );
170
172
#endif
171
173
if (offset == size_t (-1 ))
172
174
return E_FAIL;
@@ -199,7 +201,7 @@ namespace
199
201
_In_reads_ (nimages) const Image** result,
200
202
size_t nimages)
201
203
{
202
- if (!nimages)
204
+ if (!nimages || nimages > UINT32_MAX )
203
205
return E_INVALIDARG;
204
206
205
207
if (!xbox.GetPointer () || !computer || !result || !result[0 ])
@@ -210,7 +212,7 @@ namespace
210
212
uint8_t * baseAddr = xbox.GetPointer ();
211
213
const auto & metadata = xbox.GetMetadata ();
212
214
213
- for (uint32_t item = 0 ; item < nimages; ++item)
215
+ for (size_t item = 0 ; item < nimages; ++item)
214
216
{
215
217
const Image* img = result[item];
216
218
if (!img || !img->pixels )
@@ -314,6 +316,11 @@ HRESULT Xbox::Detile(
314
316
{
315
317
case TEX_DIMENSION_TEXTURE1D:
316
318
{
319
+ if (metadata.width > D3D11_REQ_TEXTURE1D_U_DIMENSION
320
+ || metadata.mipLevels > D3D11_REQ_MIP_LEVELS
321
+ || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION)
322
+ return E_INVALIDARG;
323
+
317
324
XG_TEXTURE1D_DESC desc = {};
318
325
desc.Width = static_cast <UINT>(metadata.width );
319
326
desc.MipLevels = static_cast <UINT>(metadata.mipLevels );
@@ -348,13 +355,13 @@ HRESULT Xbox::Detile(
348
355
if (FAILED (hr))
349
356
return hr;
350
357
351
- for (uint32_t level = 0 ; level < metadata.mipLevels ; ++level)
358
+ for (size_t level = 0 ; level < metadata.mipLevels ; ++level)
352
359
{
353
360
if (metadata.arraySize > 1 )
354
361
{
355
362
std::vector<const Image*> images;
356
363
images.reserve (metadata.arraySize );
357
- for (uint32_t item = 0 ; item < metadata.arraySize ; ++item)
364
+ for (size_t item = 0 ; item < metadata.arraySize ; ++item)
358
365
{
359
366
const Image* img = image.GetImage (level, item, 0 );
360
367
if (!img)
@@ -366,7 +373,7 @@ HRESULT Xbox::Detile(
366
373
images.push_back (img);
367
374
}
368
375
369
- hr = Detile1D (xbox, level, computer.Get (), layout, &images[0 ], images.size ());
376
+ hr = Detile1D (xbox, static_cast < uint32_t >( level) , computer.Get (), layout, &images[0 ], images.size ());
370
377
}
371
378
else
372
379
{
@@ -377,7 +384,7 @@ HRESULT Xbox::Detile(
377
384
return E_FAIL;
378
385
}
379
386
380
- hr = Detile1D (xbox, level, computer.Get (), layout, &img, 1 );
387
+ hr = Detile1D (xbox, static_cast < uint32_t >( level) , computer.Get (), layout, &img, 1 );
381
388
}
382
389
383
390
if (FAILED (hr))
@@ -391,6 +398,12 @@ HRESULT Xbox::Detile(
391
398
392
399
case TEX_DIMENSION_TEXTURE2D:
393
400
{
401
+ if (metadata.width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION
402
+ || metadata.height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION
403
+ || metadata.mipLevels > D3D11_REQ_MIP_LEVELS
404
+ || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION)
405
+ return E_INVALIDARG;
406
+
394
407
XG_TEXTURE2D_DESC desc = {};
395
408
desc.Width = static_cast <UINT>(metadata.width );
396
409
desc.Height = static_cast <UINT>(metadata.height );
@@ -427,13 +440,13 @@ HRESULT Xbox::Detile(
427
440
if (FAILED (hr))
428
441
return hr;
429
442
430
- for (uint32_t level = 0 ; level < metadata.mipLevels ; ++level)
443
+ for (size_t level = 0 ; level < metadata.mipLevels ; ++level)
431
444
{
432
445
if (metadata.arraySize > 1 )
433
446
{
434
447
std::vector<const Image*> images;
435
448
images.reserve (metadata.arraySize );
436
- for (uint32_t item = 0 ; item < metadata.arraySize ; ++item)
449
+ for (size_t item = 0 ; item < metadata.arraySize ; ++item)
437
450
{
438
451
const Image* img = image.GetImage (level, item, 0 );
439
452
if (!img)
@@ -445,7 +458,7 @@ HRESULT Xbox::Detile(
445
458
images.push_back (img);
446
459
}
447
460
448
- hr = Detile2D (xbox, level, computer.Get (), &images[0 ], images.size ());
461
+ hr = Detile2D (xbox, static_cast < uint32_t >( level) , computer.Get (), &images[0 ], images.size ());
449
462
}
450
463
else
451
464
{
@@ -456,7 +469,7 @@ HRESULT Xbox::Detile(
456
469
return E_FAIL;
457
470
}
458
471
459
- hr = Detile2D (xbox, level, computer.Get (), &img, 1 );
472
+ hr = Detile2D (xbox, static_cast < uint32_t >( level) , computer.Get (), &img, 1 );
460
473
}
461
474
462
475
if (FAILED (hr))
@@ -470,6 +483,13 @@ HRESULT Xbox::Detile(
470
483
471
484
case TEX_DIMENSION_TEXTURE3D:
472
485
{
486
+ if (metadata.width > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION
487
+ || metadata.height > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION
488
+ || metadata.depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION
489
+ || metadata.mipLevels > D3D11_REQ_MIP_LEVELS
490
+ || metadata.arraySize != 1 )
491
+ return E_INVALIDARG;
492
+
473
493
XG_TEXTURE3D_DESC desc = {};
474
494
desc.Width = static_cast <UINT>(metadata.width );
475
495
desc.Height = static_cast <UINT>(metadata.height );
@@ -504,10 +524,10 @@ HRESULT Xbox::Detile(
504
524
if (FAILED (hr))
505
525
return hr;
506
526
507
- uint32_t d = static_cast <uint32_t >(metadata.depth );
527
+ auto d = static_cast <uint32_t >(metadata.depth );
508
528
509
529
size_t index = 0 ;
510
- for (uint32_t level = 0 ; level < metadata.mipLevels ; ++level)
530
+ for (size_t level = 0 ; level < metadata.mipLevels ; ++level)
511
531
{
512
532
if ((index + d) > image.GetImageCount ())
513
533
{
@@ -516,7 +536,7 @@ HRESULT Xbox::Detile(
516
536
}
517
537
518
538
// Relies on the fact that slices are contiguous
519
- hr = Detile3D (xbox, level, computer.Get (), image.GetImages ()[index ]);
539
+ hr = Detile3D (xbox, static_cast < uint32_t >( level) , computer.Get (), image.GetImages ()[index ]);
520
540
if (FAILED (hr))
521
541
{
522
542
image.Release ();
0 commit comments