aboutsummaryrefslogtreecommitdiff
path: root/source/val/validate_image.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/val/validate_image.cpp')
-rw-r--r--source/val/validate_image.cpp32
1 files changed, 22 insertions, 10 deletions
diff --git a/source/val/validate_image.cpp b/source/val/validate_image.cpp
index e5968d06..64f6ba7b 100644
--- a/source/val/validate_image.cpp
+++ b/source/val/validate_image.cpp
@@ -66,6 +66,11 @@ bool CheckAllImageOperandsHandled() {
case SpvImageOperandsVolatileTexelKHRMask:
case SpvImageOperandsSignExtendMask:
case SpvImageOperandsZeroExtendMask:
+ // TODO(jaebaek): Move this line properly after handling image offsets
+ // operand. This line temporarily fixes CI failure that
+ // blocks other PRs.
+ // https://github.com/KhronosGroup/SPIRV-Tools/issues/4565
+ case SpvImageOperandsOffsetsMask:
return true;
}
return false;
@@ -281,13 +286,14 @@ spv_result_t ValidateImageOperands(ValidationState_t& _,
// the module to be invalid.
if (mask == 0) return SPV_SUCCESS;
- if (spvtools::utils::CountSetBits(
- mask & (SpvImageOperandsOffsetMask | SpvImageOperandsConstOffsetMask |
- SpvImageOperandsConstOffsetsMask)) > 1) {
+ if (spvtools::utils::CountSetBits(mask & (SpvImageOperandsOffsetMask |
+ SpvImageOperandsConstOffsetMask |
+ SpvImageOperandsConstOffsetsMask |
+ SpvImageOperandsOffsetsMask)) > 1) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< _.VkErrorID(4662)
- << "Image Operands Offset, ConstOffset, ConstOffsets cannot be used "
- << "together";
+ << "Image Operands Offset, ConstOffset, ConstOffsets, Offsets "
+ "cannot be used together";
}
const bool is_implicit_lod = IsImplicitLod(opcode);
@@ -620,6 +626,10 @@ spv_result_t ValidateImageOperands(ValidationState_t& _,
// setup.
}
+ if (mask & SpvImageOperandsOffsetsMask) {
+ // TODO: add validation
+ }
+
return SPV_SUCCESS;
}
@@ -2058,11 +2068,13 @@ spv_result_t ImagePass(ValidationState_t& _, const Instruction* inst) {
std::string* message) {
const auto* models = state.GetExecutionModels(entry_point->id());
const auto* modes = state.GetExecutionModes(entry_point->id());
- if (models->find(SpvExecutionModelGLCompute) != models->end() &&
- modes->find(SpvExecutionModeDerivativeGroupLinearNV) ==
- modes->end() &&
- modes->find(SpvExecutionModeDerivativeGroupQuadsNV) ==
- modes->end()) {
+ if (models &&
+ models->find(SpvExecutionModelGLCompute) != models->end() &&
+ (!modes ||
+ (modes->find(SpvExecutionModeDerivativeGroupLinearNV) ==
+ modes->end() &&
+ modes->find(SpvExecutionModeDerivativeGroupQuadsNV) ==
+ modes->end()))) {
if (message) {
*message =
std::string(