#include "vktSpvAsmComputeShaderCase.hpp"
#include "vktSpvAsmComputeShaderTestUtil.hpp"
#include "vktSpvAsmGraphicsShaderTestUtil.hpp"
+#include "vktSpvAsmUtils.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktTestGroupUtil.hpp"
struct Case
{
const char* name;
+ const char* interfaceOpCall;
const char* interfaceOpFunc;
const char* postInterfaceOp;
const char* postInterfaceOpGeom;
{
{ // Scalar cases
"scalar",
- // Passthrough interface_op_func
- "%interface_op_func = OpFunction %f16 None %f16_f32_function\n"
- " %io_param1 = OpFunctionParameter %f32\n"
- " %entry = OpLabel\n"
- " OpReturnValue %f16_0\n"
- " OpFunctionEnd\n",
+ "OpFConvert %f16",
+ "",
" %ret0 = OpFConvert %f16 %IF_input_val\n"
" OpStore %IF_output %ret0\n",
" %op_a3f16 = OpTypePointer Output %a3f16\n"
"%f16_f32_function = OpTypeFunction %f16 %f32\n"
" %a3f32 = OpTypeArray %f32 %c_i32_3\n"
- " %ip_a3f32 = OpTypePointer Input %a3f32\n"
- " %f16_0 = OpConstant %f16 0\n",
+ " %ip_a3f32 = OpTypePointer Input %a3f32\n",
"f32",
"f16",
{ // Vector cases
"vector",
- "%interface_op_func = OpFunction %v2f16 None %v2f16_v2f32_function\n"
- " %io_param1 = OpFunctionParameter %v2f32\n"
- " %entry = OpLabel\n"
- " OpReturnValue %v2f16_0\n"
- " OpFunctionEnd\n",
+ "OpFConvert %v2f16",
+ "",
" %ret0 = OpFConvert %v2f16 %IF_input_val\n"
" OpStore %IF_output %ret0\n",
" %op_a3v2f16 = OpTypePointer Output %a3v2f16\n"
"%v2f16_v2f32_function = OpTypeFunction %v2f16 %v2f32\n"
" %a3v2f32 = OpTypeArray %v2f32 %c_i32_3\n"
- " %ip_a3v2f32 = OpTypePointer Input %a3v2f32\n"
- " %f16_0 = OpConstant %f16 0\n"
- " %v2f16_0 = OpConstantComposite %v2f16 %f16_0 %f16_0\n",
+ " %ip_a3v2f32 = OpTypePointer Input %a3v2f32\n",
"v2f32",
"v2f16",
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
for (deUint32 rndModeIdx = 0; rndModeIdx < DE_LENGTH_OF_ARRAY(rndModes); ++rndModeIdx)
{
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall;
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc;
fragments["post_interface_op_frag"] = cases[caseIdx].postInterfaceOp;
fragments["post_interface_op_vert"] = cases[caseIdx].postInterfaceOp;
struct Case
{
const char* name;
+ const char* interfaceOpCall;
const char* interfaceOpFunc;
const char* preMain;
const char* inputType;
{ // Scalar cases
"scalar",
- "%interface_op_func = OpFunction %f32 None %f32_f16_function\n"
- " %io_param1 = OpFunctionParameter %f16\n"
- " %entry = OpLabel\n"
- " %ret = OpFConvert %f32 %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n",
+ "OpFConvert %f32",
+ "",
" %f16 = OpTypeFloat 16\n"
" %ip_f16 = OpTypePointer Input %f16\n"
{ // Vector cases
"vector",
- "%interface_op_func = OpFunction %v2f32 None %v2f32_v2f16_function\n"
- " %io_param1 = OpFunctionParameter %v2f16\n"
- " %entry = OpLabel\n"
- " %ret = OpFConvert %v2f32 %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n",
+ "OpFConvert %v2f32",
+ "",
" %f16 = OpTypeFloat 16\n"
" %v2f16 = OpTypeVector %f16 2\n"
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
{
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall;
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc;
fragments["pre_main"] = cases[caseIdx].preMain;
struct Case
{
const char* name;
+ const char* interfaceOpCall;
const char* interfaceOpFunc;
const char* preMain;
const char* inputType;
{ // Scalar cases
"scalar",
- "%interface_op_func = OpFunction %f16 None %f16_f16_function\n"
- " %io_param1 = OpFunctionParameter %f16\n"
- " %entry = OpLabel\n"
- " %ret = OpCopyObject %f16 %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n",
+ "OpCopyObject %f16",
+ "",
" %f16 = OpTypeFloat 16\n"
" %ip_f16 = OpTypePointer Input %f16\n"
{ // Vector cases
"vector",
- "%interface_op_func = OpFunction %v2f16 None %v2f16_v2f16_function\n"
- " %io_param1 = OpFunctionParameter %v2f16\n"
- " %entry = OpLabel\n"
- " %ret = OpCopyObject %v2f16 %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n",
+ "OpCopyObject %v2f16",
+ "",
" %f16 = OpTypeFloat 16\n"
" %v2f16 = OpTypeVector %f16 2\n"
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
{
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall;
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc;
fragments["pre_main"] = cases[caseIdx].preMain;
void addGraphics16BitStorageInputOutputFloat16To16x2Group (tcu::TestCaseGroup* testGroup)
{
- map<string, string> fragments;
RGBA defaultColors[4];
SpecConstants noSpecConstants;
PushConstants noPushConstants;
SpecConstants noSpecConstants;
PushConstants noPushConstants;
vector<string> extensions;
- map<string, string> noFragments;
GraphicsResources noResources;
StageToSpecConstantMap specConstantMap;
VulkanFeatures requiredFeatures;
extensions.push_back("VK_KHR_16bit_storage");
requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
+ requiredFeatures.coreFeatures.shaderInt16 = DE_TRUE;
const struct
{
const InstanceContext& instanceContext = createInstanceContext(pipelineStages,
defaultColors,
outputColors,
- noFragments,
+ fragments,
specConstantMap,
noPushConstants,
noResources,
getDefaultColors(defaultColors);
- const StringTemplate scalarInterfaceOpFunc(
- "%interface_op_func = OpFunction %${type16} None %${type16}_${type32}_function\n"
- " %io_param1 = OpFunctionParameter %${type32}\n"
- " %entry = OpLabel\n"
- " %ret = ${convert} %${type16} %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n");
+ const StringTemplate scalarInterfaceOpCall(
+ "${convert} %${type16}");
+
+ const StringTemplate scalarInterfaceOpFunc("");
const StringTemplate scalarPreMain(
" %${type16} = OpTypeInt 16 ${signed}\n"
" %a3${type32} = OpTypeArray %${type32} %c_i32_3\n"
" %ip_a3${type32} = OpTypePointer Input %a3${type32}\n");
- const StringTemplate vecInterfaceOpFunc(
- "%interface_op_func = OpFunction %${type16} None %${type16}_${type32}_function\n"
- " %io_param1 = OpFunctionParameter %${type32}\n"
- " %entry = OpLabel\n"
- " %ret = ${convert} %${type16} %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n");
+ const StringTemplate vecInterfaceOpCall(
+ "${convert} %${type16}");
+
+ const StringTemplate vecInterfaceOpFunc("");
const StringTemplate vecPreMain(
" %i16 = OpTypeInt 16 1\n"
struct Case
{
const char* name;
+ const StringTemplate& interfaceOpCall;
const StringTemplate& interfaceOpFunc;
const StringTemplate& preMain;
const char* type32;
Case cases[] =
{
- {"scalar_sint", scalarInterfaceOpFunc, scalarPreMain, "i32", "i16", "1", "OpSConvert", 4, 1},
- {"scalar_uint", scalarInterfaceOpFunc, scalarPreMain, "u32", "u16", "0", "OpUConvert", 4, 1},
- {"vector_sint", vecInterfaceOpFunc, vecPreMain, "v4i32", "v4i16", "1", "OpSConvert", 4 * 4, 4},
- {"vector_uint", vecInterfaceOpFunc, vecPreMain, "v4u32", "v4u16", "0", "OpUConvert", 4 * 4, 4},
+ {"scalar_sint", scalarInterfaceOpCall, scalarInterfaceOpFunc, scalarPreMain, "i32", "i16", "1", "OpSConvert", 4, 1},
+ {"scalar_uint", scalarInterfaceOpCall, scalarInterfaceOpFunc, scalarPreMain, "u32", "u16", "0", "OpUConvert", 4, 1},
+ {"vector_sint", vecInterfaceOpCall, vecInterfaceOpFunc, vecPreMain, "v4i32", "v4i16", "1", "OpSConvert", 4 * 4, 4},
+ {"vector_uint", vecInterfaceOpCall, vecInterfaceOpFunc, vecPreMain, "v4u32", "v4u16", "0", "OpUConvert", 4 * 4, 4},
};
VulkanFeatures requiredFeatures;
+ requiredFeatures.coreFeatures.shaderInt16 = DE_TRUE;
requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
specs["convert"] = cases[caseIdx].opcode;
fragments["pre_main"] = cases[caseIdx].preMain.specialize(specs);
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall.specialize(specs);
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc.specialize(specs);
fragments["input_type"] = cases[caseIdx].type32;
fragments["output_type"] = cases[caseIdx].type16;
getDefaultColors(defaultColors);
- const StringTemplate scalarIfOpFunc (
- "%interface_op_func = OpFunction %${type32} None %${type32}_${type16}_function\n"
- " %io_param1 = OpFunctionParameter %${type16}\n"
- " %entry = OpLabel\n"
- " %ret = ${convert} %${type32} %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n");
+ const StringTemplate scalarIfOpCall (
+ "${convert} %${type32}");
+
+ const StringTemplate scalarIfOpFunc ("");
const StringTemplate scalarPreMain (
" %${type16} = OpTypeInt 16 ${signed}\n"
" %a3${type32} = OpTypeArray %${type32} %c_i32_3\n"
" %op_a3${type32} = OpTypePointer Output %a3${type32}\n");
- const StringTemplate vecIfOpFunc (
- "%interface_op_func = OpFunction %${type32} None %${type32}_${type16}_function\n"
- " %io_param1 = OpFunctionParameter %${type16}\n"
- " %entry = OpLabel\n"
- " %ret = ${convert} %${type32} %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n");
+ const StringTemplate vecIfOpCall (
+ "${convert} %${type32}");
+
+ const StringTemplate vecIfOpFunc ("");
const StringTemplate vecPreMain (
" %i16 = OpTypeInt 16 1\n"
struct Case
{
const char* name;
+ const StringTemplate& interfaceOpCall;
const StringTemplate& interfaceOpFunc;
const StringTemplate& preMain;
const char* type32;
Case cases[] =
{
- {"scalar_sint", scalarIfOpFunc, scalarPreMain, "i32", "i16", "1", "OpSConvert", 4, 1},
- {"scalar_uint", scalarIfOpFunc, scalarPreMain, "u32", "u16", "0", "OpUConvert", 4, 1},
- {"vector_sint", vecIfOpFunc, vecPreMain, "v4i32", "v4i16", "1", "OpSConvert", 4 * 4, 4},
- {"vector_uint", vecIfOpFunc, vecPreMain, "v4u32", "v4u16", "0", "OpUConvert", 4 * 4, 4},
+ {"scalar_sint", scalarIfOpCall, scalarIfOpFunc, scalarPreMain, "i32", "i16", "1", "OpSConvert", 4, 1},
+ {"scalar_uint", scalarIfOpCall, scalarIfOpFunc, scalarPreMain, "u32", "u16", "0", "OpUConvert", 4, 1},
+ {"vector_sint", vecIfOpCall, vecIfOpFunc, vecPreMain, "v4i32", "v4i16", "1", "OpSConvert", 4 * 4, 4},
+ {"vector_uint", vecIfOpCall, vecIfOpFunc, vecPreMain, "v4u32", "v4u16", "0", "OpUConvert", 4 * 4, 4},
};
VulkanFeatures requiredFeatures;
+ requiredFeatures.coreFeatures.shaderInt16 = DE_TRUE;
requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
specs["convert"] = cases[caseIdx].opcode;
fragments["pre_main"] = cases[caseIdx].preMain.specialize(specs);
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall.specialize(specs);
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc.specialize(specs);
fragments["input_type"] = cases[caseIdx].type16;
fragments["output_type"] = cases[caseIdx].type32;
getDefaultColors(defaultColors);
- const StringTemplate scalarIfOpFunc (
- "%interface_op_func = OpFunction %${type16} None %${type16}_${type16}_function\n"
- " %io_param1 = OpFunctionParameter %${type16}\n"
- " %entry = OpLabel\n"
- " %ret = OpCopyObject %${type16} %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n");
+ const StringTemplate scalarIfOpCall (
+ "OpCopyObject %${type16}");
+
+ const StringTemplate scalarIfOpFunc ("");
const StringTemplate scalarPreMain (
" %${type16} = OpTypeInt 16 ${signed}\n"
" %op_${type16} = OpTypePointer Output %${type16}\n"
" %op_a3${type16} = OpTypePointer Output %a3${type16}\n");
- const StringTemplate vecIfOpFunc (
- "%interface_op_func = OpFunction %${type16} None %${type16}_${type16}_function\n"
- " %io_param1 = OpFunctionParameter %${type16}\n"
- " %entry = OpLabel\n"
- " %ret = OpCopyObject %${type16} %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n");
+ const StringTemplate vecIfOpCall (
+ "OpCopyObject %${type16}");
+
+ const StringTemplate vecIfOpFunc ("");
const StringTemplate vecPreMain (
" %i16 = OpTypeInt 16 1\n"
struct Case
{
const char* name;
+ const StringTemplate& interfaceOpCall;
const StringTemplate& interfaceOpFunc;
const StringTemplate& preMain;
const char* type16;
Case cases[] =
{
- {"scalar_sint", scalarIfOpFunc, scalarPreMain, "i16", "1", 4, 1},
- {"scalar_uint", scalarIfOpFunc, scalarPreMain, "u16", "0", 4, 1},
- {"vector_sint", vecIfOpFunc, vecPreMain, "v4i16", "1", 4 * 4, 4},
- {"vector_uint", vecIfOpFunc, vecPreMain, "v4u16", "0", 4 * 4, 4},
+ {"scalar_sint", scalarIfOpCall, scalarIfOpFunc, scalarPreMain, "i16", "1", 4, 1},
+ {"scalar_uint", scalarIfOpCall, scalarIfOpFunc, scalarPreMain, "u16", "0", 4, 1},
+ {"vector_sint", vecIfOpCall, vecIfOpFunc, vecPreMain, "v4i16", "1", 4 * 4, 4},
+ {"vector_uint", vecIfOpCall, vecIfOpFunc, vecPreMain, "v4u16", "0", 4 * 4, 4},
};
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
specs["signed"] = cases[caseIdx].sign;
fragments["pre_main"] = cases[caseIdx].preMain.specialize(specs);
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall.specialize(specs);
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc.specialize(specs);
fragments["input_type"] = cases[caseIdx].type16;
fragments["output_type"] = cases[caseIdx].type16;
float64Data.push_back(deFloat16To64(float16Data[numIdx]));
extensions.push_back("VK_KHR_16bit_storage");
- extensions.push_back("VK_KHR_shader_float16_int8");
fragments["capability"] =
"OpCapability StorageInputOutput16\n"
- "OpCapability Float64\n"
- "OpCapability Float16\n";
+ "OpCapability Float64\n";
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"\n";
getDefaultColors(defaultColors);
struct Case
{
const char* name;
+ const char* interfaceOpCall;
const char* interfaceOpFunc;
const char* preMain;
const char* inputType;
{ // Scalar cases
"scalar",
- "%interface_op_func = OpFunction %f64 None %f64_f16_function\n"
- " %io_param1 = OpFunctionParameter %f16\n"
- " %entry = OpLabel\n"
- " %ret = OpFConvert %f64 %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n",
+ "OpFConvert %f64",
+ "",
" %f16 = OpTypeFloat 16\n"
" %f64 = OpTypeFloat 64\n"
{ // Vector cases
"vector",
- "%interface_op_func = OpFunction %v2f64 None %v2f64_v2f16_function\n"
- " %io_param1 = OpFunctionParameter %v2f16\n"
- " %entry = OpLabel\n"
- " %ret = OpFConvert %v2f64 %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n",
+ "OpFConvert %v2f64",
+ "",
" %f16 = OpTypeFloat 16\n"
" %v2f16 = OpTypeVector %f16 2\n"
requiredFeatures.coreFeatures.shaderFloat64 = DE_TRUE;
requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
- requiredFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
{
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall;
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc;
fragments["pre_main"] = cases[caseIdx].preMain;
const deUint32 numDataPoints = 256;
RGBA defaultColors[4];
const StringTemplate capabilities ("OpCapability ${cap}\n"
- "OpCapability Float64\n"
- "OpCapability Float16\n");
+ "OpCapability Float64\n");
vector<deFloat16> float16Data = getFloat16s(rnd, numDataPoints);
struct ConstantIndex
};
extensions.push_back("VK_KHR_16bit_storage");
- extensions.push_back("VK_KHR_shader_float16_int8");
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"";
VulkanFeatures features = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
features.coreFeatures.shaderFloat64 = DE_TRUE;
- features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
}
VulkanFeatures features = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
features.coreFeatures.shaderFloat64 = DE_TRUE;
- features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
}
VulkanFeatures features = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
features.coreFeatures.shaderFloat64 = DE_TRUE;
- features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
}
float64Data.push_back(deFloat16To64(float16Data[numIdx]));
extensions.push_back("VK_KHR_16bit_storage");
- extensions.push_back("VK_KHR_shader_float16_int8");
requiredFeatures.coreFeatures.shaderFloat64 = DE_TRUE;
requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_PUSH_CONSTANT;
- requiredFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
fragments["capability"] =
"OpCapability StoragePushConstant16\n"
- "OpCapability Float64\n"
- "OpCapability Float16\n";
+ "OpCapability Float64\n";
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"";
"OpCapability Shader\n"
"OpCapability ${capability}\n"
"OpCapability Float64\n"
- "OpCapability Float16\n"
"OpExtension \"SPV_KHR_16bit_storage\"\n"
"OpMemoryModel Logical GLSL450\n"
"OpEntryPoint GLCompute %main \"main\" %id\n"
spec.outputs.push_back(BufferSp(new Float16Buffer(float16DummyData)));
spec.extensions.push_back("VK_KHR_16bit_storage");
- spec.extensions.push_back("VK_KHR_shader_float16_int8");
spec.requestedVulkanFeatures = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
spec.requestedVulkanFeatures.coreFeatures.shaderFloat64 = VK_TRUE;
- spec.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
}
vector<double> float64Data = getFloat64s(rnd, numDataPoints);
vector<deFloat16> float16DummyData (numDataPoints, 0);
const StringTemplate capabilities ("OpCapability Float64\n"
- "OpCapability Float16\n"
"OpCapability ${cap}\n");
// We use a custom verifyIO to check the result via computing directly from inputs; the contents in outputs do not matter.
resources.outputs.push_back(Resource(BufferSp(new Float16Buffer(float16DummyData)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
extensions.push_back("VK_KHR_16bit_storage");
- extensions.push_back("VK_KHR_shader_float16_int8");
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"";
features = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
features.coreFeatures.shaderFloat64 = DE_TRUE;
- features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
features = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
features.coreFeatures.shaderFloat64 = DE_TRUE;
- features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
}
features = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
features.coreFeatures.shaderFloat64 = DE_TRUE;
- features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
}
vector<double> float64Data = getFloat64s(rnd, numDataPoints);
extensions.push_back("VK_KHR_16bit_storage");
- extensions.push_back("VK_KHR_shader_float16_int8");
fragments["capability"] =
"OpCapability StorageInputOutput16\n"
- "OpCapability Float16\n"
"OpCapability Float64\n";
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"\n";
struct Case
{
const char* name;
+ const char* interfaceOpCall;
const char* interfaceOpFunc;
const char* postInterfaceOp;
const char* postInterfaceOpGeom;
{ // Scalar cases
"scalar",
- "%interface_op_func = OpFunction %f16 None %f16_f64_function\n"
- " %io_param1 = OpFunctionParameter %f64\n"
- " %entry = OpLabel\n"
- " OpReturnValue %f16_0\n"
- " OpFunctionEnd\n",
+ "OpFConvert %f16",
+
+ "",
" %ret0 = OpFConvert %f16 %IF_input_val\n"
" OpStore %IF_output %ret0\n",
"%f16_f64_function = OpTypeFunction %f16 %f64\n"
" %a3f64 = OpTypeArray %f64 %c_i32_3\n"
" %ip_a3f64 = OpTypePointer Input %a3f64\n"
- " %ip_f64 = OpTypePointer Input %f64\n"
- " %f16_0 = OpConstant %f16 0\n",
+ " %ip_f64 = OpTypePointer Input %f64\n",
"f64",
"f16",
{ // Vector cases
"vector",
- "%interface_op_func = OpFunction %v2f16 None %v2f16_v2f64_function\n"
- " %io_param1 = OpFunctionParameter %v2f64\n"
- " %entry = OpLabel\n"
- " OpReturnValue %v2f16_0\n"
- " OpFunctionEnd\n",
+ "OpFConvert %v2f16",
+
+ "",
" %ret0 = OpFConvert %v2f16 %IF_input_val\n"
" OpStore %IF_output %ret0\n",
"%v2f16_v2f64_function = OpTypeFunction %v2f16 %v2f64\n"
" %a3v2f64 = OpTypeArray %v2f64 %c_i32_3\n"
" %ip_a3v2f64 = OpTypePointer Input %a3v2f64\n"
- " %ip_v2f64 = OpTypePointer Input %v2f64\n"
- " %f16_0 = OpConstant %f16 0\n"
- " %v2f16_0 = OpConstantComposite %v2f16 %f16_0 %f16_0\n",
+ " %ip_v2f64 = OpTypePointer Input %v2f64\n",
"v2f64",
"v2f16",
requiredFeatures.coreFeatures.shaderFloat64 = DE_TRUE;
requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
- requiredFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
for (deUint32 rndModeIdx = 0; rndModeIdx < DE_LENGTH_OF_ARRAY(rndModes); ++rndModeIdx)
{
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc;
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall;
fragments["post_interface_op_frag"] = cases[caseIdx].postInterfaceOp;
fragments["post_interface_op_vert"] = cases[caseIdx].postInterfaceOp;
fragments["post_interface_op_geom"] = cases[caseIdx].postInterfaceOpGeom;
const StringTemplate shaderTemplate (
"OpCapability Shader\n"
"OpCapability Float64\n"
- "OpCapability Float16\n"
"OpCapability ${capability}\n"
"OpExtension \"SPV_KHR_16bit_storage\"\n"
"OpMemoryModel Logical GLSL450\n"
spec.outputs.push_back(Resource(BufferSp(new Float64Buffer(cTypes[tyIdx].useConstantIndex ? float64DataConstIdx : float64Data))));
spec.extensions.push_back("VK_KHR_16bit_storage");
- spec.extensions.push_back("VK_KHR_shader_float16_int8");
spec.requestedVulkanFeatures = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
spec.requestedVulkanFeatures.coreFeatures.shaderFloat64 = VK_TRUE;
- spec.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
}
"OpCapability Shader\n"
"OpCapability StoragePushConstant16\n"
"OpCapability Float64\n"
- "OpCapability Float16\n"
"OpExtension \"SPV_KHR_16bit_storage\"\n"
"OpMemoryModel Logical GLSL450\n"
"OpEntryPoint GLCompute %main \"main\" %id\n"
spec.outputs.push_back(BufferSp(new Float64Buffer(float64Data)));
spec.extensions.push_back("VK_KHR_16bit_storage");
- spec.extensions.push_back("VK_KHR_shader_float16_int8");
spec.requestedVulkanFeatures.coreFeatures.shaderFloat64 = VK_TRUE;
spec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_PUSH_CONSTANT;
- spec.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
}