1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
import renderdoc as rd
import rdtest
class VK_Multi_Entry(rdtest.TestCase):
demos_test_name = 'VK_Multi_Entry'
def check_capture(self):
last_action: rd.ActionDescription = self.get_last_action()
self.controller.SetFrameEvent(last_action.eventId, True)
self.check_triangle(out=last_action.copyDestination)
rdtest.log.success("Triangle output looks correct")
action = self.find_action('CmdDraw')
self.controller.SetFrameEvent(action.eventId, True)
pipe: rd.PipeState = self.controller.GetPipelineState()
vkpipe = self.controller.GetVulkanPipelineState()
binding = vkpipe.graphics.descriptorSets[0].bindings[0]
if binding.dynamicallyUsedCount != 1:
raise rdtest.TestFailureException("Bind 0 doesn't have the right used count {}"
.format(binding.dynamicallyUsedCount))
if not binding.binds[15].dynamicallyUsed:
raise rdtest.TestFailureException("Graphics bind 0[15] isn't dynamically used")
refl: rd.ShaderReflection = pipe.GetShaderReflection(rd.ShaderStage.Vertex)
self.check(len(refl.readOnlyResources) == 0)
postvs = self.get_postvs(action, rd.MeshDataStage.VSOut, first_index=0, num_indices=1, instance=0)
trace: rd.ShaderDebugTrace = self.controller.DebugVertex(0, 0, 0, 0)
if trace.debugger is None:
raise rdtest.TestFailureException("No vertex debug result")
cycles, variables = self.process_trace(trace)
outputs = 0
for var in trace.sourceVars:
var: rd.SourceVariableMapping
if var.variables[0].type == rd.DebugVariableType.Variable and var.signatureIndex >= 0:
name = var.name
if name not in postvs[0].keys():
raise rdtest.TestFailureException("Don't have expected output for {}".format(name))
expect = postvs[0][name]
value = self.evaluate_source_var(var, variables)
if len(expect) != value.columns:
raise rdtest.TestFailureException(
"Vertex output {} has different size ({} values) to expectation ({} values)"
.format(name, action.eventId, value.columns, len(expect)))
compType = rd.VarTypeCompType(value.type)
if compType == rd.CompType.UInt:
debugged = list(value.value.u32v[0:value.columns])
elif compType == rd.CompType.SInt:
debugged = list(value.value.s32v[0:value.columns])
else:
debugged = list(value.value.f32v[0:value.columns])
is_eq, diff_amt = rdtest.value_compare_diff(expect, debugged, eps=5.0E-06)
if not is_eq:
rdtest.log.error(
"Debugged vertex output value {}: {} difference. {} doesn't exactly match postvs output {}".format(
name, action.eventId, diff_amt, debugged, expect))
outputs = outputs + 1
rdtest.log.success('Successfully debugged vertex in {} cycles, {}/{} outputs match'
.format(cycles, outputs, len(refl.outputSignature)))
self.controller.FreeTrace(trace)
history = self.controller.PixelHistory(pipe.GetOutputTargets()[0].resourceId, 200, 150, rd.Subresource(0, 0, 0),
rd.CompType.Typeless)
# should be a clear then a draw
self.check(len(history) == 2)
self.check(self.find_action('', history[0].eventId).flags & rd.ActionFlags.Clear)
self.check(self.find_action('', history[1].eventId).eventId == action.eventId)
self.check(history[1].Passed())
if not rdtest.value_compare(history[1].shaderOut.col.floatValue, (0.0, 1.0, 0.0, 1.0)):
raise rdtest.TestFailureException(
"History for drawcall output is wrong: {}".format(history[1].shaderOut.col.floatValue))
trace = self.controller.DebugPixel(200, 150, 0, 0)
refl: rd.ShaderReflection = pipe.GetShaderReflection(rd.ShaderStage.Pixel)
self.check(len(refl.readOnlyResources) == 1)
if trace.debugger is None:
raise rdtest.TestFailureException("No pixel debug result")
cycles, variables = self.process_trace(trace)
output_sourcevar = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0)
if output_sourcevar is None:
raise rdtest.TestFailureException("Couldn't get colour output value")
debugged = self.evaluate_source_var(output_sourcevar, variables)
self.controller.FreeTrace(trace)
debuggedValue = list(debugged.value.f32v[0:4])
is_eq, diff_amt = rdtest.value_compare_diff(history[1].shaderOut.col.floatValue, debuggedValue, eps=5.0E-06)
if not is_eq:
rdtest.log.error(
"Debugged pixel value {}: {} difference. {} doesn't exactly match history shader output {}".format(
debugged.name, diff_amt, debuggedValue, history[1].shaderOut.col.floatValue))
rdtest.log.success('Successfully debugged pixel in {} cycles, result matches'.format(cycles))
out = self.controller.CreateOutput(rd.CreateHeadlessWindowingData(100, 100), rd.ReplayOutputType.Texture)
tex = rd.TextureDisplay()
tex.resourceId = pipe.GetOutputTargets()[0].resourceId
tex.overlay = rd.DebugOverlay.TriangleSizeDraw
out.SetTextureDisplay(tex)
out.Display()
overlay_id = out.GetDebugOverlayTexID()
self.check_pixel_value(overlay_id, 200, 150, [14992.0, 14992.0, 14992.0, 1.0])
rdtest.log.success("Triangle size overlay gave correct output")
out.Shutdown()
|