~thomas-voss/glmark2/build-for-mir

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
/*
 * Copyright © 2010-2011 Linaro Limited
 *
 * This file is part of the glmark2 OpenGL (ES) 2.0 benchmark.
 *
 * glmark2 is free software: you can redistribute it and/or modify it under the
 * terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 *
 * glmark2 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 GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * glmark2.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Authors:
 *  Alexandros Frantzis (glmark2)
 */
#ifndef GLMARK2_CANVAS_X11_H_
#define GLMARK2_CANVAS_X11_H_

#include "canvas.h"
#include <X11/Xlib.h>
#include <X11/Xutil.h>

/**
 * Canvas for rendering with GL to an X11 window.
 */
class CanvasX11 : public Canvas
{
public:
    ~CanvasX11() {}

    virtual bool init();
    virtual bool reset();
    virtual void visible(bool visible);
    virtual void clear();
    virtual void update();
    virtual void print_info();
    virtual Pixel read_pixel(int x, int y);
    virtual void write_to_file(std::string &filename);
    virtual bool should_quit();
    virtual void resize(int width, int height);
    virtual unsigned int fbo();

protected:
    CanvasX11(int width, int height) :
        Canvas(width, height), xwin_(0), xdpy_(0), fullscreen_(false),
        gl_color_format_(0), gl_depth_format_(0),
        color_renderbuffer_(0), depth_renderbuffer_(0), fbo_(0) {}

    /**
     * Gets the XVisualInfo to use for creating the X window with.
     *
     * The caller should XFree() the returned XVisualInfo when done.
     *
     * This method should be implemented in derived classes.
     *
     * @return the XVisualInfo
     */
    virtual XVisualInfo *get_xvisualinfo() = 0;

    /**
     * Makes the canvas the current target for GL rendering.
     *
     * This method should be implemented in derived classes.
     *
     * @return whether the operation succeeded
     */
    virtual bool make_current() = 0;

    /**
     * Resets the underlying GL context for rendering.
     *
     * This method should be implemented in derived classes.
     *
     * @return whether the operation succeeded
     */
    virtual bool reset_context() = 0;

    /**
     * Swaps the GL buffers (assuming double buffering is used).
     *
     * This method should be implemented in derived classes.
     *
     * @return whether the operation succeeded
     */
    virtual void swap_buffers() = 0;

    /**
     * Gets information about the GL visual used for this canvas.
     *
     * This method should be implemented in derived classes.
     */
    virtual void get_glvisualconfig(GLVisualConfig &visual_config) = 0;

    /**
     * Whether the current implementation supports GL(ES) 2.0.
     *
     * @return true if it supports GL(ES) 2.0, false otherwise
     */
    bool supports_gl2();


    /** The X window associated with this canvas. */
    Window xwin_;
    /** The X display associated with this canvas. */
    Display *xdpy_;

private:
    void resize_no_viewport(int width, int height);
    bool ensure_x_window();
    bool do_make_current();
    bool ensure_gl_formats();
    bool ensure_fbo();
    void release_fbo();

    const char *get_gl_format_str(GLenum f);

    bool fullscreen_;
    GLenum gl_color_format_;
    GLenum gl_depth_format_;
    GLuint color_renderbuffer_;
    GLuint depth_renderbuffer_;
    GLuint fbo_;
};

#endif