Edit

kc3-lang/angle/src/libANGLE/overlay_widgets.json

Branch :

  • Show log

    Commit

  • Author : Shahbaz Youssefi
    Date : 2019-06-30 03:26:18
    Hash : 050b124d
    Message : Reland "Vulkan: Debug overlay" This is a reland of e54d0f90d1a165404236fd7abd1b05ddd041a686 This was reverted due to a build failure as a result of a missing virtual destructor in the widget base class. Original change's description: > Vulkan: Debug overlay > > A debug overlay system for the Vulkan backend designed with efficiency > and runtime configurability in mind. Overlay widgets are of two > fundamental types: > > - Text widgets: A single line of text with small, medium or large font. > - Graph widgets: A bar graph of data. > > Built on these, various overlay widget types are defined that gather > statistics. Five such types are defined with one widget per type as > example: > > - Count: A widget that counts something. VulkanValidationMessageCount > is an overlay widget of this type that shows the number of validation > messages received from the validation layers. > - Text: A generic text. VulkanLastValidationMessage is an overlay > widget of this type that shows the last validation message. > - PerSecond: A value that gets reset every second automatically. FPS is > an overlay widget of this type that simply gets incremented on every > swap(). > - RunningGraph: A graph of last N values. VulkanCommandGraphSize is an > overlay of this type. On every vkQueueSubmit, the number of nodes in > the command graph is accumulated. On every present(), the value is > taken as the number of nodes for the whole duration of the frame. > - RunningHistogram: A histogram of last N values. Input values are in > the [0, 1] range and they are ranked to N buckets for histogram > calculation. VulkanSecondaryCommandBufferPoolWaste is an overlay > widget of this type. On vkQueueSubmit, the memory waste from command > buffer pool allocations is recorded in the histogram. > > Overlay font is placed in libANGLE/overlay/ which gen_overlay_fonts.py > processes to create an array of bits, which is processed at runtime to > create the actual font image (an image with 3 layers). > > The overlay widget layout is defined in overlay_widgets.json which > gen_overlay_widgets.py processes to generate an array of widgetss, each > of its respective type, and sets their properties, such as color and > bounding box. The json file allows widgets to align against other > widgets as well as against the framebuffer edges. > > Two compute shaders are implemented to efficiently render the UI: > > - OverlayCull: This shader creates a bitset of Text and Graph widgets > whose bounding boxes intersect a corresponding subgroup processed by > OverlayDraw. This is done only when the enabled overlay widgets are > changed (a feature that is not yet implemented) or the surface is > resized. > - OverlayDraw: Using the bitsets generated by OverlayCull, values that > are uniform for each workgroup (set to be equal to hardware subgroup > size), this shader loops over enabled widgets that can possibly > intersect the pixel being processed and renders and blends in texts > and graphs. This is done once per frame on present(). > > Currently, to enable overlay widgets an environment variable is used. > For example: > > $ export ANGLE_OVERLAY=FPS:VulkanSecondaryCommandBufferPoolWaste > $ ./hello_triangle --use-angle=vulkan > > Possible future work: > > - On Android, add settings in developer options and enable widgets based > on those. > - Spawn a small server in ANGLE and write an application that sends > enable/disable commands remotely. > - Implement overlay for other backends. > > Bug: angleproject:3757 > Change-Id: If9c6974d1935c18f460ec569e79b41188bd7afcc > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1729440 > Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> > Reviewed-by: Jamie Madill <jmadill@chromium.org> Bug: angleproject:3757 Change-Id: I47915d88b37b6f882c686c2de13fca309a10b572 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1780897 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>

  • src/libANGLE/overlay_widgets.json
  • {
        "description": [
            "Copyright 2019 The ANGLE Project Authors. All rights reserved.",
            "Use of this source code is governed by a BSD-style license that can be",
            "found in the LICENSE file.",
            "",
            "overlay_widgets.json: Layout of Overlay widgets.",
            "",
            "Data for every overlay widget 'Widget' is a map with the following keys:",
            "",
            " - type: one of WidgetType types (with constructor params), such as 'PerSecond' or",
            "         'RunningGraph(64)'",
            " - color: in [R,G,B,A] format where every value is in [0,255]",
            " - coords: in [X,Y] which is the distance from the edges of the window, with negative",
            "           values representing distance from the right/bottom edge.  If a value is given",
            "           in the form of 'Widget2.<edge>.<mode>', the calculated value for <edge> in",
            "           Widget2 is used.  <edge> is one of:",
            "            - 'left', 'right': valid for x",
            "            - 'top', 'bottom': valid for y",
            "           <mode> is one of:",
            "            - 'align': the requested value is used",
            "            - 'adjacent': the value is calculated such that two widgets become adjacent",
            " - font: for Text widgets, one of 'large', 'medium' and 'small'",
            " - length: for Text widgets, maximum number of characters for this widget",
            " - bar_width: for Graph widgets, size of each graph bar.",
            " - height: for Graph widgets, the height of the graph.",
            " - text: for Graph widgets, data for the attached Text widget.  This is a map with the same",
            "         Text keys as above except type, which is implicitly Text."
        ],
        "widgets": [
            {
                "name": "FPS",
                "type": "PerSecond",
                "color": [127, 191, 255, 255],
                "coords": [10, 10],
                "font": "medium",
                "length": 12
            },
            {
                "name": "VulkanLastValidationMessage",
                "type": "Text",
                "color": [255, 0, 0, 255],
                "coords": [10, -10],
                "font": "small",
                "length": 150
            },
            {
                "name": "VulkanValidationMessageCount",
                "type": "Count",
                "color": [255, 0, 0, 255],
                "coords": [10, "VulkanLastValidationMessage.top.adjacent"],
                "font": "small",
                "length": 25
            },
            {
                "name": "VulkanCommandGraphSize",
                "type": "RunningGraph(60)",
                "color": [75, 200, 0, 200],
                "coords": [10, 100],
                "bar_width": 5,
                "height": 100,
                "description": {
                    "color": [75, 200, 0, 255],
                    "coords": ["VulkanCommandGraphSize.left.align", "VulkanCommandGraphSize.top.adjacent"],
                    "font": "small",
                    "length": 40
                }
            },
            {
                "name": "VulkanSecondaryCommandBufferPoolWaste",
                "type": "RunningHistogram(50)",
                "color": [255, 200, 75, 200],
                "coords": [-50, 100],
                "bar_width": 6,
                "height": 100,
                "description": {
                    "color": [255, 200, 75, 255],
                    "coords": ["VulkanSecondaryCommandBufferPoolWaste.left.align",
                               "VulkanSecondaryCommandBufferPoolWaste.top.adjacent"],
                    "font": "small",
                    "length": 40
                }
            }
        ]
    }