summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Franzke <benjaminfranzke@googlemail.com>2011-04-05 11:31:17 +0200
committerBenjamin Franzke <benjaminfranzke@googlemail.com>2011-04-05 11:33:27 +0200
commit5145edbc8bda0d82f7699901c225f79aa2a5da1a (patch)
tree092d4b4815eec9f1e75a0918826346029584b1ad
parent5e6532e9b8c8063f052e09086b16dc0c18bda17c (diff)
wfdport: Expose modes as handles not as ints
Defined by the wfd spec.
-rw-r--r--src/wfdport.c88
-rw-r--r--src/wfdport.h6
-rw-r--r--src/wfhandle.h1
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