~mir-team/mir/in-process-egl+input-conglomeration

« back to all changes in this revision

Viewing changes to src/server/graphics/gbm/internal_native_display.cpp

Merged trunk and fixed issues

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 * Authored by: Robert Carr <robert.carr@canonical.com>
17
17
 */
18
18
 
 
19
#include "internal_native_display.h"
19
20
#include "mir/display_server.h"
20
 
#include "mir/graphics/egl/mesa_native_display.h"
21
21
#include "mir/graphics/platform_ipc_package.h"
22
22
#include "mir/graphics/platform.h"
23
23
#include "mir/frontend/surface.h"
30
30
#include <set>
31
31
 
32
32
namespace mg = mir::graphics;
33
 
namespace mgeglm = mg::egl::mesa;
 
33
namespace mgg = mir::graphics::gbm;
34
34
namespace mf = mir::frontend;
35
35
 
36
 
std::mutex valid_displays_guard;
37
 
std::set<MirMesaEGLNativeDisplay*> valid_displays;
38
 
 
39
 
namespace
40
 
{
41
 
struct ShellMesaEGLNativeDisplay : MirMesaEGLNativeDisplay
42
 
{
43
 
public:
44
 
    ShellMesaEGLNativeDisplay(std::shared_ptr<mg::Platform> const& graphics_platform)
45
 
        : graphics_platform(graphics_platform)
46
 
    {
47
 
        context = this;
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;
52
 
    }
53
 
 
54
 
    static void native_display_get_platform(MirMesaEGLNativeDisplay* display, MirPlatformPackage* package)
55
 
    {
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++)
61
 
        {
62
 
            package->data[i] = native_disp->platform_package->ipc_data[i];
63
 
        }
64
 
        package->fd_items = native_disp->platform_package->ipc_fds.size();
65
 
        for (int i = 0; i < package->fd_items; i++)
66
 
        {
67
 
            package->fd[i] = native_disp->platform_package->ipc_fds[i];
68
 
        }
69
 
 
70
 
    }
71
 
    
72
 
    static void native_display_surface_get_current_buffer(MirMesaEGLNativeDisplay* /* display */, 
73
 
                                                          MirEGLNativeWindowType surface,
74
 
                                                          MirBufferPackage* package)
75
 
    {
76
 
        auto mir_surface = static_cast<mf::Surface*>(surface);
77
 
 
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++)
82
 
        {
83
 
            package->data[i] = buffer_package->ipc_data[i];
84
 
        }
85
 
        package->fd_items = buffer_package->ipc_fds.size();
86
 
        for (int i = 0; i < package->fd_items; i++)
87
 
        {
88
 
            package->fd[i] = buffer_package->ipc_fds[i];
89
 
        }
90
 
        package->stride = buffer_package->stride;
91
 
    }
92
 
 
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)
 
38
{
 
39
    context = this;
 
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;
 
44
}
 
45
 
 
46
void mgg::InternalNativeDisplay::native_display_get_platform(MirMesaEGLNativeDisplay* display, MirPlatformPackage* package)
 
47
{
 
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++)
 
51
    {
 
52
        package->data[i] = native_disp->platform_package->ipc_data[i];
 
53
    }
 
54
    package->fd_items = native_disp->platform_package->ipc_fds.size();
 
55
    for (int i = 0; i < package->fd_items; i++)
 
56
    {
 
57
        package->fd[i] = native_disp->platform_package->ipc_fds[i];
 
58
    }
 
59
 
 
60
}
 
61
 
 
62
void mgg::InternalNativeDisplay::native_display_surface_get_current_buffer(MirMesaEGLNativeDisplay*, 
94
63
                                                      MirEGLNativeWindowType surface,
95
 
                                                      MirSurfaceParameters* parameters)
96
 
    {
97
 
        auto mir_surface = static_cast<mf::Surface*>(surface);
98
 
 
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;
103
 
    }
104
 
 
105
 
    static void native_display_surface_advance_buffer(MirMesaEGLNativeDisplay* /* display */, 
106
 
                                                      MirEGLNativeWindowType surface)
107
 
    {
108
 
        auto mir_surface = static_cast<mf::Surface*>(surface);
109
 
        mir_surface->advance_client_buffer();
110
 
    }
111
 
 
112
 
private:
113
 
    std::shared_ptr<mg::Platform> graphics_platform;
114
 
    std::shared_ptr<mg::PlatformIPCPackage> platform_package;
115
 
};
116
 
 
117
 
struct NativeDisplayDeleter
118
 
{
119
 
    void operator()(MirMesaEGLNativeDisplay* display)
120
 
    {
121
 
        std::unique_lock<std::mutex> lg(valid_displays_guard);
122
 
        valid_displays.erase(display);
123
 
        auto disp = static_cast<ShellMesaEGLNativeDisplay*>(display->context);
124
 
        delete disp;
125
 
    }
126
 
};
127
 
 
128
 
}
129
 
 
130
 
extern "C"
131
 
{
132
 
int mir_egl_mesa_display_is_valid(MirMesaEGLNativeDisplay* display)
133
 
{
134
 
    std::unique_lock<std::mutex> lg(valid_displays_guard);
135
 
    return valid_displays.find(display) != valid_displays.end();
136
 
}
137
 
}
138
 
 
139
 
std::shared_ptr<MirMesaEGLNativeDisplay> mgeglm::create_native_display(std::shared_ptr<mg::Platform> const& platform)
140
 
{
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());
145
 
    
146
 
    return native_display;
 
64
                                                      MirBufferPackage* package)
 
65
{
 
66
    auto mir_surface = static_cast<mf::Surface*>(surface);
 
67
 
 
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++)
 
72
    {
 
73
        package->data[i] = buffer_package->ipc_data[i];
 
74
    }
 
75
    package->fd_items = buffer_package->ipc_fds.size();
 
76
    for (int i = 0; i < package->fd_items; i++)
 
77
    {
 
78
        package->fd[i] = buffer_package->ipc_fds[i];
 
79
    }
 
80
    package->stride = buffer_package->stride;
 
81
}
 
82
 
 
83
void mgg::InternalNativeDisplay::native_display_surface_get_parameters(MirMesaEGLNativeDisplay*, 
 
84
                                                  MirEGLNativeWindowType surface,
 
85
                                                  MirSurfaceParameters* parameters)
 
86
{
 
87
    auto mir_surface = static_cast<mf::Surface*>(surface);
 
88
 
 
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;
 
93
}
 
94
 
 
95
void mgg::InternalNativeDisplay::native_display_surface_advance_buffer(MirMesaEGLNativeDisplay*, 
 
96
                                                  MirEGLNativeWindowType surface)
 
97
{
 
98
    auto mir_surface = static_cast<mf::Surface*>(surface);
 
99
    mir_surface->advance_client_buffer();
147
100
}