xref: /aosp_15_r20/external/swiftshader/src/Pipeline/SpirvShaderInstructions.cpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2020 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker //    http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker 
15*03ce13f7SAndroid Build Coastguard Worker #include "SpirvShader.hpp"
16*03ce13f7SAndroid Build Coastguard Worker 
17*03ce13f7SAndroid Build Coastguard Worker #include "spirv-tools/libspirv.h"
18*03ce13f7SAndroid Build Coastguard Worker 
19*03ce13f7SAndroid Build Coastguard Worker #include <spirv/unified1/spirv.hpp>
20*03ce13f7SAndroid Build Coastguard Worker 
21*03ce13f7SAndroid Build Coastguard Worker namespace sw {
22*03ce13f7SAndroid Build Coastguard Worker 
OpcodeName(spv::Op opcode)23*03ce13f7SAndroid Build Coastguard Worker const char *Spirv::OpcodeName(spv::Op opcode)
24*03ce13f7SAndroid Build Coastguard Worker {
25*03ce13f7SAndroid Build Coastguard Worker 	return spvOpcodeString(opcode);
26*03ce13f7SAndroid Build Coastguard Worker }
27*03ce13f7SAndroid Build Coastguard Worker 
28*03ce13f7SAndroid Build Coastguard Worker // This function is used by the shader debugger to determine whether an instruction is steppable.
IsStatement(spv::Op opcode)29*03ce13f7SAndroid Build Coastguard Worker bool Spirv::IsStatement(spv::Op opcode)
30*03ce13f7SAndroid Build Coastguard Worker {
31*03ce13f7SAndroid Build Coastguard Worker 	switch(opcode)
32*03ce13f7SAndroid Build Coastguard Worker 	{
33*03ce13f7SAndroid Build Coastguard Worker 	default:
34*03ce13f7SAndroid Build Coastguard Worker 		// Most statement-like instructions produce a result which has a type.
35*03ce13f7SAndroid Build Coastguard Worker 		// Note OpType* instructions have a result but it is a type itself.
36*03ce13f7SAndroid Build Coastguard Worker 		{
37*03ce13f7SAndroid Build Coastguard Worker 			bool hasResult = false;
38*03ce13f7SAndroid Build Coastguard Worker 			bool hasResultType = false;
39*03ce13f7SAndroid Build Coastguard Worker 			spv::HasResultAndType(opcode, &hasResult, &hasResultType);
40*03ce13f7SAndroid Build Coastguard Worker 
41*03ce13f7SAndroid Build Coastguard Worker 			return hasResult && hasResultType;
42*03ce13f7SAndroid Build Coastguard Worker 		}
43*03ce13f7SAndroid Build Coastguard Worker 		break;
44*03ce13f7SAndroid Build Coastguard Worker 
45*03ce13f7SAndroid Build Coastguard Worker 	// Instructions without a result but potential side-effects.
46*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpNop:
47*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpStore:
48*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpCopyMemory:
49*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpCopyMemorySized:
50*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpImageWrite:
51*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpEmitVertex:
52*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpEndPrimitive:
53*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpEmitStreamVertex:
54*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpEndStreamPrimitive:
55*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpControlBarrier:
56*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpMemoryBarrier:
57*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpAtomicStore:
58*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpBranch:
59*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpBranchConditional:
60*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpSwitch:
61*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpKill:
62*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpReturn:
63*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpReturnValue:
64*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpLifetimeStart:
65*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpLifetimeStop:
66*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpGroupWaitEvents:
67*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpCommitReadPipe:
68*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpCommitWritePipe:
69*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpGroupCommitReadPipe:
70*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpGroupCommitWritePipe:
71*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpRetainEvent:
72*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpReleaseEvent:
73*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpSetUserEventStatus:
74*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpCaptureEventProfilingInfo:
75*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpAtomicFlagClear:
76*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpMemoryNamedBarrier:
77*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpTerminateInvocation:
78*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpTraceRayKHR:
79*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpExecuteCallableKHR:
80*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpIgnoreIntersectionKHR:
81*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpTerminateRayKHR:
82*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpRayQueryInitializeKHR:
83*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpRayQueryTerminateKHR:
84*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpRayQueryGenerateIntersectionKHR:
85*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpRayQueryConfirmIntersectionKHR:
86*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpBeginInvocationInterlockEXT:
87*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpEndInvocationInterlockEXT:
88*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpDemoteToHelperInvocationEXT:
89*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpAssumeTrueKHR:
90*03ce13f7SAndroid Build Coastguard Worker 		return true;
91*03ce13f7SAndroid Build Coastguard Worker 	}
92*03ce13f7SAndroid Build Coastguard Worker }
93*03ce13f7SAndroid Build Coastguard Worker 
IsTerminator(spv::Op opcode)94*03ce13f7SAndroid Build Coastguard Worker bool Spirv::IsTerminator(spv::Op opcode)
95*03ce13f7SAndroid Build Coastguard Worker {
96*03ce13f7SAndroid Build Coastguard Worker 	switch(opcode)
97*03ce13f7SAndroid Build Coastguard Worker 	{
98*03ce13f7SAndroid Build Coastguard Worker 	// Branch instructions
99*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpBranch:
100*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpBranchConditional:
101*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpSwitch:
102*03ce13f7SAndroid Build Coastguard Worker 	// Function termination instructions
103*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpReturn:
104*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpReturnValue:
105*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpKill:
106*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpUnreachable:
107*03ce13f7SAndroid Build Coastguard Worker 	case spv::OpTerminateInvocation:
108*03ce13f7SAndroid Build Coastguard Worker 		return true;
109*03ce13f7SAndroid Build Coastguard Worker 	default:
110*03ce13f7SAndroid Build Coastguard Worker 		return false;
111*03ce13f7SAndroid Build Coastguard Worker 	}
112*03ce13f7SAndroid Build Coastguard Worker }
113*03ce13f7SAndroid Build Coastguard Worker 
114*03ce13f7SAndroid Build Coastguard Worker }  // namespace sw