mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-10-16 14:56:00 +00:00
GPU: Zero-init handling (#10786)
This commit is contained in:
@@ -79,20 +79,50 @@
|
||||
return; \
|
||||
}
|
||||
|
||||
#define CHECK_TEXTUREFORMAT_ENUM_INVALID(format, retval) \
|
||||
if (format >= SDL_GPU_TEXTUREFORMAT_MAX) { \
|
||||
#define CHECK_TEXTUREFORMAT_ENUM_INVALID(enumval, retval) \
|
||||
if (enumval <= SDL_GPU_TEXTUREFORMAT_INVALID || enumval >= SDL_GPU_TEXTUREFORMAT_MAX_ENUM_VALUE) { \
|
||||
SDL_assert_release(!"Invalid texture format enum!"); \
|
||||
return retval; \
|
||||
}
|
||||
|
||||
#define CHECK_VERTEXELEMENTFORMAT_ENUM_INVALID(enumval, retval) \
|
||||
if (enumval <= SDL_GPU_VERTEXELEMENTFORMAT_INVALID || enumval >= SDL_GPU_VERTEXELEMENTFORMAT_MAX_ENUM_VALUE) { \
|
||||
SDL_assert_release(!"Invalid vertex format enum!"); \
|
||||
return retval; \
|
||||
}
|
||||
|
||||
#define CHECK_COMPAREOP_ENUM_INVALID(enumval, retval) \
|
||||
if (enumval <= SDL_GPU_COMPAREOP_INVALID || enumval >= SDL_GPU_COMPAREOP_MAX_ENUM_VALUE) { \
|
||||
SDL_assert_release(!"Invalid compare op enum!"); \
|
||||
return retval; \
|
||||
}
|
||||
|
||||
#define CHECK_STENCILOP_ENUM_INVALID(enumval, retval) \
|
||||
if (enumval <= SDL_GPU_STENCILOP_INVALID || enumval >= SDL_GPU_STENCILOP_MAX_ENUM_VALUE) { \
|
||||
SDL_assert_release(!"Invalid stencil op enum!"); \
|
||||
return retval; \
|
||||
}
|
||||
|
||||
#define CHECK_BLENDOP_ENUM_INVALID(enumval, retval) \
|
||||
if (enumval <= SDL_GPU_BLENDOP_INVALID || enumval >= SDL_GPU_BLENDOP_MAX_ENUM_VALUE) { \
|
||||
SDL_assert_release(!"Invalid blend op enum!"); \
|
||||
return retval; \
|
||||
}
|
||||
|
||||
#define CHECK_BLENDFACTOR_ENUM_INVALID(enumval, retval) \
|
||||
if (enumval <= SDL_GPU_BLENDFACTOR_INVALID || enumval >= SDL_GPU_BLENDFACTOR_MAX_ENUM_VALUE) { \
|
||||
SDL_assert_release(!"Invalid blend factor enum!"); \
|
||||
return retval; \
|
||||
}
|
||||
|
||||
#define CHECK_SWAPCHAINCOMPOSITION_ENUM_INVALID(enumval, retval) \
|
||||
if (enumval >= SDL_GPU_SWAPCHAINCOMPOSITION_MAX) { \
|
||||
if (enumval < 0 || enumval >= SDL_GPU_SWAPCHAINCOMPOSITION_MAX_ENUM_VALUE) { \
|
||||
SDL_assert_release(!"Invalid swapchain composition enum!"); \
|
||||
return retval; \
|
||||
}
|
||||
|
||||
#define CHECK_PRESENTMODE_ENUM_INVALID(enumval, retval) \
|
||||
if (enumval >= SDL_GPU_PRESENTMODE_MAX) { \
|
||||
if (enumval < 0 || enumval >= SDL_GPU_PRESENTMODE_MAX_ENUM_VALUE) { \
|
||||
SDL_assert_release(!"Invalid present mode enum!"); \
|
||||
return retval; \
|
||||
}
|
||||
@@ -190,7 +220,7 @@ SDL_GPUGraphicsPipeline *SDL_GPU_FetchBlitPipeline(
|
||||
}
|
||||
|
||||
blit_pipeline_create_info.multisample_state.sample_count = SDL_GPU_SAMPLECOUNT_1;
|
||||
blit_pipeline_create_info.multisample_state.sample_mask = 0xFFFFFFFF;
|
||||
blit_pipeline_create_info.multisample_state.enable_mask = SDL_FALSE;
|
||||
|
||||
blit_pipeline_create_info.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST;
|
||||
|
||||
@@ -590,11 +620,14 @@ SDL_GPUComputePipeline *SDL_CreateGPUComputePipeline(
|
||||
}
|
||||
|
||||
if (device->debug_mode) {
|
||||
if (createinfo->format == SDL_GPU_SHADERFORMAT_INVALID) {
|
||||
SDL_assert_release(!"Shader format cannot be INVALID!");
|
||||
return NULL;
|
||||
}
|
||||
if (!(createinfo->format & device->shader_formats)) {
|
||||
SDL_assert_release(!"Incompatible shader format for GPU backend");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (createinfo->num_writeonly_storage_textures > MAX_COMPUTE_WRITE_TEXTURES) {
|
||||
SDL_assert_release(!"Compute pipeline write-only texture count cannot be higher than 8!");
|
||||
return NULL;
|
||||
@@ -627,12 +660,25 @@ SDL_GPUGraphicsPipeline *SDL_CreateGPUGraphicsPipeline(
|
||||
}
|
||||
|
||||
if (device->debug_mode) {
|
||||
if (graphicsPipelineCreateInfo->target_info.num_color_targets > 0 && graphicsPipelineCreateInfo->target_info.color_target_descriptions == NULL) {
|
||||
SDL_assert_release(!"Color target descriptions array pointer cannot be NULL if num_color_targets is greater than zero!");
|
||||
return NULL;
|
||||
}
|
||||
for (Uint32 i = 0; i < graphicsPipelineCreateInfo->target_info.num_color_targets; i += 1) {
|
||||
CHECK_TEXTUREFORMAT_ENUM_INVALID(graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].format, NULL);
|
||||
if (IsDepthFormat(graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].format)) {
|
||||
SDL_assert_release(!"Color target formats cannot be a depth format!");
|
||||
return NULL;
|
||||
}
|
||||
if (graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].blend_state.enable_blend) {
|
||||
const SDL_GPUColorTargetBlendState *blend_state = &graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].blend_state;
|
||||
CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->src_color_blendfactor, NULL)
|
||||
CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->dst_color_blendfactor, NULL)
|
||||
CHECK_BLENDOP_ENUM_INVALID(blend_state->color_blend_op, NULL)
|
||||
CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->src_alpha_blendfactor, NULL)
|
||||
CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->dst_alpha_blendfactor, NULL)
|
||||
CHECK_BLENDOP_ENUM_INVALID(blend_state->alpha_blend_op, NULL)
|
||||
}
|
||||
}
|
||||
if (graphicsPipelineCreateInfo->target_info.has_depth_stencil_target) {
|
||||
CHECK_TEXTUREFORMAT_ENUM_INVALID(graphicsPipelineCreateInfo->target_info.depth_stencil_format, NULL);
|
||||
@@ -641,6 +687,27 @@ SDL_GPUGraphicsPipeline *SDL_CreateGPUGraphicsPipeline(
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if (graphicsPipelineCreateInfo->vertex_input_state.num_vertex_bindings > 0 && graphicsPipelineCreateInfo->vertex_input_state.vertex_bindings == NULL) {
|
||||
SDL_assert_release(!"Vertex bindings array pointer cannot be NULL!");
|
||||
return NULL;
|
||||
}
|
||||
if (graphicsPipelineCreateInfo->vertex_input_state.num_vertex_attributes > 0 && graphicsPipelineCreateInfo->vertex_input_state.vertex_attributes == NULL) {
|
||||
SDL_assert_release(!"Vertex attributes array pointer cannot be NULL!");
|
||||
return NULL;
|
||||
}
|
||||
for (Uint32 i = 0; i < graphicsPipelineCreateInfo->vertex_input_state.num_vertex_attributes; i += 1) {
|
||||
CHECK_VERTEXELEMENTFORMAT_ENUM_INVALID(graphicsPipelineCreateInfo->vertex_input_state.vertex_attributes[i].format, NULL);
|
||||
}
|
||||
if (graphicsPipelineCreateInfo->depth_stencil_state.enable_depth_test) {
|
||||
CHECK_COMPAREOP_ENUM_INVALID(graphicsPipelineCreateInfo->depth_stencil_state.compare_op, NULL)
|
||||
}
|
||||
if (graphicsPipelineCreateInfo->depth_stencil_state.enable_stencil_test) {
|
||||
const SDL_GPUStencilOpState *stencil_state = &graphicsPipelineCreateInfo->depth_stencil_state.back_stencil_state;
|
||||
CHECK_COMPAREOP_ENUM_INVALID(stencil_state->compare_op, NULL)
|
||||
CHECK_STENCILOP_ENUM_INVALID(stencil_state->fail_op, NULL)
|
||||
CHECK_STENCILOP_ENUM_INVALID(stencil_state->pass_op, NULL)
|
||||
CHECK_STENCILOP_ENUM_INVALID(stencil_state->depth_fail_op, NULL)
|
||||
}
|
||||
}
|
||||
|
||||
return device->CreateGraphicsPipeline(
|
||||
@@ -674,6 +741,10 @@ SDL_GPUShader *SDL_CreateGPUShader(
|
||||
}
|
||||
|
||||
if (device->debug_mode) {
|
||||
if (createinfo->format == SDL_GPU_SHADERFORMAT_INVALID) {
|
||||
SDL_assert_release(!"Shader format cannot be INVALID!");
|
||||
return NULL;
|
||||
}
|
||||
if (!(createinfo->format & device->shader_formats)) {
|
||||
SDL_assert_release(!"Incompatible shader format for GPU backend");
|
||||
return NULL;
|
||||
@@ -1909,6 +1980,14 @@ void SDL_UploadToGPUTexture(
|
||||
|
||||
if (COPYPASS_DEVICE->debug_mode) {
|
||||
CHECK_COPYPASS
|
||||
if (source->transfer_buffer == NULL) {
|
||||
SDL_assert_release(!"Source transfer buffer cannot be NULL!");
|
||||
return;
|
||||
}
|
||||
if (destination->texture == NULL) {
|
||||
SDL_assert_release(!"Destination texture cannot be NULL!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
COPYPASS_DEVICE->UploadToTexture(
|
||||
@@ -1937,6 +2016,18 @@ void SDL_UploadToGPUBuffer(
|
||||
return;
|
||||
}
|
||||
|
||||
if (COPYPASS_DEVICE->debug_mode) {
|
||||
CHECK_COPYPASS
|
||||
if (source->transfer_buffer == NULL) {
|
||||
SDL_assert_release(!"Source transfer buffer cannot be NULL!");
|
||||
return;
|
||||
}
|
||||
if (destination->buffer == NULL) {
|
||||
SDL_assert_release(!"Destination buffer cannot be NULL!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
COPYPASS_DEVICE->UploadToBuffer(
|
||||
COPYPASS_COMMAND_BUFFER,
|
||||
source,
|
||||
@@ -1966,6 +2057,18 @@ void SDL_CopyGPUTextureToTexture(
|
||||
return;
|
||||
}
|
||||
|
||||
if (COPYPASS_DEVICE->debug_mode) {
|
||||
CHECK_COPYPASS
|
||||
if (source->texture == NULL) {
|
||||
SDL_assert_release(!"Source texture cannot be NULL!");
|
||||
return;
|
||||
}
|
||||
if (destination->texture == NULL) {
|
||||
SDL_assert_release(!"Destination texture cannot be NULL!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
COPYPASS_DEVICE->CopyTextureToTexture(
|
||||
COPYPASS_COMMAND_BUFFER,
|
||||
source,
|
||||
@@ -1996,6 +2099,18 @@ void SDL_CopyGPUBufferToBuffer(
|
||||
return;
|
||||
}
|
||||
|
||||
if (COPYPASS_DEVICE->debug_mode) {
|
||||
CHECK_COPYPASS
|
||||
if (source->buffer == NULL) {
|
||||
SDL_assert_release(!"Source buffer cannot be NULL!");
|
||||
return;
|
||||
}
|
||||
if (destination->buffer == NULL) {
|
||||
SDL_assert_release(!"Destination buffer cannot be NULL!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
COPYPASS_DEVICE->CopyBufferToBuffer(
|
||||
COPYPASS_COMMAND_BUFFER,
|
||||
source,
|
||||
@@ -2022,6 +2137,18 @@ void SDL_DownloadFromGPUTexture(
|
||||
return;
|
||||
}
|
||||
|
||||
if (COPYPASS_DEVICE->debug_mode) {
|
||||
CHECK_COPYPASS
|
||||
if (source->texture == NULL) {
|
||||
SDL_assert_release(!"Source texture cannot be NULL!");
|
||||
return;
|
||||
}
|
||||
if (destination->transfer_buffer == NULL) {
|
||||
SDL_assert_release(!"Destination transfer buffer cannot be NULL!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
COPYPASS_DEVICE->DownloadFromTexture(
|
||||
COPYPASS_COMMAND_BUFFER,
|
||||
source,
|
||||
@@ -2046,6 +2173,18 @@ void SDL_DownloadFromGPUBuffer(
|
||||
return;
|
||||
}
|
||||
|
||||
if (COPYPASS_DEVICE->debug_mode) {
|
||||
CHECK_COPYPASS
|
||||
if (source->buffer == NULL) {
|
||||
SDL_assert_release(!"Source buffer cannot be NULL!");
|
||||
return;
|
||||
}
|
||||
if (destination->transfer_buffer == NULL) {
|
||||
SDL_assert_release(!"Destination transfer buffer cannot be NULL!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
COPYPASS_DEVICE->DownloadFromBuffer(
|
||||
COPYPASS_COMMAND_BUFFER,
|
||||
source,
|
||||
|
@@ -69,9 +69,14 @@ typedef struct BlitPipelineCacheEntry
|
||||
|
||||
// Internal Helper Utilities
|
||||
|
||||
#define SDL_GPU_TEXTUREFORMAT_MAX (SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT + 1)
|
||||
#define SDL_GPU_SWAPCHAINCOMPOSITION_MAX (SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2048 + 1)
|
||||
#define SDL_GPU_PRESENTMODE_MAX (SDL_GPU_PRESENTMODE_MAILBOX + 1)
|
||||
#define SDL_GPU_TEXTUREFORMAT_MAX_ENUM_VALUE (SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT + 1)
|
||||
#define SDL_GPU_VERTEXELEMENTFORMAT_MAX_ENUM_VALUE (SDL_GPU_VERTEXELEMENTFORMAT_HALF4 + 1)
|
||||
#define SDL_GPU_COMPAREOP_MAX_ENUM_VALUE (SDL_GPU_COMPAREOP_ALWAYS + 1)
|
||||
#define SDL_GPU_STENCILOP_MAX_ENUM_VALUE (SDL_GPU_STENCILOP_DECREMENT_AND_WRAP + 1)
|
||||
#define SDL_GPU_BLENDOP_MAX_ENUM_VALUE (SDL_GPU_BLENDOP_MAX + 1)
|
||||
#define SDL_GPU_BLENDFACTOR_MAX_ENUM_VALUE (SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE + 1)
|
||||
#define SDL_GPU_SWAPCHAINCOMPOSITION_MAX_ENUM_VALUE (SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2048 + 1)
|
||||
#define SDL_GPU_PRESENTMODE_MAX_ENUM_VALUE (SDL_GPU_PRESENTMODE_MAILBOX + 1)
|
||||
|
||||
static inline Sint32 Texture_GetBlockSize(
|
||||
SDL_GPUTextureFormat format)
|
||||
|
@@ -168,6 +168,7 @@ static DXGI_COLOR_SPACE_TYPE SwapchainCompositionToColorSpace[] = {
|
||||
};
|
||||
|
||||
static DXGI_FORMAT SDLToD3D11_TextureFormat[] = {
|
||||
DXGI_FORMAT_UNKNOWN, // INVALID
|
||||
DXGI_FORMAT_A8_UNORM, // A8_UNORM
|
||||
DXGI_FORMAT_R8_UNORM, // R8_UNORM
|
||||
DXGI_FORMAT_R8G8_UNORM, // R8G8_UNORM
|
||||
@@ -225,9 +226,10 @@ static DXGI_FORMAT SDLToD3D11_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(SDLToD3D11_TextureFormat, SDL_arraysize(SDLToD3D11_TextureFormat) == SDL_GPU_TEXTUREFORMAT_MAX);
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToD3D11_TextureFormat, SDL_arraysize(SDLToD3D11_TextureFormat) == SDL_GPU_TEXTUREFORMAT_MAX_ENUM_VALUE);
|
||||
|
||||
static DXGI_FORMAT SDLToD3D11_VertexFormat[] = {
|
||||
DXGI_FORMAT_UNKNOWN, // INVALID
|
||||
DXGI_FORMAT_R32_SINT, // INT
|
||||
DXGI_FORMAT_R32G32_SINT, // INT2
|
||||
DXGI_FORMAT_R32G32B32_SINT, // INT3
|
||||
@@ -259,6 +261,7 @@ static DXGI_FORMAT SDLToD3D11_VertexFormat[] = {
|
||||
DXGI_FORMAT_R16G16_FLOAT, // HALF2
|
||||
DXGI_FORMAT_R16G16B16A16_FLOAT // HALF4
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToD3D11_VertexFormat, SDL_arraysize(SDLToD3D11_VertexFormat) == SDL_GPU_VERTEXELEMENTFORMAT_MAX_ENUM_VALUE);
|
||||
|
||||
static Uint32 SDLToD3D11_SampleCount[] = {
|
||||
1, // SDL_GPU_SAMPLECOUNT_1
|
||||
@@ -273,11 +276,11 @@ static DXGI_FORMAT SDLToD3D11_IndexType[] = {
|
||||
};
|
||||
|
||||
static D3D11_PRIMITIVE_TOPOLOGY SDLToD3D11_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 D3D11_CULL_MODE SDLToD3D11_CullMode[] = {
|
||||
@@ -287,6 +290,7 @@ static D3D11_CULL_MODE SDLToD3D11_CullMode[] = {
|
||||
};
|
||||
|
||||
static D3D11_BLEND SDLToD3D11_BlendFactor[] = {
|
||||
D3D11_BLEND_ZERO, // INVALID
|
||||
D3D11_BLEND_ZERO, // ZERO
|
||||
D3D11_BLEND_ONE, // ONE
|
||||
D3D11_BLEND_SRC_COLOR, // SRC_COLOR
|
||||
@@ -301,8 +305,10 @@ static D3D11_BLEND SDLToD3D11_BlendFactor[] = {
|
||||
D3D11_BLEND_INV_BLEND_FACTOR, // ONE_MINUS_CONSTANT_COLOR
|
||||
D3D11_BLEND_SRC_ALPHA_SAT, // SRC_ALPHA_SATURATE
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToD3D11_BlendFactor, SDL_arraysize(SDLToD3D11_BlendFactor) == SDL_GPU_BLENDFACTOR_MAX_ENUM_VALUE);
|
||||
|
||||
static D3D11_BLEND SDLToD3D11_BlendFactorAlpha[] = {
|
||||
D3D11_BLEND_ZERO, // ALPHA
|
||||
D3D11_BLEND_ZERO, // ZERO
|
||||
D3D11_BLEND_ONE, // ONE
|
||||
D3D11_BLEND_SRC_ALPHA, // SRC_COLOR
|
||||
@@ -317,16 +323,20 @@ static D3D11_BLEND SDLToD3D11_BlendFactorAlpha[] = {
|
||||
D3D11_BLEND_INV_BLEND_FACTOR, // ONE_MINUS_CONSTANT_COLOR
|
||||
D3D11_BLEND_SRC_ALPHA_SAT, // SRC_ALPHA_SATURATE
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToD3D11_BlendFactorAlpha, SDL_arraysize(SDLToD3D11_BlendFactorAlpha) == SDL_GPU_BLENDFACTOR_MAX_ENUM_VALUE);
|
||||
|
||||
static D3D11_BLEND_OP SDLToD3D11_BlendOp[] = {
|
||||
D3D11_BLEND_OP_ADD, // INVALID
|
||||
D3D11_BLEND_OP_ADD, // ADD
|
||||
D3D11_BLEND_OP_SUBTRACT, // SUBTRACT
|
||||
D3D11_BLEND_OP_REV_SUBTRACT, // REVERSE_SUBTRACT
|
||||
D3D11_BLEND_OP_MIN, // MIN
|
||||
D3D11_BLEND_OP_MAX // MAX
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToD3D11_BlendOp, SDL_arraysize(SDLToD3D11_BlendOp) == SDL_GPU_BLENDOP_MAX_ENUM_VALUE);
|
||||
|
||||
static D3D11_COMPARISON_FUNC SDLToD3D11_CompareOp[] = {
|
||||
D3D11_COMPARISON_NEVER, // INVALID
|
||||
D3D11_COMPARISON_NEVER, // NEVER
|
||||
D3D11_COMPARISON_LESS, // LESS
|
||||
D3D11_COMPARISON_EQUAL, // EQUAL
|
||||
@@ -336,8 +346,10 @@ static D3D11_COMPARISON_FUNC SDLToD3D11_CompareOp[] = {
|
||||
D3D11_COMPARISON_GREATER_EQUAL, // GREATER_OR_EQUAL
|
||||
D3D11_COMPARISON_ALWAYS // ALWAYS
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToD3D11_CompareOp, SDL_arraysize(SDLToD3D11_CompareOp) == SDL_GPU_COMPAREOP_MAX_ENUM_VALUE);
|
||||
|
||||
static D3D11_STENCIL_OP SDLToD3D11_StencilOp[] = {
|
||||
D3D11_STENCIL_OP_KEEP, // INVALID
|
||||
D3D11_STENCIL_OP_KEEP, // KEEP
|
||||
D3D11_STENCIL_OP_ZERO, // ZERO
|
||||
D3D11_STENCIL_OP_REPLACE, // REPLACE
|
||||
@@ -347,6 +359,7 @@ static D3D11_STENCIL_OP SDLToD3D11_StencilOp[] = {
|
||||
D3D11_STENCIL_OP_INCR, // INCREMENT_AND_WRAP
|
||||
D3D11_STENCIL_OP_DECR // DECREMENT_AND_WRAP
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToD3D11_StencilOp, SDL_arraysize(SDLToD3D11_StencilOp) == SDL_GPU_STENCILOP_MAX_ENUM_VALUE);
|
||||
|
||||
static D3D11_INPUT_CLASSIFICATION SDLToD3D11_VertexInputRate[] = {
|
||||
D3D11_INPUT_PER_VERTEX_DATA, // VERTEX
|
||||
@@ -1264,12 +1277,16 @@ static ID3D11BlendState *D3D11_INTERNAL_FetchBlendState(
|
||||
blendDesc.IndependentBlendEnable = TRUE;
|
||||
|
||||
for (Uint32 i = 0; i < numColorTargets; i += 1) {
|
||||
SDL_GPUColorComponentFlags colorWriteMask = colorTargets[i].blend_state.enable_color_write_mask ?
|
||||
colorTargets[i].blend_state.color_write_mask :
|
||||
0xF;
|
||||
|
||||
blendDesc.RenderTarget[i].BlendEnable = colorTargets[i].blend_state.enable_blend;
|
||||
blendDesc.RenderTarget[i].BlendOp = SDLToD3D11_BlendOp[colorTargets[i].blend_state.color_blend_op];
|
||||
blendDesc.RenderTarget[i].BlendOpAlpha = SDLToD3D11_BlendOp[colorTargets[i].blend_state.alpha_blend_op];
|
||||
blendDesc.RenderTarget[i].DestBlend = SDLToD3D11_BlendFactor[colorTargets[i].blend_state.dst_color_blendfactor];
|
||||
blendDesc.RenderTarget[i].DestBlendAlpha = SDLToD3D11_BlendFactorAlpha[colorTargets[i].blend_state.dst_alpha_blendfactor];
|
||||
blendDesc.RenderTarget[i].RenderTargetWriteMask = colorTargets[i].blend_state.color_write_mask;
|
||||
blendDesc.RenderTarget[i].RenderTargetWriteMask = colorWriteMask;
|
||||
blendDesc.RenderTarget[i].SrcBlend = SDLToD3D11_BlendFactor[colorTargets[i].blend_state.src_color_blendfactor];
|
||||
blendDesc.RenderTarget[i].SrcBlendAlpha = SDLToD3D11_BlendFactorAlpha[colorTargets[i].blend_state.src_alpha_blendfactor];
|
||||
}
|
||||
@@ -3427,7 +3444,9 @@ static void D3D11_SetBlendConstants(
|
||||
{
|
||||
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer *)commandBuffer;
|
||||
FLOAT blendFactor[4] = { blendConstants.r, blendConstants.g, blendConstants.b, blendConstants.a };
|
||||
|
||||
Uint32 sample_mask = d3d11CommandBuffer->graphicsPipeline->multisampleState.enable_mask ?
|
||||
d3d11CommandBuffer->graphicsPipeline->multisampleState.sample_mask :
|
||||
0xFFFFFFFF;
|
||||
d3d11CommandBuffer->blendConstants = blendConstants;
|
||||
|
||||
if (d3d11CommandBuffer->graphicsPipeline != NULL) {
|
||||
@@ -3435,7 +3454,7 @@ static void D3D11_SetBlendConstants(
|
||||
d3d11CommandBuffer->context,
|
||||
d3d11CommandBuffer->graphicsPipeline->colorTargetBlendState,
|
||||
blendFactor,
|
||||
d3d11CommandBuffer->graphicsPipeline->multisampleState.sample_mask);
|
||||
sample_mask);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3643,14 +3662,16 @@ static void D3D11_BindGraphicsPipeline(
|
||||
d3d11CommandBuffer->blendConstants.b,
|
||||
d3d11CommandBuffer->blendConstants.a
|
||||
};
|
||||
|
||||
Uint32 sample_mask = pipeline->multisampleState.enable_mask ?
|
||||
pipeline->multisampleState.sample_mask :
|
||||
0xFFFFFFFF;
|
||||
d3d11CommandBuffer->graphicsPipeline = pipeline;
|
||||
|
||||
ID3D11DeviceContext_OMSetBlendState(
|
||||
d3d11CommandBuffer->context,
|
||||
pipeline->colorTargetBlendState,
|
||||
blendFactor,
|
||||
pipeline->multisampleState.sample_mask);
|
||||
sample_mask);
|
||||
|
||||
ID3D11DeviceContext_OMSetDepthStencilState(
|
||||
d3d11CommandBuffer->context,
|
||||
@@ -5825,7 +5846,7 @@ static void D3D11_INTERNAL_InitBlitPipelines(
|
||||
blitPipelineCreateInfo.fragment_shader = blitFrom2DPixelShader;
|
||||
|
||||
blitPipelineCreateInfo.multisample_state.sample_count = SDL_GPU_SAMPLECOUNT_1;
|
||||
blitPipelineCreateInfo.multisample_state.sample_mask = 0xFFFFFFFF;
|
||||
blitPipelineCreateInfo.multisample_state.enable_mask = SDL_FALSE;
|
||||
|
||||
blitPipelineCreateInfo.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST;
|
||||
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -68,6 +68,7 @@ static void METAL_INTERNAL_DestroyBlitResources(SDL_GPURenderer *driverData);
|
||||
// Conversions
|
||||
|
||||
static MTLPixelFormat SDLToMetal_SurfaceFormat[] = {
|
||||
MTLPixelFormatInvalid, // INVALID
|
||||
MTLPixelFormatA8Unorm, // A8_UNORM
|
||||
MTLPixelFormatR8Unorm, // R8_UNORM
|
||||
MTLPixelFormatRG8Unorm, // R8G8_UNORM
|
||||
@@ -151,9 +152,10 @@ static MTLPixelFormat SDLToMetal_SurfaceFormat[] = {
|
||||
#endif
|
||||
MTLPixelFormatDepth32Float_Stencil8, // D32_FLOAT_S8_UINT
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToMetal_SurfaceFormat, SDL_arraysize(SDLToMetal_SurfaceFormat) == SDL_GPU_TEXTUREFORMAT_MAX);
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToMetal_SurfaceFormat, SDL_arraysize(SDLToMetal_SurfaceFormat) == SDL_GPU_TEXTUREFORMAT_MAX_ENUM_VALUE);
|
||||
|
||||
static MTLVertexFormat SDLToMetal_VertexFormat[] = {
|
||||
MTLVertexFormatInvalid, // INVALID
|
||||
MTLVertexFormatInt, // INT
|
||||
MTLVertexFormatInt2, // INT2
|
||||
MTLVertexFormatInt3, // INT3
|
||||
@@ -185,6 +187,7 @@ static MTLVertexFormat SDLToMetal_VertexFormat[] = {
|
||||
MTLVertexFormatHalf2, // HALF2
|
||||
MTLVertexFormatHalf4 // HALF4
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToMetal_VertexFormat, SDL_arraysize(SDLToMetal_VertexFormat) == SDL_GPU_VERTEXELEMENTFORMAT_MAX_ENUM_VALUE);
|
||||
|
||||
static MTLIndexType SDLToMetal_IndexType[] = {
|
||||
MTLIndexTypeUInt16, // 16BIT
|
||||
@@ -192,11 +195,11 @@ static MTLIndexType SDLToMetal_IndexType[] = {
|
||||
};
|
||||
|
||||
static MTLPrimitiveType SDLToMetal_PrimitiveType[] = {
|
||||
MTLPrimitiveTypePoint, // POINTLIST
|
||||
MTLPrimitiveTypeLine, // LINELIST
|
||||
MTLPrimitiveTypeLineStrip, // LINESTRIP
|
||||
MTLPrimitiveTypeTriangle, // TRIANGLELIST
|
||||
MTLPrimitiveTypeTriangleStrip // TRIANGLESTRIP
|
||||
MTLPrimitiveTypeTriangle, // TRIANGLELIST
|
||||
MTLPrimitiveTypeTriangleStrip, // TRIANGLESTRIP
|
||||
MTLPrimitiveTypeLine, // LINELIST
|
||||
MTLPrimitiveTypeLineStrip, // LINESTRIP
|
||||
MTLPrimitiveTypePoint // POINTLIST
|
||||
};
|
||||
|
||||
static MTLTriangleFillMode SDLToMetal_PolygonMode[] = {
|
||||
@@ -216,6 +219,7 @@ static MTLWinding SDLToMetal_FrontFace[] = {
|
||||
};
|
||||
|
||||
static MTLBlendFactor SDLToMetal_BlendFactor[] = {
|
||||
MTLBlendFactorZero, // INVALID
|
||||
MTLBlendFactorZero, // ZERO
|
||||
MTLBlendFactorOne, // ONE
|
||||
MTLBlendFactorSourceColor, // SRC_COLOR
|
||||
@@ -230,16 +234,20 @@ static MTLBlendFactor SDLToMetal_BlendFactor[] = {
|
||||
MTLBlendFactorOneMinusBlendColor, // ONE_MINUS_CONSTANT_COLOR
|
||||
MTLBlendFactorSourceAlphaSaturated, // SRC_ALPHA_SATURATE
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToMetal_BlendFactor, SDL_arraysize(SDLToMetal_BlendFactor) == SDL_GPU_BLENDFACTOR_MAX_ENUM_VALUE);
|
||||
|
||||
static MTLBlendOperation SDLToMetal_BlendOp[] = {
|
||||
MTLBlendOperationAdd, // INVALID
|
||||
MTLBlendOperationAdd, // ADD
|
||||
MTLBlendOperationSubtract, // SUBTRACT
|
||||
MTLBlendOperationReverseSubtract, // REVERSE_SUBTRACT
|
||||
MTLBlendOperationMin, // MIN
|
||||
MTLBlendOperationMax, // MAX
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToMetal_BlendOp, SDL_arraysize(SDLToMetal_BlendOp) == SDL_GPU_BLENDOP_MAX_ENUM_VALUE);
|
||||
|
||||
static MTLCompareFunction SDLToMetal_CompareOp[] = {
|
||||
MTLCompareFunctionNever, // INVALID
|
||||
MTLCompareFunctionNever, // NEVER
|
||||
MTLCompareFunctionLess, // LESS
|
||||
MTLCompareFunctionEqual, // EQUAL
|
||||
@@ -249,8 +257,10 @@ static MTLCompareFunction SDLToMetal_CompareOp[] = {
|
||||
MTLCompareFunctionGreaterEqual, // GREATER_OR_EQUAL
|
||||
MTLCompareFunctionAlways, // ALWAYS
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToMetal_CompareOp, SDL_arraysize(SDLToMetal_CompareOp) == SDL_GPU_COMPAREOP_MAX_ENUM_VALUE);
|
||||
|
||||
static MTLStencilOperation SDLToMetal_StencilOp[] = {
|
||||
MTLStencilOperationKeep, // INVALID
|
||||
MTLStencilOperationKeep, // KEEP
|
||||
MTLStencilOperationZero, // ZERO
|
||||
MTLStencilOperationReplace, // REPLACE
|
||||
@@ -260,6 +270,7 @@ static MTLStencilOperation SDLToMetal_StencilOp[] = {
|
||||
MTLStencilOperationIncrementWrap, // INCREMENT_AND_WRAP
|
||||
MTLStencilOperationDecrementWrap, // DECREMENT_AND_WRAP
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToMetal_StencilOp, SDL_arraysize(SDLToMetal_StencilOp) == SDL_GPU_STENCILOP_MAX_ENUM_VALUE);
|
||||
|
||||
static MTLSamplerAddressMode SDLToMetal_SamplerAddressMode[] = {
|
||||
MTLSamplerAddressModeRepeat, // REPEAT
|
||||
@@ -1012,9 +1023,12 @@ static SDL_GPUGraphicsPipeline *METAL_CreateGraphicsPipeline(
|
||||
|
||||
for (Uint32 i = 0; i < createinfo->target_info.num_color_targets; i += 1) {
|
||||
blendState = &createinfo->target_info.color_target_descriptions[i].blend_state;
|
||||
SDL_GPUColorComponentFlags colorWriteMask = blendState->enable_color_write_mask ?
|
||||
blendState->color_write_mask :
|
||||
0xF;
|
||||
|
||||
pipelineDescriptor.colorAttachments[i].pixelFormat = SDLToMetal_SurfaceFormat[createinfo->target_info.color_target_descriptions[i].format];
|
||||
pipelineDescriptor.colorAttachments[i].writeMask = SDLToMetal_ColorWriteMask(blendState->color_write_mask);
|
||||
pipelineDescriptor.colorAttachments[i].writeMask = SDLToMetal_ColorWriteMask(colorWriteMask);
|
||||
pipelineDescriptor.colorAttachments[i].blendingEnabled = blendState->enable_blend;
|
||||
pipelineDescriptor.colorAttachments[i].rgbBlendOperation = SDLToMetal_BlendOp[blendState->color_blend_op];
|
||||
pipelineDescriptor.colorAttachments[i].alphaBlendOperation = SDLToMetal_BlendOp[blendState->alpha_blend_op];
|
||||
@@ -1099,9 +1113,13 @@ static SDL_GPUGraphicsPipeline *METAL_CreateGraphicsPipeline(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Uint32 sampleMask = createinfo->multisample_state.enable_mask ?
|
||||
createinfo->multisample_state.sample_mask :
|
||||
0xFFFFFFFF;
|
||||
|
||||
result = SDL_calloc(1, sizeof(MetalGraphicsPipeline));
|
||||
result->handle = pipelineState;
|
||||
result->sample_mask = createinfo->multisample_state.sample_mask;
|
||||
result->sample_mask = sampleMask;
|
||||
result->depth_stencil_state = depthStencilState;
|
||||
result->rasterizerState = createinfo->rasterizer_state;
|
||||
result->primitiveType = createinfo->primitive_type;
|
||||
|
@@ -136,6 +136,7 @@ static VkPresentModeKHR SDLToVK_PresentMode[] = {
|
||||
};
|
||||
|
||||
static VkFormat SDLToVK_SurfaceFormat[] = {
|
||||
VK_FORMAT_UNDEFINED, // INVALID
|
||||
VK_FORMAT_R8_UNORM, // A8_UNORM
|
||||
VK_FORMAT_R8_UNORM, // R8_UNORM
|
||||
VK_FORMAT_R8G8_UNORM, // R8G8_UNORM
|
||||
@@ -193,9 +194,10 @@ static VkFormat SDLToVK_SurfaceFormat[] = {
|
||||
VK_FORMAT_D24_UNORM_S8_UINT, // D24_UNORM_S8_UINT
|
||||
VK_FORMAT_D32_SFLOAT_S8_UINT, // D32_FLOAT_S8_UINT
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToVK_SurfaceFormat, SDL_arraysize(SDLToVK_SurfaceFormat) == SDL_GPU_TEXTUREFORMAT_MAX);
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToVK_SurfaceFormat, SDL_arraysize(SDLToVK_SurfaceFormat) == SDL_GPU_TEXTUREFORMAT_MAX_ENUM_VALUE);
|
||||
|
||||
static VkComponentMapping SDLToVK_SurfaceSwizzle[] = {
|
||||
IDENTITY_SWIZZLE,
|
||||
{
|
||||
// A8
|
||||
VK_COMPONENT_SWIZZLE_ZERO,
|
||||
@@ -283,6 +285,7 @@ static VkComponentMapping SDLToVK_SurfaceSwizzle[] = {
|
||||
IDENTITY_SWIZZLE, // D24_UNORM_S8_UINT
|
||||
IDENTITY_SWIZZLE, // D32_SFLOAT_S8_UINT
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToVK_SurfaceSwizzle, SDL_arraysize(SDLToVK_SurfaceSwizzle) == SDL_GPU_TEXTUREFORMAT_MAX_ENUM_VALUE);
|
||||
|
||||
static VkFormat SwapchainCompositionToFormat[] = {
|
||||
VK_FORMAT_B8G8R8A8_UNORM, // SDR
|
||||
@@ -337,6 +340,7 @@ static VkComponentMapping SwapchainCompositionSwizzle[] = {
|
||||
};
|
||||
|
||||
static VkFormat SDLToVK_VertexFormat[] = {
|
||||
VK_FORMAT_UNDEFINED, // INVALID
|
||||
VK_FORMAT_R32_SINT, // INT
|
||||
VK_FORMAT_R32G32_SINT, // INT2
|
||||
VK_FORMAT_R32G32B32_SINT, // INT3
|
||||
@@ -368,6 +372,7 @@ static VkFormat SDLToVK_VertexFormat[] = {
|
||||
VK_FORMAT_R16G16_SFLOAT, // HALF2
|
||||
VK_FORMAT_R16G16B16A16_SFLOAT // HALF4
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToVK_VertexFormat, SDL_arraysize(SDLToVK_VertexFormat) == SDL_GPU_VERTEXELEMENTFORMAT_MAX_ENUM_VALUE);
|
||||
|
||||
static VkIndexType SDLToVK_IndexType[] = {
|
||||
VK_INDEX_TYPE_UINT16,
|
||||
@@ -375,11 +380,11 @@ static VkIndexType SDLToVK_IndexType[] = {
|
||||
};
|
||||
|
||||
static VkPrimitiveTopology SDLToVK_PrimitiveType[] = {
|
||||
VK_PRIMITIVE_TOPOLOGY_POINT_LIST,
|
||||
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
|
||||
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
|
||||
VK_PRIMITIVE_TOPOLOGY_LINE_LIST,
|
||||
VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,
|
||||
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
|
||||
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
|
||||
VK_PRIMITIVE_TOPOLOGY_POINT_LIST
|
||||
};
|
||||
|
||||
static VkCullModeFlags SDLToVK_CullMode[] = {
|
||||
@@ -395,6 +400,7 @@ static VkFrontFace SDLToVK_FrontFace[] = {
|
||||
};
|
||||
|
||||
static VkBlendFactor SDLToVK_BlendFactor[] = {
|
||||
VK_BLEND_FACTOR_ZERO, // INVALID
|
||||
VK_BLEND_FACTOR_ZERO,
|
||||
VK_BLEND_FACTOR_ONE,
|
||||
VK_BLEND_FACTOR_SRC_COLOR,
|
||||
@@ -407,20 +413,22 @@ static VkBlendFactor SDLToVK_BlendFactor[] = {
|
||||
VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA,
|
||||
VK_BLEND_FACTOR_CONSTANT_COLOR,
|
||||
VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR,
|
||||
VK_BLEND_FACTOR_CONSTANT_ALPHA,
|
||||
VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA,
|
||||
VK_BLEND_FACTOR_SRC_ALPHA_SATURATE
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToVK_BlendFactor, SDL_arraysize(SDLToVK_BlendFactor) == SDL_GPU_BLENDFACTOR_MAX_ENUM_VALUE);
|
||||
|
||||
static VkBlendOp SDLToVK_BlendOp[] = {
|
||||
VK_BLEND_OP_ADD, // INVALID
|
||||
VK_BLEND_OP_ADD,
|
||||
VK_BLEND_OP_SUBTRACT,
|
||||
VK_BLEND_OP_REVERSE_SUBTRACT,
|
||||
VK_BLEND_OP_MIN,
|
||||
VK_BLEND_OP_MAX
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToVK_BlendOp, SDL_arraysize(SDLToVK_BlendOp) == SDL_GPU_BLENDOP_MAX_ENUM_VALUE);
|
||||
|
||||
static VkCompareOp SDLToVK_CompareOp[] = {
|
||||
VK_COMPARE_OP_NEVER, // INVALID
|
||||
VK_COMPARE_OP_NEVER,
|
||||
VK_COMPARE_OP_LESS,
|
||||
VK_COMPARE_OP_EQUAL,
|
||||
@@ -430,8 +438,10 @@ static VkCompareOp SDLToVK_CompareOp[] = {
|
||||
VK_COMPARE_OP_GREATER_OR_EQUAL,
|
||||
VK_COMPARE_OP_ALWAYS
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToVK_CompareOp, SDL_arraysize(SDLToVK_CompareOp) == SDL_GPU_COMPAREOP_MAX_ENUM_VALUE);
|
||||
|
||||
static VkStencilOp SDLToVK_StencilOp[] = {
|
||||
VK_STENCIL_OP_KEEP, // INVALID
|
||||
VK_STENCIL_OP_KEEP,
|
||||
VK_STENCIL_OP_ZERO,
|
||||
VK_STENCIL_OP_REPLACE,
|
||||
@@ -441,6 +451,7 @@ static VkStencilOp SDLToVK_StencilOp[] = {
|
||||
VK_STENCIL_OP_INCREMENT_AND_WRAP,
|
||||
VK_STENCIL_OP_DECREMENT_AND_WRAP
|
||||
};
|
||||
SDL_COMPILE_TIME_ASSERT(SDLToVK_StencilOp, SDL_arraysize(SDLToVK_StencilOp) == SDL_GPU_STENCILOP_MAX_ENUM_VALUE);
|
||||
|
||||
static VkAttachmentLoadOp SDLToVK_LoadOp[] = {
|
||||
VK_ATTACHMENT_LOAD_OP_LOAD,
|
||||
@@ -6573,6 +6584,10 @@ static SDL_GPUGraphicsPipeline *VULKAN_CreateGraphicsPipeline(
|
||||
|
||||
// Multisample
|
||||
|
||||
Uint32 sampleMask = createinfo->multisample_state.enable_mask ?
|
||||
createinfo->multisample_state.sample_mask :
|
||||
0xFFFFFFFF;
|
||||
|
||||
multisampleStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
|
||||
multisampleStateCreateInfo.pNext = NULL;
|
||||
multisampleStateCreateInfo.flags = 0;
|
||||
@@ -6580,7 +6595,7 @@ static SDL_GPUGraphicsPipeline *VULKAN_CreateGraphicsPipeline(
|
||||
multisampleStateCreateInfo.sampleShadingEnable = VK_FALSE;
|
||||
multisampleStateCreateInfo.minSampleShading = 1.0f;
|
||||
multisampleStateCreateInfo.pSampleMask =
|
||||
&createinfo->multisample_state.sample_mask;
|
||||
&sampleMask;
|
||||
multisampleStateCreateInfo.alphaToCoverageEnable = VK_FALSE;
|
||||
multisampleStateCreateInfo.alphaToOneEnable = VK_FALSE;
|
||||
|
||||
@@ -6626,6 +6641,9 @@ static SDL_GPUGraphicsPipeline *VULKAN_CreateGraphicsPipeline(
|
||||
|
||||
for (i = 0; i < createinfo->target_info.num_color_targets; i += 1) {
|
||||
SDL_GPUColorTargetBlendState blendState = createinfo->target_info.color_target_descriptions[i].blend_state;
|
||||
SDL_GPUColorComponentFlags colorWriteMask = blendState.enable_color_write_mask ?
|
||||
blendState.color_write_mask :
|
||||
0xF;
|
||||
|
||||
colorBlendAttachmentStates[i].blendEnable =
|
||||
blendState.enable_blend;
|
||||
@@ -6636,7 +6654,7 @@ static SDL_GPUGraphicsPipeline *VULKAN_CreateGraphicsPipeline(
|
||||
colorBlendAttachmentStates[i].dstAlphaBlendFactor = SDLToVK_BlendFactor[blendState.dst_alpha_blendfactor];
|
||||
colorBlendAttachmentStates[i].alphaBlendOp = SDLToVK_BlendOp[blendState.alpha_blend_op];
|
||||
colorBlendAttachmentStates[i].colorWriteMask =
|
||||
blendState.color_write_mask;
|
||||
colorWriteMask;
|
||||
}
|
||||
|
||||
colorBlendStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
|
||||
|
@@ -119,7 +119,7 @@ static SDL_GPUGraphicsPipeline *MakePipeline(SDL_GPUDevice *device, GPU_Shaders
|
||||
pci.vertex_shader = GPU_GetVertexShader(shaders, params->vert_shader);
|
||||
pci.fragment_shader = GPU_GetFragmentShader(shaders, params->frag_shader);
|
||||
pci.multisample_state.sample_count = SDL_GPU_SAMPLECOUNT_1;
|
||||
pci.multisample_state.sample_mask = 0xFFFF;
|
||||
pci.multisample_state.enable_mask = SDL_FALSE;
|
||||
pci.primitive_type = params->primitive_type;
|
||||
|
||||
pci.rasterizer_state.cull_mode = SDL_GPU_CULLMODE_NONE;
|
||||
|
Reference in New Issue
Block a user