File: VK_Descriptor_Indexing.py

package info (click to toggle)
renderdoc 1.24%2Bdfsg-1%2Bdeb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 105,156 kB
  • sloc: cpp: 759,405; ansic: 309,460; python: 26,606; xml: 22,599; java: 11,365; cs: 7,181; makefile: 6,707; yacc: 5,682; ruby: 4,648; perl: 3,461; sh: 2,354; php: 2,119; lisp: 1,835; javascript: 1,524; tcl: 1,068; ml: 747
file content (126 lines) | stat: -rw-r--r-- 6,120 bytes parent folder | download | duplicates (2)
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
import rdtest
import renderdoc as rd


class VK_Descriptor_Indexing(rdtest.TestCase):
    demos_test_name = 'VK_Descriptor_Indexing'

    def check_capture(self):

        action = self.find_action("Dispatch")
        self.check(action is not None)
        self.controller.SetFrameEvent(action.eventId, False)

        vkpipe: rd.VKState = self.controller.GetVulkanPipelineState()

        if len(vkpipe.compute.descriptorSets) != 1:
            raise rdtest.TestFailureException("Wrong number of compute sets is bound: {}, not 1"
                                              .format(len(vkpipe.compute.descriptorSets)))

        binding = vkpipe.compute.descriptorSets[0].bindings[0]

        if binding.dynamicallyUsedCount != 1:
            raise rdtest.TestFailureException("Compute bind 0 doesn't have the right used count {}"
                                              .format(binding.dynamicallyUsedCount))

        if not binding.binds[15].dynamicallyUsed:
            raise rdtest.TestFailureException("Compute bind 0[15] isn't dynamically used")

        # these lists are only expected to be empty because the descriptors aren't written to, and so with mutable
        # consideration these aren't considered read-only with unknown contents
        pipe = self.controller.GetPipelineState()
        ro = pipe.GetReadOnlyResources(rd.ShaderStage.Compute, False)
        self.check_eq(ro, [])
        ro = pipe.GetReadOnlyResources(rd.ShaderStage.Compute, True)
        self.check_eq(ro, [])

        rw = pipe.GetReadWriteResources(rd.ShaderStage.Compute, False)
        self.check_eq(rw[0].dynamicallyUsedCount, 1)
        self.check_eq(rw[0].firstIndex, 0)
        self.check_eq(len(rw[0].resources), 128)
        self.check(rw[0].resources[15].dynamicallyUsed)
        self.check_eq(rw[0].resources[15].resourceId, binding.binds[15].resourceResourceId)

        rw = pipe.GetReadWriteResources(rd.ShaderStage.Compute, True)
        self.check_eq(rw[0].dynamicallyUsedCount, 1)
        self.check_eq(rw[0].firstIndex, 15)
        self.check_eq(len(rw[0].resources), 1)
        self.check_eq(rw[0].resources[0].resourceId, binding.binds[15].resourceResourceId)
        self.check(rw[0].resources[0].dynamicallyUsed)

        action = self.find_action("Draw")
        self.check(action is not None)
        self.controller.SetFrameEvent(action.eventId, False)

        vkpipe: rd.VKState = self.controller.GetVulkanPipelineState()

        # Check bindings:
        #   - buffer 15 in bind 0 should be used
        #   - images 19, 20, 21 in bind 1 should be used for the non-uniform index
        #     images 49 & 59 in bind 1 should be used for the first fixed index
        #     image 4 in bind 1 should be used for the global access from a function with no dynamic/patched parameters
        #   - images 381 & 386 in bind 2 should be used for the second fixed index
        bind_info = {
            0: { 'dynamicallyUsedCount': 1, 'used': [15] },
            1: { 'dynamicallyUsedCount': 6, 'used': [4, 19, 20, 21, 49, 59] },
            2: { 'dynamicallyUsedCount': 2, 'used': [381, 386] },
        }

        if len(vkpipe.graphics.descriptorSets) != 1:
            raise rdtest.TestFailureException("Wrong number of sets is bound: {}, not 1"
                                              .format(len(vkpipe.graphics.descriptorSets)))

        desc_set: rd.VKDescriptorSet = vkpipe.graphics.descriptorSets[0]

        binding: rd.VKDescriptorBinding
        for bind, binding in enumerate(desc_set.bindings):
            if binding.dynamicallyUsedCount != bind_info[bind]['dynamicallyUsedCount']:
                raise rdtest.TestFailureException("Bind {} doesn't have the right used count. {} is not the expected count of {}"
                                                  .format(bind, binding.dynamicallyUsedCount, bind_info[bind]['dynamicallyUsedCount']))

            el: rd.VKBindingElement
            for idx, el in enumerate(binding.binds):
                expected_used = idx in bind_info[bind]['used']
                actually_used = el.dynamicallyUsed

                if expected_used and not actually_used:
                    raise rdtest.TestFailureException("Bind {} element {} expected to be used, but isn't.".format(bind, idx))

                if not expected_used and actually_used:
                    raise rdtest.TestFailureException("Bind {} element {} expected to be unused, but is.".format(bind, idx))

        pipe = self.controller.GetPipelineState()
        ro = pipe.GetReadOnlyResources(rd.ShaderStage.Pixel, False)
        self.check_eq(len(ro), 2)
        self.check_eq(ro[0].dynamicallyUsedCount, 6)
        self.check_eq(ro[0].firstIndex, 0)
        self.check_eq(len(ro[0].resources), 128)
        self.check_eq(ro[1].dynamicallyUsedCount, 2)
        self.check_eq(ro[1].firstIndex, 0)
        self.check_eq(len(ro[1].resources), 512)
        self.check(not ro[0].resources[18].dynamicallyUsed)
        self.check(ro[0].resources[19].dynamicallyUsed)
        ro = pipe.GetReadOnlyResources(rd.ShaderStage.Pixel, True)
        self.check_eq(len(ro), 2)
        self.check_eq(ro[0].dynamicallyUsedCount, 6)
        self.check_eq(ro[0].firstIndex, 4)
        self.check_eq(len(ro[0].resources), 56)
        self.check_eq(ro[1].dynamicallyUsedCount, 2)
        self.check_eq(ro[1].firstIndex, 381)
        self.check_eq(len(ro[1].resources), 6)
        self.check(not ro[0].resources[14].dynamicallyUsed)
        self.check(ro[0].resources[15].dynamicallyUsed)

        rw = pipe.GetReadWriteResources(rd.ShaderStage.Pixel, False)
        self.check_eq(rw[0].dynamicallyUsedCount, 1)
        self.check_eq(rw[0].firstIndex, 0)
        self.check_eq(len(rw[0].resources), 128)
        self.check(rw[0].resources[15].dynamicallyUsed)

        rw = pipe.GetReadWriteResources(rd.ShaderStage.Pixel, True)
        self.check_eq(rw[0].dynamicallyUsedCount, 1)
        self.check_eq(rw[0].firstIndex, 15)
        self.check_eq(len(rw[0].resources), 1)
        self.check(rw[0].resources[0].dynamicallyUsed)

        rdtest.log.success("Dynamic usage is as expected")