Validation of type decls for SPV_KHR_16bit_storage

Allow declaration of 16bit int or 16bit float in
the presence of capabilities from SPV_KHR_16bit_storage
This commit is contained in:
David Neto 2017-02-22 18:10:05 -05:00
parent c6099ad242
commit af7125dfb0
3 changed files with 48 additions and 4 deletions

View File

@ -341,6 +341,12 @@ void ValidationState_t::RegisterCapability(SpvCapability cap) {
case SpvCapabilityFloat16Buffer: case SpvCapabilityFloat16Buffer:
features_.declare_float16_type = true; features_.declare_float16_type = true;
break; break;
case SpvCapabilityStorageUniformBufferBlock16:
case SpvCapabilityStorageUniform16:
case SpvCapabilityStoragePushConstant16:
case SpvCapabilityStorageInputOutput16:
features_.declare_int16_type = true;
features_.declare_float16_type = true;
default: default:
break; break;
} }

View File

@ -74,7 +74,8 @@ spv_result_t ValidateFloatSize(ValidationState_t& _,
} }
return _.diag(SPV_ERROR_INVALID_DATA) return _.diag(SPV_ERROR_INVALID_DATA)
<< "Using a 16-bit floating point " << "Using a 16-bit floating point "
<< "type requires the Float16 or Float16Buffer capability."; << "type requires the Float16 or Float16Buffer capability,"
" or an extension that explicitly enables 16-bit floating point.";
} }
if (num_bits == 64) { if (num_bits == 64) {
if (_.HasCapability(SpvCapabilityFloat64)) { if (_.HasCapability(SpvCapabilityFloat64)) {
@ -111,7 +112,8 @@ spv_result_t ValidateIntSize(ValidationState_t& _,
return SPV_SUCCESS; return SPV_SUCCESS;
} }
return _.diag(SPV_ERROR_INVALID_DATA) return _.diag(SPV_ERROR_INVALID_DATA)
<< "Using a 16-bit integer type requires the Int16 capability."; << "Using a 16-bit integer type requires the Int16 capability,"
" or an extension that explicitly enables 16-bit integers.";
} }
if (num_bits == 64) { if (num_bits == 64) {
if (_.HasCapability(SpvCapabilityInt64)) { if (_.HasCapability(SpvCapabilityInt64)) {

View File

@ -33,6 +33,11 @@ using std::stringstream;
using ValidateData = spvtest::ValidateBase<pair<string, bool>>; using ValidateData = spvtest::ValidateBase<pair<string, bool>>;
string HeaderWith(std::string cap) {
return std::string("OpCapability Shader OpCapability Linkage OpCapability ") +
cap + " OpMemoryModel Logical GLSL450 ";
}
string header = R"( string header = R"(
OpCapability Shader OpCapability Shader
OpCapability Linkage OpCapability Linkage
@ -92,10 +97,13 @@ string header_with_float64 = R"(
string invalid_comp_error = "Illegal number of components"; string invalid_comp_error = "Illegal number of components";
string missing_cap_error = "requires the Vector16 capability"; string missing_cap_error = "requires the Vector16 capability";
string missing_int8_cap_error = "requires the Int8 capability"; string missing_int8_cap_error = "requires the Int8 capability";
string missing_int16_cap_error = "requires the Int16 capability"; string missing_int16_cap_error =
"requires the Int16 capability,"
" or an extension that explicitly enables 16-bit integers.";
string missing_int64_cap_error = "requires the Int64 capability"; string missing_int64_cap_error = "requires the Int64 capability";
string missing_float16_cap_error = string missing_float16_cap_error =
"requires the Float16 or Float16Buffer capability."; "requires the Float16 or Float16Buffer capability,"
" or an extension that explicitly enables 16-bit floating point.";
string missing_float64_cap_error = "requires the Float64 capability"; string missing_float64_cap_error = "requires the Float64 capability";
string invalid_num_bits_error = "Invalid number of bits"; string invalid_num_bits_error = "Invalid number of bits";
@ -190,6 +198,34 @@ TEST_F(ValidateData, int16_good) {
ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
} }
TEST_F(ValidateData, storage_uniform_buffer_block_16_good) {
string str =
HeaderWith("StorageUniformBufferBlock16") + "%2 = OpTypeInt 16 1 %3 = OpTypeFloat 16";
CompileSuccessfully(str.c_str());
ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
}
TEST_F(ValidateData, storage_uniform_16_good) {
string str = HeaderWith("StorageUniform16") +
"%2 = OpTypeInt 16 1 %3 = OpTypeFloat 16";
CompileSuccessfully(str.c_str());
ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
}
TEST_F(ValidateData, storage_push_constant_16_good) {
string str = HeaderWith("StoragePushConstant16") +
"%2 = OpTypeInt 16 1 %3 = OpTypeFloat 16";
CompileSuccessfully(str.c_str());
ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
}
TEST_F(ValidateData, storage_input_output_16_good) {
string str = HeaderWith("StorageInputOutput16") +
"%2 = OpTypeInt 16 1 %3 = OpTypeFloat 16";
CompileSuccessfully(str.c_str());
ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
}
TEST_F(ValidateData, int16_bad) { TEST_F(ValidateData, int16_bad) {
string str = header + "%2 = OpTypeInt 16 1"; string str = header + "%2 = OpTypeInt 16 1";
CompileSuccessfully(str.c_str()); CompileSuccessfully(str.c_str());