Fix parsing error with SPIR-V negating a uint.

Our SPIR-V code generator did not implement support for negating a uint.
However, this is something that GLSL allows (as does the rest of SkSL).
I checked glslang and it uses OpSNegate here. The SPIR-V docs indicate
that OpSNegate allows any type of integer, and the validator lets it
pass, so we now use OpSNegate here as well.

http://screen/33mkq92uxAT5Xu8
http://screen/4YBTh3gCWz8eZx7
http://screen/388HtXyytcN5vLZ

Change-Id: I8c142018fd5e162dcd051abe1bc5d69a6e034794
Bug: oss-fuzz:37627
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/441880
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
This commit is contained in:
John Stiles 2021-08-25 12:43:22 -04:00 committed by SkCQ
parent b61014d310
commit 43ac7e6315
4 changed files with 29 additions and 1 deletions

View File

@ -187,6 +187,7 @@ sksl_spirv_tests = [
"/sksl/spirv/LayoutOutOfOrder.sksl",
"/sksl/spirv/OpaqueTypeInArray.sksl",
"/sksl/spirv/Ossfuzz35916.sksl",
"/sksl/spirv/Ossfuzz37627.sksl",
"/sksl/workarounds/RewriteMatrixVectorMultiply.sksl",
"/sksl/errors/Ossfuzz36850.sksl",
"/sksl/errors/Ossfuzz37469.sksl",

View File

@ -0,0 +1 @@
void main(){uint x;-++x;}

View File

@ -2796,7 +2796,7 @@ SpvId SPIRVCodeGenerator::writePrefixExpression(const PrefixExpression& p, Outpu
SpvId expr = this->writeExpression(*p.operand(), out);
if (is_float(fContext, type)) {
this->writeInstruction(SpvOpFNegate, typeId, result, expr, out);
} else if (is_signed(fContext, type)) {
} else if (is_signed(fContext, type) || is_unsigned(fContext, type)) {
this->writeInstruction(SpvOpSNegate, typeId, result, expr, out);
} else {
SkDEBUGFAILF("unsupported prefix expression %s", p.description().c_str());

View File

@ -0,0 +1,26 @@
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %sk_Clockwise
OpExecutionMode %main OriginUpperLeft
OpName %sk_Clockwise "sk_Clockwise"
OpName %main "main"
OpName %x "x"
OpDecorate %sk_Clockwise BuiltIn FrontFacing
%bool = OpTypeBool
%_ptr_Input_bool = OpTypePointer Input %bool
%sk_Clockwise = OpVariable %_ptr_Input_bool Input
%void = OpTypeVoid
%7 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%_ptr_Function_uint = OpTypePointer Function %uint
%uint_1 = OpConstant %uint 1
%main = OpFunction %void None %7
%8 = OpLabel
%x = OpVariable %_ptr_Function_uint Function
%14 = OpLoad %uint %x
%15 = OpIAdd %uint %14 %uint_1
OpStore %x %15
%12 = OpSNegate %uint %15
OpReturn
OpFunctionEnd