Skip to content

Commit 769cb9d

Browse files
authored
[SPIR-V][vk::SampledTexture] #13. Support vk::SampledTextureCube and vk::SampledTextureCubeArray type. (#8214)
Part of #7979 The function definitions are equivalent to that of TextureCube and TextureCubeArray counterparts, just without Sampler argument. This is the last sampled texture type to be added.
1 parent 6dee5ce commit 769cb9d

File tree

48 files changed

+1200
-4
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1200
-4
lines changed

include/dxc/dxcapi.internal.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,9 @@ enum LEGAL_INTRINSIC_COMPTYPES {
147147
LICOMPTYPE_VK_SAMPLED_TEXTURE2DMS = 61,
148148
LICOMPTYPE_VK_SAMPLED_TEXTURE2DMS_ARRAY = 62,
149149
LICOMPTYPE_VK_SAMPLED_TEXTURE3D = 63,
150-
LICOMPTYPE_COUNT = 64
150+
LICOMPTYPE_VK_SAMPLED_TEXTURECUBE = 64,
151+
LICOMPTYPE_VK_SAMPLED_TEXTURECUBE_ARRAY = 65,
152+
LICOMPTYPE_COUNT = 66
151153
#else
152154
LICOMPTYPE_COUNT = 56
153155
#endif

tools/clang/lib/SPIRV/LowerTypeVisitor.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -866,7 +866,10 @@ const SpirvType *LowerTypeVisitor::lowerVkTypeInVkNamespace(
866866
const spv::Dim dimension =
867867
suffix.startswith("1D")
868868
? spv::Dim::Dim1D
869-
: (suffix.startswith("2D") ? spv::Dim::Dim2D : spv::Dim::Dim3D);
869+
: (suffix.startswith("2D")
870+
? spv::Dim::Dim2D
871+
: (suffix.startswith("3D") ? spv::Dim::Dim3D
872+
: spv::Dim::Cube));
870873
const bool isArray = suffix.endswith("Array");
871874
const bool isMS = suffix.find("MS") != StringRef::npos;
872875

tools/clang/lib/SPIRV/SpirvEmitter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4417,6 +4417,8 @@ SpirvEmitter::processBufferTextureGetDimensions(const CXXMemberCallExpr *expr) {
44174417
(typeName == "SampledTexture1DArray" && numArgs > 2) ||
44184418
(typeName == "SampledTexture2D" && numArgs > 2) ||
44194419
(typeName == "SampledTexture2DArray" && numArgs > 3) ||
4420+
(typeName == "SampledTextureCUBE" && numArgs > 2) ||
4421+
(typeName == "SampledTextureCUBEArray" && numArgs > 3) ||
44204422
(typeName == "SampledTexture3D" && numArgs > 3) ||
44214423
(typeName == "TextureCube" && numArgs > 2) ||
44224424
(typeName == "Texture3D" && numArgs > 3) ||

tools/clang/lib/Sema/SemaHLSL.cpp

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ enum ArBasicKind {
206206
AR_OBJECT_VK_SAMPLED_TEXTURE2D_ARRAY,
207207
AR_OBJECT_VK_SAMPLED_TEXTURE2DMS,
208208
AR_OBJECT_VK_SAMPLED_TEXTURE2DMS_ARRAY,
209+
AR_OBJECT_VK_SAMPLED_TEXTURECUBE,
210+
AR_OBJECT_VK_SAMPLED_TEXTURECUBE_ARRAY,
209211
AR_OBJECT_VK_SAMPLED_TEXTURE3D,
210212
#endif // ENABLE_SPIRV_CODEGEN
211213
// SPIRV change ends
@@ -573,6 +575,8 @@ const UINT g_uBasicKindProps[] = {
573575
BPROP_OBJECT | BPROP_RBUFFER, // AR_OBJECT_VK_SAMPLED_TEXTURE2D_ARRAY
574576
BPROP_OBJECT | BPROP_RBUFFER, // AR_OBJECT_VK_SAMPLED_TEXTURE2DMS
575577
BPROP_OBJECT | BPROP_RBUFFER, // AR_OBJECT_VK_SAMPLED_TEXTURE2DMS_ARRAY
578+
BPROP_OBJECT | BPROP_RBUFFER, // AR_OBJECT_VK_SAMPLED_TEXTURECUBE
579+
BPROP_OBJECT | BPROP_RBUFFER, // AR_OBJECT_VK_SAMPLED_TEXTURECUBE_ARRAY
576580
BPROP_OBJECT | BPROP_RBUFFER, // AR_OBJECT_VK_SAMPLED_TEXTURE3D
577581
#endif // ENABLE_SPIRV_CODEGEN
578582
// SPIRV change ends
@@ -1294,6 +1298,10 @@ static const ArBasicKind g_VKSampledTexture2DMSCT[] = {
12941298
AR_OBJECT_VK_SAMPLED_TEXTURE2DMS, AR_BASIC_UNKNOWN};
12951299
static const ArBasicKind g_VKSampledTexture2DMSArrayCT[] = {
12961300
AR_OBJECT_VK_SAMPLED_TEXTURE2DMS_ARRAY, AR_BASIC_UNKNOWN};
1301+
static const ArBasicKind g_VKSampledTextureCUBECT[] = {
1302+
AR_OBJECT_VK_SAMPLED_TEXTURECUBE, AR_BASIC_UNKNOWN};
1303+
static const ArBasicKind g_VKSampledTextureCUBEArrayCT[] = {
1304+
AR_OBJECT_VK_SAMPLED_TEXTURECUBE_ARRAY, AR_BASIC_UNKNOWN};
12971305
static const ArBasicKind g_VKSampledTexture3DCT[] = {
12981306
AR_OBJECT_VK_SAMPLED_TEXTURE3D, AR_BASIC_UNKNOWN};
12991307
#endif
@@ -1365,6 +1373,8 @@ const ArBasicKind *g_LegalIntrinsicCompTypes[] = {
13651373
g_VKSampledTexture2DArrayCT, // LICOMPTYPE_VK_SAMPLED_TEXTURE2D_ARRAY
13661374
g_VKSampledTexture2DMSCT, // LICOMPTYPE_VK_SAMPLED_TEXTURE2DMS
13671375
g_VKSampledTexture2DMSArrayCT, // LICOMPTYPE_VK_SAMPLED_TEXTURE2DMS_ARRAY
1376+
g_VKSampledTextureCUBECT, // LICOMPTYPE_VK_SAMPLED_TEXTURECUBE
1377+
g_VKSampledTextureCUBEArrayCT, // LICOMPTYPE_VK_SAMPLED_TEXTURECUBE_ARRAY
13681378
g_VKSampledTexture3DCT, // LICOMPTYPE_VK_SAMPLED_TEXTURE3D
13691379
#endif
13701380
};
@@ -1428,7 +1438,8 @@ static const ArBasicKind g_ArBasicKindsAsTypes[] = {
14281438
AR_OBJECT_VK_BUFFER_POINTER, AR_OBJECT_VK_SAMPLED_TEXTURE1D,
14291439
AR_OBJECT_VK_SAMPLED_TEXTURE1D_ARRAY, AR_OBJECT_VK_SAMPLED_TEXTURE2D,
14301440
AR_OBJECT_VK_SAMPLED_TEXTURE2D_ARRAY, AR_OBJECT_VK_SAMPLED_TEXTURE2DMS,
1431-
AR_OBJECT_VK_SAMPLED_TEXTURE2DMS_ARRAY, AR_OBJECT_VK_SAMPLED_TEXTURE3D,
1441+
AR_OBJECT_VK_SAMPLED_TEXTURE2DMS_ARRAY, AR_OBJECT_VK_SAMPLED_TEXTURECUBE,
1442+
AR_OBJECT_VK_SAMPLED_TEXTURECUBE_ARRAY, AR_OBJECT_VK_SAMPLED_TEXTURE3D,
14321443
#endif // ENABLE_SPIRV_CODEGEN
14331444
// SPIRV change ends
14341445

@@ -1546,6 +1557,8 @@ static const uint8_t g_ArBasicKindsTemplateCount[] = {
15461557
1, // AR_OBJECT_VK_SAMPLED_TEXTURE2D_ARRAY
15471558
1, // AR_OBJECT_VK_SAMPLED_TEXTURE2DMS
15481559
1, // AR_OBJECT_VK_SAMPLED_TEXTURE2DMS_ARRAY
1560+
1, // AR_OBJECT_VK_SAMPLED_TEXTURECUBE
1561+
1, // AR_OBJECT_VK_SAMPLED_TEXTURECUBE_ARRAY
15491562
1, // AR_OBJECT_VK_SAMPLED_TEXTURE3D
15501563
#endif // ENABLE_SPIRV_CODEGEN
15511564
// SPIRV change ends
@@ -1706,6 +1719,8 @@ static const SubscriptOperatorRecord g_ArBasicKindsSubscripts[] = {
17061719
{3, MipsTrue, SampleFalse}, // AR_OBJECT_VK_SAMPLED_TEXTURE2D_ARRAY
17071720
{2, MipsFalse, SampleTrue}, // AR_OBJECT_VK_SAMPLED_TEXTURE2DMS
17081721
{3, MipsFalse, SampleTrue}, // AR_OBJECT_VK_SAMPLED_TEXTURE2DMS_ARRAY
1722+
{0, MipsFalse, SampleFalse}, // AR_OBJECT_VK_SAMPLED_TEXTURECUBE
1723+
{0, MipsFalse, SampleFalse}, // AR_OBJECT_VK_SAMPLED_TEXTURECUBE_ARRAY
17091724
{3, MipsTrue, SampleFalse}, // AR_OBJECT_VK_SAMPLED_TEXTURE3D
17101725
#endif // ENABLE_SPIRV_CODEGEN
17111726
// SPIRV change ends
@@ -1882,6 +1897,8 @@ static const char *g_ArBasicTypeNames[] = {
18821897
"SampledTexture2DArray",
18831898
"SampledTexture2DMS",
18841899
"SampledTexture2DMSArray",
1900+
"SampledTextureCUBE",
1901+
"SampledTextureCUBEArray",
18851902
"SampledTexture3D",
18861903
#endif // ENABLE_SPIRV_CODEGEN
18871904
// SPIRV change ends
@@ -2563,6 +2580,14 @@ static void GetIntrinsicMethods(ArBasicKind kind,
25632580
*intrinsics = g_VkSampledTexture2DMSArrayMethods;
25642581
*intrinsicCount = _countof(g_VkSampledTexture2DMSArrayMethods);
25652582
break;
2583+
case AR_OBJECT_VK_SAMPLED_TEXTURECUBE:
2584+
*intrinsics = g_VkSampledTextureCUBEMethods;
2585+
*intrinsicCount = _countof(g_VkSampledTextureCUBEMethods);
2586+
break;
2587+
case AR_OBJECT_VK_SAMPLED_TEXTURECUBE_ARRAY:
2588+
*intrinsics = g_VkSampledTextureCUBEArrayMethods;
2589+
*intrinsicCount = _countof(g_VkSampledTextureCUBEArrayMethods);
2590+
break;
25662591
case AR_OBJECT_VK_SAMPLED_TEXTURE3D:
25672592
*intrinsics = g_VkSampledTexture3DMethods;
25682593
*intrinsicCount = _countof(g_VkSampledTexture3DMethods);
@@ -4178,7 +4203,9 @@ class HLSLExternalSource : public ExternalSemaSource {
41784203
kind == AR_OBJECT_VK_SAMPLED_TEXTURE2D_ARRAY ||
41794204
kind == AR_OBJECT_VK_SAMPLED_TEXTURE2DMS ||
41804205
kind == AR_OBJECT_VK_SAMPLED_TEXTURE2DMS_ARRAY ||
4181-
kind == AR_OBJECT_VK_SAMPLED_TEXTURE3D) {
4206+
kind == AR_OBJECT_VK_SAMPLED_TEXTURE3D ||
4207+
kind == AR_OBJECT_VK_SAMPLED_TEXTURECUBE ||
4208+
kind == AR_OBJECT_VK_SAMPLED_TEXTURECUBE_ARRAY) {
41824209
if (!m_vkNSDecl)
41834210
continue;
41844211
QualType float4Type =
@@ -5174,10 +5201,16 @@ class HLSLExternalSource : public ExternalSemaSource {
51745201
ResClass = DXIL::ResourceClass::UAV;
51755202
return true;
51765203
case AR_OBJECT_TEXTURECUBE:
5204+
#ifdef ENABLE_SPIRV_CODEGEN
5205+
case AR_OBJECT_VK_SAMPLED_TEXTURECUBE:
5206+
#endif
51775207
ResKind = DXIL::ResourceKind::TextureCube;
51785208
ResClass = DXIL::ResourceClass::SRV;
51795209
return true;
51805210
case AR_OBJECT_TEXTURECUBE_ARRAY:
5211+
#ifdef ENABLE_SPIRV_CODEGEN
5212+
case AR_OBJECT_VK_SAMPLED_TEXTURECUBE_ARRAY:
5213+
#endif
51815214
ResKind = DXIL::ResourceKind::TextureCubeArray;
51825215
ResClass = DXIL::ResourceClass::SRV;
51835216
return true;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// RUN: %dxc -T ps_6_8 -E main -fcgl %s -spirv | FileCheck %s
2+
3+
// CHECK: OpCapability ImageQuery
4+
// CHECK: [[type_cube_image:%[a-zA-Z0-9_]+]] = OpTypeImage %float Cube 0 0 0 1 Unknown
5+
// CHECK: [[type_cube_sampled:%[a-zA-Z0-9_]+]] = OpTypeSampledImage [[type_cube_image]]
6+
7+
vk::SampledTextureCUBE<float4> tex;
8+
9+
void main() {
10+
float3 xyz = float3(0.5, 0.25, 0.75);
11+
12+
// CHECK: [[tex_load:%[a-zA-Z0-9_]+]] = OpLoad [[type_cube_sampled]] %tex
13+
// CHECK: [[xyz_load:%[a-zA-Z0-9_]+]] = OpLoad %v3float %xyz
14+
// CHECK: [[lod_query:%[a-zA-Z0-9_]+]] = OpImageQueryLod %v2float [[tex_load]] [[xyz_load]]
15+
// CHECK: {{%[0-9]+}} = OpCompositeExtract %float [[lod_query]] 1
16+
float lod = tex.CalculateLevelOfDetailUnclamped(xyz);
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// RUN: %dxc -T ps_6_8 -E main -fcgl %s -spirv | FileCheck %s
2+
3+
// CHECK: OpCapability ImageQuery
4+
// CHECK: [[type_cube_image:%[a-zA-Z0-9_]+]] = OpTypeImage %float Cube 0 0 0 1 Unknown
5+
// CHECK: [[type_cube_sampled:%[a-zA-Z0-9_]+]] = OpTypeSampledImage [[type_cube_image]]
6+
7+
vk::SampledTextureCUBE<float4> tex;
8+
9+
void main() {
10+
float3 xyz = float3(0.5, 0.25, 0.75);
11+
12+
// CHECK: [[tex_load:%[a-zA-Z0-9_]+]] = OpLoad [[type_cube_sampled]] %tex
13+
// CHECK: [[xyz_load:%[a-zA-Z0-9_]+]] = OpLoad %v3float %xyz
14+
// CHECK: [[lod_query:%[a-zA-Z0-9_]+]] = OpImageQueryLod %v2float [[tex_load]] [[xyz_load]]
15+
// CHECK: {{%[0-9]+}} = OpCompositeExtract %float [[lod_query]] 0
16+
float lod = tex.CalculateLevelOfDetail(xyz);
17+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// RUN: %dxc -T ps_6_8 -E main -fcgl %s -spirv | FileCheck %s
2+
3+
// CHECK: OpCapability SparseResidency
4+
5+
// CHECK: [[v3fc:%[0-9]+]] = OpConstantComposite %v3float %float_0_5 %float_0_25 %float_0_75
6+
// CHECK: [[type_cube_image:%[a-zA-Z0-9_]+]] = OpTypeImage %float Cube 0 0 0 1 Unknown
7+
// CHECK: [[type_cube_sampled:%[a-zA-Z0-9_]+]] = OpTypeSampledImage [[type_cube_image]]
8+
9+
vk::SampledTextureCUBE<float4> texf4;
10+
11+
float4 main() : SV_Target {
12+
// CHECK: [[tex0:%[a-zA-Z0-9_]+]] = OpLoad [[type_cube_sampled]] %texf4
13+
// CHECK: [[a:%[a-zA-Z0-9_]+]] = OpImageGather %v4float [[tex0]] [[v3fc]] %int_3 None
14+
float4 a = texf4.GatherAlpha(float3(0.5, 0.25, 0.75));
15+
16+
uint status;
17+
// CHECK: [[tex1:%[a-zA-Z0-9_]+]] = OpLoad [[type_cube_sampled]] %texf4
18+
// CHECK: [[b_sparse:%[a-zA-Z0-9_]+]] = OpImageSparseGather %SparseResidencyStruct [[tex1]] [[v3fc]] %int_3 None
19+
// CHECK: [[status0:%[a-zA-Z0-9_]+]] = OpCompositeExtract %uint [[b_sparse]] 0
20+
// CHECK: OpStore %status [[status0]]
21+
float4 b = texf4.GatherAlpha(float3(0.5, 0.25, 0.75), status);
22+
23+
return a + b;
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// RUN: %dxc -T ps_6_8 -E main -fcgl %s -spirv | FileCheck %s
2+
3+
// CHECK: OpCapability SparseResidency
4+
5+
// CHECK: [[v3fc:%[0-9]+]] = OpConstantComposite %v3float %float_0_5 %float_0_25 %float_0_75
6+
// CHECK: [[type_cube_image:%[a-zA-Z0-9_]+]] = OpTypeImage %float Cube 0 0 0 1 Unknown
7+
// CHECK: [[type_cube_sampled:%[a-zA-Z0-9_]+]] = OpTypeSampledImage [[type_cube_image]]
8+
9+
vk::SampledTextureCUBE<float4> texf4;
10+
11+
float4 main() : SV_Target {
12+
// CHECK: [[tex0:%[a-zA-Z0-9_]+]] = OpLoad [[type_cube_sampled]] %texf4
13+
// CHECK: [[a:%[a-zA-Z0-9_]+]] = OpImageGather %v4float [[tex0]] [[v3fc]] %int_2 None
14+
float4 a = texf4.GatherBlue(float3(0.5, 0.25, 0.75));
15+
16+
uint status;
17+
// CHECK: [[tex1:%[a-zA-Z0-9_]+]] = OpLoad [[type_cube_sampled]] %texf4
18+
// CHECK: [[b_sparse:%[a-zA-Z0-9_]+]] = OpImageSparseGather %SparseResidencyStruct [[tex1]] [[v3fc]] %int_2 None
19+
// CHECK: [[status0:%[a-zA-Z0-9_]+]] = OpCompositeExtract %uint [[b_sparse]] 0
20+
// CHECK: OpStore %status [[status0]]
21+
float4 b = texf4.GatherBlue(float3(0.5, 0.25, 0.75), status);
22+
23+
return a + b;
24+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// RUN: not %dxc -T ps_6_8 -E main -fcgl %s -spirv 2>&1 | FileCheck %s
2+
3+
vk::SampledTextureCUBE<float4> tex;
4+
5+
float4 main() : SV_Target {
6+
float4 a = tex.GatherCmpAlpha(float3(0.5, 0.25, 0.75), 0.25f);
7+
uint status;
8+
float4 b = tex.GatherCmpAlpha(float3(0.5, 0.25, 0.75), 0.25f, status);
9+
return a + b;
10+
}
11+
12+
// CHECK: error: no equivalent for GatherCmpAlpha intrinsic method in Vulkan
13+
// CHECK: error: no equivalent for GatherCmpAlpha intrinsic method in Vulkan
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// RUN: not %dxc -T ps_6_8 -E main -fcgl %s -spirv 2>&1 | FileCheck %s
2+
3+
vk::SampledTextureCUBE<float4> tex;
4+
5+
float4 main() : SV_Target {
6+
float4 a = tex.GatherCmpBlue(float3(0.5, 0.25, 0.75), 0.25f);
7+
uint status;
8+
float4 b = tex.GatherCmpBlue(float3(0.5, 0.25, 0.75), 0.25f, status);
9+
return a + b;
10+
}
11+
12+
// CHECK: error: no equivalent for GatherCmpBlue intrinsic method in Vulkan
13+
// CHECK: error: no equivalent for GatherCmpBlue intrinsic method in Vulkan

0 commit comments

Comments
 (0)