Edit

kc3-lang/angle/src/libANGLE/Observer.h

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2018-10-10 16:13:03
    Hash : 956ab4d9
    Message : Optimize several functions for the Program perf test. This gives the same or slightly better performance in the ProgramDraw perf test. Also only set the Program object as dirty when there are dirty bits set in the Program itself. Bug: angleproject:2877 Change-Id: I07b428b40d3e3c24e0a42c970524756b6dc3a30e Reviewed-on: https://chromium-review.googlesource.com/c/1271475 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>

  • src/libANGLE/Observer.h
  • //
    // Copyright 2016 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.
    //
    // Observer:
    //   Implements the Observer pattern for sending state change notifications
    //   from Subject objects to dependent Observer objects.
    //
    //   See design document:
    //   https://docs.google.com/document/d/15Edfotqg6_l1skTEL8ADQudF_oIdNa7i8Po43k6jMd4/
    
    #ifndef LIBANGLE_OBSERVER_H_
    #define LIBANGLE_OBSERVER_H_
    
    #include "common/FastVector.h"
    #include "common/angleutils.h"
    
    namespace gl
    {
    class Context;
    }  // namespace gl
    
    namespace angle
    {
    
    using SubjectIndex = size_t;
    
    enum class SubjectMessage
    {
        CONTENTS_CHANGED,
        STORAGE_CHANGED,
        BINDING_CHANGED,
        DEPENDENT_DIRTY_BITS,
        RESOURCE_MAPPED,
        RESOURCE_UNMAPPED,
    };
    
    // The observing class inherits from this interface class.
    class ObserverInterface
    {
      public:
        virtual ~ObserverInterface();
        virtual void onSubjectStateChange(const gl::Context *context,
                                          SubjectIndex index,
                                          SubjectMessage message) = 0;
    };
    
    class ObserverBinding;
    
    // Maintains a list of observer bindings. Sends update messages to the observer.
    class Subject : NonCopyable
    {
      public:
        Subject();
        virtual ~Subject();
    
        void onStateChange(const gl::Context *context, SubjectMessage message) const;
        bool hasObservers() const;
        void resetObservers();
    
      private:
        // Only the ObserverBinding class should add or remove observers.
        friend class ObserverBinding;
        void addObserver(ObserverBinding *observer);
        void removeObserver(ObserverBinding *observer);
    
        // Keep a short list of observers so we can allocate/free them quickly. But since we support
        // unlimited bindings, have a spill-over list of that uses dynamic allocation.
        static constexpr size_t kMaxFixedObservers = 8;
        angle::FastVector<ObserverBinding *, kMaxFixedObservers> mObservers;
    };
    
    // Keeps a binding between a Subject and Observer, with a specific subject index.
    class ObserverBinding final
    {
      public:
        ObserverBinding(ObserverInterface *observer, SubjectIndex index);
        ~ObserverBinding();
        ObserverBinding(const ObserverBinding &other);
        ObserverBinding &operator=(const ObserverBinding &other);
    
        void bind(Subject *subject);
    
        ANGLE_INLINE void reset() { bind(nullptr); }
    
        void onStateChange(const gl::Context *context, SubjectMessage message) const;
        void onSubjectReset();
    
        const Subject *getSubject() const;
    
      private:
        Subject *mSubject;
        ObserverInterface *mObserver;
        SubjectIndex mIndex;
    };
    
    }  // namespace angle
    
    #endif  // LIBANGLE_OBSERVER_H_