@@ -141,6 +141,8 @@ OPTIONS:\n\
141
141
without a display attached.\n\
142
142
--dummy-display-size \"width,height\" The width & height of the dummy display\n\
143
143
in pixels.\n\
144
+ --drm-vout-display <drm-device> The DRM display to use.\n\
145
+ HDMI-A-1, HDMI-A-2, DSI-1, DSI-2.\n\
144
146
\n\
145
147
-h, --help Show this help and exit.\n\
146
148
\n\
@@ -262,6 +264,8 @@ struct flutterpi {
262
264
bool session_active ;
263
265
264
266
char * desired_videomode ;
267
+
268
+ char * drm_vout_display ;
265
269
};
266
270
267
271
struct device_id_and_fd {
@@ -1853,6 +1857,16 @@ static bool parse_vec2i(const char *str, struct vec2i *out) {
1853
1857
return true;
1854
1858
}
1855
1859
1860
+ bool is_valid_drm_display (const char * display ) {
1861
+ const char * valid_displays [] = { "HDMI-A-1" , "HDMI-A-2" , "DSI-1" , "DSI-2" };
1862
+ for (size_t i = 0 ; i < sizeof (valid_displays ) / sizeof (valid_displays [0 ]); i ++ ) {
1863
+ if (strcmp (display , valid_displays [i ]) == 0 ) {
1864
+ return true;
1865
+ }
1866
+ }
1867
+ return false;
1868
+ }
1869
+
1856
1870
bool flutterpi_parse_cmdline_args (int argc , char * * argv , struct flutterpi_cmdline_args * result_out ) {
1857
1871
bool finished_parsing_options ;
1858
1872
int runtime_mode_int = FLUTTER_RUNTIME_MODE_DEBUG ;
@@ -1876,6 +1890,7 @@ bool flutterpi_parse_cmdline_args(int argc, char **argv, struct flutterpi_cmdlin
1876
1890
{ "videomode" , required_argument , NULL , 'v' },
1877
1891
{ "dummy-display" , no_argument , & dummy_display_int , 1 },
1878
1892
{ "dummy-display-size" , required_argument , NULL , 's' },
1893
+ { "drm-vout-display" , required_argument , NULL , 'i' },
1879
1894
{ 0 , 0 , 0 , 0 },
1880
1895
};
1881
1896
@@ -1997,6 +2012,17 @@ bool flutterpi_parse_cmdline_args(int argc, char **argv, struct flutterpi_cmdlin
1997
2012
1998
2013
break ;
1999
2014
2015
+ case 'i' : // --drm-vout-display
2016
+ result_out -> drm_vout_display = strdup (optarg );
2017
+ if (result_out -> drm_vout_display == NULL ) {
2018
+ return false;
2019
+ }
2020
+ if (!is_valid_drm_display (result_out -> drm_vout_display )) {
2021
+ LOG_ERROR ("Invalid DRM display specified: %s. Valid options are HDMI-A-1, HDMI-A-2, DSI-1, DSI-2.\n" , optarg );
2022
+ return false;
2023
+ }
2024
+ break ;
2025
+
2000
2026
case 'h' : printf ("%s" , usage ); return false;
2001
2027
2002
2028
case '?' :
@@ -2099,6 +2125,25 @@ static void on_drmdev_close(int fd, void *fd_metadata, void *userdata) {
2099
2125
2100
2126
static const struct drmdev_interface drmdev_interface = { .open = on_drmdev_open , .close = on_drmdev_close };
2101
2127
2128
+ bool parse_drm_vout_display (const char * display , int * type_out , int * type_id_out ) {
2129
+ if (strcmp (display , "HDMI-A-1" ) == 0 ) {
2130
+ * type_out = DRM_MODE_CONNECTOR_HDMIA ;
2131
+ * type_id_out = 1 ;
2132
+ } else if (strcmp (display , "HDMI-A-2" ) == 0 ) {
2133
+ * type_out = DRM_MODE_CONNECTOR_HDMIA ;
2134
+ * type_id_out = 2 ;
2135
+ } else if (strcmp (display , "DSI-1" ) == 0 ) {
2136
+ * type_out = DRM_MODE_CONNECTOR_DSI ;
2137
+ * type_id_out = 1 ;
2138
+ } else if (strcmp (display , "DSI-2" ) == 0 ) {
2139
+ * type_out = DRM_MODE_CONNECTOR_DSI ;
2140
+ * type_id_out = 2 ;
2141
+ } else {
2142
+ return false;
2143
+ }
2144
+ return true;
2145
+ }
2146
+
2102
2147
static struct drmdev * find_drmdev (struct libseat * libseat ) {
2103
2148
struct drm_connector * connector ;
2104
2149
struct drmdev * drmdev ;
@@ -2137,7 +2182,21 @@ static struct drmdev *find_drmdev(struct libseat *libseat) {
2137
2182
2138
2183
for_each_connector_in_drmdev (drmdev , connector ) {
2139
2184
if (connector -> variable_state .connection_state == kConnected_DrmConnectionState ) {
2140
- goto found_connected_connector ;
2185
+ if (flutterpi -> drm_vout_display != NULL ) {
2186
+ // We only want to use the display that was specified on the command line.
2187
+ int expected_type , expected_type_id ;
2188
+ if (!parse_drm_vout_display (flutterpi -> drm_vout_display , & expected_type , & expected_type_id )) {
2189
+ continue ;
2190
+ }
2191
+
2192
+ if (connector -> type == expected_type && connector -> type_id == expected_type_id ) {
2193
+ goto found_connected_connector ;
2194
+ } else {
2195
+ continue ;
2196
+ }
2197
+ } else {
2198
+ goto found_connected_connector ;
2199
+ }
2141
2200
}
2142
2201
}
2143
2202
LOG_ERROR ("Device \"%s\" doesn't have a display connected. Skipping.\n" , device -> nodes [DRM_NODE_PRIMARY ]);
@@ -2335,6 +2394,8 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2335
2394
goto fail_free_fpi ;
2336
2395
}
2337
2396
2397
+ fpi -> drm_vout_display = cmd_args .drm_vout_display ? strdup (cmd_args .drm_vout_display ) : NULL ;
2398
+
2338
2399
#ifndef HAVE_VULKAN
2339
2400
if (cmd_args .use_vulkan == true) {
2340
2401
LOG_ERROR ("ERROR: --vulkan was specified, but flutter-pi was built without vulkan support.\n" );
0 commit comments