File: GLObjects

package info (click to toggle)
openscenegraph 3.6.5%2Bdfsg1-8
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 40,028 kB
  • sloc: cpp: 392,065; ansic: 21,495; java: 1,020; yacc: 548; makefile: 430; objc: 406; xml: 155; lex: 151; javascript: 34
file content (132 lines) | stat: -rw-r--r-- 4,875 bytes parent folder | download | duplicates (4)
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
127
128
129
130
131
132
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
 *
 * This library is open source and may be redistributed and/or modified under
 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
 * (at your option) any later version.  The full license is in LICENSE file
 * included with this distribution, and on the openscenegraph.org website.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * OpenSceneGraph Public License for more details.
*/

#ifndef OSG_GLOBJECTS
#define OSG_GLOBJECTS 1

#include <osg/Referenced>
#include <osg/GL>
#include <list>
#include <string>

namespace osg {

// forward declare
class FrameStamp;

/** Flush all deleted OpenGL objects within the specified availableTime.
  * Note, must be called from a thread which has current the graphics context associated with contextID. */
extern OSG_EXPORT void flushDeletedGLObjects(unsigned int contextID, double currentTime, double& availableTime);

/** Flush all deleted OpenGL objects.
  * Note, must be called from a thread which has current the graphics context associated with contextID. */
extern OSG_EXPORT void flushAllDeletedGLObjects(unsigned int contextID);

/** Do a GL delete all OpenGL objects.
  * Note, must be called from a thread which has current the graphics context associated with contextID. */
extern OSG_EXPORT void deleteAllGLObjects(unsigned int contextID);

/** Discard all OpenGL objects.
  * Note, unlike deleteAllGLjects discard does not
  * do any OpenGL calls so can be called from any thread, but as a consequence it
  * also doesn't remove the associated OpenGL resource so discard should only be
  * called when the associated graphics context is being/has been closed. */
extern OSG_EXPORT void discardAllGLObjects(unsigned int contextID);

class OSG_EXPORT GraphicsObject : public osg::Referenced
{
    public:
        GraphicsObject();

    protected:
        virtual ~GraphicsObject();
};


class OSG_EXPORT GraphicsObjectManager : public osg::Referenced
{
    public:
        GraphicsObjectManager(const std::string& name, unsigned int contextID);

        unsigned int getContextID() const { return _contextID; }

        /** Signal that a new frame has started.*/
        virtual void newFrame(osg::FrameStamp* /*fs*/) {}

        virtual void resetStats() {}
        virtual void reportStats(std::ostream& /*out*/)  {}
        virtual void recomputeStats(std::ostream& /*out*/) const  {}


        /** Flush all deleted OpenGL objects within the specified availableTime.
        * Note, must be called from a thread which has current the graphics context associated with contextID. */
        virtual void flushDeletedGLObjects(double currentTime, double& availableTime) = 0;

        /** Flush all deleted OpenGL objects.
        * Note, must be called from a thread which has current the graphics context associated with contextID. */
        virtual void flushAllDeletedGLObjects() = 0;

        /** Do a GL delete all OpenGL objects.
        * Note, must be called from a thread which has current the graphics context associated with contextID. */
        virtual void deleteAllGLObjects() = 0;

        /** Discard all OpenGL objects.
        * Note, unlike deleteAllGLjects discard does not
        * do any OpenGL calls so can be called from any thread, but as a consequence it
        * also doesn't remove the associated OpenGL resource so discard should only be
        * called when the associated graphics context is being/has been closed. */
        virtual void discardAllGLObjects() = 0;

    protected:
        virtual ~GraphicsObjectManager();

        std::string     _name;
        unsigned int    _contextID;

};

class OSG_EXPORT GLObjectManager : public GraphicsObjectManager
{
public:
    GLObjectManager(const std::string& name, unsigned int contextID);

    virtual void flushDeletedGLObjects(double currentTime, double& availableTime);

    virtual void flushAllDeletedGLObjects();

    virtual void deleteAllGLObjects();

    virtual void discardAllGLObjects();

    /** schedule a GL object for deletion by the graphics thread.*/
    virtual void scheduleGLObjectForDeletion(GLuint globj);

    /** implementation of the actual creation of an GL object - subclasses from GLObjectManager must implement the appropriate GL calls.*/
    virtual GLuint createGLObject();

    /** implementation of the actual deletion of an GL object - subclasses from GLObjectManager must implement the appropriate GL calls.*/
    virtual void deleteGLObject(GLuint globj) = 0;

protected:
    virtual ~GLObjectManager();

    typedef std::list<GLuint> GLObjectHandleList;
    OpenThreads::Mutex  _mutex;
    GLObjectHandleList _deleteGLObjectHandles;

};


}

#endif