mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-21 01:10:39 +00:00
d0accc409b
* This is a deliberate break of compatibility since the field is now often empty, for non-markers. This means code will get a more explicit error when the name is being referenced, so it can be updated to fetch the name it needs as needed.
108 lines
3.0 KiB
Python
108 lines
3.0 KiB
Python
import sys
|
|
|
|
# Import renderdoc if not already imported (e.g. in the UI)
|
|
if 'renderdoc' not in sys.modules and '_renderdoc' not in sys.modules:
|
|
import renderdoc
|
|
|
|
# Alias renderdoc for legibility
|
|
rd = renderdoc
|
|
|
|
actions = {}
|
|
|
|
# Define a recursive function for iterating over actions
|
|
def iterDraw(d, indent = ''):
|
|
global actions
|
|
|
|
# save the action by eventId
|
|
actions[d.eventId] = d
|
|
|
|
# Iterate over the draw's children
|
|
for d in d.children:
|
|
iterDraw(d, indent + ' ')
|
|
|
|
def sampleCode(controller):
|
|
# Iterate over all of the root actions, so we have names for each
|
|
# eventId
|
|
for d in controller.GetRootActions():
|
|
iterDraw(d)
|
|
|
|
# Enumerate the available counters
|
|
counters = controller.EnumerateCounters()
|
|
|
|
if not (rd.GPUCounter.SamplesPassed in counters):
|
|
raise RuntimeError("Implementation doesn't support Samples Passed counter")
|
|
|
|
# Now we fetch the counter data, this is a good time to batch requests of as many
|
|
# counters as possible, the implementation handles any book keeping.
|
|
results = controller.FetchCounters([rd.GPUCounter.SamplesPassed])
|
|
|
|
# Get the description for the counter we want
|
|
samplesPassedDesc = controller.DescribeCounter(rd.GPUCounter.SamplesPassed)
|
|
|
|
# Describe each counter
|
|
for c in counters:
|
|
desc = controller.DescribeCounter(c)
|
|
|
|
print("Counter %d (%s):" % (c, desc.name))
|
|
print(" %s" % desc.description)
|
|
print(" Returns %d byte %s, representing %s" % (desc.resultByteWidth, desc.resultType, desc.unit))
|
|
|
|
# Look in the results for any draws with 0 samples written - this is an indication
|
|
# that if a lot of draws appear then culling could be better.
|
|
for r in results:
|
|
draw = actions[r.eventId]
|
|
|
|
# Only care about draws, not about clears and other misc events
|
|
if not (draw.flags & rd.ActionFlags.Drawcall):
|
|
continue
|
|
|
|
if samplesPassedDesc.resultByteWidth == 4:
|
|
val = r.value.u32
|
|
else:
|
|
val = r.value.u64
|
|
|
|
if val == 0:
|
|
print("EID %d '%s' had no samples pass depth/stencil test!" % (r.eventId, draw.GetName(controller.GetStructuredFile())))
|
|
|
|
def loadCapture(filename):
|
|
# Open a capture file handle
|
|
cap = rd.OpenCaptureFile()
|
|
|
|
# Open a particular file - see also OpenBuffer to load from memory
|
|
status = cap.OpenFile(filename, '', None)
|
|
|
|
# Make sure the file opened successfully
|
|
if status != rd.ReplayStatus.Succeeded:
|
|
raise RuntimeError("Couldn't open file: " + str(status))
|
|
|
|
# Make sure we can replay
|
|
if not cap.LocalReplaySupport():
|
|
raise RuntimeError("Capture cannot be replayed")
|
|
|
|
# Initialise the replay
|
|
status,controller = cap.OpenCapture(rd.ReplayOptions(), None)
|
|
|
|
if status != rd.ReplayStatus.Succeeded:
|
|
raise RuntimeError("Couldn't initialise replay: " + str(status))
|
|
|
|
return cap,controller
|
|
|
|
if 'pyrenderdoc' in globals():
|
|
pyrenderdoc.Replay().BlockInvoke(sampleCode)
|
|
else:
|
|
rd.InitialiseReplay(rd.GlobalEnvironment(), [])
|
|
|
|
if len(sys.argv) <= 1:
|
|
print('Usage: python3 {} filename.rdc'.format(sys.argv[0]))
|
|
sys.exit(0)
|
|
|
|
cap,controller = loadCapture(sys.argv[1])
|
|
|
|
sampleCode(controller)
|
|
|
|
controller.Shutdown()
|
|
cap.Shutdown()
|
|
|
|
rd.ShutdownReplay()
|
|
|