blob: e16eeb06375a6b323a73232f6a7fbc5ccdb9f652 [file] [log] [blame] [edit]
from hctdb_instrhelp import get_db_dxil
from hctdb_instrhelp import get_db_hlsl
import argparse
# user defined function
def inst_query_dxil(insts, inst):
# example
if inst.ret_type == "v" and inst.fn_attr != "":
return True
return False
# example
"""
if inst.fn_attr == "" and "Quad" in inst.name:
found = false
for other_inst in insts:
if not (other_inst == inst) and "Quad" in other_inst.name and other_inst.fn_attr != ""
found = true
break
return found
return false
"""
def inst_query_hlsl(insts, inst):
# example
"""
if inst.ret_type == "v":
return true
return false
"""
# example
"""
if inst.fn_attr == "" and "Quad" in inst.name:
found = false
for other_inst in insts:
if not (other_inst == inst) and "Quad" in other_inst.name and other_inst.fn_attr != ""
found = true
break
return found
return false
"""
# example
if inst.wave:
return True
return False
class DxilInstructionWrapper:
def set_ret_type_and_args(self, dxil_inst):
ops = []
for op in dxil_inst.ops:
ops.append(op.llvm_type)
if len(ops) > 0:
self.ret_type = ops[0]
if len(ops) > 1:
self.args = ops[1:]
def __init__(self, dxil_inst):
self.dxil_inst = dxil_inst # db_dxil_inst type, defined in hctdb.py
self.name = dxil_inst.name
self.fn_attr = dxil_inst.fn_attr
self.wave = dxil_inst.is_wave # bool
self.ret_type = ""
self.args = []
self.set_ret_type_and_args(dxil_inst)
def __str__(self):
str_args = ", ".join(self.args)
return "[{}] {} {}({})".format(self.fn_attr, self.ret_type, self.name, str_args)
class HLOperationWrapper:
def set_ret_type_and_args(self, hl_op):
ops = hl_op.params
if len(ops) > 0:
self.ret_type = ops[0].type_name
if len(ops) > 1:
self.args = [x.name + " " + x.type_name for x in ops[1:]]
def __init__(self, hl_op):
self.hl_op = hl_op # db_hlsl_intrinsic type, defined in hctdb.py
self.name = hl_op.name
self.fn_attr = "rn" if hl_op.readnone else ""
self.fn_attr += "ro" if hl_op.readonly else ""
self.wave = hl_op.wave # bool
self.ret_type = ""
self.args = []
self.set_ret_type_and_args(hl_op)
def __str__(self):
str_args = ", ".join(self.args)
return "[{}] {} {}({})".format(self.fn_attr, self.ret_type, self.name, str_args)
def parse_query_hlsl(db, options):
HLInstructions = []
# The query function should be using the HLOperationWrapper interface
# because that is what's being loaded into the instructions list.
for hl_op in db.intrinsics:
new_op = HLOperationWrapper(hl_op)
HLInstructions.append(new_op)
# apply the query filter
print("\nQUERY RESULTS:\n")
for instruction in HLInstructions:
if inst_query_hlsl(HLInstructions, instruction):
print(instruction)
def parse_query_dxil(db, options):
DxilInstructions = []
# The query function should use the DxilInstructionWrapper interface
# because that's what's being loaded into the DxilInstructions list
for dxil_inst in db.instr:
i = DxilInstructionWrapper(dxil_inst)
DxilInstructions.append(i)
# apply the query filter
print("\nQUERY RESULTS:\n")
for instruction in DxilInstructions:
if inst_query_dxil(DxilInstructions, instruction):
print(instruction)
parser = argparse.ArgumentParser(description="Query instructions.")
parser.add_argument(
"-query", choices=["dxil", "hlsl"], help="type of instructions to query."
)
args = parser.parse_args()
if args.query == "dxil":
db_dxil = get_db_dxil()
parse_query_dxil(db_dxil, args)
if args.query == "hlsl":
db_hlsl = get_db_hlsl()
parse_query_hlsl(db_hlsl, args)