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 147 148 149 150 151 152
|
import rdtest
import struct
import renderdoc as rd
class VK_Discard_Zoo(rdtest.Discard_Zoo):
demos_test_name = 'VK_Discard_Zoo'
internal = False
def __init__(self):
rdtest.Discard_Zoo.__init__(self)
def check_capture(self):
self.check_textures()
# Test render pass attachments
action = self.find_action("TestStart")
rpcol: rd.TextureDescription = self.get_texture(
[res for res in self.controller.GetResources() if "RPCol" in res.name][0].resourceId)
rpdepth: rd.TextureDescription = self.get_texture(
[res for res in self.controller.GetResources() if "RPDepth" in res.name][0].resourceId)
self.check(action is not None)
self.controller.SetFrameEvent(action.next.eventId, True)
# At the start they should be cleared
for y in range(0, rpcol.height-1, 17):
for x in range(0, rpcol.width-1, 17):
self.check_pixel_value(rpcol.resourceId, x, y, [0.0, 1.0, 0.0, 1.0])
self.check_pixel_value(rpdepth.resourceId, x, y, [0.4, float(0x40)/float(255), 0.0, 1.0])
rdtest.log.success("Values are correct before the renderpass")
action = self.find_action("TestMiddle")
self.controller.SetFrameEvent(action.next.eventId, True)
for y in range(0, rpcol.height-1, 17):
for x in range(0, rpcol.width-1, 17):
# if we're in the rect, check for pattern colors
if 50 <= x < 125 and 50 <= y < 125:
c: rd.PixelValue = self.controller.PickPixel(rpcol.resourceId, x, y, rd.Subresource(),
rd.CompType.Typeless)
d: rd.PixelValue = self.controller.PickPixel(rpdepth.resourceId, x, y, rd.Subresource(),
rd.CompType.Typeless)
if not rdtest.value_compare(c.floatValue, [0.0] * 4) and not rdtest.value_compare(c.floatValue,
[1000.0] * 4):
raise rdtest.TestFailureException(
'middle color has unexpected value at {},{}: {}'.format(x, y, c.floatValue))
if not rdtest.value_compare(d.floatValue[0:2], [0.0] * 2) and not rdtest.value_compare(
d.floatValue[0:2], [1.0] * 2):
raise rdtest.TestFailureException(
'middle depth has unexpected value at {},{}: {}'.format(x, y, d.floatValue))
else:
self.check_pixel_value(rpcol.resourceId, x, y, [0.0, 1.0, 0.0, 1.0])
self.check_pixel_value(rpdepth.resourceId, x, y, [0.4, float(0x40)/float(255), 0.0, 1.0])
middle_col_bytes = self.controller.GetTextureData(rpcol.resourceId, rd.Subresource())
middle_depth_bytes = self.controller.GetTextureData(rpdepth.resourceId, rd.Subresource())
rdtest.log.success("Values are correct in the middle of the renderpass")
action = self.find_action("TestEnd")
self.controller.SetFrameEvent(action.next.eventId, True)
for y in range(0, rpcol.height-1, 17):
for x in range(0, rpcol.width-1, 17):
# if we're in the rect, check for pattern colors
if 50 <= x < 125 and 50 <= y < 125:
c: rd.PixelValue = self.controller.PickPixel(rpcol.resourceId, x, y, rd.Subresource(),
rd.CompType.Typeless)
d: rd.PixelValue = self.controller.PickPixel(rpdepth.resourceId, x, y, rd.Subresource(),
rd.CompType.Typeless)
if not rdtest.value_compare(c.floatValue, [0.0] * 4) and not rdtest.value_compare(c.floatValue,
[1000.0] * 4):
raise rdtest.TestFailureException(
'middle color has unexpected value at {},{}: {}'.format(x, y, c.floatValue))
if not rdtest.value_compare(d.floatValue[0:2], [0.0] * 2) and not rdtest.value_compare(
d.floatValue[0:2], [1.0] * 2):
raise rdtest.TestFailureException(
'middle depth has unexpected value at {},{}: {}'.format(x, y, d.floatValue))
else:
self.check_pixel_value(rpcol.resourceId, x, y, [0.0, 1.0, 0.0, 1.0])
self.check_pixel_value(rpdepth.resourceId, x, y, [0.4, float(0x40)/float(255), 0.0, 1.0])
rdtest.log.success("Values are correct after the renderpass")
end_col_bytes = self.controller.GetTextureData(rpcol.resourceId, rd.Subresource())
end_depth_bytes = self.controller.GetTextureData(rpdepth.resourceId, rd.Subresource())
self.check(middle_col_bytes != end_col_bytes)
self.check(middle_depth_bytes != end_depth_bytes)
action = self.find_action("UndefinedLoad_Before")
self.controller.SetFrameEvent(action.next.eventId, True)
# check that they are cleared again
for y in range(0, rpcol.height-1, 17):
for x in range(0, rpcol.width-1, 17):
self.check_pixel_value(rpcol.resourceId, x, y, [0.0, 1.0, 0.0, 1.0])
self.check_pixel_value(rpdepth.resourceId, x, y, [0.4, float(0x40)/float(255), 0.0, 1.0])
rdtest.log.success("Values are correct before the UNDEFINED initial layout renderpass")
action = self.find_action("UndefinedLoad_After")
self.controller.SetFrameEvent(action.next.eventId, True)
# check that they are all undefined pattern - initial layout affects the whole resource
for y in range(0, rpcol.height-1, 17):
for x in range(0, rpcol.width-1, 17):
c: rd.PixelValue = self.controller.PickPixel(rpcol.resourceId, x, y, rd.Subresource(),
rd.CompType.Typeless)
d: rd.PixelValue = self.controller.PickPixel(rpdepth.resourceId, x, y, rd.Subresource(),
rd.CompType.Typeless)
if not rdtest.value_compare(c.floatValue, [0.0] * 4) and not rdtest.value_compare(c.floatValue,
[1000.0] * 4):
raise rdtest.TestFailureException(
'undefined color has unexpected value at {},{}: {}'.format(x, y, c.floatValue))
if not rdtest.value_compare(d.floatValue[0:2], [0.0] * 2) and not rdtest.value_compare(
d.floatValue[0:2], [1.0] * 2):
raise rdtest.TestFailureException(
'undefined depth has unexpected value at {},{}: {}'.format(x, y, d.floatValue))
rdtest.log.success("Values are correct after the UNDEFINED initial layout renderpass")
action = self.find_action("CmdDraw")
self.check(action is not None)
self.controller.SetFrameEvent(action.eventId, True)
pipe: rd.PipeState = self.controller.GetPipelineState()
tex_id = pipe.GetOutputTargets()[0].resourceId
self.check_pixel_value(tex_id, 0.5, 0.5, [0.0, 1.0, 0.0, 1.0])
self.controller.SetFrameEvent(action.next.eventId, True)
self.check_pixel_value(tex_id, 0.5, 0.5, [0.0, 1.0, 0.0, 1.0])
rdtest.log.success("Output value from draw is correct at draw and after it")
|