Edit

kc3-lang/angle/src/tests/angle_unittests_utils.h

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/tests/angle_unittests_utils.h
  • //
    // Copyright 2015 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.
    //
    // angle_unittests_utils.h:
    //   Helpers for mocking and unit testing.
    
    #ifndef TESTS_ANGLE_UNITTESTS_UTILS_H_
    #define TESTS_ANGLE_UNITTESTS_UTILS_H_
    
    #include "libANGLE/Surface.h"
    #include "libANGLE/renderer/ContextImpl.h"
    #include "libANGLE/renderer/EGLImplFactory.h"
    #include "libANGLE/renderer/GLImplFactory.h"
    
    namespace rx
    {
    
    // Useful when mocking a part of the GLImplFactory class
    class NullFactory : public GLImplFactory
    {
      public:
        NullFactory() {}
    
        // Shader creation
        CompilerImpl *createCompiler() override { return nullptr; }
        ShaderImpl *createShader(const gl::ShaderState &data) override { return nullptr; }
        ProgramImpl *createProgram(const gl::ProgramState &data) override { return nullptr; }
    
        // Framebuffer creation
        FramebufferImpl *createFramebuffer(const gl::FramebufferState &data) override
        {
            return nullptr;
        }
    
        // Texture creation
        TextureImpl *createTexture(const gl::TextureState &data) override { return nullptr; }
    
        // Renderbuffer creation
        RenderbufferImpl *createRenderbuffer(const gl::RenderbufferState &state) override
        {
            return nullptr;
        }
    
        // Buffer creation
        BufferImpl *createBuffer(const gl::BufferState &state) override { return nullptr; }
    
        // Vertex Array creation
        VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override
        {
            return nullptr;
        }
    
        // Query and Fence creation
        QueryImpl *createQuery(gl::QueryType type) override { return nullptr; }
        FenceNVImpl *createFenceNV() override { return nullptr; }
        SyncImpl *createSync() override { return nullptr; }
    
        // Transform Feedback creation
        TransformFeedbackImpl *createTransformFeedback(const gl::TransformFeedbackState &state) override
        {
            return nullptr;
        }
    
        // Sampler object creation
        SamplerImpl *createSampler(const gl::SamplerState &state) override { return nullptr; }
    
        // Program Pipeline creation
        ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) override
        {
            return nullptr;
        }
    
        std::vector<PathImpl *> createPaths(GLsizei range) override
        {
            return std::vector<PathImpl *>();
        }
    
        SemaphoreImpl *createSemaphore() override { return nullptr; }
    
        OverlayImpl *createOverlay(const gl::OverlayState &state) override { return nullptr; }
    };
    
    // A class with all the factory methods mocked.
    class MockGLFactory : public GLImplFactory
    {
      public:
        MOCK_METHOD1(createContext, ContextImpl *(const gl::State &));
        MOCK_METHOD0(createCompiler, CompilerImpl *());
        MOCK_METHOD1(createShader, ShaderImpl *(const gl::ShaderState &));
        MOCK_METHOD1(createProgram, ProgramImpl *(const gl::ProgramState &));
        MOCK_METHOD1(createProgramPipeline, ProgramPipelineImpl *(const gl::ProgramPipelineState &));
        MOCK_METHOD1(createFramebuffer, FramebufferImpl *(const gl::FramebufferState &));
        MOCK_METHOD0(createMemoryObject, MemoryObjectImpl *());
        MOCK_METHOD1(createTexture, TextureImpl *(const gl::TextureState &));
        MOCK_METHOD1(createRenderbuffer, RenderbufferImpl *(const gl::RenderbufferState &));
        MOCK_METHOD1(createBuffer, BufferImpl *(const gl::BufferState &));
        MOCK_METHOD1(createVertexArray, VertexArrayImpl *(const gl::VertexArrayState &));
        MOCK_METHOD1(createQuery, QueryImpl *(gl::QueryType type));
        MOCK_METHOD0(createFenceNV, FenceNVImpl *());
        MOCK_METHOD0(createSync, SyncImpl *());
        MOCK_METHOD1(createTransformFeedback,
                     TransformFeedbackImpl *(const gl::TransformFeedbackState &));
        MOCK_METHOD1(createSampler, SamplerImpl *(const gl::SamplerState &));
        MOCK_METHOD1(createPaths, std::vector<PathImpl *>(GLsizei));
        MOCK_METHOD0(createSemaphore, SemaphoreImpl *());
        MOCK_METHOD1(createOverlay, OverlayImpl *(const gl::OverlayState &));
    };
    
    class MockEGLFactory : public EGLImplFactory
    {
      public:
        MOCK_METHOD3(createWindowSurface,
                     SurfaceImpl *(const egl::SurfaceState &,
                                   EGLNativeWindowType,
                                   const egl::AttributeMap &));
        MOCK_METHOD2(createPbufferSurface,
                     SurfaceImpl *(const egl::SurfaceState &, const egl::AttributeMap &));
        MOCK_METHOD4(createPbufferFromClientBuffer,
                     SurfaceImpl *(const egl::SurfaceState &,
                                   EGLenum,
                                   EGLClientBuffer,
                                   const egl::AttributeMap &));
        MOCK_METHOD3(createPixmapSurface,
                     SurfaceImpl *(const egl::SurfaceState &,
                                   NativePixmapType,
                                   const egl::AttributeMap &));
        MOCK_METHOD4(createImage,
                     ImageImpl *(const egl::ImageState &,
                                 const gl::Context *,
                                 EGLenum,
                                 const egl::AttributeMap &));
        MOCK_METHOD5(createContext,
                     ContextImpl *(const gl::State &,
                                   gl::ErrorSet *,
                                   const egl::Config *,
                                   const gl::Context *,
                                   const egl::AttributeMap &));
        MOCK_METHOD2(createStreamProducerD3DTexture,
                     StreamProducerImpl *(egl::Stream::ConsumerType, const egl::AttributeMap &));
    };
    
    }  // namespace rx
    
    #endif  // TESTS_ANGLE_UNITTESTS_UTILS_H_