blob: e355131791d498f05ee41912374b4089f465a296 [file] [log] [blame]
//
// Copyright © 2012 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:
// Simon Que
// Jesse Barker
//
#ifndef GLMARK2_CANVAS_DRM_H_
#define GLMARK2_CANVAS_DRM_H_
#include <cstring>
#include <gbm.h>
#include <drm.h>
#include <xf86drm.h>
#include <xf86drmMode.h>
#include "canvas.h"
#include "egl-state.h"
struct DRMFBState
{
int fd;
gbm_bo* bo;
uint32_t fb_id;
};
class DRMState
{
static void page_flip_handler(int fd, unsigned int frame, unsigned int sec,
unsigned int usec, void* data);
static void fb_destroy_callback(gbm_bo* bo, void* data);
static void quit_handler(int signum);
static bool should_quit_;
DRMFBState* fb_get_from_bo(gbm_bo* bo);
bool init_gbm();
int fd_;
drmModeRes* resources_;
drmModeConnector* connector_;
drmModeEncoder* encoder_;
drmModeCrtcPtr crtc_;
drmModeModeInfo* mode_;
gbm_device* dev_;
gbm_surface* surface_;
gbm_bo* bo_;
DRMFBState* fb_;
public:
DRMState() :
fd_(0),
resources_(0),
connector_(0),
encoder_(0),
mode_(0),
dev_(0),
surface_(0),
bo_(0),
fb_(0) {}
~DRMState() { cleanup(); }
void cleanup();
bool init();
bool reset();
void do_flip();
bool should_quit() const { return should_quit_; }
gbm_device* device() const { return dev_; }
gbm_surface* surface() const { return surface_; }
unsigned int mode_width() const
{
if (mode_) {
return mode_->hdisplay;
}
return 0;
}
unsigned int mode_height() const
{
if (mode_) {
return mode_->vdisplay;
}
return 0;
}
};
/**
* Canvas for direct rendering with EGL.
*/
class CanvasDRM: public Canvas
{
public:
CanvasDRM(int width, int height) :
Canvas(width, height) {}
~CanvasDRM();
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);
protected:
virtual bool make_current();
virtual bool reset_context();
virtual void swap_buffers();
virtual bool supports_gl2();
private:
DRMState drm_;
EGLState egl_;
void resize_no_viewport(int width, int height);
void init_gl_extensions();
};
#endif