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:
parent
b61014d310
commit
43ac7e6315
@ -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",
|
||||
|
1
resources/sksl/spirv/Ossfuzz37627.sksl
Normal file
1
resources/sksl/spirv/Ossfuzz37627.sksl
Normal file
@ -0,0 +1 @@
|
||||
void main(){uint x;-++x;}
|
@ -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());
|
||||
|
26
tests/sksl/spirv/Ossfuzz37627.asm.frag
Normal file
26
tests/sksl/spirv/Ossfuzz37627.asm.frag
Normal 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
|
Loading…
Reference in New Issue
Block a user