32
32
namespace mg = mir::graphics;
33
namespace mgeglm = mg::egl::mesa;
33
namespace mgg = mir::graphics::gbm;
34
34
namespace mf = mir::frontend;
36
std::mutex valid_displays_guard;
37
std::set<MirMesaEGLNativeDisplay*> valid_displays;
41
struct ShellMesaEGLNativeDisplay : MirMesaEGLNativeDisplay
44
ShellMesaEGLNativeDisplay(std::shared_ptr<mg::Platform> const& graphics_platform)
45
: graphics_platform(graphics_platform)
48
this->display_get_platform = &ShellMesaEGLNativeDisplay::native_display_get_platform;
49
this->surface_get_current_buffer = &ShellMesaEGLNativeDisplay::native_display_surface_get_current_buffer;
50
this->surface_get_parameters = &ShellMesaEGLNativeDisplay::native_display_surface_get_parameters;
51
this->surface_advance_buffer = &ShellMesaEGLNativeDisplay::native_display_surface_advance_buffer;
54
static void native_display_get_platform(MirMesaEGLNativeDisplay* display, MirPlatformPackage* package)
56
auto native_disp = static_cast<ShellMesaEGLNativeDisplay*>(display);
57
if (!native_disp->platform_package)
58
native_disp->platform_package = native_disp->graphics_platform->get_ipc_package();
59
package->data_items = native_disp->platform_package->ipc_data.size();
60
for (int i = 0; i < package->data_items; i++)
62
package->data[i] = native_disp->platform_package->ipc_data[i];
64
package->fd_items = native_disp->platform_package->ipc_fds.size();
65
for (int i = 0; i < package->fd_items; i++)
67
package->fd[i] = native_disp->platform_package->ipc_fds[i];
72
static void native_display_surface_get_current_buffer(MirMesaEGLNativeDisplay* /* display */,
73
MirEGLNativeWindowType surface,
74
MirBufferPackage* package)
76
auto mir_surface = static_cast<mf::Surface*>(surface);
78
auto buffer = mir_surface->client_buffer();
79
auto buffer_package = buffer->get_ipc_package();
80
package->data_items = buffer_package->ipc_data.size();
81
for (int i = 0; i < package->data_items; i++)
83
package->data[i] = buffer_package->ipc_data[i];
85
package->fd_items = buffer_package->ipc_fds.size();
86
for (int i = 0; i < package->fd_items; i++)
88
package->fd[i] = buffer_package->ipc_fds[i];
90
package->stride = buffer_package->stride;
93
static void native_display_surface_get_parameters(MirMesaEGLNativeDisplay* /* display */,
36
mgg::InternalNativeDisplay::InternalNativeDisplay(std::shared_ptr<mg::PlatformIPCPackage> const& platform_package)
37
: platform_package(platform_package)
40
this->display_get_platform = &InternalNativeDisplay::native_display_get_platform;
41
this->surface_get_current_buffer = &InternalNativeDisplay::native_display_surface_get_current_buffer;
42
this->surface_get_parameters = &InternalNativeDisplay::native_display_surface_get_parameters;
43
this->surface_advance_buffer = &InternalNativeDisplay::native_display_surface_advance_buffer;
46
void mgg::InternalNativeDisplay::native_display_get_platform(MirMesaEGLNativeDisplay* display, MirPlatformPackage* package)
48
auto native_disp = static_cast<InternalNativeDisplay*>(display);
49
package->data_items = native_disp->platform_package->ipc_data.size();
50
for (int i = 0; i < package->data_items; i++)
52
package->data[i] = native_disp->platform_package->ipc_data[i];
54
package->fd_items = native_disp->platform_package->ipc_fds.size();
55
for (int i = 0; i < package->fd_items; i++)
57
package->fd[i] = native_disp->platform_package->ipc_fds[i];
62
void mgg::InternalNativeDisplay::native_display_surface_get_current_buffer(MirMesaEGLNativeDisplay*,
94
63
MirEGLNativeWindowType surface,
95
MirSurfaceParameters* parameters)
97
auto mir_surface = static_cast<mf::Surface*>(surface);
99
parameters->width = mir_surface->size().width.as_uint32_t();
100
parameters->height = mir_surface->size().height.as_uint32_t();
101
parameters->pixel_format = static_cast<MirPixelFormat>(mir_surface->pixel_format());
102
parameters->buffer_usage = mir_buffer_usage_hardware;
105
static void native_display_surface_advance_buffer(MirMesaEGLNativeDisplay* /* display */,
106
MirEGLNativeWindowType surface)
108
auto mir_surface = static_cast<mf::Surface*>(surface);
109
mir_surface->advance_client_buffer();
113
std::shared_ptr<mg::Platform> graphics_platform;
114
std::shared_ptr<mg::PlatformIPCPackage> platform_package;
117
struct NativeDisplayDeleter
119
void operator()(MirMesaEGLNativeDisplay* display)
121
std::unique_lock<std::mutex> lg(valid_displays_guard);
122
valid_displays.erase(display);
123
auto disp = static_cast<ShellMesaEGLNativeDisplay*>(display->context);
132
int mir_egl_mesa_display_is_valid(MirMesaEGLNativeDisplay* display)
134
std::unique_lock<std::mutex> lg(valid_displays_guard);
135
return valid_displays.find(display) != valid_displays.end();
139
std::shared_ptr<MirMesaEGLNativeDisplay> mgeglm::create_native_display(std::shared_ptr<mg::Platform> const& platform)
141
auto native_display = std::shared_ptr<ShellMesaEGLNativeDisplay>(new ShellMesaEGLNativeDisplay(platform),
142
NativeDisplayDeleter());
143
std::unique_lock<std::mutex> lg(valid_displays_guard);
144
valid_displays.insert(native_display.get());
146
return native_display;
64
MirBufferPackage* package)
66
auto mir_surface = static_cast<mf::Surface*>(surface);
68
auto buffer = mir_surface->client_buffer();
69
auto buffer_package = buffer->get_ipc_package();
70
package->data_items = buffer_package->ipc_data.size();
71
for (int i = 0; i < package->data_items; i++)
73
package->data[i] = buffer_package->ipc_data[i];
75
package->fd_items = buffer_package->ipc_fds.size();
76
for (int i = 0; i < package->fd_items; i++)
78
package->fd[i] = buffer_package->ipc_fds[i];
80
package->stride = buffer_package->stride;
83
void mgg::InternalNativeDisplay::native_display_surface_get_parameters(MirMesaEGLNativeDisplay*,
84
MirEGLNativeWindowType surface,
85
MirSurfaceParameters* parameters)
87
auto mir_surface = static_cast<mf::Surface*>(surface);
89
parameters->width = mir_surface->size().width.as_uint32_t();
90
parameters->height = mir_surface->size().height.as_uint32_t();
91
parameters->pixel_format = static_cast<MirPixelFormat>(mir_surface->pixel_format());
92
parameters->buffer_usage = mir_buffer_usage_hardware;
95
void mgg::InternalNativeDisplay::native_display_surface_advance_buffer(MirMesaEGLNativeDisplay*,
96
MirEGLNativeWindowType surface)
98
auto mir_surface = static_cast<mf::Surface*>(surface);
99
mir_surface->advance_client_buffer();