mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-05-31 17:07:39 +00:00
GPU: Cube Arrays (#10800)
--------- Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com>
This commit is contained in:
parent
9ea0a837ae
commit
66489f91bb
15 changed files with 9280 additions and 5916 deletions
|
@ -484,10 +484,11 @@ typedef Uint32 SDL_GPUTextureUsageFlags;
|
||||||
*/
|
*/
|
||||||
typedef enum SDL_GPUTextureType
|
typedef enum SDL_GPUTextureType
|
||||||
{
|
{
|
||||||
SDL_GPU_TEXTURETYPE_2D, /**< The texture is a 2-dimensional image. */
|
SDL_GPU_TEXTURETYPE_2D, /**< The texture is a 2-dimensional image. */
|
||||||
SDL_GPU_TEXTURETYPE_2D_ARRAY, /**< The texture is a 2-dimensional array image. */
|
SDL_GPU_TEXTURETYPE_2D_ARRAY, /**< The texture is a 2-dimensional array image. */
|
||||||
SDL_GPU_TEXTURETYPE_3D, /**< The texture is a 3-dimensional image. */
|
SDL_GPU_TEXTURETYPE_3D, /**< The texture is a 3-dimensional image. */
|
||||||
SDL_GPU_TEXTURETYPE_CUBE /**< The texture is a cube image. */
|
SDL_GPU_TEXTURETYPE_CUBE, /**< The texture is a cube image. */
|
||||||
|
SDL_GPU_TEXTURETYPE_CUBE_ARRAY /**< The texture is a cube array image. */
|
||||||
} SDL_GPUTextureType;
|
} SDL_GPUTextureType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -177,6 +177,7 @@ SDL_GPUGraphicsPipeline *SDL_GPU_FetchBlitPipeline(
|
||||||
SDL_GPUShader *blit_from_2d_array_shader,
|
SDL_GPUShader *blit_from_2d_array_shader,
|
||||||
SDL_GPUShader *blit_from_3d_shader,
|
SDL_GPUShader *blit_from_3d_shader,
|
||||||
SDL_GPUShader *blit_from_cube_shader,
|
SDL_GPUShader *blit_from_cube_shader,
|
||||||
|
SDL_GPUShader *blit_from_cube_array_shader,
|
||||||
BlitPipelineCacheEntry **blit_pipelines,
|
BlitPipelineCacheEntry **blit_pipelines,
|
||||||
Uint32 *blit_pipeline_count,
|
Uint32 *blit_pipeline_count,
|
||||||
Uint32 *blit_pipeline_capacity)
|
Uint32 *blit_pipeline_capacity)
|
||||||
|
@ -211,7 +212,9 @@ SDL_GPUGraphicsPipeline *SDL_GPU_FetchBlitPipeline(
|
||||||
blit_pipeline_create_info.vertex_shader = blit_vertex_shader;
|
blit_pipeline_create_info.vertex_shader = blit_vertex_shader;
|
||||||
if (source_texture_type == SDL_GPU_TEXTURETYPE_CUBE) {
|
if (source_texture_type == SDL_GPU_TEXTURETYPE_CUBE) {
|
||||||
blit_pipeline_create_info.fragment_shader = blit_from_cube_shader;
|
blit_pipeline_create_info.fragment_shader = blit_from_cube_shader;
|
||||||
} else if (source_texture_type == SDL_GPU_TEXTURETYPE_2D_ARRAY) {
|
} else if (source_texture_type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
|
||||||
|
blit_pipeline_create_info.fragment_shader = blit_from_cube_array_shader;
|
||||||
|
} else if (source_texture_type == SDL_GPU_TEXTURETYPE_2D_ARRAY) {
|
||||||
blit_pipeline_create_info.fragment_shader = blit_from_2d_array_shader;
|
blit_pipeline_create_info.fragment_shader = blit_from_2d_array_shader;
|
||||||
} else if (source_texture_type == SDL_GPU_TEXTURETYPE_3D) {
|
} else if (source_texture_type == SDL_GPU_TEXTURETYPE_3D) {
|
||||||
blit_pipeline_create_info.fragment_shader = blit_from_3d_shader;
|
blit_pipeline_create_info.fragment_shader = blit_from_3d_shader;
|
||||||
|
@ -259,6 +262,7 @@ void SDL_GPU_BlitCommon(
|
||||||
SDL_GPUShader *blit_from_2d_array_shader,
|
SDL_GPUShader *blit_from_2d_array_shader,
|
||||||
SDL_GPUShader *blit_from_3d_shader,
|
SDL_GPUShader *blit_from_3d_shader,
|
||||||
SDL_GPUShader *blit_from_cube_shader,
|
SDL_GPUShader *blit_from_cube_shader,
|
||||||
|
SDL_GPUShader *blit_from_cube_array_shader,
|
||||||
BlitPipelineCacheEntry **blit_pipelines,
|
BlitPipelineCacheEntry **blit_pipelines,
|
||||||
Uint32 *blit_pipeline_count,
|
Uint32 *blit_pipeline_count,
|
||||||
Uint32 *blit_pipeline_capacity)
|
Uint32 *blit_pipeline_capacity)
|
||||||
|
@ -283,6 +287,7 @@ void SDL_GPU_BlitCommon(
|
||||||
blit_from_2d_array_shader,
|
blit_from_2d_array_shader,
|
||||||
blit_from_3d_shader,
|
blit_from_3d_shader,
|
||||||
blit_from_cube_shader,
|
blit_from_cube_shader,
|
||||||
|
blit_from_cube_array_shader,
|
||||||
blit_pipelines,
|
blit_pipelines,
|
||||||
blit_pipeline_count,
|
blit_pipeline_count,
|
||||||
blit_pipeline_capacity);
|
blit_pipeline_capacity);
|
||||||
|
@ -818,6 +823,28 @@ SDL_GPUTexture *SDL_CreateGPUTexture(
|
||||||
SDL_assert_release(!"For cube textures: the format is unsupported for the given usage");
|
SDL_assert_release(!"For cube textures: the format is unsupported for the given usage");
|
||||||
failed = true;
|
failed = true;
|
||||||
}
|
}
|
||||||
|
} else if (createinfo->type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
|
||||||
|
// Cubemap array validation
|
||||||
|
if (createinfo->width != createinfo->height) {
|
||||||
|
SDL_assert_release(!"For cube array textures: width and height must be identical");
|
||||||
|
failed = true;
|
||||||
|
}
|
||||||
|
if (createinfo->width > MAX_2D_DIMENSION || createinfo->height > MAX_2D_DIMENSION) {
|
||||||
|
SDL_assert_release(!"For cube array textures: width and height must be <= 16384");
|
||||||
|
failed = true;
|
||||||
|
}
|
||||||
|
if (createinfo->layer_count_or_depth % 6 != 0) {
|
||||||
|
SDL_assert_release(!"For cube array textures: layer_count_or_depth must be a multiple of 6");
|
||||||
|
failed = true;
|
||||||
|
}
|
||||||
|
if (createinfo->sample_count > SDL_GPU_SAMPLECOUNT_1) {
|
||||||
|
SDL_assert_release(!"For cube array textures: sample_count must be SDL_GPU_SAMPLECOUNT_1");
|
||||||
|
failed = true;
|
||||||
|
}
|
||||||
|
if (!SDL_GPUTextureSupportsFormat(device, createinfo->format, SDL_GPU_TEXTURETYPE_CUBE_ARRAY, createinfo->usage)) {
|
||||||
|
SDL_assert_release(!"For cube array textures: the format is unsupported for the given usage");
|
||||||
|
failed = true;
|
||||||
|
}
|
||||||
} else if (createinfo->type == SDL_GPU_TEXTURETYPE_3D) {
|
} else if (createinfo->type == SDL_GPU_TEXTURETYPE_3D) {
|
||||||
// 3D Texture Validation
|
// 3D Texture Validation
|
||||||
if (createinfo->width > MAX_3D_DIMENSION || createinfo->height > MAX_3D_DIMENSION || createinfo->layer_count_or_depth > MAX_3D_DIMENSION) {
|
if (createinfo->width > MAX_3D_DIMENSION || createinfo->height > MAX_3D_DIMENSION || createinfo->layer_count_or_depth > MAX_3D_DIMENSION) {
|
||||||
|
|
|
@ -262,6 +262,7 @@ SDL_GPUGraphicsPipeline *SDL_GPU_FetchBlitPipeline(
|
||||||
SDL_GPUShader *blitFrom2DArrayShader,
|
SDL_GPUShader *blitFrom2DArrayShader,
|
||||||
SDL_GPUShader *blitFrom3DShader,
|
SDL_GPUShader *blitFrom3DShader,
|
||||||
SDL_GPUShader *blitFromCubeShader,
|
SDL_GPUShader *blitFromCubeShader,
|
||||||
|
SDL_GPUShader *blitFromCubeArrayShader,
|
||||||
BlitPipelineCacheEntry **blitPipelines,
|
BlitPipelineCacheEntry **blitPipelines,
|
||||||
Uint32 *blitPipelineCount,
|
Uint32 *blitPipelineCount,
|
||||||
Uint32 *blitPipelineCapacity);
|
Uint32 *blitPipelineCapacity);
|
||||||
|
@ -276,6 +277,7 @@ void SDL_GPU_BlitCommon(
|
||||||
SDL_GPUShader *blitFrom2DArrayShader,
|
SDL_GPUShader *blitFrom2DArrayShader,
|
||||||
SDL_GPUShader *blitFrom3DShader,
|
SDL_GPUShader *blitFrom3DShader,
|
||||||
SDL_GPUShader *blitFromCubeShader,
|
SDL_GPUShader *blitFromCubeShader,
|
||||||
|
SDL_GPUShader *blitFromCubeArrayShader,
|
||||||
BlitPipelineCacheEntry **blitPipelines,
|
BlitPipelineCacheEntry **blitPipelines,
|
||||||
Uint32 *blitPipelineCount,
|
Uint32 *blitPipelineCount,
|
||||||
Uint32 *blitPipelineCapacity);
|
Uint32 *blitPipelineCapacity);
|
||||||
|
|
|
@ -1014,10 +1014,10 @@ switch r1.x
|
||||||
break
|
break
|
||||||
case l(2)
|
case l(2)
|
||||||
mul r0.xz, r0.xxzx, l(1.000000, 0.000000, -1.000000, 0.000000)
|
mul r0.xz, r0.xxzx, l(1.000000, 0.000000, -1.000000, 0.000000)
|
||||||
mov r0.y, l(-1.000000)
|
mov r0.y, l(1.000000)
|
||||||
break
|
break
|
||||||
case l(3)
|
case l(3)
|
||||||
mov r0.y, l(1.000000)
|
mov r0.y, l(-1.000000)
|
||||||
break
|
break
|
||||||
case l(4)
|
case l(4)
|
||||||
mul r0.xy, r0.xzxx, l(1.000000, -1.000000, 0.000000, 0.000000)
|
mul r0.xy, r0.xzxx, l(1.000000, -1.000000, 0.000000, 0.000000)
|
||||||
|
@ -1039,10 +1039,10 @@ ret
|
||||||
|
|
||||||
const BYTE g_BlitFromCube[] =
|
const BYTE g_BlitFromCube[] =
|
||||||
{
|
{
|
||||||
68, 88, 66, 67, 74, 191,
|
68, 88, 66, 67, 10, 119,
|
||||||
49, 23, 175, 39, 209, 200,
|
223, 12, 113, 233, 111, 65,
|
||||||
62, 140, 77, 177, 73, 191,
|
57, 156, 6, 26, 212, 111,
|
||||||
60, 231, 1, 0, 0, 0,
|
79, 35, 1, 0, 0, 0,
|
||||||
176, 6, 0, 0, 5, 0,
|
176, 6, 0, 0, 5, 0,
|
||||||
0, 0, 52, 0, 0, 0,
|
0, 0, 52, 0, 0, 0,
|
||||||
156, 2, 0, 0, 244, 2,
|
156, 2, 0, 0, 244, 2,
|
||||||
|
@ -1248,13 +1248,13 @@ const BYTE g_BlitFromCube[] =
|
||||||
54, 0, 0, 5, 34, 0,
|
54, 0, 0, 5, 34, 0,
|
||||||
16, 0, 0, 0, 0, 0,
|
16, 0, 0, 0, 0, 0,
|
||||||
1, 64, 0, 0, 0, 0,
|
1, 64, 0, 0, 0, 0,
|
||||||
128, 191, 2, 0, 0, 1,
|
128, 63, 2, 0, 0, 1,
|
||||||
6, 0, 0, 3, 1, 64,
|
6, 0, 0, 3, 1, 64,
|
||||||
0, 0, 3, 0, 0, 0,
|
0, 0, 3, 0, 0, 0,
|
||||||
54, 0, 0, 5, 34, 0,
|
54, 0, 0, 5, 34, 0,
|
||||||
16, 0, 0, 0, 0, 0,
|
16, 0, 0, 0, 0, 0,
|
||||||
1, 64, 0, 0, 0, 0,
|
1, 64, 0, 0, 0, 0,
|
||||||
128, 63, 2, 0, 0, 1,
|
128, 191, 2, 0, 0, 1,
|
||||||
6, 0, 0, 3, 1, 64,
|
6, 0, 0, 3, 1, 64,
|
||||||
0, 0, 4, 0, 0, 0,
|
0, 0, 4, 0, 0, 0,
|
||||||
56, 0, 0, 10, 50, 0,
|
56, 0, 0, 10, 50, 0,
|
||||||
|
@ -1326,3 +1326,382 @@ const BYTE g_BlitFromCube[] =
|
||||||
0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0,
|
||||||
0, 0
|
0, 0
|
||||||
};
|
};
|
||||||
|
#if 0
|
||||||
|
//
|
||||||
|
// Generated by Microsoft (R) HLSL Shader Compiler 10.1
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Buffer Definitions:
|
||||||
|
//
|
||||||
|
// cbuffer SourceRegionBuffer
|
||||||
|
// {
|
||||||
|
//
|
||||||
|
// float2 UVLeftTop; // Offset: 0 Size: 8
|
||||||
|
// float2 UVDimensions; // Offset: 8 Size: 8
|
||||||
|
// uint MipLevel; // Offset: 16 Size: 4
|
||||||
|
// float LayerOrDepth; // Offset: 20 Size: 4
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Resource Bindings:
|
||||||
|
//
|
||||||
|
// Name Type Format Dim HLSL Bind Count
|
||||||
|
// ------------------------------ ---------- ------- ----------- -------------- ------
|
||||||
|
// SourceSampler sampler NA NA s0 1
|
||||||
|
// SourceTextureCubeArray texture float4 cubearray t0 1
|
||||||
|
// SourceRegionBuffer cbuffer NA NA cb0 1
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Input signature:
|
||||||
|
//
|
||||||
|
// Name Index Mask Register SysValue Format Used
|
||||||
|
// -------------------- ----- ------ -------- -------- ------- ------
|
||||||
|
// TEXCOORD 0 xy 0 NONE float xy
|
||||||
|
// SV_POSITION 0 xyzw 1 POS float
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Output signature:
|
||||||
|
//
|
||||||
|
// Name Index Mask Register SysValue Format Used
|
||||||
|
// -------------------- ----- ------ -------- -------- ------- ------
|
||||||
|
// SV_Target 0 xyzw 0 TARGET float xyzw
|
||||||
|
//
|
||||||
|
ps_5_0
|
||||||
|
dcl_globalFlags refactoringAllowed
|
||||||
|
dcl_constantbuffer CB0[2], immediateIndexed
|
||||||
|
dcl_sampler s0, mode_default
|
||||||
|
dcl_resource_texturecubearray (float,float,float,float) t0
|
||||||
|
dcl_input_ps linear v0.xy
|
||||||
|
dcl_output o0.xyzw
|
||||||
|
dcl_temps 3
|
||||||
|
mad r0.xy, cb0[0].zwzz, v0.xyxx, cb0[0].xyxx
|
||||||
|
mad r0.xz, r0.xxyx, l(2.000000, 0.000000, 2.000000, 0.000000), l(-1.000000, 0.000000, -1.000000, 0.000000)
|
||||||
|
ftou r1.x, cb0[1].y
|
||||||
|
udiv r1.x, r2.x, r1.x, l(6)
|
||||||
|
switch r2.x
|
||||||
|
case l(0)
|
||||||
|
mov r0.yz, -r0.zzxz
|
||||||
|
mov r0.x, l(1.000000)
|
||||||
|
break
|
||||||
|
case l(1)
|
||||||
|
mov r0.y, l(-1.000000)
|
||||||
|
mov r0.w, -r0.z
|
||||||
|
mov r0.xyz, r0.ywxy
|
||||||
|
break
|
||||||
|
case l(2)
|
||||||
|
mul r0.xz, r0.xxzx, l(1.000000, 0.000000, -1.000000, 0.000000)
|
||||||
|
mov r0.y, l(1.000000)
|
||||||
|
break
|
||||||
|
case l(3)
|
||||||
|
mov r0.y, l(-1.000000)
|
||||||
|
break
|
||||||
|
case l(4)
|
||||||
|
mul r0.xy, r0.xzxx, l(1.000000, -1.000000, 0.000000, 0.000000)
|
||||||
|
mov r0.z, l(1.000000)
|
||||||
|
break
|
||||||
|
case l(5)
|
||||||
|
mov r0.xy, -r0.xzxx
|
||||||
|
mov r0.z, l(-1.000000)
|
||||||
|
break
|
||||||
|
endswitch
|
||||||
|
utof r0.w, r1.x
|
||||||
|
utof r1.x, cb0[1].x
|
||||||
|
sample_l_indexable(texturecubearray)(float,float,float,float) o0.xyzw, r0.xyzw, t0.xyzw, s0, r1.x
|
||||||
|
ret
|
||||||
|
// Approximately 34 instruction slots used
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const BYTE g_BlitFromCubeArray[] =
|
||||||
|
{
|
||||||
|
68, 88, 66, 67, 59, 147,
|
||||||
|
203, 21, 33, 208, 116, 167,
|
||||||
|
11, 254, 103, 46, 206, 206,
|
||||||
|
176, 66, 1, 0, 0, 0,
|
||||||
|
196, 6, 0, 0, 5, 0,
|
||||||
|
0, 0, 52, 0, 0, 0,
|
||||||
|
160, 2, 0, 0, 248, 2,
|
||||||
|
0, 0, 44, 3, 0, 0,
|
||||||
|
40, 6, 0, 0, 82, 68,
|
||||||
|
69, 70, 100, 2, 0, 0,
|
||||||
|
1, 0, 0, 0, 212, 0,
|
||||||
|
0, 0, 3, 0, 0, 0,
|
||||||
|
60, 0, 0, 0, 0, 5,
|
||||||
|
255, 255, 0, 1, 0, 0,
|
||||||
|
60, 2, 0, 0, 82, 68,
|
||||||
|
49, 49, 60, 0, 0, 0,
|
||||||
|
24, 0, 0, 0, 32, 0,
|
||||||
|
0, 0, 40, 0, 0, 0,
|
||||||
|
36, 0, 0, 0, 12, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
156, 0, 0, 0, 3, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
1, 0, 0, 0, 1, 0,
|
||||||
|
0, 0, 170, 0, 0, 0,
|
||||||
|
2, 0, 0, 0, 5, 0,
|
||||||
|
0, 0, 10, 0, 0, 0,
|
||||||
|
255, 255, 255, 255, 0, 0,
|
||||||
|
0, 0, 1, 0, 0, 0,
|
||||||
|
13, 0, 0, 0, 193, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 1, 0,
|
||||||
|
0, 0, 1, 0, 0, 0,
|
||||||
|
83, 111, 117, 114, 99, 101,
|
||||||
|
83, 97, 109, 112, 108, 101,
|
||||||
|
114, 0, 83, 111, 117, 114,
|
||||||
|
99, 101, 84, 101, 120, 116,
|
||||||
|
117, 114, 101, 67, 117, 98,
|
||||||
|
101, 65, 114, 114, 97, 121,
|
||||||
|
0, 83, 111, 117, 114, 99,
|
||||||
|
101, 82, 101, 103, 105, 111,
|
||||||
|
110, 66, 117, 102, 102, 101,
|
||||||
|
114, 0, 193, 0, 0, 0,
|
||||||
|
4, 0, 0, 0, 236, 0,
|
||||||
|
0, 0, 32, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 140, 1, 0, 0,
|
||||||
|
0, 0, 0, 0, 8, 0,
|
||||||
|
0, 0, 2, 0, 0, 0,
|
||||||
|
160, 1, 0, 0, 0, 0,
|
||||||
|
0, 0, 255, 255, 255, 255,
|
||||||
|
0, 0, 0, 0, 255, 255,
|
||||||
|
255, 255, 0, 0, 0, 0,
|
||||||
|
196, 1, 0, 0, 8, 0,
|
||||||
|
0, 0, 8, 0, 0, 0,
|
||||||
|
2, 0, 0, 0, 160, 1,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
255, 255, 255, 255, 0, 0,
|
||||||
|
0, 0, 255, 255, 255, 255,
|
||||||
|
0, 0, 0, 0, 209, 1,
|
||||||
|
0, 0, 16, 0, 0, 0,
|
||||||
|
4, 0, 0, 0, 2, 0,
|
||||||
|
0, 0, 224, 1, 0, 0,
|
||||||
|
0, 0, 0, 0, 255, 255,
|
||||||
|
255, 255, 0, 0, 0, 0,
|
||||||
|
255, 255, 255, 255, 0, 0,
|
||||||
|
0, 0, 4, 2, 0, 0,
|
||||||
|
20, 0, 0, 0, 4, 0,
|
||||||
|
0, 0, 2, 0, 0, 0,
|
||||||
|
24, 2, 0, 0, 0, 0,
|
||||||
|
0, 0, 255, 255, 255, 255,
|
||||||
|
0, 0, 0, 0, 255, 255,
|
||||||
|
255, 255, 0, 0, 0, 0,
|
||||||
|
85, 86, 76, 101, 102, 116,
|
||||||
|
84, 111, 112, 0, 102, 108,
|
||||||
|
111, 97, 116, 50, 0, 171,
|
||||||
|
171, 171, 1, 0, 3, 0,
|
||||||
|
1, 0, 2, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 150, 1,
|
||||||
|
0, 0, 85, 86, 68, 105,
|
||||||
|
109, 101, 110, 115, 105, 111,
|
||||||
|
110, 115, 0, 77, 105, 112,
|
||||||
|
76, 101, 118, 101, 108, 0,
|
||||||
|
100, 119, 111, 114, 100, 0,
|
||||||
|
0, 0, 19, 0, 1, 0,
|
||||||
|
1, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 218, 1, 0, 0,
|
||||||
|
76, 97, 121, 101, 114, 79,
|
||||||
|
114, 68, 101, 112, 116, 104,
|
||||||
|
0, 102, 108, 111, 97, 116,
|
||||||
|
0, 171, 0, 0, 3, 0,
|
||||||
|
1, 0, 1, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 17, 2,
|
||||||
|
0, 0, 77, 105, 99, 114,
|
||||||
|
111, 115, 111, 102, 116, 32,
|
||||||
|
40, 82, 41, 32, 72, 76,
|
||||||
|
83, 76, 32, 83, 104, 97,
|
||||||
|
100, 101, 114, 32, 67, 111,
|
||||||
|
109, 112, 105, 108, 101, 114,
|
||||||
|
32, 49, 48, 46, 49, 0,
|
||||||
|
73, 83, 71, 78, 80, 0,
|
||||||
|
0, 0, 2, 0, 0, 0,
|
||||||
|
8, 0, 0, 0, 56, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 3, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
3, 3, 0, 0, 65, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
1, 0, 0, 0, 3, 0,
|
||||||
|
0, 0, 1, 0, 0, 0,
|
||||||
|
15, 0, 0, 0, 84, 69,
|
||||||
|
88, 67, 79, 79, 82, 68,
|
||||||
|
0, 83, 86, 95, 80, 79,
|
||||||
|
83, 73, 84, 73, 79, 78,
|
||||||
|
0, 171, 171, 171, 79, 83,
|
||||||
|
71, 78, 44, 0, 0, 0,
|
||||||
|
1, 0, 0, 0, 8, 0,
|
||||||
|
0, 0, 32, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 3, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 15, 0,
|
||||||
|
0, 0, 83, 86, 95, 84,
|
||||||
|
97, 114, 103, 101, 116, 0,
|
||||||
|
171, 171, 83, 72, 69, 88,
|
||||||
|
244, 2, 0, 0, 80, 0,
|
||||||
|
0, 0, 189, 0, 0, 0,
|
||||||
|
106, 8, 0, 1, 89, 0,
|
||||||
|
0, 4, 70, 142, 32, 0,
|
||||||
|
0, 0, 0, 0, 2, 0,
|
||||||
|
0, 0, 90, 0, 0, 3,
|
||||||
|
0, 96, 16, 0, 0, 0,
|
||||||
|
0, 0, 88, 80, 0, 4,
|
||||||
|
0, 112, 16, 0, 0, 0,
|
||||||
|
0, 0, 85, 85, 0, 0,
|
||||||
|
98, 16, 0, 3, 50, 16,
|
||||||
|
16, 0, 0, 0, 0, 0,
|
||||||
|
101, 0, 0, 3, 242, 32,
|
||||||
|
16, 0, 0, 0, 0, 0,
|
||||||
|
104, 0, 0, 2, 3, 0,
|
||||||
|
0, 0, 50, 0, 0, 11,
|
||||||
|
50, 0, 16, 0, 0, 0,
|
||||||
|
0, 0, 230, 138, 32, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 70, 16, 16, 0,
|
||||||
|
0, 0, 0, 0, 70, 128,
|
||||||
|
32, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 50, 0,
|
||||||
|
0, 15, 82, 0, 16, 0,
|
||||||
|
0, 0, 0, 0, 6, 1,
|
||||||
|
16, 0, 0, 0, 0, 0,
|
||||||
|
2, 64, 0, 0, 0, 0,
|
||||||
|
0, 64, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 64, 0, 0,
|
||||||
|
0, 0, 2, 64, 0, 0,
|
||||||
|
0, 0, 128, 191, 0, 0,
|
||||||
|
0, 0, 0, 0, 128, 191,
|
||||||
|
0, 0, 0, 0, 28, 0,
|
||||||
|
0, 6, 18, 0, 16, 0,
|
||||||
|
1, 0, 0, 0, 26, 128,
|
||||||
|
32, 0, 0, 0, 0, 0,
|
||||||
|
1, 0, 0, 0, 78, 0,
|
||||||
|
0, 9, 18, 0, 16, 0,
|
||||||
|
1, 0, 0, 0, 18, 0,
|
||||||
|
16, 0, 2, 0, 0, 0,
|
||||||
|
10, 0, 16, 0, 1, 0,
|
||||||
|
0, 0, 1, 64, 0, 0,
|
||||||
|
6, 0, 0, 0, 76, 0,
|
||||||
|
0, 3, 10, 0, 16, 0,
|
||||||
|
2, 0, 0, 0, 6, 0,
|
||||||
|
0, 3, 1, 64, 0, 0,
|
||||||
|
0, 0, 0, 0, 54, 0,
|
||||||
|
0, 6, 98, 0, 16, 0,
|
||||||
|
0, 0, 0, 0, 166, 8,
|
||||||
|
16, 128, 65, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 54, 0,
|
||||||
|
0, 5, 18, 0, 16, 0,
|
||||||
|
0, 0, 0, 0, 1, 64,
|
||||||
|
0, 0, 0, 0, 128, 63,
|
||||||
|
2, 0, 0, 1, 6, 0,
|
||||||
|
0, 3, 1, 64, 0, 0,
|
||||||
|
1, 0, 0, 0, 54, 0,
|
||||||
|
0, 5, 34, 0, 16, 0,
|
||||||
|
0, 0, 0, 0, 1, 64,
|
||||||
|
0, 0, 0, 0, 128, 191,
|
||||||
|
54, 0, 0, 6, 130, 0,
|
||||||
|
16, 0, 0, 0, 0, 0,
|
||||||
|
42, 0, 16, 128, 65, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
54, 0, 0, 5, 114, 0,
|
||||||
|
16, 0, 0, 0, 0, 0,
|
||||||
|
214, 4, 16, 0, 0, 0,
|
||||||
|
0, 0, 2, 0, 0, 1,
|
||||||
|
6, 0, 0, 3, 1, 64,
|
||||||
|
0, 0, 2, 0, 0, 0,
|
||||||
|
56, 0, 0, 10, 82, 0,
|
||||||
|
16, 0, 0, 0, 0, 0,
|
||||||
|
6, 2, 16, 0, 0, 0,
|
||||||
|
0, 0, 2, 64, 0, 0,
|
||||||
|
0, 0, 128, 63, 0, 0,
|
||||||
|
0, 0, 0, 0, 128, 191,
|
||||||
|
0, 0, 0, 0, 54, 0,
|
||||||
|
0, 5, 34, 0, 16, 0,
|
||||||
|
0, 0, 0, 0, 1, 64,
|
||||||
|
0, 0, 0, 0, 128, 63,
|
||||||
|
2, 0, 0, 1, 6, 0,
|
||||||
|
0, 3, 1, 64, 0, 0,
|
||||||
|
3, 0, 0, 0, 54, 0,
|
||||||
|
0, 5, 34, 0, 16, 0,
|
||||||
|
0, 0, 0, 0, 1, 64,
|
||||||
|
0, 0, 0, 0, 128, 191,
|
||||||
|
2, 0, 0, 1, 6, 0,
|
||||||
|
0, 3, 1, 64, 0, 0,
|
||||||
|
4, 0, 0, 0, 56, 0,
|
||||||
|
0, 10, 50, 0, 16, 0,
|
||||||
|
0, 0, 0, 0, 134, 0,
|
||||||
|
16, 0, 0, 0, 0, 0,
|
||||||
|
2, 64, 0, 0, 0, 0,
|
||||||
|
128, 63, 0, 0, 128, 191,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 54, 0, 0, 5,
|
||||||
|
66, 0, 16, 0, 0, 0,
|
||||||
|
0, 0, 1, 64, 0, 0,
|
||||||
|
0, 0, 128, 63, 2, 0,
|
||||||
|
0, 1, 6, 0, 0, 3,
|
||||||
|
1, 64, 0, 0, 5, 0,
|
||||||
|
0, 0, 54, 0, 0, 6,
|
||||||
|
50, 0, 16, 0, 0, 0,
|
||||||
|
0, 0, 134, 0, 16, 128,
|
||||||
|
65, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 54, 0, 0, 5,
|
||||||
|
66, 0, 16, 0, 0, 0,
|
||||||
|
0, 0, 1, 64, 0, 0,
|
||||||
|
0, 0, 128, 191, 2, 0,
|
||||||
|
0, 1, 23, 0, 0, 1,
|
||||||
|
86, 0, 0, 5, 130, 0,
|
||||||
|
16, 0, 0, 0, 0, 0,
|
||||||
|
10, 0, 16, 0, 1, 0,
|
||||||
|
0, 0, 86, 0, 0, 6,
|
||||||
|
18, 0, 16, 0, 1, 0,
|
||||||
|
0, 0, 10, 128, 32, 0,
|
||||||
|
0, 0, 0, 0, 1, 0,
|
||||||
|
0, 0, 72, 0, 0, 141,
|
||||||
|
130, 2, 0, 128, 67, 85,
|
||||||
|
21, 0, 242, 32, 16, 0,
|
||||||
|
0, 0, 0, 0, 70, 14,
|
||||||
|
16, 0, 0, 0, 0, 0,
|
||||||
|
70, 126, 16, 0, 0, 0,
|
||||||
|
0, 0, 0, 96, 16, 0,
|
||||||
|
0, 0, 0, 0, 10, 0,
|
||||||
|
16, 0, 1, 0, 0, 0,
|
||||||
|
62, 0, 0, 1, 83, 84,
|
||||||
|
65, 84, 148, 0, 0, 0,
|
||||||
|
34, 0, 0, 0, 3, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
2, 0, 0, 0, 7, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 7, 0,
|
||||||
|
0, 0, 1, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
1, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 7, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
3, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
|
@ -92,17 +92,19 @@ static const GUID D3D_IID_DXGI_DEBUG_ALL = { 0xe48ae283, 0xda80, 0x490b, { 0x87,
|
||||||
|
|
||||||
// Built-in shaders, compiled with compile_shaders.bat
|
// Built-in shaders, compiled with compile_shaders.bat
|
||||||
|
|
||||||
#define g_FullscreenVert D3D11_FullscreenVert
|
#define g_FullscreenVert D3D11_FullscreenVert
|
||||||
#define g_BlitFrom2D D3D11_BlitFrom2D
|
#define g_BlitFrom2D D3D11_BlitFrom2D
|
||||||
#define g_BlitFrom2DArray D3D11_BlitFrom2DArray
|
#define g_BlitFrom2DArray D3D11_BlitFrom2DArray
|
||||||
#define g_BlitFrom3D D3D11_BlitFrom3D
|
#define g_BlitFrom3D D3D11_BlitFrom3D
|
||||||
#define g_BlitFromCube D3D11_BlitFromCube
|
#define g_BlitFromCube D3D11_BlitFromCube
|
||||||
|
#define g_BlitFromCubeArray D3D11_BlitFromCubeArray
|
||||||
#include "D3D11_Blit.h"
|
#include "D3D11_Blit.h"
|
||||||
#undef g_FullscreenVert
|
#undef g_FullscreenVert
|
||||||
#undef g_BlitFrom2D
|
#undef g_BlitFrom2D
|
||||||
#undef g_BlitFrom2DArray
|
#undef g_BlitFrom2DArray
|
||||||
#undef g_BlitFrom3D
|
#undef g_BlitFrom3D
|
||||||
#undef g_BlitFromCube
|
#undef g_BlitFromCube
|
||||||
|
#undef g_BlitFromCubeArray
|
||||||
|
|
||||||
// Macros
|
// Macros
|
||||||
|
|
||||||
|
@ -740,7 +742,7 @@ struct D3D11Renderer
|
||||||
SDL_iconv_t iconv;
|
SDL_iconv_t iconv;
|
||||||
|
|
||||||
// Blit
|
// Blit
|
||||||
BlitPipelineCacheEntry blitPipelines[4];
|
BlitPipelineCacheEntry blitPipelines[5];
|
||||||
SDL_GPUSampler *blitNearestSampler;
|
SDL_GPUSampler *blitNearestSampler;
|
||||||
SDL_GPUSampler *blitLinearSampler;
|
SDL_GPUSampler *blitLinearSampler;
|
||||||
|
|
||||||
|
@ -1940,7 +1942,7 @@ static D3D11Texture *D3D11_INTERNAL_CreateTexture(
|
||||||
desc2D.SampleDesc.Quality = 0;
|
desc2D.SampleDesc.Quality = 0;
|
||||||
desc2D.Usage = isStaging ? D3D11_USAGE_STAGING : D3D11_USAGE_DEFAULT;
|
desc2D.Usage = isStaging ? D3D11_USAGE_STAGING : D3D11_USAGE_DEFAULT;
|
||||||
|
|
||||||
if (createInfo->type == SDL_GPU_TEXTURETYPE_CUBE) {
|
if (createInfo->type == SDL_GPU_TEXTURETYPE_CUBE || createInfo->type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
|
||||||
desc2D.MiscFlags |= D3D11_RESOURCE_MISC_TEXTURECUBE;
|
desc2D.MiscFlags |= D3D11_RESOURCE_MISC_TEXTURECUBE;
|
||||||
}
|
}
|
||||||
if (isMippable) {
|
if (isMippable) {
|
||||||
|
@ -1963,6 +1965,12 @@ static D3D11Texture *D3D11_INTERNAL_CreateTexture(
|
||||||
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
|
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
|
||||||
srvDesc.TextureCube.MipLevels = desc2D.MipLevels;
|
srvDesc.TextureCube.MipLevels = desc2D.MipLevels;
|
||||||
srvDesc.TextureCube.MostDetailedMip = 0;
|
srvDesc.TextureCube.MostDetailedMip = 0;
|
||||||
|
} else if (createInfo->type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
|
||||||
|
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY;
|
||||||
|
srvDesc.TextureCubeArray.MipLevels = desc2D.MipLevels;
|
||||||
|
srvDesc.TextureCubeArray.MostDetailedMip = 0;
|
||||||
|
srvDesc.TextureCubeArray.First2DArrayFace = 0;
|
||||||
|
srvDesc.TextureCubeArray.NumCubes = layerCount / 6;
|
||||||
} else if (createInfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY) {
|
} else if (createInfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY) {
|
||||||
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
|
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
|
||||||
srvDesc.Texture2DArray.MipLevels = desc2D.MipLevels;
|
srvDesc.Texture2DArray.MipLevels = desc2D.MipLevels;
|
||||||
|
@ -2136,7 +2144,7 @@ static D3D11Texture *D3D11_INTERNAL_CreateTexture(
|
||||||
|
|
||||||
rtvDesc.Format = SDLToD3D11_TextureFormat[createInfo->format];
|
rtvDesc.Format = SDLToD3D11_TextureFormat[createInfo->format];
|
||||||
|
|
||||||
if (createInfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY || createInfo->type == SDL_GPU_TEXTURETYPE_CUBE) {
|
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.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
|
||||||
rtvDesc.Texture2DArray.MipSlice = levelIndex;
|
rtvDesc.Texture2DArray.MipSlice = levelIndex;
|
||||||
rtvDesc.Texture2DArray.FirstArraySlice = layerIndex;
|
rtvDesc.Texture2DArray.FirstArraySlice = layerIndex;
|
||||||
|
@ -2164,7 +2172,7 @@ static D3D11Texture *D3D11_INTERNAL_CreateTexture(
|
||||||
D3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc;
|
D3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc;
|
||||||
uavDesc.Format = format;
|
uavDesc.Format = format;
|
||||||
|
|
||||||
if (createInfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY || createInfo->type == SDL_GPU_TEXTURETYPE_CUBE) {
|
if (createInfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY || createInfo->type == SDL_GPU_TEXTURETYPE_CUBE || createInfo->type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
|
||||||
uavDesc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2DARRAY;
|
uavDesc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2DARRAY;
|
||||||
uavDesc.Texture2DArray.MipSlice = levelIndex;
|
uavDesc.Texture2DArray.MipSlice = levelIndex;
|
||||||
uavDesc.Texture2DArray.FirstArraySlice = layerIndex;
|
uavDesc.Texture2DArray.FirstArraySlice = layerIndex;
|
||||||
|
@ -4316,6 +4324,7 @@ static void D3D11_Blit(
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
NULL,
|
||||||
&blitPipelines,
|
&blitPipelines,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -5821,6 +5830,9 @@ static bool D3D11_SupportsTextureFormat(
|
||||||
if (type == SDL_GPU_TEXTURETYPE_CUBE && !(formatSupport & D3D11_FORMAT_SUPPORT_TEXTURECUBE)) {
|
if (type == SDL_GPU_TEXTURETYPE_CUBE && !(formatSupport & D3D11_FORMAT_SUPPORT_TEXTURECUBE)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY && !(formatSupport & D3D11_FORMAT_SUPPORT_TEXTURECUBE)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Are the usage flags supported?
|
// Are the usage flags supported?
|
||||||
if ((usage & SDL_GPU_TEXTUREUSAGE_SAMPLER) && !(formatSupport & D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) {
|
if ((usage & SDL_GPU_TEXTUREUSAGE_SAMPLER) && !(formatSupport & D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) {
|
||||||
|
@ -5952,6 +5964,7 @@ static void D3D11_INTERNAL_InitBlitPipelines(
|
||||||
SDL_GPUShader *blitFrom2DArrayPixelShader;
|
SDL_GPUShader *blitFrom2DArrayPixelShader;
|
||||||
SDL_GPUShader *blitFrom3DPixelShader;
|
SDL_GPUShader *blitFrom3DPixelShader;
|
||||||
SDL_GPUShader *blitFromCubePixelShader;
|
SDL_GPUShader *blitFromCubePixelShader;
|
||||||
|
SDL_GPUShader *blitFromCubeArrayPixelShader;
|
||||||
SDL_GPUGraphicsPipelineCreateInfo blitPipelineCreateInfo;
|
SDL_GPUGraphicsPipelineCreateInfo blitPipelineCreateInfo;
|
||||||
SDL_GPUGraphicsPipeline *blitPipeline;
|
SDL_GPUGraphicsPipeline *blitPipeline;
|
||||||
SDL_GPUSamplerCreateInfo samplerCreateInfo;
|
SDL_GPUSamplerCreateInfo samplerCreateInfo;
|
||||||
|
@ -6024,6 +6037,18 @@ static void D3D11_INTERNAL_InitBlitPipelines(
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to compile BlitFromCube pixel shader!");
|
SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to compile BlitFromCube pixel shader!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BlitFromCubeArray pixel shader
|
||||||
|
shaderCreateInfo.code = (Uint8 *)D3D11_BlitFromCubeArray;
|
||||||
|
shaderCreateInfo.code_size = sizeof(D3D11_BlitFromCubeArray);
|
||||||
|
|
||||||
|
blitFromCubeArrayPixelShader = D3D11_CreateShader(
|
||||||
|
(SDL_GPURenderer *)renderer,
|
||||||
|
&shaderCreateInfo);
|
||||||
|
|
||||||
|
if (blitFromCubeArrayPixelShader == NULL) {
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to compile BlitFromCubeArray pixel shader!");
|
||||||
|
}
|
||||||
|
|
||||||
// BlitFrom2D pipeline
|
// BlitFrom2D pipeline
|
||||||
SDL_zero(blitPipelineCreateInfo);
|
SDL_zero(blitPipelineCreateInfo);
|
||||||
|
|
||||||
|
@ -6098,6 +6123,20 @@ static void D3D11_INTERNAL_InitBlitPipelines(
|
||||||
renderer->blitPipelines[SDL_GPU_TEXTURETYPE_CUBE].type = SDL_GPU_TEXTURETYPE_CUBE;
|
renderer->blitPipelines[SDL_GPU_TEXTURETYPE_CUBE].type = SDL_GPU_TEXTURETYPE_CUBE;
|
||||||
renderer->blitPipelines[SDL_GPU_TEXTURETYPE_CUBE].format = SDL_GPU_TEXTUREFORMAT_INVALID;
|
renderer->blitPipelines[SDL_GPU_TEXTURETYPE_CUBE].format = SDL_GPU_TEXTUREFORMAT_INVALID;
|
||||||
|
|
||||||
|
// BlitFromCubeArrayPipeline
|
||||||
|
blitPipelineCreateInfo.fragment_shader = blitFromCubeArrayPixelShader;
|
||||||
|
blitPipeline = D3D11_CreateGraphicsPipeline(
|
||||||
|
(SDL_GPURenderer *)renderer,
|
||||||
|
&blitPipelineCreateInfo);
|
||||||
|
|
||||||
|
if (blitPipeline == NULL) {
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to create BlitFromCubeArray pipeline!");
|
||||||
|
}
|
||||||
|
|
||||||
|
renderer->blitPipelines[SDL_GPU_TEXTURETYPE_CUBE_ARRAY].pipeline = blitPipeline;
|
||||||
|
renderer->blitPipelines[SDL_GPU_TEXTURETYPE_CUBE_ARRAY].type = SDL_GPU_TEXTURETYPE_CUBE_ARRAY;
|
||||||
|
renderer->blitPipelines[SDL_GPU_TEXTURETYPE_CUBE_ARRAY].format = SDL_GPU_TEXTUREFORMAT_INVALID;
|
||||||
|
|
||||||
// Create samplers
|
// Create samplers
|
||||||
samplerCreateInfo.address_mode_u = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE;
|
samplerCreateInfo.address_mode_u = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE;
|
||||||
samplerCreateInfo.address_mode_v = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE;
|
samplerCreateInfo.address_mode_v = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE;
|
||||||
|
@ -6137,6 +6176,7 @@ static void D3D11_INTERNAL_InitBlitPipelines(
|
||||||
D3D11_ReleaseShader((SDL_GPURenderer *)renderer, blitFrom2DArrayPixelShader);
|
D3D11_ReleaseShader((SDL_GPURenderer *)renderer, blitFrom2DArrayPixelShader);
|
||||||
D3D11_ReleaseShader((SDL_GPURenderer *)renderer, blitFrom3DPixelShader);
|
D3D11_ReleaseShader((SDL_GPURenderer *)renderer, blitFrom3DPixelShader);
|
||||||
D3D11_ReleaseShader((SDL_GPURenderer *)renderer, blitFromCubePixelShader);
|
D3D11_ReleaseShader((SDL_GPURenderer *)renderer, blitFromCubePixelShader);
|
||||||
|
D3D11_ReleaseShader((SDL_GPURenderer *)renderer, blitFromCubeArrayPixelShader);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D11_INTERNAL_DestroyBlitPipelines(
|
static void D3D11_INTERNAL_DestroyBlitPipelines(
|
||||||
|
|
|
@ -3,5 +3,6 @@ fxc /T ps_5_0 /E BlitFrom2D /Fh D3D11_BlitFrom2D.h ..\d3dcommon\D3D_Blit.hlsl
|
||||||
fxc /T ps_5_0 /E BlitFrom2DArray /Fh D3D11_BlitFrom2DArray.h ..\d3dcommon\D3D_Blit.hlsl
|
fxc /T ps_5_0 /E BlitFrom2DArray /Fh D3D11_BlitFrom2DArray.h ..\d3dcommon\D3D_Blit.hlsl
|
||||||
fxc /T ps_5_0 /E BlitFrom3D /Fh D3D11_BlitFrom3D.h ..\d3dcommon\D3D_Blit.hlsl
|
fxc /T ps_5_0 /E BlitFrom3D /Fh D3D11_BlitFrom3D.h ..\d3dcommon\D3D_Blit.hlsl
|
||||||
fxc /T ps_5_0 /E BlitFromCube /Fh D3D11_BlitFromCube.h ..\d3dcommon\D3D_Blit.hlsl
|
fxc /T ps_5_0 /E BlitFromCube /Fh D3D11_BlitFromCube.h ..\d3dcommon\D3D_Blit.hlsl
|
||||||
copy /b D3D11_FullscreenVert.h+D3D11_BlitFrom2D.h+D3D11_BlitFrom2DArray.h+D3D11_BlitFrom3D.h+D3D11_BlitFromCube.h D3D11_Blit.h
|
fxc /T ps_5_0 /E BlitFromCubeArray /Fh D3D11_BlitFromCubeArray.h ..\d3dcommon\D3D_Blit.hlsl
|
||||||
del D3D11_FullscreenVert.h D3D11_BlitFrom2D.h D3D11_BlitFrom2DArray.h D3D11_BlitFrom3D.h D3D11_BlitFromCube.h
|
copy /b D3D11_FullscreenVert.h+D3D11_BlitFrom2D.h+D3D11_BlitFrom2DArray.h+D3D11_BlitFrom3D.h+D3D11_BlitFromCube.h+D3D11_BlitFromCubeArray.h D3D11_Blit.h
|
||||||
|
del D3D11_FullscreenVert.h D3D11_BlitFrom2D.h D3D11_BlitFrom2DArray.h D3D11_BlitFrom3D.h D3D11_BlitFromCube.h D3D11_BlitFromCubeArray.h
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -34,11 +34,12 @@
|
||||||
|
|
||||||
// Built-in shaders, compiled with compile_shaders.bat
|
// Built-in shaders, compiled with compile_shaders.bat
|
||||||
|
|
||||||
#define g_FullscreenVert D3D12_FullscreenVert
|
#define g_FullscreenVert D3D12_FullscreenVert
|
||||||
#define g_BlitFrom2D D3D12_BlitFrom2D
|
#define g_BlitFrom2D D3D12_BlitFrom2D
|
||||||
#define g_BlitFrom2DArray D3D12_BlitFrom2DArray
|
#define g_BlitFrom2DArray D3D12_BlitFrom2DArray
|
||||||
#define g_BlitFrom3D D3D12_BlitFrom3D
|
#define g_BlitFrom3D D3D12_BlitFrom3D
|
||||||
#define g_BlitFromCube D3D12_BlitFromCube
|
#define g_BlitFromCube D3D12_BlitFromCube
|
||||||
|
#define g_BlitFromCubeArray D3D12_BlitFromCubeArray
|
||||||
#if defined(SDL_PLATFORM_XBOXSERIES)
|
#if defined(SDL_PLATFORM_XBOXSERIES)
|
||||||
#include "D3D12_Blit_Series.h"
|
#include "D3D12_Blit_Series.h"
|
||||||
#elif defined(SDL_PLATFORM_XBOXONE)
|
#elif defined(SDL_PLATFORM_XBOXONE)
|
||||||
|
@ -51,6 +52,7 @@
|
||||||
#undef g_BlitFrom2DArray
|
#undef g_BlitFrom2DArray
|
||||||
#undef g_BlitFrom3D
|
#undef g_BlitFrom3D
|
||||||
#undef g_BlitFromCube
|
#undef g_BlitFromCube
|
||||||
|
#undef g_BlitFromCubeArray
|
||||||
|
|
||||||
// Macros
|
// Macros
|
||||||
|
|
||||||
|
@ -587,6 +589,7 @@ struct D3D12Renderer
|
||||||
SDL_GPUShader *blitFrom2DArrayShader;
|
SDL_GPUShader *blitFrom2DArrayShader;
|
||||||
SDL_GPUShader *blitFrom3DShader;
|
SDL_GPUShader *blitFrom3DShader;
|
||||||
SDL_GPUShader *blitFromCubeShader;
|
SDL_GPUShader *blitFromCubeShader;
|
||||||
|
SDL_GPUShader *blitFromCubeArrayShader;
|
||||||
|
|
||||||
SDL_GPUSampler *blitNearestSampler;
|
SDL_GPUSampler *blitNearestSampler;
|
||||||
SDL_GPUSampler *blitLinearSampler;
|
SDL_GPUSampler *blitLinearSampler;
|
||||||
|
@ -2875,6 +2878,13 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
|
||||||
srvDesc.TextureCube.MipLevels = createinfo->num_levels;
|
srvDesc.TextureCube.MipLevels = createinfo->num_levels;
|
||||||
srvDesc.TextureCube.MostDetailedMip = 0;
|
srvDesc.TextureCube.MostDetailedMip = 0;
|
||||||
srvDesc.TextureCube.ResourceMinLODClamp = 0;
|
srvDesc.TextureCube.ResourceMinLODClamp = 0;
|
||||||
|
} else if (createinfo->type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
|
||||||
|
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBEARRAY;
|
||||||
|
srvDesc.TextureCubeArray.MipLevels = createinfo->num_levels;
|
||||||
|
srvDesc.TextureCubeArray.MostDetailedMip = 0;
|
||||||
|
srvDesc.TextureCubeArray.First2DArrayFace = 0;
|
||||||
|
srvDesc.TextureCubeArray.NumCubes = createinfo->layer_count_or_depth / 6;
|
||||||
|
srvDesc.TextureCubeArray.ResourceMinLODClamp = 0;
|
||||||
} else if (createinfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY) {
|
} else if (createinfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY) {
|
||||||
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY;
|
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY;
|
||||||
srvDesc.Texture2DArray.MipLevels = createinfo->num_levels;
|
srvDesc.Texture2DArray.MipLevels = createinfo->num_levels;
|
||||||
|
@ -2943,7 +2953,7 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
|
||||||
|
|
||||||
rtvDesc.Format = SDLToD3D12_TextureFormat[createinfo->format];
|
rtvDesc.Format = SDLToD3D12_TextureFormat[createinfo->format];
|
||||||
|
|
||||||
if (createinfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY || createinfo->type == SDL_GPU_TEXTURETYPE_CUBE) {
|
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.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY;
|
||||||
rtvDesc.Texture2DArray.MipSlice = levelIndex;
|
rtvDesc.Texture2DArray.MipSlice = levelIndex;
|
||||||
rtvDesc.Texture2DArray.FirstArraySlice = layerIndex;
|
rtvDesc.Texture2DArray.FirstArraySlice = layerIndex;
|
||||||
|
@ -3000,7 +3010,7 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture(
|
||||||
|
|
||||||
uavDesc.Format = SDLToD3D12_TextureFormat[createinfo->format];
|
uavDesc.Format = SDLToD3D12_TextureFormat[createinfo->format];
|
||||||
|
|
||||||
if (createinfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY || createinfo->type == SDL_GPU_TEXTURETYPE_CUBE) {
|
if (createinfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY || createinfo->type == SDL_GPU_TEXTURETYPE_CUBE || createinfo->type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
|
||||||
uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2DARRAY;
|
uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2DARRAY;
|
||||||
uavDesc.Texture2DArray.MipSlice = levelIndex;
|
uavDesc.Texture2DArray.MipSlice = levelIndex;
|
||||||
uavDesc.Texture2DArray.FirstArraySlice = layerIndex;
|
uavDesc.Texture2DArray.FirstArraySlice = layerIndex;
|
||||||
|
@ -3628,6 +3638,7 @@ static void D3D12_INTERNAL_ReleaseBlitPipelines(SDL_GPURenderer *driverData)
|
||||||
D3D12_ReleaseShader(driverData, renderer->blitFrom2DArrayShader);
|
D3D12_ReleaseShader(driverData, renderer->blitFrom2DArrayShader);
|
||||||
D3D12_ReleaseShader(driverData, renderer->blitFrom3DShader);
|
D3D12_ReleaseShader(driverData, renderer->blitFrom3DShader);
|
||||||
D3D12_ReleaseShader(driverData, renderer->blitFromCubeShader);
|
D3D12_ReleaseShader(driverData, renderer->blitFromCubeShader);
|
||||||
|
D3D12_ReleaseShader(driverData, renderer->blitFromCubeArrayShader);
|
||||||
|
|
||||||
for (Uint32 i = 0; i < renderer->blitPipelineCount; i += 1) {
|
for (Uint32 i = 0; i < renderer->blitPipelineCount; i += 1) {
|
||||||
D3D12_ReleaseGraphicsPipeline(driverData, renderer->blitPipelines[i].pipeline);
|
D3D12_ReleaseGraphicsPipeline(driverData, renderer->blitPipelines[i].pipeline);
|
||||||
|
@ -5830,6 +5841,7 @@ static void D3D12_GenerateMipmaps(
|
||||||
renderer->blitFrom2DArrayShader,
|
renderer->blitFrom2DArrayShader,
|
||||||
renderer->blitFrom3DShader,
|
renderer->blitFrom3DShader,
|
||||||
renderer->blitFromCubeShader,
|
renderer->blitFromCubeShader,
|
||||||
|
renderer->blitFromCubeArrayShader,
|
||||||
&renderer->blitPipelines,
|
&renderer->blitPipelines,
|
||||||
&renderer->blitPipelineCount,
|
&renderer->blitPipelineCount,
|
||||||
&renderer->blitPipelineCapacity);
|
&renderer->blitPipelineCapacity);
|
||||||
|
@ -5890,6 +5902,7 @@ static void D3D12_Blit(
|
||||||
renderer->blitFrom2DArrayShader,
|
renderer->blitFrom2DArrayShader,
|
||||||
renderer->blitFrom3DShader,
|
renderer->blitFrom3DShader,
|
||||||
renderer->blitFromCubeShader,
|
renderer->blitFromCubeShader,
|
||||||
|
renderer->blitFromCubeArrayShader,
|
||||||
&renderer->blitPipelines,
|
&renderer->blitPipelines,
|
||||||
&renderer->blitPipelineCount,
|
&renderer->blitPipelineCount,
|
||||||
&renderer->blitPipelineCapacity);
|
&renderer->blitPipelineCapacity);
|
||||||
|
@ -6027,7 +6040,7 @@ static bool D3D12_INTERNAL_CreateSwapchain(
|
||||||
windowData->swapchainHeight = height;
|
windowData->swapchainHeight = height;
|
||||||
|
|
||||||
// Precache blit pipelines for the swapchain format
|
// Precache blit pipelines for the swapchain format
|
||||||
for (Uint32 i = 0; i < 4; i += 1) {
|
for (Uint32 i = 0; i < 5; i += 1) {
|
||||||
SDL_GPU_FetchBlitPipeline(
|
SDL_GPU_FetchBlitPipeline(
|
||||||
renderer->sdlGPUDevice,
|
renderer->sdlGPUDevice,
|
||||||
(SDL_GPUTextureType)i,
|
(SDL_GPUTextureType)i,
|
||||||
|
@ -6407,7 +6420,7 @@ static bool D3D12_INTERNAL_CreateSwapchain(
|
||||||
windowData->frameCounter = 0;
|
windowData->frameCounter = 0;
|
||||||
|
|
||||||
// Precache blit pipelines for the swapchain format
|
// Precache blit pipelines for the swapchain format
|
||||||
for (Uint32 i = 0; i < 4; i += 1) {
|
for (Uint32 i = 0; i < 5; i += 1) {
|
||||||
SDL_GPU_FetchBlitPipeline(
|
SDL_GPU_FetchBlitPipeline(
|
||||||
renderer->sdlGPUDevice,
|
renderer->sdlGPUDevice,
|
||||||
(SDL_GPUTextureType)i,
|
(SDL_GPUTextureType)i,
|
||||||
|
@ -6417,6 +6430,7 @@ static bool D3D12_INTERNAL_CreateSwapchain(
|
||||||
renderer->blitFrom2DArrayShader,
|
renderer->blitFrom2DArrayShader,
|
||||||
renderer->blitFrom3DShader,
|
renderer->blitFrom3DShader,
|
||||||
renderer->blitFromCubeShader,
|
renderer->blitFromCubeShader,
|
||||||
|
renderer->blitFromCubeArrayShader,
|
||||||
&renderer->blitPipelines,
|
&renderer->blitPipelines,
|
||||||
&renderer->blitPipelineCount,
|
&renderer->blitPipelineCount,
|
||||||
&renderer->blitPipelineCapacity);
|
&renderer->blitPipelineCapacity);
|
||||||
|
@ -7450,6 +7464,9 @@ static bool D3D12_SupportsTextureFormat(
|
||||||
if (type == SDL_GPU_TEXTURETYPE_CUBE && !(formatSupport.Support1 & D3D12_FORMAT_SUPPORT1_TEXTURECUBE)) {
|
if (type == SDL_GPU_TEXTURETYPE_CUBE && !(formatSupport.Support1 & D3D12_FORMAT_SUPPORT1_TEXTURECUBE)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY && !(formatSupport.Support1 & D3D12_FORMAT_SUPPORT1_TEXTURECUBE)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Are the usage flags supported?
|
// Are the usage flags supported?
|
||||||
if ((usage & SDL_GPU_TEXTUREUSAGE_SAMPLER) && !(formatSupport.Support1 & D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE)) {
|
if ((usage & SDL_GPU_TEXTUREUSAGE_SAMPLER) && !(formatSupport.Support1 & D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE)) {
|
||||||
|
@ -7574,6 +7591,18 @@ static void D3D12_INTERNAL_InitBlitResources(
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to compile BlitFromCube pixel shader!");
|
SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to compile BlitFromCube pixel shader!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BlitFromCubeArray pixel shader
|
||||||
|
shaderCreateInfo.code = (Uint8 *)D3D12_BlitFromCubeArray;
|
||||||
|
shaderCreateInfo.code_size = sizeof(D3D12_BlitFromCubeArray);
|
||||||
|
|
||||||
|
renderer->blitFromCubeArrayShader = D3D12_CreateShader(
|
||||||
|
(SDL_GPURenderer *)renderer,
|
||||||
|
&shaderCreateInfo);
|
||||||
|
|
||||||
|
if (renderer->blitFromCubeArrayShader == NULL) {
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to compile BlitFromCubeArray pixel shader!");
|
||||||
|
}
|
||||||
|
|
||||||
// Create samplers
|
// Create samplers
|
||||||
samplerCreateInfo.address_mode_u = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE;
|
samplerCreateInfo.address_mode_u = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE;
|
||||||
samplerCreateInfo.address_mode_v = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE;
|
samplerCreateInfo.address_mode_v = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE;
|
||||||
|
|
|
@ -13,5 +13,6 @@ cd "%~dp0"
|
||||||
%DXC% -E BlitFrom2DArray -T ps_6_0 -Fh D3D12_BlitFrom2DArray.h ..\d3dcommon\D3D_Blit.hlsl /D D3D12=1
|
%DXC% -E BlitFrom2DArray -T ps_6_0 -Fh D3D12_BlitFrom2DArray.h ..\d3dcommon\D3D_Blit.hlsl /D D3D12=1
|
||||||
%DXC% -E BlitFrom3D -T ps_6_0 -Fh D3D12_BlitFrom3D.h ..\d3dcommon\D3D_Blit.hlsl /D D3D12=1
|
%DXC% -E BlitFrom3D -T ps_6_0 -Fh D3D12_BlitFrom3D.h ..\d3dcommon\D3D_Blit.hlsl /D D3D12=1
|
||||||
%DXC% -E BlitFromCube -T ps_6_0 -Fh D3D12_BlitFromCube.h ..\d3dcommon\D3D_Blit.hlsl /D D3D12=1
|
%DXC% -E BlitFromCube -T ps_6_0 -Fh D3D12_BlitFromCube.h ..\d3dcommon\D3D_Blit.hlsl /D D3D12=1
|
||||||
copy /b D3D12_FullscreenVert.h+D3D12_BlitFrom2D.h+D3D12_BlitFrom2DArray.h+D3D12_BlitFrom3D.h+D3D12_BlitFromCube.h D3D12_Blit%SUFFIX%
|
%DXC% -E BlitFromCubeArray -T ps_6_0 -Fh D3D12_BlitFromCubeArray.h ..\d3dcommon\D3D_Blit.hlsl /D D3D12=1
|
||||||
del D3D12_FullscreenVert.h D3D12_BlitFrom2D.h D3D12_BlitFrom2DArray.h D3D12_BlitFrom3D.h D3D12_BlitFromCube.h
|
copy /b D3D12_FullscreenVert.h+D3D12_BlitFrom2D.h+D3D12_BlitFrom2DArray.h+D3D12_BlitFrom3D.h+D3D12_BlitFromCube.h+D3D12_BlitFromCubeArray.h D3D12_Blit%SUFFIX%
|
||||||
|
del D3D12_FullscreenVert.h D3D12_BlitFrom2D.h D3D12_BlitFrom2DArray.h D3D12_BlitFrom3D.h D3D12_BlitFromCube.h D3D12_BlitFromCubeArray.h
|
||||||
|
|
|
@ -27,6 +27,7 @@ Texture2D SourceTexture2D : REG(t0, space2);
|
||||||
Texture2DArray SourceTexture2DArray : REG(t0, space2);
|
Texture2DArray SourceTexture2DArray : REG(t0, space2);
|
||||||
Texture3D SourceTexture3D : REG(t0, space2);
|
Texture3D SourceTexture3D : REG(t0, space2);
|
||||||
TextureCube SourceTextureCube : REG(t0, space2);
|
TextureCube SourceTextureCube : REG(t0, space2);
|
||||||
|
TextureCubeArray SourceTextureCubeArray : REG(t0, space2);
|
||||||
sampler SourceSampler : REG(s0, space2);
|
sampler SourceSampler : REG(s0, space2);
|
||||||
|
|
||||||
#if D3D12
|
#if D3D12
|
||||||
|
@ -81,11 +82,34 @@ float4 BlitFromCube(VertexToPixel input) : SV_Target0
|
||||||
switch ((uint)LayerOrDepth) {
|
switch ((uint)LayerOrDepth) {
|
||||||
case 0: newCoord = float3(1.0, -v, -u); break; // POSITIVE X
|
case 0: newCoord = float3(1.0, -v, -u); break; // POSITIVE X
|
||||||
case 1: newCoord = float3(-1.0, -v, u); break; // NEGATIVE X
|
case 1: newCoord = float3(-1.0, -v, u); break; // NEGATIVE X
|
||||||
case 2: newCoord = float3(u, -1.0, -v); break; // POSITIVE Y
|
case 2: newCoord = float3(u, 1.0, -v); break; // POSITIVE Y
|
||||||
case 3: newCoord = float3(u, 1.0, v); break; // NEGATIVE Y
|
case 3: newCoord = float3(u, -1.0, v); break; // NEGATIVE Y
|
||||||
case 4: newCoord = float3(u, -v, 1.0); break; // POSITIVE Z
|
case 4: newCoord = float3(u, -v, 1.0); break; // POSITIVE Z
|
||||||
case 5: newCoord = float3(-u, -v, -1.0); break; // NEGATIVE Z
|
case 5: newCoord = float3(-u, -v, -1.0); break; // NEGATIVE Z
|
||||||
default: newCoord = float3(0, 0, 0); break; // silences warning
|
default: newCoord = float3(0, 0, 0); break; // silences warning
|
||||||
}
|
}
|
||||||
return SourceTextureCube.SampleLevel(SourceSampler, newCoord, MipLevel);
|
return SourceTextureCube.SampleLevel(SourceSampler, newCoord, MipLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if D3D12
|
||||||
|
[RootSignature(BlitRS)]
|
||||||
|
#endif
|
||||||
|
float4 BlitFromCubeArray(VertexToPixel input) : SV_Target0
|
||||||
|
{
|
||||||
|
// Thanks, Wikipedia! https://en.wikipedia.org/wiki/Cube_mapping
|
||||||
|
float3 newCoord;
|
||||||
|
float2 scaledUV = UVLeftTop + UVDimensions * input.tex;
|
||||||
|
float u = 2.0 * scaledUV.x - 1.0;
|
||||||
|
float v = 2.0 * scaledUV.y - 1.0;
|
||||||
|
uint ArrayIndex = (uint)LayerOrDepth / 6;
|
||||||
|
switch ((uint)LayerOrDepth % 6) {
|
||||||
|
case 0: newCoord = float3(1.0, -v, -u); break; // POSITIVE X
|
||||||
|
case 1: newCoord = float3(-1.0, -v, u); break; // NEGATIVE X
|
||||||
|
case 2: newCoord = float3(u, 1.0, -v); break; // POSITIVE Y
|
||||||
|
case 3: newCoord = float3(u, -1.0, v); break; // NEGATIVE Y
|
||||||
|
case 4: newCoord = float3(u, -v, 1.0); break; // POSITIVE Z
|
||||||
|
case 5: newCoord = float3(-u, -v, -1.0); break; // NEGATIVE Z
|
||||||
|
default: newCoord = float3(0, 0, 0); break; // silences warning
|
||||||
|
}
|
||||||
|
return SourceTextureCubeArray.SampleLevel(SourceSampler, float4(newCoord, float(ArrayIndex)), MipLevel);
|
||||||
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -74,8 +74,8 @@ fragment float4 BlitFromCube(
|
||||||
switch ((uint)sourceRegion.LayerOrDepth) {
|
switch ((uint)sourceRegion.LayerOrDepth) {
|
||||||
case 0: newCoord = float3(1.0, -v, -u); break; // POSITIVE X
|
case 0: newCoord = float3(1.0, -v, -u); break; // POSITIVE X
|
||||||
case 1: newCoord = float3(-1.0, -v, u); break; // NEGATIVE X
|
case 1: newCoord = float3(-1.0, -v, u); break; // NEGATIVE X
|
||||||
case 2: newCoord = float3(u, -1.0, -v); break; // POSITIVE Y
|
case 2: newCoord = float3(u, 1.0, -v); break; // POSITIVE Y
|
||||||
case 3: newCoord = float3(u, 1.0, v); break; // NEGATIVE Y
|
case 3: newCoord = float3(u, -1.0, v); break; // NEGATIVE Y
|
||||||
case 4: newCoord = float3(u, -v, 1.0); break; // POSITIVE Z
|
case 4: newCoord = float3(u, -v, 1.0); break; // POSITIVE Z
|
||||||
case 5: newCoord = float3(-u, -v, -1.0); break; // NEGATIVE Z
|
case 5: newCoord = float3(-u, -v, -1.0); break; // NEGATIVE Z
|
||||||
default: newCoord = float3(0, 0, 0); break; // silences warning
|
default: newCoord = float3(0, 0, 0); break; // silences warning
|
||||||
|
@ -83,3 +83,28 @@ fragment float4 BlitFromCube(
|
||||||
return sourceTexture.sample(sourceSampler, newCoord, level(sourceRegion.MipLevel));
|
return sourceTexture.sample(sourceSampler, newCoord, level(sourceRegion.MipLevel));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if COMPILE_BlitFromCubeArray
|
||||||
|
fragment float4 BlitFromCubeArray(
|
||||||
|
VertexToFragment input [[stage_in]],
|
||||||
|
constant SourceRegion &sourceRegion [[buffer(0)]],
|
||||||
|
texturecube_array<float> sourceTexture [[texture(0)]],
|
||||||
|
sampler sourceSampler [[sampler(0)]])
|
||||||
|
{
|
||||||
|
// Thanks, Wikipedia! https://en.wikipedia.org/wiki/Cube_mapping
|
||||||
|
float2 scaledUV = sourceRegion.UVLeftTop + sourceRegion.UVDimensions * input.tex;
|
||||||
|
float u = 2.0 * scaledUV.x - 1.0;
|
||||||
|
float v = 2.0 * scaledUV.y - 1.0;
|
||||||
|
float3 newCoord;
|
||||||
|
switch (((uint)sourceRegion.LayerOrDepth) % 6) {
|
||||||
|
case 0: newCoord = float3(1.0, -v, -u); break; // POSITIVE X
|
||||||
|
case 1: newCoord = float3(-1.0, -v, u); break; // NEGATIVE X
|
||||||
|
case 2: newCoord = float3(u, 1.0, -v); break; // POSITIVE Y
|
||||||
|
case 3: newCoord = float3(u, -1.0, v); break; // NEGATIVE Y
|
||||||
|
case 4: newCoord = float3(u, -v, 1.0); break; // POSITIVE Z
|
||||||
|
case 5: newCoord = float3(-u, -v, -1.0); break; // NEGATIVE Z
|
||||||
|
default: newCoord = float3(0, 0, 0); break; // silences warning
|
||||||
|
}
|
||||||
|
return sourceTexture.sample(sourceSampler, newCoord, (uint)sourceRegion.LayerOrDepth / 6, level(sourceRegion.MipLevel));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -307,10 +307,11 @@ static NSUInteger SDLToMetal_SampleCount[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static MTLTextureType SDLToMetal_TextureType[] = {
|
static MTLTextureType SDLToMetal_TextureType[] = {
|
||||||
MTLTextureType2D, // SDL_GPU_TEXTURETYPE_2D
|
MTLTextureType2D, // SDL_GPU_TEXTURETYPE_2D
|
||||||
MTLTextureType2DArray, // SDL_GPU_TEXTURETYPE_2D_ARRAY
|
MTLTextureType2DArray, // SDL_GPU_TEXTURETYPE_2D_ARRAY
|
||||||
MTLTextureType3D, // SDL_GPU_TEXTURETYPE_3D
|
MTLTextureType3D, // SDL_GPU_TEXTURETYPE_3D
|
||||||
MTLTextureTypeCube // SDL_GPU_TEXTURETYPE_CUBE
|
MTLTextureTypeCube, // SDL_GPU_TEXTURETYPE_CUBE
|
||||||
|
MTLTextureTypeCubeArray // SDL_GPU_TEXTURETYPE_CUBE_ARRAY
|
||||||
};
|
};
|
||||||
|
|
||||||
static SDL_GPUTextureFormat SwapchainCompositionToFormat[] = {
|
static SDL_GPUTextureFormat SwapchainCompositionToFormat[] = {
|
||||||
|
@ -612,6 +613,7 @@ struct MetalRenderer
|
||||||
SDL_GPUShader *blitFrom2DArrayShader;
|
SDL_GPUShader *blitFrom2DArrayShader;
|
||||||
SDL_GPUShader *blitFrom3DShader;
|
SDL_GPUShader *blitFrom3DShader;
|
||||||
SDL_GPUShader *blitFromCubeShader;
|
SDL_GPUShader *blitFromCubeShader;
|
||||||
|
SDL_GPUShader *blitFromCubeArrayShader;
|
||||||
|
|
||||||
SDL_GPUSampler *blitNearestSampler;
|
SDL_GPUSampler *blitNearestSampler;
|
||||||
SDL_GPUSampler *blitLinearSampler;
|
SDL_GPUSampler *blitLinearSampler;
|
||||||
|
@ -1348,7 +1350,10 @@ static MetalTexture *METAL_INTERNAL_CreateTexture(
|
||||||
textureDescriptor.depth = (createinfo->type == SDL_GPU_TEXTURETYPE_3D) ? createinfo->layer_count_or_depth : 1;
|
textureDescriptor.depth = (createinfo->type == SDL_GPU_TEXTURETYPE_3D) ? createinfo->layer_count_or_depth : 1;
|
||||||
textureDescriptor.mipmapLevelCount = createinfo->num_levels;
|
textureDescriptor.mipmapLevelCount = createinfo->num_levels;
|
||||||
textureDescriptor.sampleCount = 1;
|
textureDescriptor.sampleCount = 1;
|
||||||
textureDescriptor.arrayLength = (createinfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY) ? createinfo->layer_count_or_depth : 1;
|
textureDescriptor.arrayLength =
|
||||||
|
(createinfo->type == SDL_GPU_TEXTURETYPE_2D_ARRAY || createinfo->type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY)
|
||||||
|
? createinfo->layer_count_or_depth
|
||||||
|
: 1;
|
||||||
textureDescriptor.storageMode = MTLStorageModePrivate;
|
textureDescriptor.storageMode = MTLStorageModePrivate;
|
||||||
|
|
||||||
textureDescriptor.usage = 0;
|
textureDescriptor.usage = 0;
|
||||||
|
@ -2953,6 +2958,7 @@ static void METAL_Blit(
|
||||||
renderer->blitFrom2DArrayShader,
|
renderer->blitFrom2DArrayShader,
|
||||||
renderer->blitFrom3DShader,
|
renderer->blitFrom3DShader,
|
||||||
renderer->blitFromCubeShader,
|
renderer->blitFromCubeShader,
|
||||||
|
renderer->blitFromCubeArrayShader,
|
||||||
&renderer->blitPipelines,
|
&renderer->blitPipelines,
|
||||||
&renderer->blitPipelineCount,
|
&renderer->blitPipelineCount,
|
||||||
&renderer->blitPipelineCapacity);
|
&renderer->blitPipelineCapacity);
|
||||||
|
@ -3466,6 +3472,7 @@ static Uint8 METAL_INTERNAL_CreateSwapchain(
|
||||||
renderer->blitFrom2DArrayShader,
|
renderer->blitFrom2DArrayShader,
|
||||||
renderer->blitFrom3DShader,
|
renderer->blitFrom3DShader,
|
||||||
renderer->blitFromCubeShader,
|
renderer->blitFromCubeShader,
|
||||||
|
renderer->blitFromCubeArrayShader,
|
||||||
&renderer->blitPipelines,
|
&renderer->blitPipelines,
|
||||||
&renderer->blitPipelineCount,
|
&renderer->blitPipelineCount,
|
||||||
&renderer->blitPipelineCapacity);
|
&renderer->blitPipelineCapacity);
|
||||||
|
@ -3793,6 +3800,14 @@ static bool METAL_SupportsTextureFormat(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cube arrays are not supported on older iOS devices
|
||||||
|
if (type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
|
||||||
|
if (!([renderer->device supportsFamily:MTLGPUFamilyCommon2] ||
|
||||||
|
[renderer->device supportsFamily:MTLGPUFamilyApple4])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (format) {
|
switch (format) {
|
||||||
// Apple GPU exclusive
|
// Apple GPU exclusive
|
||||||
case SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM:
|
case SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM:
|
||||||
|
@ -3932,6 +3947,19 @@ static void METAL_INTERNAL_InitBlitResources(
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to compile BlitFromCube fragment shader!");
|
SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to compile BlitFromCube fragment shader!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BlitFromCubeArray fragment shader
|
||||||
|
shaderModuleCreateInfo.code = BlitFromCubeArray_metallib;
|
||||||
|
shaderModuleCreateInfo.code_size = BlitFromCubeArray_metallib_len;
|
||||||
|
shaderModuleCreateInfo.entrypoint = "BlitFromCubeArray";
|
||||||
|
|
||||||
|
renderer->blitFromCubeArrayShader = METAL_CreateShader(
|
||||||
|
(SDL_GPURenderer *)renderer,
|
||||||
|
&shaderModuleCreateInfo);
|
||||||
|
|
||||||
|
if (renderer->blitFromCubeArrayShader == NULL) {
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to compile BlitFromCubeArray fragment shader!");
|
||||||
|
}
|
||||||
|
|
||||||
// Create samplers
|
// Create samplers
|
||||||
createinfo.address_mode_u = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE;
|
createinfo.address_mode_u = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE;
|
||||||
createinfo.address_mode_v = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE;
|
createinfo.address_mode_v = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE;
|
||||||
|
@ -3979,6 +4007,7 @@ static void METAL_INTERNAL_DestroyBlitResources(
|
||||||
METAL_ReleaseShader(driverData, renderer->blitFrom2DArrayShader);
|
METAL_ReleaseShader(driverData, renderer->blitFrom2DArrayShader);
|
||||||
METAL_ReleaseShader(driverData, renderer->blitFrom3DShader);
|
METAL_ReleaseShader(driverData, renderer->blitFrom3DShader);
|
||||||
METAL_ReleaseShader(driverData, renderer->blitFromCubeShader);
|
METAL_ReleaseShader(driverData, renderer->blitFromCubeShader);
|
||||||
|
METAL_ReleaseShader(driverData, renderer->blitFromCubeArrayShader);
|
||||||
|
|
||||||
for (Uint32 i = 0; i < renderer->blitPipelineCount; i += 1) {
|
for (Uint32 i = 0; i < renderer->blitPipelineCount; i += 1) {
|
||||||
METAL_ReleaseGraphicsPipeline(driverData, renderer->blitPipelines[i].pipeline);
|
METAL_ReleaseGraphicsPipeline(driverData, renderer->blitPipelines[i].pipeline);
|
||||||
|
|
|
@ -4,7 +4,7 @@ set -x
|
||||||
set -e
|
set -e
|
||||||
cd `dirname "$0"`
|
cd `dirname "$0"`
|
||||||
|
|
||||||
shadernames=(FullscreenVert BlitFrom2D BlitFrom2DArray BlitFrom3D BlitFromCube)
|
shadernames=(FullscreenVert BlitFrom2D BlitFrom2DArray BlitFrom3D BlitFromCube BlitFromCubeArray)
|
||||||
|
|
||||||
generate_shaders()
|
generate_shaders()
|
||||||
{
|
{
|
||||||
|
@ -14,7 +14,7 @@ generate_shaders()
|
||||||
minversion=$4
|
minversion=$4
|
||||||
|
|
||||||
for shadername in "${shadernames[@]}"; do
|
for shadername in "${shadernames[@]}"; do
|
||||||
xcrun -sdk $sdkplatform metal -c -std=$compileplatform-metal1.1 -m$sdkplatform-version-min=$minversion -Wall -O3 -D COMPILE_$shadername -o ./$shadername.air ./Metal_Blit.metal || exit $?
|
xcrun -sdk $sdkplatform metal -c -std=$compileplatform-metal2.0 -m$sdkplatform-version-min=$minversion -Wall -O3 -D COMPILE_$shadername -o ./$shadername.air ./Metal_Blit.metal || exit $?
|
||||||
xcrun -sdk $sdkplatform metallib -o $shadername.metallib $shadername.air || exit $?
|
xcrun -sdk $sdkplatform metallib -o $shadername.metallib $shadername.air || exit $?
|
||||||
xxd -i $shadername.metallib | perl -w -p -e 's/\Aunsigned /const unsigned /;' >./${shadername}_$fileplatform.h
|
xxd -i $shadername.metallib | perl -w -p -e 's/\Aunsigned /const unsigned /;' >./${shadername}_$fileplatform.h
|
||||||
rm -f $shadername.air $shadername.metallib
|
rm -f $shadername.air $shadername.metallib
|
||||||
|
@ -22,10 +22,10 @@ generate_shaders()
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_shaders macos macos macosx 10.11
|
generate_shaders macos macos macosx 10.11
|
||||||
generate_shaders ios ios iphoneos 8.0
|
generate_shaders ios ios iphoneos 11.0
|
||||||
generate_shaders iphonesimulator ios iphonesimulator 8.0
|
generate_shaders iphonesimulator ios iphonesimulator 11.0
|
||||||
generate_shaders tvos ios appletvos 9.0
|
generate_shaders tvos ios appletvos 11.0
|
||||||
generate_shaders tvsimulator ios appletvsimulator 9.0
|
generate_shaders tvsimulator ios appletvsimulator 11.0
|
||||||
|
|
||||||
# Bundle together one mega-header
|
# Bundle together one mega-header
|
||||||
catShaders()
|
catShaders()
|
||||||
|
|
|
@ -5650,7 +5650,7 @@ static VulkanTexture *VULKAN_INTERNAL_CreateTexture(
|
||||||
texture->isMSAAColorTarget = isMSAAColorTarget;
|
texture->isMSAAColorTarget = isMSAAColorTarget;
|
||||||
texture->markedForDestroy = 0;
|
texture->markedForDestroy = 0;
|
||||||
|
|
||||||
if (type == SDL_GPU_TEXTURETYPE_CUBE) {
|
if (type == SDL_GPU_TEXTURETYPE_CUBE || type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
|
||||||
imageCreateFlags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
|
imageCreateFlags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
|
||||||
} else if (type == SDL_GPU_TEXTURETYPE_3D) {
|
} else if (type == SDL_GPU_TEXTURETYPE_3D) {
|
||||||
imageCreateFlags |= VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT;
|
imageCreateFlags |= VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT;
|
||||||
|
@ -5734,6 +5734,8 @@ static VulkanTexture *VULKAN_INTERNAL_CreateTexture(
|
||||||
|
|
||||||
if (type == SDL_GPU_TEXTURETYPE_CUBE) {
|
if (type == SDL_GPU_TEXTURETYPE_CUBE) {
|
||||||
imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_CUBE;
|
imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_CUBE;
|
||||||
|
} else if (type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY){
|
||||||
|
imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
|
||||||
} else if (type == SDL_GPU_TEXTURETYPE_3D) {
|
} else if (type == SDL_GPU_TEXTURETYPE_3D) {
|
||||||
imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_3D;
|
imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_3D;
|
||||||
} else if (type == SDL_GPU_TEXTURETYPE_2D_ARRAY) {
|
} else if (type == SDL_GPU_TEXTURETYPE_2D_ARRAY) {
|
||||||
|
@ -10944,7 +10946,7 @@ static bool VULKAN_SupportsTextureFormat(
|
||||||
vulkanUsage |= VK_IMAGE_USAGE_STORAGE_BIT;
|
vulkanUsage |= VK_IMAGE_USAGE_STORAGE_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == SDL_GPU_TEXTURETYPE_CUBE) {
|
if (type == SDL_GPU_TEXTURETYPE_CUBE || type == SDL_GPU_TEXTURETYPE_CUBE_ARRAY) {
|
||||||
createFlags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
|
createFlags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11531,6 +11533,7 @@ static Uint8 VULKAN_INTERNAL_CreateLogicalDevice(
|
||||||
SDL_zero(desiredDeviceFeatures);
|
SDL_zero(desiredDeviceFeatures);
|
||||||
desiredDeviceFeatures.independentBlend = VK_TRUE;
|
desiredDeviceFeatures.independentBlend = VK_TRUE;
|
||||||
desiredDeviceFeatures.samplerAnisotropy = VK_TRUE;
|
desiredDeviceFeatures.samplerAnisotropy = VK_TRUE;
|
||||||
|
desiredDeviceFeatures.imageCubeArray = VK_TRUE;
|
||||||
|
|
||||||
if (haveDeviceFeatures.fillModeNonSolid) {
|
if (haveDeviceFeatures.fillModeNonSolid) {
|
||||||
desiredDeviceFeatures.fillModeNonSolid = VK_TRUE;
|
desiredDeviceFeatures.fillModeNonSolid = VK_TRUE;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue