@@ -494,29 +494,31 @@ RedSurfaceDestroyItem::RedSurfaceDestroyItem(uint32_t surface_id)
RedPipeItemPtr dcc_gl_scanout_item_new(RedChannelClient *rcc, void *data, int num)
{
- /* FIXME: on !unix peer, start streaming with a video codec */
- if (!red_stream_is_plain_unix(rcc->get_stream()) ||
- !rcc->test_remote_cap(SPICE_DISPLAY_CAP_GL_SCANOUT)) {
+ auto dcc = static_cast<DisplayChannelClient *>(rcc);
+
+ if (dcc->is_gl_client()) {
+ return red::make_shared<RedGlScanoutUnixItem>();
+ } else if (rcc->test_remote_cap(SPICE_DISPLAY_CAP_MULTI_CODEC)) {
+ return RedPipeItemPtr();
+ } else {
red_channel_warning(rcc->get_channel(),
- "FIXME: client does not support GL scanout");
+ "Client does not support GL scanout or multiple codecs");
rcc->disconnect();
return RedPipeItemPtr();
}
-
- return red::make_shared<RedGlScanoutUnixItem>();
}
XXX_CAST(RedChannelClient, DisplayChannelClient, DISPLAY_CHANNEL_CLIENT);
RedPipeItemPtr dcc_gl_draw_item_new(RedChannelClient *rcc, void *data, int num)
{
- DisplayChannelClient *dcc = DISPLAY_CHANNEL_CLIENT(rcc);
+ auto dcc = static_cast<DisplayChannelClient *>(rcc);
auto draw = static_cast<const SpiceMsgDisplayGlDraw *>(data);
- if (!red_stream_is_plain_unix(rcc->get_stream()) ||
- !rcc->test_remote_cap(SPICE_DISPLAY_CAP_GL_SCANOUT)) {
+ if (!dcc->is_gl_client() &&
+ !rcc->test_remote_cap(SPICE_DISPLAY_CAP_MULTI_CODEC)) {
red_channel_warning(rcc->get_channel(),
- "FIXME: client does not support GL scanout");
+ "Client does not support GL scanout or multiple codecs");
rcc->disconnect();
return RedPipeItemPtr();
}
@@ -47,6 +47,12 @@ public:
spice_wan_compression_t zlib_glz_state);
virtual void disconnect() override;
+ bool is_gl_client()
+ {
+ return red_stream_is_plain_unix(get_stream()) &&
+ test_remote_cap(SPICE_DISPLAY_CAP_GL_SCANOUT);
+ }
+
protected:
virtual bool handle_message(uint16_t type, uint32_t size, void *msg) override;
virtual bool config_socket() override;