Skip to content

Commit 3c2d7ec

Browse files
gyxos-loganslouken
authored andcommitted
GPU D3D12 - Update to use typeless formats for depth buffer (#12701)
For a depth buffer in D3D12 that is also going to be used in a texture sampler, the creation (on an Intel HD 5500 igpu) fails. e.g. SDL_GPUTextureCreateInfo type = TEXTURE_2D, format = D32_FLOAT, usage = DEPTH_STENCIL_TARGET | SAMPLER The error messages are: D32_FLOAT D3D12 ERROR: ID3D12Device::CreateShaderResourceView: The Format (0x29, R32_FLOAT) is invalid when creating a View; the Resource was already created with a fully qualified Format, which is not castable (0x28, D32_FLOAT). D24_UNORM D3D12 ERROR: ID3D12Device::CreateShaderResourceView: For the resource format D24_UNORM_S8_UINT, when making a D3D view, the format name for the view can't be R24_UNORM_X8_TYPELESS. I found this is because the texture format needs to be created as _TYPELESS, then the views (depth stencil view, shader resource view) should then be created as their respective types - e.g. texture = R32_TYPELESS, dsv = D32_FLOAT, srv = R32_FLOAT Tested and working on: NVidia RTX 3050 (D3D12 feature set 12_2) Intel HD 5500 (D3D12 feature set 11_1) (cherry picked from commit c81b622)
1 parent 0834f1d commit 3c2d7ec

File tree

1 file changed

+117
-5
lines changed

1 file changed

+117
-5
lines changed

src/gpu/d3d12/SDL_gpu_d3d12.c

+117-5
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,115 @@ static DXGI_FORMAT SDLToD3D12_DepthFormat[] = {
475475
};
476476
SDL_COMPILE_TIME_ASSERT(SDLToD3D12_DepthFormat, SDL_arraysize(SDLToD3D12_DepthFormat) == SDL_GPU_TEXTUREFORMAT_MAX_ENUM_VALUE);
477477

478+
static DXGI_FORMAT SDLToD3D12_TypelessFormat[] = {
479+
DXGI_FORMAT_UNKNOWN, // INVALID
480+
DXGI_FORMAT_UNKNOWN, // A8_UNORM
481+
DXGI_FORMAT_UNKNOWN, // R8_UNORM
482+
DXGI_FORMAT_UNKNOWN, // R8G8_UNORM
483+
DXGI_FORMAT_UNKNOWN, // R8G8B8A8_UNORM
484+
DXGI_FORMAT_UNKNOWN, // R16_UNORM
485+
DXGI_FORMAT_UNKNOWN, // R16G16_UNORM
486+
DXGI_FORMAT_UNKNOWN, // R16G16B16A16_UNORM
487+
DXGI_FORMAT_UNKNOWN, // R10G10B10A2_UNORM
488+
DXGI_FORMAT_UNKNOWN, // B5G6R5_UNORM
489+
DXGI_FORMAT_UNKNOWN, // B5G5R5A1_UNORM
490+
DXGI_FORMAT_UNKNOWN, // B4G4R4A4_UNORM
491+
DXGI_FORMAT_UNKNOWN, // B8G8R8A8_UNORM
492+
DXGI_FORMAT_UNKNOWN, // BC1_UNORM
493+
DXGI_FORMAT_UNKNOWN, // BC2_UNORM
494+
DXGI_FORMAT_UNKNOWN, // BC3_UNORM
495+
DXGI_FORMAT_UNKNOWN, // BC4_UNORM
496+
DXGI_FORMAT_UNKNOWN, // BC5_UNORM
497+
DXGI_FORMAT_UNKNOWN, // BC7_UNORM
498+
DXGI_FORMAT_UNKNOWN, // BC6H_FLOAT
499+
DXGI_FORMAT_UNKNOWN, // BC6H_UFLOAT
500+
DXGI_FORMAT_UNKNOWN, // R8_SNORM
501+
DXGI_FORMAT_UNKNOWN, // R8G8_SNORM
502+
DXGI_FORMAT_UNKNOWN, // R8G8B8A8_SNORM
503+
DXGI_FORMAT_UNKNOWN, // R16_SNORM
504+
DXGI_FORMAT_UNKNOWN, // R16G16_SNORM
505+
DXGI_FORMAT_UNKNOWN, // R16G16B16A16_SNORM
506+
DXGI_FORMAT_UNKNOWN, // R16_FLOAT
507+
DXGI_FORMAT_UNKNOWN, // R16G16_FLOAT
508+
DXGI_FORMAT_UNKNOWN, // R16G16B16A16_FLOAT
509+
DXGI_FORMAT_UNKNOWN, // R32_FLOAT
510+
DXGI_FORMAT_UNKNOWN, // R32G32_FLOAT
511+
DXGI_FORMAT_UNKNOWN, // R32G32B32A32_FLOAT
512+
DXGI_FORMAT_UNKNOWN, // R11G11B10_UFLOAT
513+
DXGI_FORMAT_UNKNOWN, // R8_UINT
514+
DXGI_FORMAT_UNKNOWN, // R8G8_UINT
515+
DXGI_FORMAT_UNKNOWN, // R8G8B8A8_UINT
516+
DXGI_FORMAT_UNKNOWN, // R16_UINT
517+
DXGI_FORMAT_UNKNOWN, // R16G16_UINT
518+
DXGI_FORMAT_UNKNOWN, // R16G16B16A16_UINT
519+
DXGI_FORMAT_UNKNOWN, // R32_UINT
520+
DXGI_FORMAT_UNKNOWN, // R32G32_UINT
521+
DXGI_FORMAT_UNKNOWN, // R32G32B32A32_UINT
522+
DXGI_FORMAT_UNKNOWN, // R8_INT
523+
DXGI_FORMAT_UNKNOWN, // R8G8_INT
524+
DXGI_FORMAT_UNKNOWN, // R8G8B8A8_INT
525+
DXGI_FORMAT_UNKNOWN, // R16_INT
526+
DXGI_FORMAT_UNKNOWN, // R16G16_INT
527+
DXGI_FORMAT_UNKNOWN, // R16G16B16A16_INT
528+
DXGI_FORMAT_UNKNOWN, // R32_INT
529+
DXGI_FORMAT_UNKNOWN, // R32G32_INT
530+
DXGI_FORMAT_UNKNOWN, // R32G32B32A32_INT
531+
DXGI_FORMAT_UNKNOWN, // R8G8B8A8_UNORM_SRGB
532+
DXGI_FORMAT_UNKNOWN, // B8G8R8A8_UNORM_SRGB
533+
DXGI_FORMAT_UNKNOWN, // BC1_UNORM_SRGB
534+
DXGI_FORMAT_UNKNOWN, // BC2_UNORM_SRGB
535+
DXGI_FORMAT_UNKNOWN, // BC3_UNORM_SRGB
536+
DXGI_FORMAT_UNKNOWN, // BC7_UNORM_SRGB
537+
DXGI_FORMAT_R16_TYPELESS, // D16_UNORM
538+
DXGI_FORMAT_R24G8_TYPELESS, // D24_UNORM
539+
DXGI_FORMAT_R32_TYPELESS, // D32_FLOAT
540+
DXGI_FORMAT_R24G8_TYPELESS, // D24_UNORM_S8_UINT
541+
DXGI_FORMAT_R32G8X24_TYPELESS, // D32_FLOAT_S8_UINT
542+
DXGI_FORMAT_UNKNOWN, // ASTC_4x4_UNORM
543+
DXGI_FORMAT_UNKNOWN, // ASTC_5x4_UNORM
544+
DXGI_FORMAT_UNKNOWN, // ASTC_5x5_UNORM
545+
DXGI_FORMAT_UNKNOWN, // ASTC_6x5_UNORM
546+
DXGI_FORMAT_UNKNOWN, // ASTC_6x6_UNORM
547+
DXGI_FORMAT_UNKNOWN, // ASTC_8x5_UNORM
548+
DXGI_FORMAT_UNKNOWN, // ASTC_8x6_UNORM
549+
DXGI_FORMAT_UNKNOWN, // ASTC_8x8_UNORM
550+
DXGI_FORMAT_UNKNOWN, // ASTC_10x5_UNORM
551+
DXGI_FORMAT_UNKNOWN, // ASTC_10x6_UNORM
552+
DXGI_FORMAT_UNKNOWN, // ASTC_10x8_UNORM
553+
DXGI_FORMAT_UNKNOWN, // ASTC_10x10_UNORM
554+
DXGI_FORMAT_UNKNOWN, // ASTC_12x10_UNORM
555+
DXGI_FORMAT_UNKNOWN, // ASTC_12x12_UNORM
556+
DXGI_FORMAT_UNKNOWN, // ASTC_4x4_UNORM_SRGB
557+
DXGI_FORMAT_UNKNOWN, // ASTC_5x4_UNORM_SRGB
558+
DXGI_FORMAT_UNKNOWN, // ASTC_5x5_UNORM_SRGB
559+
DXGI_FORMAT_UNKNOWN, // ASTC_6x5_UNORM_SRGB
560+
DXGI_FORMAT_UNKNOWN, // ASTC_6x6_UNORM_SRGB
561+
DXGI_FORMAT_UNKNOWN, // ASTC_8x5_UNORM_SRGB
562+
DXGI_FORMAT_UNKNOWN, // ASTC_8x6_UNORM_SRGB
563+
DXGI_FORMAT_UNKNOWN, // ASTC_8x8_UNORM_SRGB
564+
DXGI_FORMAT_UNKNOWN, // ASTC_10x5_UNORM_SRGB
565+
DXGI_FORMAT_UNKNOWN, // ASTC_10x6_UNORM_SRGB
566+
DXGI_FORMAT_UNKNOWN, // ASTC_10x8_UNORM_SRGB
567+
DXGI_FORMAT_UNKNOWN, // ASTC_10x10_UNORM_SRGB
568+
DXGI_FORMAT_UNKNOWN, // ASTC_12x10_UNORM_SRGB
569+
DXGI_FORMAT_UNKNOWN, // ASTC_12x12_UNORM_SRGB
570+
DXGI_FORMAT_UNKNOWN, // ASTC_4x4_FLOAT
571+
DXGI_FORMAT_UNKNOWN, // ASTC_5x4_FLOAT
572+
DXGI_FORMAT_UNKNOWN, // ASTC_5x5_FLOAT
573+
DXGI_FORMAT_UNKNOWN, // ASTC_6x5_FLOAT
574+
DXGI_FORMAT_UNKNOWN, // ASTC_6x6_FLOAT
575+
DXGI_FORMAT_UNKNOWN, // ASTC_8x5_FLOAT
576+
DXGI_FORMAT_UNKNOWN, // ASTC_8x6_FLOAT
577+
DXGI_FORMAT_UNKNOWN, // ASTC_8x8_FLOAT
578+
DXGI_FORMAT_UNKNOWN, // ASTC_10x5_FLOAT
579+
DXGI_FORMAT_UNKNOWN, // ASTC_10x6_FLOAT
580+
DXGI_FORMAT_UNKNOWN, // ASTC_10x8_FLOAT
581+
DXGI_FORMAT_UNKNOWN, // ASTC_10x10_FLOAT
582+
DXGI_FORMAT_UNKNOWN, // ASTC_12x10_FLOAT
583+
DXGI_FORMAT_UNKNOWN, // ASTC_12x12_FLOAT
584+
};
585+
SDL_COMPILE_TIME_ASSERT(SDLToD3D12_TypelessFormat, SDL_arraysize(SDLToD3D12_TypelessFormat) == SDL_GPU_TEXTUREFORMAT_MAX_ENUM_VALUE);
586+
478587
static D3D12_COMPARISON_FUNC SDLToD3D12_CompareOp[] = {
479588
D3D12_COMPARISON_FUNC_NEVER, // INVALID
480589
D3D12_COMPARISON_FUNC_NEVER, // NEVER
@@ -3188,6 +3297,10 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
31883297
D3D12_CLEAR_VALUE clearValue;
31893298
DXGI_FORMAT format;
31903299
bool useClearValue = false;
3300+
bool needsSRV =
3301+
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_SAMPLER) ||
3302+
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ) ||
3303+
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ);
31913304
bool needsUAV =
31923305
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE) ||
31933306
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE);
@@ -3207,6 +3320,7 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
32073320
if (createinfo->usage & SDL_GPU_TEXTUREUSAGE_COLOR_TARGET) {
32083321
resourceFlags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
32093322
useClearValue = true;
3323+
clearValue.Format = format;
32103324
clearValue.Color[0] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT, 0);
32113325
clearValue.Color[1] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT, 0);
32123326
clearValue.Color[2] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT, 0);
@@ -3216,9 +3330,10 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
32163330
if (createinfo->usage & SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET) {
32173331
resourceFlags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
32183332
useClearValue = true;
3333+
clearValue.Format = SDLToD3D12_DepthFormat[createinfo->format];
32193334
clearValue.DepthStencil.Depth = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT, 0);
32203335
clearValue.DepthStencil.Stencil = (UINT8)SDL_GetNumberProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_NUMBER, 0);
3221-
format = SDLToD3D12_DepthFormat[createinfo->format];
3336+
format = needsSRV ? SDLToD3D12_TypelessFormat[createinfo->format] : SDLToD3D12_DepthFormat[createinfo->format];
32223337
}
32233338

32243339
if (needsUAV) {
@@ -3260,7 +3375,6 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
32603375
}
32613376

32623377
initialState = isSwapchainTexture ? D3D12_RESOURCE_STATE_PRESENT : D3D12_INTERNAL_DefaultTextureResourceState(createinfo->usage);
3263-
clearValue.Format = desc.Format;
32643378

32653379
res = ID3D12Device_CreateCommittedResource(
32663380
renderer->device,
@@ -3280,9 +3394,7 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
32803394
texture->resource = handle;
32813395

32823396
// Create the SRV if applicable
3283-
if ((createinfo->usage & SDL_GPU_TEXTUREUSAGE_SAMPLER) ||
3284-
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ) ||
3285-
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ)) {
3397+
if (needsSRV) {
32863398
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc;
32873399

32883400
D3D12_INTERNAL_AssignStagingDescriptorHandle(

0 commit comments

Comments
 (0)