From 97d1056e16d44f67df3b19e1fac8378399ae5f3d Mon Sep 17 00:00:00 2001
From: Caleb Cornett <[EMAIL REDACTED]>
Date: Sat, 21 Sep 2024 17:38:10 -0500
Subject: [PATCH] GPU: MSAA fixes (#10917)
---
src/gpu/SDL_gpu.c | 7 ++++++
src/gpu/d3d11/SDL_gpu_d3d11.c | 36 ++++++++++++-------------------
src/gpu/d3d12/SDL_gpu_d3d12.c | 40 ++++++++++++++---------------------
src/gpu/metal/SDL_gpu_metal.m | 30 +++++++++++++++++---------
4 files changed, 57 insertions(+), 56 deletions(-)
diff --git a/src/gpu/SDL_gpu.c b/src/gpu/SDL_gpu.c
index 1a1b1223f540d..abc7f8ec31ce9 100644
--- a/src/gpu/SDL_gpu.c
+++ b/src/gpu/SDL_gpu.c
@@ -959,6 +959,10 @@ SDL_GPUTexture *SDL_CreateGPUTexture(
SDL_assert_release(!"For array textures: usage must not contain DEPTH_STENCIL_TARGET");
failed = true;
}
+ if (createinfo->sample_count > SDL_GPU_SAMPLECOUNT_1) {
+ SDL_assert_release(!"For array textures: sample_count must be SDL_GPU_SAMPLECOUNT_1");
+ failed = true;
+ }
}
if (createinfo->sample_count > SDL_GPU_SAMPLECOUNT_1 && createinfo->num_levels > 1) {
SDL_assert_release(!"For 2D multisample textures: num_levels must be 1");
@@ -1378,6 +1382,9 @@ SDL_GPURenderPass *SDL_BeginGPURenderPass(
if (resolveTextureHeader->info.type == SDL_GPU_TEXTURETYPE_3D) {
SDL_assert_release(!"Resolve texture must not be of TEXTURETYPE_3D!");
}
+ if (!(resolveTextureHeader->info.usage & SDL_GPU_TEXTUREUSAGE_COLOR_TARGET)) {
+ SDL_assert_release(!"Resolve texture usage must include COLOR_TARGET!");
+ }
}
}
}
diff --git a/src/gpu/d3d11/SDL_gpu_d3d11.c b/src/gpu/d3d11/SDL_gpu_d3d11.c
index 25be9a19cf48f..ccd55d6bb51e9 100644
--- a/src/gpu/d3d11/SDL_gpu_d3d11.c
+++ b/src/gpu/d3d11/SDL_gpu_d3d11.c
@@ -2081,29 +2081,21 @@ static D3D11Texture *D3D11_INTERNAL_CreateTexture(
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = SDLToD3D11_TextureFormat[createInfo->format];
- if (isMultisample) {
- if (createInfo->type == SDL_GPU_TEXTURETYPE_2D) {
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS;
- } else if (createInfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY) {
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY;
- rtvDesc.Texture2DMSArray.FirstArraySlice = layerIndex;
- rtvDesc.Texture2DMSArray.ArraySize = 1;
- }
+ if (createInfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY || createInfo->type == SDL_GPU_TEXTURETYPE_CUBE || createInfo->type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
+ rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
+ rtvDesc.Texture2DArray.MipSlice = levelIndex;
+ rtvDesc.Texture2DArray.FirstArraySlice = layerIndex;
+ rtvDesc.Texture2DArray.ArraySize = 1;
+ } else if (createInfo->type == SDL_GPU_TEXTURETYPE_3D) {
+ rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
+ rtvDesc.Texture3D.MipSlice = levelIndex;
+ rtvDesc.Texture3D.FirstWSlice = depthIndex;
+ rtvDesc.Texture3D.WSize = 1;
+ } else if (isMultisample) {
+ rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS;
} else {
- if (createInfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY || createInfo->type == SDL_GPU_TEXTURETYPE_CUBE || createInfo->type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
- rtvDesc.Texture2DArray.MipSlice = levelIndex;
- rtvDesc.Texture2DArray.FirstArraySlice = layerIndex;
- rtvDesc.Texture2DArray.ArraySize = 1;
- } else if (createInfo->type == SDL_GPU_TEXTURETYPE_3D) {
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
- rtvDesc.Texture3D.MipSlice = levelIndex;
- rtvDesc.Texture3D.FirstWSlice = depthIndex;
- rtvDesc.Texture3D.WSize = 1;
- } else {
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
- rtvDesc.Texture2D.MipSlice = levelIndex;
- }
+ rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
+ rtvDesc.Texture2D.MipSlice = levelIndex;
}
res = ID3D11Device_CreateRenderTargetView(
diff --git a/src/gpu/d3d12/SDL_gpu_d3d12.c b/src/gpu/d3d12/SDL_gpu_d3d12.c
index 10693c8f20f67..902930149ff71 100644
--- a/src/gpu/d3d12/SDL_gpu_d3d12.c
+++ b/src/gpu/d3d12/SDL_gpu_d3d12.c
@@ -2957,31 +2957,23 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
rtvDesc.Format = SDLToD3D12_TextureFormat[createinfo->format];
- if (isMultisample) {
- if (createinfo->type == SDL_GPU_TEXTURETYPE_2D) {
- rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DMS;
- } else if (createinfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY) {
- rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DMSARRAY;
- rtvDesc.Texture2DMSArray.FirstArraySlice = layerIndex;
- rtvDesc.Texture2DMSArray.ArraySize = 1;
- }
+ if (createinfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY || createinfo->type == SDL_GPU_TEXTURETYPE_CUBE || createinfo->type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
+ rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY;
+ rtvDesc.Texture2DArray.MipSlice = levelIndex;
+ rtvDesc.Texture2DArray.FirstArraySlice = layerIndex;
+ rtvDesc.Texture2DArray.ArraySize = 1;
+ rtvDesc.Texture2DArray.PlaneSlice = 0;
+ } else if (createinfo->type == SDL_GPU_TEXTURETYPE_3D) {
+ rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE3D;
+ rtvDesc.Texture3D.MipSlice = levelIndex;
+ rtvDesc.Texture3D.FirstWSlice = depthIndex;
+ rtvDesc.Texture3D.WSize = 1;
+ } else if (isMultisample) {
+ rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DMS;
} else {
- if (createinfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY || createinfo->type == SDL_GPU_TEXTURETYPE_CUBE || createinfo->type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
- rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY;
- rtvDesc.Texture2DArray.MipSlice = levelIndex;
- rtvDesc.Texture2DArray.FirstArraySlice = layerIndex;
- rtvDesc.Texture2DArray.ArraySize = 1;
- rtvDesc.Texture2DArray.PlaneSlice = 0;
- } else if (createinfo->type == SDL_GPU_TEXTURETYPE_3D) {
- rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE3D;
- rtvDesc.Texture3D.MipSlice = levelIndex;
- rtvDesc.Texture3D.FirstWSlice = depthIndex;
- rtvDesc.Texture3D.WSize = 1;
- } else {
- rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;
- rtvDesc.Texture2D.MipSlice = levelIndex;
- rtvDesc.Texture2D.PlaneSlice = 0;
- }
+ rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;
+ rtvDesc.Texture2D.MipSlice = levelIndex;
+ rtvDesc.Texture2D.PlaneSlice = 0;
}
ID3D12Device_CreateRenderTargetView(
diff --git a/src/gpu/metal/SDL_gpu_metal.m b/src/gpu/metal/SDL_gpu_metal.m
index 7992055fefb10..7ea18b3c24058 100644
--- a/src/gpu/metal/SDL_gpu_metal.m
+++ b/src/gpu/metal/SDL_gpu_metal.m
@@ -313,14 +313,6 @@ static void METAL_ReleaseWindow(
8 // SDL_GPU_SAMPLECOUNT_8
};
-static MTLTextureType SDLToMetal_TextureType[] = {
- MTLTextureType2D, // SDL_GPU_TEXTURETYPE_2D
- MTLTextureType2DArray, // SDL_GPU_TEXTURETYPE_2D_ARRAY
- MTLTextureType3D, // SDL_GPU_TEXTURETYPE_3D
- MTLTextureTypeCube, // SDL_GPU_TEXTURETYPE_CUBE
- MTLTextureTypeCubeArray // SDL_GPU_TEXTURETYPE_CUBE_ARRAY
-};
-
static SDL_GPUTextureFormat SwapchainCompositionToFormat[] = {
SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM, // SDR
SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB, // SDR_LINEAR
@@ -330,6 +322,24 @@ static void METAL_ReleaseWindow(
static CFStringRef SwapchainCompositionToColorSpace[4]; // initialized on device creation
+static MTLTextureType SDLToMetal_TextureType(SDL_GPUTextureType textureType, bool isMSAA)
+{
+ switch (textureType) {
+ case SDL_GPU_TEXTURETYPE_2D:
+ return isMSAA ? MTLTextureType2DMultisample : MTLTextureType2D;
+ case SDL_GPU_TEXTURETYPE_2D_ARRAY:
+ return MTLTextureType2DArray;
+ case SDL_GPU_TEXTURETYPE_3D:
+ return MTLTextureType3D;
+ case SDL_GPU_TEXTURETYPE_CUBE:
+ return MTLTextureTypeCube;
+ case SDL_GPU_TEXTURETYPE_CUBE_ARRAY:
+ return MTLTextureTypeCubeArray;
+ default:
+ return MTLTextureType2D;
+ }
+}
+
static MTLColorWriteMask SDLToMetal_ColorWriteMask(
SDL_GPUColorComponentFlags mask)
{
@@ -1323,7 +1333,7 @@ static void METAL_PopDebugGroup(
id<MTLTexture> texture;
MetalTexture *metalTexture;
- textureDescriptor.textureType = SDLToMetal_TextureType[createinfo->type];
+ textureDescriptor.textureType = SDLToMetal_TextureType(createinfo->type, createinfo->sample_count > SDL_GPU_SAMPLECOUNT_1);
textureDescriptor.pixelFormat = SDLToMetal_SurfaceFormat[createinfo->format];
// This format isn't natively supported so let's swizzle!
if (createinfo->format == SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM) {
@@ -2965,7 +2975,7 @@ static void METAL_BeginComputePass(
METAL_INTERNAL_TrackTexture(metalCommandBuffer, texture);
textureView = [texture->handle newTextureViewWithPixelFormat:SDLToMetal_SurfaceFormat[textureContainer->header.info.format]
- textureType:SDLToMetal_TextureType[textureContainer->header.info.type]
+ textureType:SDLToMetal_TextureType(textureContainer->header.info.type, false)
levels:NSMakeRange(storageTextureBindings[i].mip_level, 1)
slices:NSMakeRange(storageTextureBindings[i].layer, 1)];