1*61046927SAndroid Build Coastguard Worker-- Parse cmdstream dump and check for common errors 2*61046927SAndroid Build Coastguard Worker-- 1) Check for overflowing HLSQ_xS_CNTL.CONSTLEN 3*61046927SAndroid Build Coastguard Worker-- 2) Check for constant uploades that overwrite each other. The 4*61046927SAndroid Build Coastguard Worker-- range checking is reset on each draw, since it is a valid 5*61046927SAndroid Build Coastguard Worker-- use-case to do partial constant upload. But if we see two 6*61046927SAndroid Build Coastguard Worker-- CP_LOAD_STATE* that overwrite the same range of constants 7*61046927SAndroid Build Coastguard Worker-- within the same draw, that is almost certainly unintentional. 8*61046927SAndroid Build Coastguard Worker-- 9*61046927SAndroid Build Coastguard Worker-- TODO add more checks 10*61046927SAndroid Build Coastguard Worker-- TODO maybe some parts could be shared across 11*61046927SAndroid Build Coastguard Worker-- different generations 12*61046927SAndroid Build Coastguard Worker 13*61046927SAndroid Build Coastguard Worker--local posix = require "posix" 14*61046927SAndroid Build Coastguard Worker 15*61046927SAndroid Build Coastguard Workerfunction printf(fmt, ...) 16*61046927SAndroid Build Coastguard Worker return io.write(string.format(fmt, ...)) 17*61046927SAndroid Build Coastguard Workerend 18*61046927SAndroid Build Coastguard Worker 19*61046927SAndroid Build Coastguard Workerfunction dbg(fmt, ...) 20*61046927SAndroid Build Coastguard Worker --printf(fmt, ...) 21*61046927SAndroid Build Coastguard Workerend 22*61046927SAndroid Build Coastguard Worker 23*61046927SAndroid Build Coastguard Workerstages = { 24*61046927SAndroid Build Coastguard Worker "SB6_VS_SHADER", 25*61046927SAndroid Build Coastguard Worker "SB6_HS_SHADER", 26*61046927SAndroid Build Coastguard Worker "SB6_DS_SHADER", 27*61046927SAndroid Build Coastguard Worker "SB6_GS_SHADER", 28*61046927SAndroid Build Coastguard Worker "SB6_FS_SHADER", 29*61046927SAndroid Build Coastguard Worker "SB6_CS_SHADER", 30*61046927SAndroid Build Coastguard Worker} 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Worker-- maps shader stage to HLSQ_xS_CNTL register name: 33*61046927SAndroid Build Coastguard Workercntl_regs = { 34*61046927SAndroid Build Coastguard Worker ["SB6_VS_SHADER"] = "HLSQ_VS_CNTL", 35*61046927SAndroid Build Coastguard Worker ["SB6_HS_SHADER"] = "HLSQ_HS_CNTL", 36*61046927SAndroid Build Coastguard Worker ["SB6_DS_SHADER"] = "HLSQ_DS_CNTL", 37*61046927SAndroid Build Coastguard Worker ["SB6_GS_SHADER"] = "HLSQ_GS_CNTL", 38*61046927SAndroid Build Coastguard Worker ["SB6_FS_SHADER"] = "HLSQ_FS_CNTL", 39*61046927SAndroid Build Coastguard Worker ["SB6_CS_SHADER"] = "HLSQ_CS_CNTL", 40*61046927SAndroid Build Coastguard Worker} 41*61046927SAndroid Build Coastguard Worker 42*61046927SAndroid Build Coastguard Worker-- initialize constant updated ranges: 43*61046927SAndroid Build Coastguard Worker-- constranges[stagename] -> table of offsets that have been uploaded 44*61046927SAndroid Build Coastguard Workerconstranges = {} 45*61046927SAndroid Build Coastguard Workerfunction reset_constranges() 46*61046927SAndroid Build Coastguard Worker for i,stage in ipairs(stages) do 47*61046927SAndroid Build Coastguard Worker constranges[stage] = {} 48*61046927SAndroid Build Coastguard Worker end 49*61046927SAndroid Build Coastguard Workerend 50*61046927SAndroid Build Coastguard Worker 51*61046927SAndroid Build Coastguard Workerreset_constranges() 52*61046927SAndroid Build Coastguard Worker 53*61046927SAndroid Build Coastguard Workerprintf("Checking cmdstream...\n") 54*61046927SAndroid Build Coastguard Worker 55*61046927SAndroid Build Coastguard Workerlocal r = rnn.init("a630") 56*61046927SAndroid Build Coastguard Worker 57*61046927SAndroid Build Coastguard Workerfunction draw(primtype, nindx) 58*61046927SAndroid Build Coastguard Worker printf("draw!\n") 59*61046927SAndroid Build Coastguard Worker -- reset ranges of uploaded consts on each draw: 60*61046927SAndroid Build Coastguard Worker reset_constranges() 61*61046927SAndroid Build Coastguard Workerend 62*61046927SAndroid Build Coastguard Worker 63*61046927SAndroid Build Coastguard Workerfunction CP_LOAD_STATE6(pkt, size) 64*61046927SAndroid Build Coastguard Worker if tostring(pkt[0].STATE_TYPE) ~= "ST6_CONSTANTS" then 65*61046927SAndroid Build Coastguard Worker return 66*61046927SAndroid Build Coastguard Worker end 67*61046927SAndroid Build Coastguard Worker dbg("got CP_LOAD_STATE6\n") 68*61046927SAndroid Build Coastguard Worker stage = tostring(pkt[0].STATE_BLOCK) 69*61046927SAndroid Build Coastguard Worker max = pkt[0].DST_OFF + pkt[0].NUM_UNIT 70*61046927SAndroid Build Coastguard Worker cntl_reg = cntl_regs[stage] 71*61046927SAndroid Build Coastguard Worker dbg("looking for %s.. max=%d vs %d\n", cntl_reg, max, r[cntl_reg].CONSTLEN) 72*61046927SAndroid Build Coastguard Worker if max > r[cntl_reg].CONSTLEN then 73*61046927SAndroid Build Coastguard Worker printf("ERROR: invalid max constant offset for stage %s: %d vs %d\n", stage, max, r[cntl_reg].CONSTLEN) 74*61046927SAndroid Build Coastguard Worker end 75*61046927SAndroid Build Coastguard Worker 76*61046927SAndroid Build Coastguard Workerend 77