diff options
author | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-04-05 11:31:17 +0200 |
---|---|---|
committer | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-04-05 11:33:27 +0200 |
commit | 5145edbc8bda0d82f7699901c225f79aa2a5da1a (patch) | |
tree | 092d4b4815eec9f1e75a0918826346029584b1ad | |
parent | 5e6532e9b8c8063f052e09086b16dc0c18bda17c (diff) |
wfdport: Expose modes as handles not as ints
Defined by the wfd spec.
-rw-r--r-- | src/wfdport.c | 88 | ||||
-rw-r--r-- | src/wfdport.h | 6 | ||||
-rw-r--r-- | src/wfhandle.h | 1 |
3 files changed, 79 insertions, 16 deletions
diff --git a/src/wfdport.c b/src/wfdport.c index 71e8c34..9bb266e 100644 --- a/src/wfdport.c +++ b/src/wfdport.c @@ -36,11 +36,15 @@ struct wfd_port { drmModeConnectorPtr connector; + int modes_count; + WFDPortMode *modes; + uint32_t possible_crtcs; - int mode; + drmModeModeInfoPtr mode; struct wfd_pipeline *pipeline; int pipeline_updated; + }; WFDint @@ -64,14 +68,56 @@ wfd_enumerate_ports(struct wfd_device *device, return count; } +static void +port_modes_destroy(struct wfd_device *device, + struct wfd_port *port) +{ + int i; + + for (i = 0; i < port->modes_count; ++i) + wf_handle_destroy(port->modes[i]); + free(port->modes); + port->modes = NULL; +} + void wfd_port_destroy(struct wfd_device *device, struct wfd_port *port) { + port_modes_destroy(device, port); drmModeFreeConnector(port->connector); free(port); } +static int +port_update_modes(struct wfd_device *device, + struct wfd_port *port) +{ + int i; + + if (port->connector->connection != DRM_MODE_CONNECTED) + return 0; + + if (port->modes) + port_modes_destroy(device, port); + + port->modes = calloc(port->connector->count_modes, + sizeof(WFDPortMode)); + if (port->modes == NULL) + return -1; + + port->modes_count = port->connector->count_modes; + + for (i = 0; i < port->modes_count; ++i) { + port->modes[i] = + wf_handle_create(&port->connector->modes[i], + MODE_HANDLE); + + } + + return 0; +} + struct wfd_port * wfd_port_create(struct wfd_device *device, WFDint port_id, @@ -92,6 +138,12 @@ wfd_port_create(struct wfd_device *device, return NULL; } + if (port_update_modes(device, port) < 0) { + free(port->connector); + free(port); + return NULL; + } + /* intersect encoder's possible_crtc to be sure the crtc we choose * is compatible with all encoders the kernel might choose. * Radeon DDX does this as well, all other KMS based DDX @@ -104,7 +156,7 @@ wfd_port_create(struct wfd_device *device, drmModeFreeEncoder(encoder); } - port->mode = -1; + port->mode = NULL; return port; } @@ -177,21 +229,21 @@ wfd_port_get_attribiv(struct wfd_device *device, WFDint wfd_port_get_modes(struct wfd_device *device, struct wfd_port *port, - WFDint *modes, + WFDPortMode *modes, WFDint modes_count) { int i; - int count_modes = port->connector->count_modes; + int count_modes = port->modes_count; int count; if (port->connector->connection != DRM_MODE_CONNECTED) return 0; if (modes == NULL) - return port->connector->count_modes; + return count_modes; for (i = 0, count = 0; i < count_modes && count < modes_count; ++i) { - modes[count++] = i; + modes[count++] = port->modes[i]; } return count; @@ -200,9 +252,13 @@ wfd_port_get_modes(struct wfd_device *device, void wfd_port_set_mode(struct wfd_device *device, struct wfd_port *port, - WFDint mode) + WFDPortMode mode_handle) { - assert(mode < port->connector->count_modes); + drmModeModeInfoPtr mode; + + mode = wf_handle_get_object(mode_handle, MODE_HANDLE); + if (mode == NULL) + return; port->mode = mode; } @@ -210,16 +266,20 @@ wfd_port_set_mode(struct wfd_device *device, int wfd_port_mode_get_attribi(struct wfd_device *device, struct wfd_port *port, - WFDint mode, + WFDPortMode mode_handle, WFDPortModeAttrib attrib) { - drmModeModeInfoPtr mode_info = &port->connector->modes[mode]; + drmModeModeInfoPtr mode; + + mode = wf_handle_get_object(mode_handle, MODE_HANDLE); + if (mode == NULL) + return 0; switch (attrib) { case WFD_PORT_MODE_WIDTH: - return mode_info->hdisplay; + return mode->hdisplay; case WFD_PORT_MODE_HEIGHT: - return mode_info->vdisplay; + return mode->vdisplay; default: break; } @@ -239,12 +299,14 @@ wfd_port_commit(struct wfd_device *device, if (port->pipeline_updated == 0) return 0; + assert(port->mode != NULL); + ret = drmModeSetCrtc(fd, wfd_pipeline_get_crtc_id(port->pipeline), wfd_pipeline_get_fb_id(port->pipeline), 0, 0, &port->connector->connector_id, 1, - &port->connector->modes[port->mode]); + port->mode); if (ret) fprintf(stderr, "drmModeSetCrtc: %d %m\n", ret); diff --git a/src/wfdport.h b/src/wfdport.h index 36afa85..08bbef5 100644 --- a/src/wfdport.h +++ b/src/wfdport.h @@ -58,18 +58,18 @@ wfd_port_get_attribiv(struct wfd_device *device, WFDint wfd_port_get_modes(struct wfd_device *device, struct wfd_port *port, - WFDint *modes, + WFDPortMode *modes, WFDint modes_count); void wfd_port_set_mode(struct wfd_device *device, struct wfd_port *port, - WFDint mode); + WFDPortMode mode); int wfd_port_mode_get_attribi(struct wfd_device *device, struct wfd_port *port, - WFDint mode, + WFDPortMode mode, WFDPortModeAttrib attrib); int diff --git a/src/wfhandle.h b/src/wfhandle.h index 9aa973a..3ddad79 100644 --- a/src/wfhandle.h +++ b/src/wfhandle.h @@ -34,6 +34,7 @@ enum wf_type { ANY_HANDLE, DEVICE_HANDLE, PORT_HANDLE, + MODE_HANDLE, PIPELINE_HANDLE, SOURCE_HANDLE, EVENT_HANDLE |