1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.9
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2010 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 "util/u_memory.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_string.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pointer.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_dl.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egldriver.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "eglimage.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "eglmutex.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egl_g3d.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egl_g3d_st.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct egl_g3d_st_manager {
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_manager base;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLDisplay *display;
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct egl_g3d_st_manager *
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_st_manager(struct st_manager *smapi)
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct egl_g3d_st_manager *) smapi;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_st_manager_get_egl_image(struct st_manager *smapi,
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 void *egl_image,
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 struct st_egl_image *out)
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct egl_g3d_st_manager *gsmapi = egl_g3d_st_manager(smapi);
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGLImageKHR handle = (EGLImageKHR) egl_image;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLImage *img;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct egl_g3d_image *gimg;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* this is called from state trackers */
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _eglLockMutex(&gsmapi->display->Mutex);
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img = _eglLookupImage(handle, gsmapi->display);
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!img) {
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglUnlockMutex(&gsmapi->display->Mutex);
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gimg = egl_g3d_image(img);
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out->texture = NULL;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_resource_reference(&out->texture, gimg->texture);
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out->level = gimg->level;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out->layer = gimg->layer;
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _eglUnlockMutex(&gsmapi->display->Mutex);
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_st_manager_get_param(struct st_manager *smapi,
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             enum st_manager_param param)
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct st_manager *
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_create_st_manager(_EGLDisplay *dpy)
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct egl_g3d_st_manager *gsmapi;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gsmapi = CALLOC_STRUCT(egl_g3d_st_manager);
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (gsmapi) {
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      gsmapi->display = dpy;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      gsmapi->base.screen = gdpy->native->screen;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      gsmapi->base.get_egl_image = egl_g3d_st_manager_get_egl_image;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      gsmapi->base.get_param = egl_g3d_st_manager_get_param;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &gsmapi->base;;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_destroy_st_manager(struct st_manager *smapi)
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct egl_g3d_st_manager *gsmapi = egl_g3d_st_manager(smapi);
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(gsmapi);
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_st_framebuffer_flush_front_pbuffer(struct st_framebuffer_iface *stfbi,
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           enum st_attachment_type statt)
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpbuffer_reference_openvg_image(struct egl_g3d_surface *gsurf)
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* TODO */
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpbuffer_allocate_pbuffer_texture(struct egl_g3d_surface *gsurf)
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct egl_g3d_display *gdpy =
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      egl_g3d_display(gsurf->base.Resource.Display);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_screen *screen = gdpy->native->screen;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource templ, *ptex;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&templ, 0, sizeof(templ));
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templ.target = PIPE_TEXTURE_2D;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templ.last_level = 0;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templ.width0 = gsurf->base.Width;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templ.height0 = gsurf->base.Height;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templ.depth0 = 1;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templ.array_size = 1;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templ.format = gsurf->stvis.color_format;
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* for rendering and binding to texture */
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ptex = screen->resource_create(screen, &templ);
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gsurf->render_texture = ptex;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_st_framebuffer_validate_pbuffer(struct st_framebuffer_iface *stfbi,
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        const enum st_attachment_type *statts,
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        unsigned count,
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        struct pipe_resource **out)
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLSurface *surf = (_EGLSurface *) stfbi->st_manager_private;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < count; i++) {
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      out[i] = NULL;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (gsurf->stvis.render_buffer != statts[i])
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!gsurf->render_texture) {
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (gsurf->client_buffer_type) {
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case EGL_NONE:
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            pbuffer_allocate_pbuffer_texture(gsurf);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case EGL_OPENVG_IMAGE:
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            pbuffer_reference_openvg_image(gsurf);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!gsurf->render_texture)
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pipe_resource_reference(&out[i], gsurf->render_texture);
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_st_framebuffer_flush_front(struct st_framebuffer_iface *stfbi,
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   enum st_attachment_type statt)
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLSurface *surf = (_EGLSurface *) stfbi->st_manager_private;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct native_present_control ctrl;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&ctrl, 0, sizeof(ctrl));
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctrl.natt = NATIVE_ATTACHMENT_FRONT_LEFT;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return gsurf->native->present(gsurf->native, &ctrl);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                const enum st_attachment_type *statts,
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                unsigned count,
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                struct pipe_resource **out)
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLSurface *surf = (_EGLSurface *) stfbi->st_manager_private;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource *textures[NUM_NATIVE_ATTACHMENTS];
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint attachment_mask = 0;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < count; i++) {
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int natt;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (statts[i]) {
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case ST_ATTACHMENT_FRONT_LEFT:
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         natt = NATIVE_ATTACHMENT_FRONT_LEFT;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case ST_ATTACHMENT_BACK_LEFT:
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         natt = NATIVE_ATTACHMENT_BACK_LEFT;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case ST_ATTACHMENT_FRONT_RIGHT:
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         natt = NATIVE_ATTACHMENT_FRONT_RIGHT;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case ST_ATTACHMENT_BACK_RIGHT:
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         natt = NATIVE_ATTACHMENT_BACK_RIGHT;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         natt = -1;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (natt >= 0)
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         attachment_mask |= 1 << natt;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!gsurf->native->validate(gsurf->native, attachment_mask,
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         &gsurf->sequence_number, textures, &gsurf->base.Width,
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         &gsurf->base.Height))
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < count; i++) {
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_resource *tex;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int natt;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (statts[i]) {
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case ST_ATTACHMENT_FRONT_LEFT:
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         natt = NATIVE_ATTACHMENT_FRONT_LEFT;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case ST_ATTACHMENT_BACK_LEFT:
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         natt = NATIVE_ATTACHMENT_BACK_LEFT;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case ST_ATTACHMENT_FRONT_RIGHT:
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         natt = NATIVE_ATTACHMENT_FRONT_RIGHT;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case ST_ATTACHMENT_BACK_RIGHT:
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         natt = NATIVE_ATTACHMENT_BACK_RIGHT;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         natt = -1;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (natt >= 0) {
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tex = textures[natt];
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (statts[i] == stfbi->visual->render_buffer)
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            pipe_resource_reference(&gsurf->render_texture, tex);
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (attachment_mask & (1 << natt)) {
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* transfer the ownership to the caller */
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            out[i] = tex;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            attachment_mask &= ~(1 << natt);
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* the attachment is listed more than once */
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            pipe_resource_reference(&out[i], tex);
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct st_framebuffer_iface *
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_create_st_framebuffer(_EGLSurface *surf)
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_framebuffer_iface *stfbi;
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stfbi = CALLOC_STRUCT(st_framebuffer_iface);
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!stfbi)
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stfbi->visual = &gsurf->stvis;
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p_atomic_set(&stfbi->stamp, 1);
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (gsurf->base.Type != EGL_PBUFFER_BIT) {
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stfbi->flush_front = egl_g3d_st_framebuffer_flush_front;
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stfbi->validate = egl_g3d_st_framebuffer_validate;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stfbi->flush_front = egl_g3d_st_framebuffer_flush_front_pbuffer;
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stfbi->validate = egl_g3d_st_framebuffer_validate_pbuffer;
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stfbi->st_manager_private = (void *) &gsurf->base;
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return stfbi;
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_destroy_st_framebuffer(struct st_framebuffer_iface *stfbi)
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(stfbi);
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
319