2
* Copyright © 2013 Canonical Ltd.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU Lesser General Public License version 3,
6
* as published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU Lesser General Public License for more details.
13
* You should have received a copy of the GNU Lesser General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
* Authored by: Kevin DuBois <kevin.dubois@canonical.com>
20
#include "../client_buffer.h"
21
#include "gbm_native_surface.h"
23
namespace mclg=mir::client::gbm;
27
static int advance_buffer_static(MirMesaEGLNativeSurface* surface,
28
MirBufferPackage* buffer_package)
30
auto s = static_cast<mclg::GBMNativeSurface*>(surface);
31
return s->advance_buffer(buffer_package);
34
static int get_parameters_static(MirMesaEGLNativeSurface* surface,
35
MirSurfaceParameters* surface_parameters)
37
auto s = static_cast<mclg::GBMNativeSurface*>(surface);
38
return s->get_parameters(surface_parameters);
41
static int set_swapinterval_static(MirMesaEGLNativeSurface* surface, int interval)
43
auto s = static_cast<mclg::GBMNativeSurface*>(surface);
44
return s->set_swapinterval(interval);
47
static void buffer_advanced_callback(MirSurface* /* surface */,
53
mclg::GBMNativeSurface::GBMNativeSurface(ClientSurface& surface)
56
surface_advance_buffer = advance_buffer_static;
57
surface_get_parameters = get_parameters_static;
58
surface_set_swapinterval = set_swapinterval_static;
61
int mclg::GBMNativeSurface::advance_buffer(MirBufferPackage* buffer_package)
63
mir_wait_for(surface.next_buffer(buffer_advanced_callback, NULL));
64
auto buffer = surface.get_current_buffer();
66
auto buffer_to_driver = buffer->native_buffer_handle();
67
memcpy(buffer_package, buffer_to_driver.get(), sizeof(MirBufferPackage));
71
int mclg::GBMNativeSurface::get_parameters(MirSurfaceParameters* surface_parameters)
73
auto params = surface.get_parameters();
74
memcpy(surface_parameters, ¶ms, sizeof(MirSurfaceParameters));
78
int mclg::GBMNativeSurface::set_swapinterval(int interval)
80
if ((interval < 0) || (interval > 1))
81
return MIR_MESA_FALSE;
83
mir_wait_for(surface.configure(mir_surface_attrib_swapinterval, interval));