Hash :
879f90d2
Author :
Date :
2018-03-01T11:45:20
Vulkan: Avoid recopying the data every time we draw line loops Use the Observer pattern to get notified when the BufferVk we've copied our data from is changing. We will only recopy the data if anything has changed, but otherwise we'll keep drawing with the same index buffer we've created previously. Bug: angleproject:2335 Change-Id: Ib65677b4d5ec90c46a5e3b975fffd1fddeed59e7 Reviewed-on: https://chromium-review.googlesource.com/948622 Commit-Queue: Luc Ferron <lucferron@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
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
//
// 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/angleutils.h"
namespace gl
{
class Context;
} // namespace gl
namespace angle
{
using SubjectIndex = size_t;
enum class SubjectMessage
{
STATE_CHANGE,
DEPENDENT_DIRTY_BITS,
};
// 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);
std::vector<ObserverBinding *> 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);
void reset();
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_