Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Sign in / Register
Toggle navigation
W
wlroots
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
7
Issues
7
List
Boards
Labels
Milestones
Merge Requests
2
Merge Requests
2
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Librem5
wlroots
Commits
36bd4795
Unverified
Commit
36bd4795
authored
May 22, 2018
by
emersion
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
export-dmabuf: add basic and incomplete implementation
parent
9e26808c
Changes
5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
451 additions
and
1 deletion
+451
-1
wlr_export_dmabuf_v1.h
include/wlr/types/wlr_export_dmabuf_v1.h
+33
-0
meson.build
protocol/meson.build
+2
-1
wlr-export-dmabuf-unstable-v1.xml
protocol/wlr-export-dmabuf-unstable-v1.xml
+230
-0
meson.build
types/meson.build
+1
-0
wlr_export_dmabuf_v1.c
types/wlr_export_dmabuf_v1.c
+185
-0
No files found.
include/wlr/types/wlr_export_dmabuf_v1.h
0 → 100644
View file @
36bd4795
#ifndef WLR_TYPES_WLR_EXPORT_DMABUF_V1_H
#define WLR_TYPES_WLR_EXPORT_DMABUF_V1_H
#include <wayland-server.h>
struct
wlr_export_dmabuf_manager_v1
;
struct
wlr_export_dmabuf_frame_v1
{
struct
wl_resource
*
resource
;
struct
wlr_export_dmabuf_manager_v1
*
manager
;
struct
wl_list
link
;
struct
wlr_output
*
output
;
};
struct
wlr_export_dmabuf_manager_v1
{
struct
wl_global
*
global
;
struct
wl_list
resources
;
struct
wl_list
frames
;
struct
wl_listener
display_destroy
;
struct
{
struct
wl_signal
destroy
;
}
events
;
};
struct
wlr_export_dmabuf_manager_v1
*
wlr_export_dmabuf_manager_v1_create
(
struct
wl_display
*
display
);
void
wlr_export_dmabuf_manager_v1_destroy
(
struct
wlr_export_dmabuf_manager_v1
*
manager
);
#endif
protocol/meson.build
View file @
36bd4795
...
...
@@ -39,8 +39,9 @@ protocols = [
'screenshooter.xml',
'server-decoration.xml',
'virtual-keyboard-unstable-v1.xml',
'wlr-
layer-shell
-unstable-v1.xml',
'wlr-
export-dmabuf
-unstable-v1.xml',
'wlr-input-inhibitor-unstable-v1.xml',
'wlr-layer-shell-unstable-v1.xml',
]
client_protocols = [
...
...
protocol/wlr-export-dmabuf-unstable-v1.xml
0 → 100644
View file @
36bd4795
This diff is collapsed.
Click to expand it.
types/meson.build
View file @
36bd4795
...
...
@@ -22,6 +22,7 @@ lib_wlr_types = static_library(
'wlr_box.c',
'wlr_compositor.c',
'wlr_cursor.c',
'wlr_export_dmabuf_v1.c',
'wlr_gamma_control.c',
'wlr_idle_inhibit_v1.c',
'wlr_idle.c',
...
...
types/wlr_export_dmabuf_v1.c
0 → 100644
View file @
36bd4795
#include <assert.h>
#include <stdlib.h>
#include <unistd.h>
#include <wlr/types/wlr_export_dmabuf_v1.h>
#include <wlr/types/wlr_linux_dmabuf.h>
#include <wlr/types/wlr_output.h>
#include "wlr-export-dmabuf-unstable-v1-protocol.h"
#define EXPORT_DMABUF_MANAGER_VERSION 1
static
const
struct
zwlr_export_dmabuf_frame_v1_interface
frame_impl
;
static
struct
wlr_export_dmabuf_frame_v1
*
frame_from_resource
(
struct
wl_resource
*
resource
)
{
assert
(
wl_resource_instance_of
(
resource
,
&
zwlr_export_dmabuf_frame_v1_interface
,
&
frame_impl
));
return
wl_resource_get_user_data
(
resource
);
}
static
void
frame_handle_destroy
(
struct
wl_client
*
client
,
struct
wl_resource
*
resource
)
{
wl_resource_destroy
(
resource
);
}
static
const
struct
zwlr_export_dmabuf_frame_v1_interface
frame_impl
=
{
.
destroy
=
frame_handle_destroy
,
};
static
void
frame_handle_resource_destroy
(
struct
wl_resource
*
resource
)
{
struct
wlr_export_dmabuf_frame_v1
*
frame
=
frame_from_resource
(
resource
);
wl_list_remove
(
&
frame
->
link
);
free
(
frame
);
}
static
const
struct
zwlr_export_dmabuf_manager_v1_interface
manager_impl
;
static
struct
wlr_export_dmabuf_manager_v1
*
manager_from_resource
(
struct
wl_resource
*
resource
)
{
assert
(
wl_resource_instance_of
(
resource
,
&
zwlr_export_dmabuf_manager_v1_interface
,
&
manager_impl
));
return
wl_resource_get_user_data
(
resource
);
}
static
void
manager_handle_capture_client
(
struct
wl_client
*
client
,
struct
wl_resource
*
manager_resource
,
uint32_t
id
,
uint32_t
client_id
,
int32_t
overlay_cursor
)
{
// TODO
}
static
void
manager_handle_capture_output
(
struct
wl_client
*
client
,
struct
wl_resource
*
manager_resource
,
uint32_t
id
,
struct
wl_resource
*
output_resource
)
{
struct
wlr_export_dmabuf_manager_v1
*
manager
=
manager_from_resource
(
manager_resource
);
struct
wlr_output
*
output
=
wlr_output_from_resource
(
output_resource
);
struct
wlr_export_dmabuf_frame_v1
*
frame
=
calloc
(
1
,
sizeof
(
struct
wlr_export_dmabuf_frame_v1
));
if
(
frame
==
NULL
)
{
wl_resource_post_no_memory
(
manager_resource
);
return
;
}
frame
->
manager
=
manager
;
frame
->
output
=
output
;
uint32_t
version
=
wl_resource_get_version
(
manager_resource
);
frame
->
resource
=
wl_resource_create
(
client
,
&
zwlr_export_dmabuf_frame_v1_interface
,
version
,
id
);
if
(
frame
->
resource
==
NULL
)
{
wl_client_post_no_memory
(
client
);
return
;
}
wl_resource_set_implementation
(
frame
->
resource
,
&
frame_impl
,
frame
,
frame_handle_resource_destroy
);
wl_list_insert
(
&
manager
->
frames
,
&
frame
->
link
);
struct
wlr_dmabuf_buffer_attribs
attribs
;
if
(
!
wlr_output_export_dmabuf
(
output
,
&
attribs
))
{
zwlr_export_dmabuf_frame_v1_send_abort
(
frame
->
resource
);
return
;
}
// TODO: multiple layers support
uint32_t
frame_flags
=
0
;
uint32_t
mod_high
=
attribs
.
modifier
[
0
]
>>
32
;
uint32_t
mod_low
=
attribs
.
modifier
[
0
];
zwlr_export_dmabuf_frame_v1_send_frame
(
frame
->
resource
,
output
->
width
,
output
->
height
,
output
->
scale
,
output
->
transform
,
attribs
.
flags
,
frame_flags
,
mod_high
,
mod_low
,
attribs
.
n_planes
,
1
);
zwlr_export_dmabuf_frame_v1_send_dma_layer
(
frame
->
resource
,
0
,
attribs
.
format
,
1
);
for
(
int
i
=
0
;
i
<
attribs
.
n_planes
;
++
i
)
{
// TODO: what to do if the kernel doesn't support seek on buffer
off_t
size
=
lseek
(
attribs
.
fd
[
i
],
0
,
SEEK_END
);
zwlr_export_dmabuf_frame_v1_send_dma_object
(
frame
->
resource
,
i
,
attribs
.
fd
[
i
],
size
);
zwlr_export_dmabuf_frame_v1_send_dma_plane
(
frame
->
resource
,
i
,
0
,
i
,
attribs
.
offset
[
i
],
attribs
.
stride
[
i
]);
}
// TODO: wait for the frame to be ready
// TODO: timestamps
zwlr_export_dmabuf_frame_v1_send_ready
(
frame
->
resource
,
0
,
0
,
0
);
}
static
const
struct
zwlr_export_dmabuf_manager_v1_interface
manager_impl
=
{
.
capture_client
=
manager_handle_capture_client
,
.
capture_output
=
manager_handle_capture_output
,
};
static
void
manager_handle_resource_destroy
(
struct
wl_resource
*
resource
)
{
wl_list_remove
(
wl_resource_get_link
(
resource
));
}
static
void
manager_bind
(
struct
wl_client
*
client
,
void
*
data
,
uint32_t
version
,
uint32_t
id
)
{
struct
wlr_export_dmabuf_manager_v1
*
manager
=
data
;
struct
wl_resource
*
resource
=
wl_resource_create
(
client
,
&
zwlr_export_dmabuf_manager_v1_interface
,
version
,
id
);
if
(
resource
==
NULL
)
{
wl_client_post_no_memory
(
client
);
return
;
}
wl_resource_set_implementation
(
resource
,
&
manager_impl
,
manager
,
manager_handle_resource_destroy
);
wl_list_insert
(
&
manager
->
resources
,
wl_resource_get_link
(
resource
));
}
static
void
handle_display_destroy
(
struct
wl_listener
*
listener
,
void
*
data
)
{
struct
wlr_export_dmabuf_manager_v1
*
manager
=
wl_container_of
(
listener
,
manager
,
display_destroy
);
wlr_export_dmabuf_manager_v1_destroy
(
manager
);
}
struct
wlr_export_dmabuf_manager_v1
*
wlr_export_dmabuf_manager_v1_create
(
struct
wl_display
*
display
)
{
struct
wlr_export_dmabuf_manager_v1
*
manager
=
calloc
(
1
,
sizeof
(
struct
wlr_export_dmabuf_manager_v1
));
if
(
manager
==
NULL
)
{
return
NULL
;
}
wl_list_init
(
&
manager
->
resources
);
wl_list_init
(
&
manager
->
frames
);
manager
->
global
=
wl_global_create
(
display
,
&
zwlr_export_dmabuf_manager_v1_interface
,
EXPORT_DMABUF_MANAGER_VERSION
,
manager
,
manager_bind
);
if
(
manager
->
global
==
NULL
)
{
free
(
manager
);
return
NULL
;
}
manager
->
display_destroy
.
notify
=
handle_display_destroy
;
wl_display_add_destroy_listener
(
display
,
&
manager
->
display_destroy
);
return
manager
;
}
void
wlr_export_dmabuf_manager_v1_destroy
(
struct
wlr_export_dmabuf_manager_v1
*
manager
)
{
if
(
manager
==
NULL
)
{
return
;
}
wl_list_remove
(
&
manager
->
display_destroy
.
link
);
wl_global_destroy
(
manager
->
global
);
struct
wl_resource
*
resource
,
*
resource_tmp
;
wl_resource_for_each_safe
(
resource
,
resource_tmp
,
&
manager
->
resources
)
{
wl_resource_destroy
(
resource
);
}
struct
wlr_export_dmabuf_frame_v1
*
frame
,
*
frame_tmp
;
wl_list_for_each_safe
(
frame
,
frame_tmp
,
&
manager
->
frames
,
link
)
{
wl_resource_destroy
(
frame
->
resource
);
}
free
(
manager
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment