GPU: Zero-init handling (#10786)

This commit is contained in:
Evan Hemsley
2024-09-10 18:17:08 -07:00
committed by GitHub
parent b8dbc7086d
commit 0b6f993dea
9 changed files with 310 additions and 88 deletions

View File

@@ -192,6 +192,7 @@ static DXGI_COLOR_SPACE_TYPE SwapchainCompositionToColorSpace[] = {
};
static D3D12_BLEND SDLToD3D12_BlendFactor[] = {
D3D12_BLEND_ZERO, // INVALID
D3D12_BLEND_ZERO, // ZERO
D3D12_BLEND_ONE, // ONE
D3D12_BLEND_SRC_COLOR, // SRC_COLOR
@@ -206,8 +207,10 @@ static D3D12_BLEND SDLToD3D12_BlendFactor[] = {
D3D12_BLEND_INV_BLEND_FACTOR, // ONE_MINUS_CONSTANT_COLOR
D3D12_BLEND_SRC_ALPHA_SAT, // SRC_ALPHA_SATURATE
};
SDL_COMPILE_TIME_ASSERT(SDLToD3D12_BlendFactor, SDL_arraysize(SDLToD3D12_BlendFactor) == SDL_GPU_BLENDFACTOR_MAX_ENUM_VALUE);
static D3D12_BLEND SDLToD3D12_BlendFactorAlpha[] = {
D3D12_BLEND_ZERO, // INVALID
D3D12_BLEND_ZERO, // ZERO
D3D12_BLEND_ONE, // ONE
D3D12_BLEND_SRC_ALPHA, // SRC_COLOR
@@ -222,16 +225,20 @@ static D3D12_BLEND SDLToD3D12_BlendFactorAlpha[] = {
D3D12_BLEND_INV_BLEND_FACTOR, // ONE_MINUS_CONSTANT_COLOR
D3D12_BLEND_SRC_ALPHA_SAT, // SRC_ALPHA_SATURATE
};
SDL_COMPILE_TIME_ASSERT(SDLToD3D12_BlendFactorAlpha, SDL_arraysize(SDLToD3D12_BlendFactorAlpha) == SDL_GPU_BLENDFACTOR_MAX_ENUM_VALUE);
static D3D12_BLEND_OP SDLToD3D12_BlendOp[] = {
D3D12_BLEND_OP_ADD, // INVALID
D3D12_BLEND_OP_ADD, // ADD
D3D12_BLEND_OP_SUBTRACT, // SUBTRACT
D3D12_BLEND_OP_REV_SUBTRACT, // REVERSE_SUBTRACT
D3D12_BLEND_OP_MIN, // MIN
D3D12_BLEND_OP_MAX // MAX
};
SDL_COMPILE_TIME_ASSERT(SDLToD3D12_BlendOp, SDL_arraysize(SDLToD3D12_BlendOp) == SDL_GPU_BLENDOP_MAX_ENUM_VALUE);
static DXGI_FORMAT SDLToD3D12_TextureFormat[] = {
DXGI_FORMAT_UNKNOWN, // INVALID
DXGI_FORMAT_A8_UNORM, // A8_UNORM
DXGI_FORMAT_R8_UNORM, // R8_UNORM
DXGI_FORMAT_R8G8_UNORM, // R8G8_UNORM
@@ -289,9 +296,10 @@ static DXGI_FORMAT SDLToD3D12_TextureFormat[] = {
DXGI_FORMAT_D24_UNORM_S8_UINT, // D24_UNORM_S8_UINT
DXGI_FORMAT_D32_FLOAT_S8X24_UINT, // D32_FLOAT_S8_UINT
};
SDL_COMPILE_TIME_ASSERT(SDLToD3D12_TextureFormat, SDL_arraysize(SDLToD3D12_TextureFormat) == SDL_GPU_TEXTUREFORMAT_MAX);
SDL_COMPILE_TIME_ASSERT(SDLToD3D12_TextureFormat, SDL_arraysize(SDLToD3D12_TextureFormat) == SDL_GPU_TEXTUREFORMAT_MAX_ENUM_VALUE);
static D3D12_COMPARISON_FUNC SDLToD3D12_CompareOp[] = {
D3D12_COMPARISON_FUNC_NEVER, // INVALID
D3D12_COMPARISON_FUNC_NEVER, // NEVER
D3D12_COMPARISON_FUNC_LESS, // LESS
D3D12_COMPARISON_FUNC_EQUAL, // EQUAL
@@ -301,8 +309,10 @@ static D3D12_COMPARISON_FUNC SDLToD3D12_CompareOp[] = {
D3D12_COMPARISON_FUNC_GREATER_EQUAL, // GREATER_OR_EQUAL
D3D12_COMPARISON_FUNC_ALWAYS // ALWAYS
};
SDL_COMPILE_TIME_ASSERT(SDLToD3D12_CompareOp, SDL_arraysize(SDLToD3D12_CompareOp) == SDL_GPU_COMPAREOP_MAX_ENUM_VALUE);
static D3D12_STENCIL_OP SDLToD3D12_StencilOp[] = {
D3D12_STENCIL_OP_KEEP, // INVALID
D3D12_STENCIL_OP_KEEP, // KEEP
D3D12_STENCIL_OP_ZERO, // ZERO
D3D12_STENCIL_OP_REPLACE, // REPLACE
@@ -312,6 +322,7 @@ static D3D12_STENCIL_OP SDLToD3D12_StencilOp[] = {
D3D12_STENCIL_OP_INCR, // INCREMENT_AND_WRAP
D3D12_STENCIL_OP_DECR // DECREMENT_AND_WRAP
};
SDL_COMPILE_TIME_ASSERT(SDLToD3D12_StencilOp, SDL_arraysize(SDLToD3D12_StencilOp) == SDL_GPU_STENCILOP_MAX_ENUM_VALUE);
static D3D12_CULL_MODE SDLToD3D12_CullMode[] = {
D3D12_CULL_MODE_NONE, // NONE
@@ -330,6 +341,7 @@ static D3D12_INPUT_CLASSIFICATION SDLToD3D12_InputRate[] = {
};
static DXGI_FORMAT SDLToD3D12_VertexFormat[] = {
DXGI_FORMAT_UNKNOWN, // UNKNOWN
DXGI_FORMAT_R32_SINT, // INT
DXGI_FORMAT_R32G32_SINT, // INT2
DXGI_FORMAT_R32G32B32_SINT, // INT3
@@ -361,6 +373,7 @@ static DXGI_FORMAT SDLToD3D12_VertexFormat[] = {
DXGI_FORMAT_R16G16_FLOAT, // HALF2
DXGI_FORMAT_R16G16B16A16_FLOAT // HALF4
};
SDL_COMPILE_TIME_ASSERT(SDLToD3D12_VertexFormat, SDL_arraysize(SDLToD3D12_VertexFormat) == SDL_GPU_VERTEXELEMENTFORMAT_MAX_ENUM_VALUE);
static Uint32 SDLToD3D12_SampleCount[] = {
1, // SDL_GPU_SAMPLECOUNT_1
@@ -370,11 +383,11 @@ static Uint32 SDLToD3D12_SampleCount[] = {
};
static D3D12_PRIMITIVE_TOPOLOGY SDLToD3D12_PrimitiveType[] = {
D3D_PRIMITIVE_TOPOLOGY_POINTLIST, // POINTLIST
D3D_PRIMITIVE_TOPOLOGY_LINELIST, // LINELIST
D3D_PRIMITIVE_TOPOLOGY_LINESTRIP, // LINESTRIP
D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST, // TRIANGLELIST
D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP // TRIANGLESTRIP
D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST, // TRIANGLELIST
D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP, // TRIANGLESTRIP
D3D_PRIMITIVE_TOPOLOGY_LINELIST, // LINELIST
D3D_PRIMITIVE_TOPOLOGY_LINESTRIP, // LINESTRIP
D3D_PRIMITIVE_TOPOLOGY_POINTLIST // POINTLIST
};
static D3D12_TEXTURE_ADDRESS_MODE SDLToD3D12_SamplerAddressMode[] = {
@@ -2409,8 +2422,10 @@ static bool D3D12_INTERNAL_ConvertBlendState(
// If target_info has more blend states, you can set IndependentBlendEnable to TRUE and assign different blend states to each render target slot
if (i < pipelineInfo->target_info.num_color_targets) {
SDL_GPUColorTargetBlendState sdlBlendState = pipelineInfo->target_info.color_target_descriptions[i].blend_state;
SDL_GPUColorComponentFlags colorWriteMask = sdlBlendState.enable_color_write_mask ?
sdlBlendState.color_write_mask :
0xF;
rtBlendDesc.BlendEnable = sdlBlendState.enable_blend;
rtBlendDesc.SrcBlend = SDLToD3D12_BlendFactor[sdlBlendState.src_color_blendfactor];
@@ -2419,7 +2434,7 @@ static bool D3D12_INTERNAL_ConvertBlendState(
rtBlendDesc.SrcBlendAlpha = SDLToD3D12_BlendFactorAlpha[sdlBlendState.src_alpha_blendfactor];
rtBlendDesc.DestBlendAlpha = SDLToD3D12_BlendFactorAlpha[sdlBlendState.dst_alpha_blendfactor];
rtBlendDesc.BlendOpAlpha = SDLToD3D12_BlendOp[sdlBlendState.alpha_blend_op];
rtBlendDesc.RenderTargetWriteMask = sdlBlendState.color_write_mask;
rtBlendDesc.RenderTargetWriteMask = colorWriteMask;
if (i > 0) {
blendDesc->IndependentBlendEnable = TRUE;
@@ -2550,7 +2565,11 @@ static SDL_GPUGraphicsPipeline *D3D12_CreateGraphicsPipeline(
return NULL;
}
psoDesc.SampleMask = UINT_MAX;
Uint32 sampleMask = createinfo->multisample_state.enable_mask ?
createinfo->multisample_state.sample_mask :
0xFFFFFFFF;
psoDesc.SampleMask = sampleMask;
psoDesc.SampleDesc.Count = SDLToD3D12_SampleCount[createinfo->multisample_state.sample_count];
psoDesc.SampleDesc.Quality = 0;