From: Andrey Tuganov Date: Thu, 2 Mar 2017 20:23:02 +0000 (-0500) Subject: Fix invalid SPIR-V in dEQP-VK.sparse_resources X-Git-Tag: upstream/0.1.0~9^2~20^2~21 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0d16f7a9a94a1a2356c9a4e0c4265efb887a8c6f;p=platform%2Fupstream%2FVK-GL-CTS.git Fix invalid SPIR-V in dEQP-VK.sparse_resources Fixed issue: SPIR-V code generated in - vktSparseResourcesShaderIntrinsicsStorage.cpp - vktSparseResourcesShaderIntrinsicsSampled.cpp violates non-aggregate type declaration uniqueness rule of SPIR-V specification. Affects: dEQP-VK.sparse_resources.shader_intrinsics.* Components: Vulkan VK-GL-CTS issue: 230 Change-Id: Id39663a17684923f37924559917af524cf68f6c0 --- diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsBase.cpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsBase.cpp index 12aa864..a870437 100644 --- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsBase.cpp +++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsBase.cpp @@ -55,6 +55,34 @@ std::string getOpTypeImageComponent (const tcu::TextureFormat& format) } } +std::string getImageComponentTypeName (const tcu::TextureFormat& format) +{ + switch (tcu::getTextureChannelClass(format.type)) + { + case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: + return "%type_uint"; + case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: + return "%type_int"; + default: + DE_ASSERT(0); + return ""; + } +} + +std::string getImageComponentVec4TypeName (const tcu::TextureFormat& format) +{ + switch (tcu::getTextureChannelClass(format.type)) + { + case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: + return "%type_uvec4"; + case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: + return "%type_ivec4"; + default: + DE_ASSERT(0); + return ""; + } +} + std::string getOpTypeImageSparse (const ImageType imageType, const tcu::TextureFormat& format, const std::string& componentType, diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsBase.hpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsBase.hpp index 5c1028f..65c96c9 100644 --- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsBase.hpp +++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsBase.hpp @@ -86,7 +86,9 @@ enum SpirVFunction SPARSE_SPIRV_FUNCTION_TYPE_LAST }; -std::string getOpTypeImageComponent (const tcu::TextureFormat& format); +std::string getOpTypeImageComponent (const tcu::TextureFormat& format); +std::string getImageComponentTypeName (const tcu::TextureFormat& format); +std::string getImageComponentVec4TypeName (const tcu::TextureFormat& format); std::string getOpTypeImageSparse (const ImageType imageType, const tcu::TextureFormat& format, diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsSampled.cpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsSampled.cpp index 893f57c..d5f0801 100644 --- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsSampled.cpp +++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsSampled.cpp @@ -97,6 +97,9 @@ void SparseShaderIntrinsicsCaseSampledBase::initPrograms (vk::SourceCollections& // Create fragment shader std::ostringstream fs; + const std::string typeImgComp = getImageComponentTypeName(m_format); + const std::string typeImgCompVec4 = getImageComponentVec4TypeName(m_format); + fs << "OpCapability Shader\n" << "OpCapability SampledCubeArray\n" << "OpCapability ImageCubeArray\n" @@ -145,27 +148,26 @@ void SparseShaderIntrinsicsCaseSampledBase::initPrograms (vk::SourceCollections& << "%type_vec2 = OpTypeVector %type_float 2\n" << "%type_vec3 = OpTypeVector %type_float 3\n" << "%type_vec4 = OpTypeVector %type_float 4\n" + << "%type_ivec4 = OpTypeVector %type_int 4\n" + << "%type_uvec4 = OpTypeVector %type_uint 4\n" << "%type_uniformblock = OpTypeStruct %type_uint %type_vec2\n" - << "%type_img_comp = " << getOpTypeImageComponent(m_format) << "\n" - << "%type_img_comp_vec4 = OpTypeVector %type_img_comp 4\n" - << "%type_struct_int_img_comp_vec4 = OpTypeStruct %type_int %type_img_comp_vec4\n" + << "%type_struct_int_img_comp_vec4 = OpTypeStruct %type_int " << typeImgCompVec4 << "\n" << "%type_input_vec3 = OpTypePointer Input %type_vec3\n" << "%type_input_float = OpTypePointer Input %type_float\n" - << "%type_output_img_comp_vec4 = OpTypePointer Output %type_img_comp_vec4\n" + << "%type_output_img_comp_vec4 = OpTypePointer Output " << typeImgCompVec4 << "\n" << "%type_output_uint = OpTypePointer Output %type_uint\n" << "%type_function_int = OpTypePointer Function %type_int\n" - << "%type_function_img_comp = OpTypePointer Function %type_img_comp\n" - << "%type_function_img_comp_vec4 = OpTypePointer Function %type_img_comp_vec4\n" + << "%type_function_img_comp_vec4 = OpTypePointer Function " << typeImgCompVec4 << "\n" << "%type_function_int_img_comp_vec4 = OpTypePointer Function %type_struct_int_img_comp_vec4\n" << "%type_pushconstant_uniformblock = OpTypePointer PushConstant %type_uniformblock\n" << "%type_pushconstant_uniformblock_member_lod = OpTypePointer PushConstant %type_uint\n" << "%type_pushconstant_uniformblock_member_size = OpTypePointer PushConstant %type_vec2\n" - << "%type_image_sparse = " << getOpTypeImageSparse(m_imageType, m_format, "%type_img_comp", true) << "\n" + << "%type_image_sparse = " << getOpTypeImageSparse(m_imageType, m_format, typeImgComp, true) << "\n" << "%type_sampled_image_sparse = OpTypeSampledImage %type_image_sparse\n" << "%type_uniformconst_image_sparse = OpTypePointer UniformConstant %type_sampled_image_sparse\n" @@ -216,7 +218,7 @@ void SparseShaderIntrinsicsCaseSampledBase::initPrograms (vk::SourceCollections& << sparseImageOpString("%local_sparse_op_result", "%type_struct_int_img_comp_vec4", "%local_image_sparse", coordString, "%local_uniformblock_member_float_lod") << "\n" // Load texel value - << "%local_img_comp_vec4 = OpCompositeExtract %type_img_comp_vec4 %local_sparse_op_result 1\n" + << "%local_img_comp_vec4 = OpCompositeExtract " << typeImgCompVec4 << " %local_sparse_op_result 1\n" << "OpStore %output_texel %local_img_comp_vec4\n" @@ -285,6 +287,9 @@ std::string SparseCaseOpImageSparseGather::sparseImageOpString (const std::strin std::ostringstream src; + const std::string typeImgComp = getImageComponentTypeName(m_format); + const std::string typeImgCompVec4 = getImageComponentVec4TypeName(m_format); + // Bias the coord value by half a texel, so we sample from center of 2x2 gather rectangle src << "%local_image_width = OpCompositeExtract %type_float %local_uniformblock_member_size 0\n"; @@ -301,17 +306,17 @@ std::string SparseCaseOpImageSparseGather::sparseImageOpString (const std::strin src << "%local_gather_residency_code = OpCompositeExtract %type_int %local_sparse_gather_result_x 0\n"; - src << "%local_gather_texels_x = OpCompositeExtract %type_img_comp_vec4 %local_sparse_gather_result_x 1\n"; - src << "%local_gather_texels_y = OpCompositeExtract %type_img_comp_vec4 %local_sparse_gather_result_y 1\n"; - src << "%local_gather_texels_z = OpCompositeExtract %type_img_comp_vec4 %local_sparse_gather_result_z 1\n"; - src << "%local_gather_texels_w = OpCompositeExtract %type_img_comp_vec4 %local_sparse_gather_result_w 1\n"; + src << "%local_gather_texels_x = OpCompositeExtract " << typeImgCompVec4 << " %local_sparse_gather_result_x 1\n"; + src << "%local_gather_texels_y = OpCompositeExtract " << typeImgCompVec4 << " %local_sparse_gather_result_y 1\n"; + src << "%local_gather_texels_z = OpCompositeExtract " << typeImgCompVec4 << " %local_sparse_gather_result_z 1\n"; + src << "%local_gather_texels_w = OpCompositeExtract " << typeImgCompVec4 << " %local_sparse_gather_result_w 1\n"; - src << "%local_gather_primary_texel_x = OpCompositeExtract %type_img_comp %local_gather_texels_x 3\n"; - src << "%local_gather_primary_texel_y = OpCompositeExtract %type_img_comp %local_gather_texels_y 3\n"; - src << "%local_gather_primary_texel_z = OpCompositeExtract %type_img_comp %local_gather_texels_z 3\n"; - src << "%local_gather_primary_texel_w = OpCompositeExtract %type_img_comp %local_gather_texels_w 3\n"; + src << "%local_gather_primary_texel_x = OpCompositeExtract " << typeImgComp << " %local_gather_texels_x 3\n"; + src << "%local_gather_primary_texel_y = OpCompositeExtract " << typeImgComp << " %local_gather_texels_y 3\n"; + src << "%local_gather_primary_texel_z = OpCompositeExtract " << typeImgComp << " %local_gather_texels_z 3\n"; + src << "%local_gather_primary_texel_w = OpCompositeExtract " << typeImgComp << " %local_gather_texels_w 3\n"; - src << "%local_gather_primary_texel = OpCompositeConstruct %type_img_comp_vec4 %local_gather_primary_texel_x %local_gather_primary_texel_y %local_gather_primary_texel_z %local_gather_primary_texel_w\n"; + src << "%local_gather_primary_texel = OpCompositeConstruct " << typeImgCompVec4 << " %local_gather_primary_texel_x %local_gather_primary_texel_y %local_gather_primary_texel_z %local_gather_primary_texel_w\n"; src << resultVariable << " = OpCompositeConstruct " << resultType << " %local_gather_residency_code %local_gather_primary_texel\n"; return src.str(); diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsStorage.cpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsStorage.cpp index a2fefd6..1793bc6 100644 --- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsStorage.cpp +++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsStorage.cpp @@ -55,6 +55,11 @@ void SparseShaderIntrinsicsCaseStorage::initPrograms (vk::SourceCollections& pro // Create compute program std::ostringstream src; + const std::string typeImgComp = getImageComponentTypeName(m_format); + const std::string typeImgCompVec4 = getImageComponentVec4TypeName(m_format); + const std::string typeImageSparse = getSparseImageTypeName(); + const std::string typeUniformConstImageSparse = getUniformConstSparseImageTypeName(); + src << "OpCapability Shader\n" << "OpCapability ImageCubeArray\n" << "OpCapability SparseResidency\n" @@ -104,38 +109,37 @@ void SparseShaderIntrinsicsCaseStorage::initPrograms (vk::SourceCollections& pro << "%type_uint = OpTypeInt 32 0\n" << "%type_ivec2 = OpTypeVector %type_int 2\n" << "%type_ivec3 = OpTypeVector %type_int 3\n" + << "%type_ivec4 = OpTypeVector %type_int 4\n" << "%type_uvec3 = OpTypeVector %type_uint 3\n" << "%type_uvec4 = OpTypeVector %type_uint 4\n" - << "%type_img_comp = " << getOpTypeImageComponent(m_format) << "\n" - << "%type_img_comp_vec4 = OpTypeVector %type_img_comp 4\n" - << "%type_struct_int_img_comp_vec4 = OpTypeStruct %type_int %type_img_comp_vec4\n" + << "%type_struct_int_img_comp_vec4 = OpTypeStruct %type_int " << typeImgCompVec4 << "\n" << "%type_input_uint = OpTypePointer Input %type_uint\n" << "%type_input_uvec3 = OpTypePointer Input %type_uvec3\n" << "%type_function_int = OpTypePointer Function %type_int\n" - << "%type_function_img_comp_vec4 = OpTypePointer Function %type_img_comp_vec4\n" + << "%type_function_img_comp_vec4 = OpTypePointer Function " << typeImgCompVec4 << "\n" << "%type_void = OpTypeVoid\n" << "%type_void_func = OpTypeFunction %type_void\n" - // Sparse image type declaration - << sparseImageTypeDecl("%type_image_sparse", "%type_img_comp") - << "%type_uniformconst_image_sparse = OpTypePointer UniformConstant %type_image_sparse\n" + // Sparse image without sampler type declaration + << "%type_image_sparse = " << getOpTypeImageSparse(m_imageType, m_format, typeImgComp, false) << "\n" + << "%type_uniformconst_image_sparse = OpTypePointer UniformConstant %type_image_sparse\n" - // Texels image type declaration - << "%type_image_texels = " << getOpTypeImageSparse(m_imageType, m_format, "%type_img_comp", false) << "\n" - << "%type_uniformconst_image_texels = OpTypePointer UniformConstant %type_image_texels\n" + // Sparse image with sampler type declaration + << "%type_image_sparse_with_sampler = " << getOpTypeImageSparse(m_imageType, m_format, typeImgComp, true) << "\n" + << "%type_uniformconst_image_sparse_with_sampler = OpTypePointer UniformConstant %type_image_sparse_with_sampler\n" // Residency image type declaration << "%type_image_residency = " << getOpTypeImageResidency(m_imageType) << "\n" << "%type_uniformconst_image_residency = OpTypePointer UniformConstant %type_image_residency\n" // Declare sparse image variable - << "%uniform_image_sparse = OpVariable %type_uniformconst_image_sparse UniformConstant\n" + << "%uniform_image_sparse = OpVariable " << typeUniformConstImageSparse << " UniformConstant\n" // Declare output image variable for storing texels - << "%uniform_image_texels = OpVariable %type_uniformconst_image_texels UniformConstant\n" + << "%uniform_image_texels = OpVariable %type_uniformconst_image_sparse UniformConstant\n" // Declare output image variable for storing residency information << "%uniform_image_residency = OpVariable %type_uniformconst_image_residency UniformConstant\n" @@ -201,20 +205,20 @@ void SparseShaderIntrinsicsCaseStorage::initPrograms (vk::SourceCollections& pro << "%label_in_range_z = OpLabel\n" // Load sparse image - << "%local_image_sparse = OpLoad %type_image_sparse %uniform_image_sparse\n" + << "%local_image_sparse = OpLoad " << typeImageSparse << " %uniform_image_sparse\n" // Call OpImageSparse* << sparseImageOpString("%local_sparse_op_result", "%type_struct_int_img_comp_vec4", "%local_image_sparse", coordString, "%constant_int_0") << "\n" // Load the texel from the sparse image to local variable for OpImageSparse* - << "%local_img_comp_vec4 = OpCompositeExtract %type_img_comp_vec4 %local_sparse_op_result 1\n" + << "%local_img_comp_vec4 = OpCompositeExtract " << typeImgCompVec4 << " %local_sparse_op_result 1\n" // Load residency code for OpImageSparse* << "%local_residency_code = OpCompositeExtract %type_int %local_sparse_op_result 0\n" // End Call OpImageSparse* // Load texels image - << "%local_image_texels = OpLoad %type_image_texels %uniform_image_texels\n" + << "%local_image_texels = OpLoad %type_image_sparse %uniform_image_texels\n" // Write the texel to output image via OpImageWrite << "OpImageWrite %local_image_texels " << coordString << " %local_img_comp_vec4\n" @@ -255,13 +259,14 @@ void SparseShaderIntrinsicsCaseStorage::initPrograms (vk::SourceCollections& pro programCollection.spirvAsmSources.add("compute") << src.str(); } -std::string SparseCaseOpImageSparseFetch::sparseImageTypeDecl (const std::string& imageType, const std::string& componentType) const +std::string SparseCaseOpImageSparseFetch::getSparseImageTypeName (void) const { - std::ostringstream src; - - src << imageType << " = " << getOpTypeImageSparse(m_imageType, m_format, componentType, true) << "\n"; + return "%type_image_sparse_with_sampler"; +} - return src.str(); +std::string SparseCaseOpImageSparseFetch::getUniformConstSparseImageTypeName (void) const +{ + return "%type_uniformconst_image_sparse_with_sampler"; } std::string SparseCaseOpImageSparseFetch::sparseImageOpString (const std::string& resultVariable, @@ -277,13 +282,14 @@ std::string SparseCaseOpImageSparseFetch::sparseImageOpString (const std::strin return src.str(); } -std::string SparseCaseOpImageSparseRead::sparseImageTypeDecl (const std::string& imageType, const std::string& componentType) const +std::string SparseCaseOpImageSparseRead::getSparseImageTypeName (void) const { - std::ostringstream src; - - src << imageType << " = " << getOpTypeImageSparse(m_imageType, m_format, componentType, false) << "\n"; + return "%type_image_sparse"; +} - return src.str(); +std::string SparseCaseOpImageSparseRead::getUniformConstSparseImageTypeName (void) const +{ + return "%type_uniformconst_image_sparse"; } std::string SparseCaseOpImageSparseRead::sparseImageOpString (const std::string& resultVariable, diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsStorage.hpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsStorage.hpp index fdc8940..a4eed30 100644 --- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsStorage.hpp +++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsStorage.hpp @@ -43,8 +43,8 @@ public: void initPrograms (vk::SourceCollections& programCollection) const; - virtual std::string sparseImageTypeDecl(const std::string& imageType, - const std::string& componentType) const = 0; + virtual std::string getSparseImageTypeName (void) const = 0; + virtual std::string getUniformConstSparseImageTypeName (void) const = 0; virtual std::string sparseImageOpString (const std::string& resultVariable, const std::string& resultType, @@ -66,7 +66,8 @@ public: TestInstance* createInstance(Context& context) const; - std::string sparseImageTypeDecl(const std::string& imageType, const std::string& componentType) const; + std::string getSparseImageTypeName (void) const; + std::string getUniformConstSparseImageTypeName (void) const; std::string sparseImageOpString(const std::string& resultVariable, const std::string& resultType, const std::string& image, const std::string& coord, const std::string& mipLevel) const; }; @@ -84,7 +85,8 @@ public: TestInstance* createInstance(Context& context) const; - std::string sparseImageTypeDecl(const std::string& imageType, const std::string& componentType) const; + std::string getSparseImageTypeName (void) const; + std::string getUniformConstSparseImageTypeName (void) const; std::string sparseImageOpString(const std::string& resultVariable, const std::string& resultType, const std::string& image, const std::string& coord, const std::string& mipLevel) const; };