Added TI patches, generated from commit 04f9d72 of the following tree:
[ubuntu-omap:gst-plugins-bad1-0.git] / debian / patches / 0074-PATCH-14-33-kmssink-do-modeset.patch
1 From 3bc093467ce57a2ce22b7316c35ef72a5f4defae Mon Sep 17 00:00:00 2001
2 From: Rob Clark <rob@ti.com>
3 Date: Tue, 12 Jun 2012 14:44:46 -0500
4 Subject: [PATCH 074/100] [PATCH 14/33] kmssink: do modeset
5
6 Set the mode we actually know what the screen resolution is.  Just
7 assuming it is the first mode is incorrect and would depend on the
8 monitor.
9
10 We could be a bit more clever and pick the lowest resolution that
11 is greater than the requested video.  But picking highest resolution
12 is a safe bet.
13 ---
14  sys/kms/gstdrmutils.c |  119 ++++++++++++++++++++++++++++++++++++++-----------
15  sys/kms/gstdrmutils.h |   13 ++++--
16  sys/kms/gstkmssink.c  |    2 +-
17  3 files changed, 103 insertions(+), 31 deletions(-)
18
19 diff --git a/sys/kms/gstdrmutils.c b/sys/kms/gstdrmutils.c
20 index 7e9ac99..c6b9698 100644
21 --- a/sys/kms/gstdrmutils.c
22 +++ b/sys/kms/gstdrmutils.c
23 @@ -1,46 +1,96 @@
24 +/* GStreamer
25 + *
26 + * Copyright (C) 2012 Texas Instruments
27 + * Copyright (C) 2012 Collabora Ltd
28 + *
29 + * Authors:
30 + *  Alessandro Decina <alessandro.decina@collabora.co.uk>
31 + *
32 + * This library is free software; you can redistribute it and/or
33 + * modify it under the terms of the GNU Library General Public
34 + * License as published by the Free Software Foundation; either
35 + * version 2 of the License, or (at your option) any later version.
36 + *
37 + * This library is distributed in the hope that it will be useful,
38 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
39 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
40 + * Library General Public License for more details.
41 + *
42 + * You should have received a copy of the GNU Library General Public
43 + * License along with this library; if not, write to the
44 + * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
45 + * Boston, MA 02111-1307, USA.
46 + */
47 +
48  #include "gstdrmutils.h"
49  
50 +void
51 +gst_drm_connector_cleanup (int fd, struct connector * c)
52 +{
53 +  if (c->connector) {
54 +    drmModeFreeConnector (c->connector);
55 +    c->connector = NULL;
56 +  }
57 +  if (c->mode) {
58 +    drmModeFreeModeInfo (c->mode);
59 +    c->mode = NULL;
60 +  }
61 +  if (c->encoder) {
62 +    drmModeFreeEncoder (c->encoder);
63 +    c->encoder = NULL;
64 +  }
65 +  if (c->fb_id) {
66 +    drmModeRmFB (fd, c->fb_id);
67 +    c->fb_id = 0;
68 +  }
69 +  if (c->fb_bo) {
70 +    omap_bo_del (c->fb_bo);
71 +    c->fb_bo = NULL;
72 +  }
73 +}
74 +
75  gboolean
76 -gst_drm_connector_find_mode_and_plane (int fd, int width, int height,
77 +gst_drm_connector_find_mode_and_plane (int fd,
78 +    struct omap_device * dev, int width, int height,
79      drmModeRes * resources, drmModePlaneRes * plane_resources,
80      struct connector *c, drmModePlane ** out_plane)
81  {
82 -  drmModeConnector *connector = NULL;
83 -  int i;
84 +  int i, best_area = 0, ret;
85 +
86 +  /* free old stuff: */
87 +  if (*out_plane) /* TODO maybe move into 'struct connector'?? */
88 +    drmModeFreePlane (*out_plane);
89 +  gst_drm_connector_cleanup (fd, c);
90  
91    /* First, find the connector & mode */
92 -  c->mode = NULL;
93 -  c->encoder = NULL;
94 -  connector = drmModeGetConnector (fd, c->id);
95 -  if (!connector)
96 +  c->connector = drmModeGetConnector (fd, c->id);
97 +  if (!c->connector)
98      goto error_no_connector;
99  
100 -  if (!connector->count_modes)
101 +  if (!c->connector->count_modes)
102      goto error_no_mode;
103  
104 -#if 0
105 -  /* XXX: don't try to find a mode that matches width/height. Leave ->mode as
106 -   * NULL so that the first (highest res) mode is selected
107 -   */
108 -  for (i = 0; i < connector->count_modes; i++) {
109 -    c->mode = &connector->modes[i];
110 -    if (c->mode->hdisplay == width && c->mode->vdisplay == height)
111 -      break;
112 -    else
113 -      c->mode = NULL;
114 +  /* just look for the highest resolution: */
115 +  for (i = 0; i < c->connector->count_modes; i++) {
116 +    drmModeModeInfo *mode = &c->connector->modes[i];
117 +    int area = mode->hdisplay * mode->vdisplay;
118 +
119 +    if (area > best_area) {
120 +      c->mode = mode;
121 +      best_area = area;
122 +    }
123    }
124 -#endif
125  
126    if (c->mode == NULL) {
127      /* XXX: just pick the first available mode. Not sure this is correct... */
128 -    c->mode = &connector->modes[0];
129 +    c->mode = &c->connector->modes[0];
130  #if 0
131      goto error_no_mode;
132  #endif
133    }
134  
135    /* Now get the encoder */
136 -  c->encoder = drmModeGetEncoder (fd, connector->encoder_id);
137 +  c->encoder = drmModeGetEncoder (fd, c->connector->encoder_id);
138    if (!c->encoder)
139      goto error_no_encoder;
140  
141 @@ -71,14 +121,29 @@ gst_drm_connector_find_mode_and_plane (int fd, int width, int height,
142    if (*out_plane == NULL)
143      goto error_no_plane;
144  
145 +  c->fb_bo = omap_bo_new (dev, best_area * 2, OMAP_BO_WC);
146 +  if (c->fb_bo) {
147 +    uint32_t fourcc = DRM_FORMAT_RGB565;
148 +    uint32_t handles[4] = { omap_bo_handle (c->fb_bo) };
149 +    uint32_t pitches[4] = { c->mode->hdisplay * 2 };
150 +    uint32_t offsets[4] = { 0 };
151 +    ret = drmModeAddFB2 (fd, c->mode->hdisplay, c->mode->vdisplay,
152 +        fourcc, handles, pitches, offsets, &c->fb_id, 0);
153 +    if (ret) {
154 +      /* TODO */
155 +    }
156 +  }
157 +
158 +  /* now set the desired mode: */
159 +  ret = drmModeSetCrtc (fd, c->crtc, c->fb_id, 0, 0, &c->id, 1, c->mode);
160 +  if (ret) {
161 +    /* TODO */
162 +  }
163 +
164    return TRUE;
165  
166  fail:
167 -  if (c->encoder)
168 -    drmModeFreeEncoder (c->encoder);
169 -
170 -  if (connector)
171 -    drmModeFreeConnector (connector);
172 +  gst_drm_connector_cleanup (fd, c);
173  
174    return FALSE;
175  
176 @@ -88,7 +153,7 @@ error_no_connector:
177  
178  error_no_mode:
179    GST_ERROR ("could not find mode %dx%d (count_modes %d)",
180 -      width, height, connector->count_modes);
181 +      width, height, c->connector->count_modes);
182    goto fail;
183  
184  error_no_encoder:
185 diff --git a/sys/kms/gstdrmutils.h b/sys/kms/gstdrmutils.h
186 index c479dc0..3ee7ec2 100644
187 --- a/sys/kms/gstdrmutils.h
188 +++ b/sys/kms/gstdrmutils.h
189 @@ -9,19 +9,26 @@
190  #include <unistd.h>
191  #include <assert.h>
192  #include <xf86drmMode.h>
193 +#include <omap_drm.h>
194 +#include <omap_drmif.h>
195 +#include <drm_fourcc.h>
196  #include <gst/gst.h>
197  
198  struct connector {
199         uint32_t id;
200         char mode_str[64];
201 +       drmModeConnector *connector;
202         drmModeModeInfo *mode;
203         drmModeEncoder *encoder;
204 +       int fb_id;
205 +       struct omap_bo *fb_bo;
206         int crtc;
207         int pipe;
208  };
209  
210 -gboolean gst_drm_connector_find_mode_and_plane (int fd, int width, int height,
211 -    drmModeRes *resources, drmModePlaneRes *plane_resources,
212 -    struct connector *c, drmModePlane **out_plane);
213 +gboolean gst_drm_connector_find_mode_and_plane (int fd,
214 +    struct omap_device * dev, int width, int height,
215 +    drmModeRes * resources, drmModePlaneRes * plane_resources,
216 +    struct connector *c, drmModePlane ** out_plane);
217  
218  #endif /* __GST_DRMUTILS_H__ */
219 diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
220 index 27b9444..06fe8e2 100644
221 --- a/sys/kms/gstkmssink.c
222 +++ b/sys/kms/gstkmssink.c
223 @@ -239,7 +239,7 @@ gst_kms_sink_show_frame (GstVideoSink * vsink, GstBuffer * inbuf)
224      GstVideoRectangle dest = { 0 };
225  
226      if (!gst_drm_connector_find_mode_and_plane (sink->fd,
227 -            sink->src_rect.w, sink->src_rect.h,
228 +            sink->dev, sink->src_rect.w, sink->src_rect.h,
229              sink->resources, sink->plane_resources, &sink->conn, &sink->plane))
230        goto connector_not_found;
231  
232 -- 
233 1.7.9.5
234