1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.12
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2010-2011 LunarG Inc.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors:
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    Chia-I Wu <olv@lunarg.com>
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_compiler.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "state_tracker/sw_winsys.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <hardware/gralloc.h>
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <utils/Errors.h>
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if ANDROID_VERSION < 0x0300
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <private/ui/sw_gralloc_handle.h>
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "android_sw_winsys.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct android_sw_winsys
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct sw_winsys base;
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const gralloc_module_t *grmod;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct android_sw_displaytarget
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buffer_handle_t handle;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int stride;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int width, height;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int usage; /* gralloc usage */
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *mapped;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct android_sw_winsys *
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.organdroid_sw_winsys(struct sw_winsys *ws)
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct android_sw_winsys *) ws;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct android_sw_displaytarget *
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.organdroid_sw_displaytarget(struct sw_displaytarget *dt)
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct android_sw_displaytarget *) dt;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace android {
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.organdroid_displaytarget_display(struct sw_winsys *ws,
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              struct sw_displaytarget *dt,
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              void *context_private)
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct sw_displaytarget *
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.organdroid_displaytarget_create(struct sw_winsys *ws,
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             unsigned tex_usage,
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             enum pipe_format format,
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             unsigned width, unsigned height,
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             unsigned alignment,
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             unsigned *stride)
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return NULL;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.organdroid_displaytarget_destroy(struct sw_winsys *ws,
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              struct sw_displaytarget *dt)
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct android_sw_displaytarget *adt = android_sw_displaytarget(dt);
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(!adt->mapped);
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(adt);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.organdroid_displaytarget_unmap(struct sw_winsys *ws,
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct sw_displaytarget *dt)
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct android_sw_winsys *droid = android_sw_winsys(ws);
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct android_sw_displaytarget *adt = android_sw_displaytarget(dt);
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if ANDROID_VERSION < 0x0300
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* try sw_gralloc first */
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (adt->mapped && sw_gralloc_handle_t::validate(adt->handle) >= 0) {
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      adt->mapped = NULL;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (adt->mapped) {
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      droid->grmod->unlock(droid->grmod, adt->handle);
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      adt->mapped = NULL;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.organdroid_displaytarget_map(struct sw_winsys *ws,
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          struct sw_displaytarget *dt,
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          unsigned flags)
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct android_sw_winsys *droid = android_sw_winsys(ws);
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct android_sw_displaytarget *adt = android_sw_displaytarget(dt);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if ANDROID_VERSION < 0x0300
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* try sw_gralloc first */
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (sw_gralloc_handle_t::validate(adt->handle) >= 0) {
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const sw_gralloc_handle_t *swhandle =
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         reinterpret_cast<const sw_gralloc_handle_t *>(adt->handle);
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      adt->mapped = reinterpret_cast<void *>(swhandle->base);
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return adt->mapped;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!adt->mapped) {
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* lock the buffer for CPU access */
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      droid->grmod->lock(droid->grmod, adt->handle,
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            adt->usage, 0, 0, adt->width, adt->height, &adt->mapped);
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return adt->mapped;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct sw_displaytarget *
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.organdroid_displaytarget_from_handle(struct sw_winsys *ws,
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const struct pipe_resource *templ,
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  struct winsys_handle *whandle,
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  unsigned *stride)
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct android_winsys_handle *ahandle =
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (struct android_winsys_handle *) whandle;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct android_sw_displaytarget *adt;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   adt = CALLOC_STRUCT(android_sw_displaytarget);
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!adt)
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   adt->handle = ahandle->handle;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   adt->stride = ahandle->stride;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   adt->width = templ->width0;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   adt->height = templ->height0;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (templ->bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_TRANSFER_WRITE))
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      adt->usage |= GRALLOC_USAGE_SW_WRITE_OFTEN;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (templ->bind & (PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_TRANSFER_READ))
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      adt->usage |= GRALLOC_USAGE_SW_READ_OFTEN;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (stride)
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *stride = adt->stride;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return reinterpret_cast<struct sw_displaytarget *>(adt);
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.organdroid_displaytarget_get_handle(struct sw_winsys *ws,
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 struct sw_displaytarget *dt,
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 struct winsys_handle *whandle)
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.organdroid_is_displaytarget_format_supported(struct sw_winsys *ws,
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          unsigned tex_usage,
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          enum pipe_format format)
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct android_sw_winsys *droid = android_sw_winsys(ws);
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int fmt = -1;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_R8G8B8A8_UNORM:
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fmt = HAL_PIXEL_FORMAT_RGBA_8888;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_R8G8B8X8_UNORM:
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fmt = HAL_PIXEL_FORMAT_RGBX_8888;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_R8G8B8_UNORM:
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fmt = HAL_PIXEL_FORMAT_RGB_888;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_B5G6R5_UNORM:
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fmt = HAL_PIXEL_FORMAT_RGB_565;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_B8G8R8A8_UNORM:
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fmt = HAL_PIXEL_FORMAT_BGRA_8888;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (fmt != -1);
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.organdroid_destroy(struct sw_winsys *ws)
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct android_sw_winsys *droid = android_sw_winsys(ws);
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(droid);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; /* namespace android */
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgusing namespace android;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct sw_winsys *
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.organdroid_create_sw_winsys(void)
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct android_sw_winsys *droid;
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const hw_module_t *mod;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   droid = CALLOC_STRUCT(android_sw_winsys);
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!droid)
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &mod)) {
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FREE(droid);
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   droid->grmod = (const gralloc_module_t *) mod;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   droid->base.destroy = android_destroy;
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   droid->base.is_displaytarget_format_supported =
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      android_is_displaytarget_format_supported;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   droid->base.displaytarget_create = android_displaytarget_create;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   droid->base.displaytarget_destroy = android_displaytarget_destroy;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   droid->base.displaytarget_from_handle = android_displaytarget_from_handle;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   droid->base.displaytarget_get_handle = android_displaytarget_get_handle;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   droid->base.displaytarget_map = android_displaytarget_map;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   droid->base.displaytarget_unmap = android_displaytarget_unmap;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   droid->base.displaytarget_display = android_displaytarget_display;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &droid->base;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
265