Skip to content

Commit c81b622

Browse files
authored
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)
1 parent 27b2560 commit c81b622

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
@@ -463,6 +463,115 @@ static DXGI_FORMAT SDLToD3D12_DepthFormat[] = {
463463
};
464464
SDL_COMPILE_TIME_ASSERT(SDLToD3D12_DepthFormat, SDL_arraysize(SDLToD3D12_DepthFormat) == SDL_GPU_TEXTUREFORMAT_MAX_ENUM_VALUE);
465465

466+
static DXGI_FORMAT SDLToD3D12_TypelessFormat[] = {
467+
DXGI_FORMAT_UNKNOWN, // INVALID
468+
DXGI_FORMAT_UNKNOWN, // A8_UNORM
469+
DXGI_FORMAT_UNKNOWN, // R8_UNORM
470+
DXGI_FORMAT_UNKNOWN, // R8G8_UNORM
471+
DXGI_FORMAT_UNKNOWN, // R8G8B8A8_UNORM
472+
DXGI_FORMAT_UNKNOWN, // R16_UNORM
473+
DXGI_FORMAT_UNKNOWN, // R16G16_UNORM
474+
DXGI_FORMAT_UNKNOWN, // R16G16B16A16_UNORM
475+
DXGI_FORMAT_UNKNOWN, // R10G10B10A2_UNORM
476+
DXGI_FORMAT_UNKNOWN, // B5G6R5_UNORM
477+
DXGI_FORMAT_UNKNOWN, // B5G5R5A1_UNORM
478+
DXGI_FORMAT_UNKNOWN, // B4G4R4A4_UNORM
479+
DXGI_FORMAT_UNKNOWN, // B8G8R8A8_UNORM
480+
DXGI_FORMAT_UNKNOWN, // BC1_UNORM
481+
DXGI_FORMAT_UNKNOWN, // BC2_UNORM
482+
DXGI_FORMAT_UNKNOWN, // BC3_UNORM
483+
DXGI_FORMAT_UNKNOWN, // BC4_UNORM
484+
DXGI_FORMAT_UNKNOWN, // BC5_UNORM
485+
DXGI_FORMAT_UNKNOWN, // BC7_UNORM
486+
DXGI_FORMAT_UNKNOWN, // BC6H_FLOAT
487+
DXGI_FORMAT_UNKNOWN, // BC6H_UFLOAT
488+
DXGI_FORMAT_UNKNOWN, // R8_SNORM
489+
DXGI_FORMAT_UNKNOWN, // R8G8_SNORM
490+
DXGI_FORMAT_UNKNOWN, // R8G8B8A8_SNORM
491+
DXGI_FORMAT_UNKNOWN, // R16_SNORM
492+
DXGI_FORMAT_UNKNOWN, // R16G16_SNORM
493+
DXGI_FORMAT_UNKNOWN, // R16G16B16A16_SNORM
494+
DXGI_FORMAT_UNKNOWN, // R16_FLOAT
495+
DXGI_FORMAT_UNKNOWN, // R16G16_FLOAT
496+
DXGI_FORMAT_UNKNOWN, // R16G16B16A16_FLOAT
497+
DXGI_FORMAT_UNKNOWN, // R32_FLOAT
498+
DXGI_FORMAT_UNKNOWN, // R32G32_FLOAT
499+
DXGI_FORMAT_UNKNOWN, // R32G32B32A32_FLOAT
500+
DXGI_FORMAT_UNKNOWN, // R11G11B10_UFLOAT
501+
DXGI_FORMAT_UNKNOWN, // R8_UINT
502+
DXGI_FORMAT_UNKNOWN, // R8G8_UINT
503+
DXGI_FORMAT_UNKNOWN, // R8G8B8A8_UINT
504+
DXGI_FORMAT_UNKNOWN, // R16_UINT
505+
DXGI_FORMAT_UNKNOWN, // R16G16_UINT
506+
DXGI_FORMAT_UNKNOWN, // R16G16B16A16_UINT
507+
DXGI_FORMAT_UNKNOWN, // R32_UINT
508+
DXGI_FORMAT_UNKNOWN, // R32G32_UINT
509+
DXGI_FORMAT_UNKNOWN, // R32G32B32A32_UINT
510+
DXGI_FORMAT_UNKNOWN, // R8_INT
511+
DXGI_FORMAT_UNKNOWN, // R8G8_INT
512+
DXGI_FORMAT_UNKNOWN, // R8G8B8A8_INT
513+
DXGI_FORMAT_UNKNOWN, // R16_INT
514+
DXGI_FORMAT_UNKNOWN, // R16G16_INT
515+
DXGI_FORMAT_UNKNOWN, // R16G16B16A16_INT
516+
DXGI_FORMAT_UNKNOWN, // R32_INT
517+
DXGI_FORMAT_UNKNOWN, // R32G32_INT
518+
DXGI_FORMAT_UNKNOWN, // R32G32B32A32_INT
519+
DXGI_FORMAT_UNKNOWN, // R8G8B8A8_UNORM_SRGB
520+
DXGI_FORMAT_UNKNOWN, // B8G8R8A8_UNORM_SRGB
521+
DXGI_FORMAT_UNKNOWN, // BC1_UNORM_SRGB
522+
DXGI_FORMAT_UNKNOWN, // BC2_UNORM_SRGB
523+
DXGI_FORMAT_UNKNOWN, // BC3_UNORM_SRGB
524+
DXGI_FORMAT_UNKNOWN, // BC7_UNORM_SRGB
525+
DXGI_FORMAT_R16_TYPELESS, // D16_UNORM
526+
DXGI_FORMAT_R24G8_TYPELESS, // D24_UNORM
527+
DXGI_FORMAT_R32_TYPELESS, // D32_FLOAT
528+
DXGI_FORMAT_R24G8_TYPELESS, // D24_UNORM_S8_UINT
529+
DXGI_FORMAT_R32G8X24_TYPELESS, // D32_FLOAT_S8_UINT
530+
DXGI_FORMAT_UNKNOWN, // ASTC_4x4_UNORM
531+
DXGI_FORMAT_UNKNOWN, // ASTC_5x4_UNORM
532+
DXGI_FORMAT_UNKNOWN, // ASTC_5x5_UNORM
533+
DXGI_FORMAT_UNKNOWN, // ASTC_6x5_UNORM
534+
DXGI_FORMAT_UNKNOWN, // ASTC_6x6_UNORM
535+
DXGI_FORMAT_UNKNOWN, // ASTC_8x5_UNORM
536+
DXGI_FORMAT_UNKNOWN, // ASTC_8x6_UNORM
537+
DXGI_FORMAT_UNKNOWN, // ASTC_8x8_UNORM
538+
DXGI_FORMAT_UNKNOWN, // ASTC_10x5_UNORM
539+
DXGI_FORMAT_UNKNOWN, // ASTC_10x6_UNORM
540+
DXGI_FORMAT_UNKNOWN, // ASTC_10x8_UNORM
541+
DXGI_FORMAT_UNKNOWN, // ASTC_10x10_UNORM
542+
DXGI_FORMAT_UNKNOWN, // ASTC_12x10_UNORM
543+
DXGI_FORMAT_UNKNOWN, // ASTC_12x12_UNORM
544+
DXGI_FORMAT_UNKNOWN, // ASTC_4x4_UNORM_SRGB
545+
DXGI_FORMAT_UNKNOWN, // ASTC_5x4_UNORM_SRGB
546+
DXGI_FORMAT_UNKNOWN, // ASTC_5x5_UNORM_SRGB
547+
DXGI_FORMAT_UNKNOWN, // ASTC_6x5_UNORM_SRGB
548+
DXGI_FORMAT_UNKNOWN, // ASTC_6x6_UNORM_SRGB
549+
DXGI_FORMAT_UNKNOWN, // ASTC_8x5_UNORM_SRGB
550+
DXGI_FORMAT_UNKNOWN, // ASTC_8x6_UNORM_SRGB
551+
DXGI_FORMAT_UNKNOWN, // ASTC_8x8_UNORM_SRGB
552+
DXGI_FORMAT_UNKNOWN, // ASTC_10x5_UNORM_SRGB
553+
DXGI_FORMAT_UNKNOWN, // ASTC_10x6_UNORM_SRGB
554+
DXGI_FORMAT_UNKNOWN, // ASTC_10x8_UNORM_SRGB
555+
DXGI_FORMAT_UNKNOWN, // ASTC_10x10_UNORM_SRGB
556+
DXGI_FORMAT_UNKNOWN, // ASTC_12x10_UNORM_SRGB
557+
DXGI_FORMAT_UNKNOWN, // ASTC_12x12_UNORM_SRGB
558+
DXGI_FORMAT_UNKNOWN, // ASTC_4x4_FLOAT
559+
DXGI_FORMAT_UNKNOWN, // ASTC_5x4_FLOAT
560+
DXGI_FORMAT_UNKNOWN, // ASTC_5x5_FLOAT
561+
DXGI_FORMAT_UNKNOWN, // ASTC_6x5_FLOAT
562+
DXGI_FORMAT_UNKNOWN, // ASTC_6x6_FLOAT
563+
DXGI_FORMAT_UNKNOWN, // ASTC_8x5_FLOAT
564+
DXGI_FORMAT_UNKNOWN, // ASTC_8x6_FLOAT
565+
DXGI_FORMAT_UNKNOWN, // ASTC_8x8_FLOAT
566+
DXGI_FORMAT_UNKNOWN, // ASTC_10x5_FLOAT
567+
DXGI_FORMAT_UNKNOWN, // ASTC_10x6_FLOAT
568+
DXGI_FORMAT_UNKNOWN, // ASTC_10x8_FLOAT
569+
DXGI_FORMAT_UNKNOWN, // ASTC_10x10_FLOAT
570+
DXGI_FORMAT_UNKNOWN, // ASTC_12x10_FLOAT
571+
DXGI_FORMAT_UNKNOWN, // ASTC_12x12_FLOAT
572+
};
573+
SDL_COMPILE_TIME_ASSERT(SDLToD3D12_TypelessFormat, SDL_arraysize(SDLToD3D12_TypelessFormat) == SDL_GPU_TEXTUREFORMAT_MAX_ENUM_VALUE);
574+
466575
static D3D12_COMPARISON_FUNC SDLToD3D12_CompareOp[] = {
467576
D3D12_COMPARISON_FUNC_NEVER, // INVALID
468577
D3D12_COMPARISON_FUNC_NEVER, // NEVER
@@ -3184,6 +3293,10 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
31843293
D3D12_CLEAR_VALUE clearValue;
31853294
DXGI_FORMAT format;
31863295
bool useClearValue = false;
3296+
bool needsSRV =
3297+
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_SAMPLER) ||
3298+
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ) ||
3299+
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ);
31873300
bool needsUAV =
31883301
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE) ||
31893302
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE);
@@ -3203,6 +3316,7 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
32033316
if (createinfo->usage & SDL_GPU_TEXTUREUSAGE_COLOR_TARGET) {
32043317
resourceFlags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
32053318
useClearValue = true;
3319+
clearValue.Format = format;
32063320
clearValue.Color[0] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT, 0);
32073321
clearValue.Color[1] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT, 0);
32083322
clearValue.Color[2] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT, 0);
@@ -3212,9 +3326,10 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
32123326
if (createinfo->usage & SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET) {
32133327
resourceFlags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
32143328
useClearValue = true;
3329+
clearValue.Format = SDLToD3D12_DepthFormat[createinfo->format];
32153330
clearValue.DepthStencil.Depth = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT, 0);
32163331
clearValue.DepthStencil.Stencil = (UINT8)SDL_GetNumberProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_NUMBER, 0);
3217-
format = SDLToD3D12_DepthFormat[createinfo->format];
3332+
format = needsSRV ? SDLToD3D12_TypelessFormat[createinfo->format] : SDLToD3D12_DepthFormat[createinfo->format];
32183333
}
32193334

32203335
if (needsUAV) {
@@ -3256,7 +3371,6 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
32563371
}
32573372

32583373
initialState = isSwapchainTexture ? D3D12_RESOURCE_STATE_PRESENT : D3D12_INTERNAL_DefaultTextureResourceState(createinfo->usage);
3259-
clearValue.Format = desc.Format;
32603374

32613375
res = ID3D12Device_CreateCommittedResource(
32623376
renderer->device,
@@ -3276,9 +3390,7 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
32763390
texture->resource = handle;
32773391

32783392
// Create the SRV if applicable
3279-
if ((createinfo->usage & SDL_GPU_TEXTUREUSAGE_SAMPLER) ||
3280-
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ) ||
3281-
(createinfo->usage & SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ)) {
3393+
if (needsSRV) {
32823394
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc;
32833395

32843396
D3D12_INTERNAL_AssignStagingDescriptorHandle(

0 commit comments

Comments
 (0)