1a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu/*
2a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * Mesa 3-D graphics library
3a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * Version:  7.9
4a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu *
5a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * Copyright (C) 2010 LunarG Inc.
6a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu *
7a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
8a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * copy of this software and associated documentation files (the "Software"),
9a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * to deal in the Software without restriction, including without limitation
10a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * and/or sell copies of the Software, and to permit persons to whom the
12a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * Software is furnished to do so, subject to the following conditions:
13a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu *
14a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * The above copyright notice and this permission notice shall be included
15a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * in all copies or substantial portions of the Software.
16a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu *
17ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * DEALINGS IN THE SOFTWARE.
24a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu *
25a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * Authors:
26a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu *    Chia-I Wu <olv@lunarg.com>
27a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu */
28a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
29a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "util/u_memory.h"
302773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu#include "util/u_string.h"
31a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "util/u_inlines.h"
32a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu#include "util/u_pointer.h"
33a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "util/u_dl.h"
342773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu#include "egldriver.h"
35a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "eglimage.h"
36a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "eglmutex.h"
37a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
38a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "egl_g3d.h"
39a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "egl_g3d_st.h"
40a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
41a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wustruct egl_g3d_st_manager {
42a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct st_manager base;
43a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   _EGLDisplay *display;
44a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu};
45a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
46a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wustatic INLINE struct egl_g3d_st_manager *
47a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_st_manager(struct st_manager *smapi)
48a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
49a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   return (struct egl_g3d_st_manager *) smapi;
50a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
51a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
52776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wustatic boolean
53776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wuegl_g3d_st_manager_get_egl_image(struct st_manager *smapi,
544db0c760195c67f1bc114fdfb8464791030a526cJakob Borncrantz                                 void *egl_image,
554db0c760195c67f1bc114fdfb8464791030a526cJakob Borncrantz                                 struct st_egl_image *out)
56776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu{
57776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   struct egl_g3d_st_manager *gsmapi = egl_g3d_st_manager(smapi);
584db0c760195c67f1bc114fdfb8464791030a526cJakob Borncrantz   EGLImageKHR handle = (EGLImageKHR) egl_image;
59776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   _EGLImage *img;
60776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   struct egl_g3d_image *gimg;
61776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
62776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   /* this is called from state trackers */
63776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   _eglLockMutex(&gsmapi->display->Mutex);
64776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
65776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   img = _eglLookupImage(handle, gsmapi->display);
66776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   if (!img) {
67776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu      _eglUnlockMutex(&gsmapi->display->Mutex);
68776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu      return FALSE;
69776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   }
70776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
71776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   gimg = egl_g3d_image(img);
72776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
734db0c760195c67f1bc114fdfb8464791030a526cJakob Borncrantz   out->texture = NULL;
744db0c760195c67f1bc114fdfb8464791030a526cJakob Borncrantz   pipe_resource_reference(&out->texture, gimg->texture);
754db0c760195c67f1bc114fdfb8464791030a526cJakob Borncrantz   out->level = gimg->level;
764c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   out->layer = gimg->layer;
77776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
78776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   _eglUnlockMutex(&gsmapi->display->Mutex);
79776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
80776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   return TRUE;
81776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu}
82776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
835f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantzstatic int
845f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantzegl_g3d_st_manager_get_param(struct st_manager *smapi,
855f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantz                             enum st_manager_param param)
865f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantz{
875f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantz   return 0;
885f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantz}
895f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantz
90a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wustruct st_manager *
91a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_create_st_manager(_EGLDisplay *dpy)
92a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
93a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
94a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct egl_g3d_st_manager *gsmapi;
95a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
96a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   gsmapi = CALLOC_STRUCT(egl_g3d_st_manager);
97a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   if (gsmapi) {
98a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      gsmapi->display = dpy;
99a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
100a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      gsmapi->base.screen = gdpy->native->screen;
101776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu      gsmapi->base.get_egl_image = egl_g3d_st_manager_get_egl_image;
1025f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantz      gsmapi->base.get_param = egl_g3d_st_manager_get_param;
103a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   }
104a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
105a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   return &gsmapi->base;;
106a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
107a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
108a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuvoid
109a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_destroy_st_manager(struct st_manager *smapi)
110a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
111a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct egl_g3d_st_manager *gsmapi = egl_g3d_st_manager(smapi);
112870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu   FREE(gsmapi);
113a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
114a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
115a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wustatic boolean
116f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wuegl_g3d_st_framebuffer_flush_front_pbuffer(struct st_framebuffer_iface *stfbi,
117f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu                                           enum st_attachment_type statt)
118f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu{
119f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   return TRUE;
120f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu}
121f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
122a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wustatic void
123a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wupbuffer_reference_openvg_image(struct egl_g3d_surface *gsurf)
124a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu{
125a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu   /* TODO */
126a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu}
127a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu
128a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wustatic void
1295c9e0ad5fddf216921703a0aa9c911a51226cdfdChia-I Wupbuffer_allocate_pbuffer_texture(struct egl_g3d_surface *gsurf)
130a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu{
131a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu   struct egl_g3d_display *gdpy =
132a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu      egl_g3d_display(gsurf->base.Resource.Display);
133a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu   struct pipe_screen *screen = gdpy->native->screen;
134a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu   struct pipe_resource templ, *ptex;
135a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu
136a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu   memset(&templ, 0, sizeof(templ));
137a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu   templ.target = PIPE_TEXTURE_2D;
138a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu   templ.last_level = 0;
139a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu   templ.width0 = gsurf->base.Width;
140a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu   templ.height0 = gsurf->base.Height;
141a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu   templ.depth0 = 1;
1424c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   templ.array_size = 1;
143a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu   templ.format = gsurf->stvis.color_format;
1445c9e0ad5fddf216921703a0aa9c911a51226cdfdChia-I Wu   /* for rendering and binding to texture */
1455c9e0ad5fddf216921703a0aa9c911a51226cdfdChia-I Wu   templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
146a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu
147a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu   ptex = screen->resource_create(screen, &templ);
148a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu   gsurf->render_texture = ptex;
149a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu}
150a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu
151a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wustatic boolean
152f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wuegl_g3d_st_framebuffer_validate_pbuffer(struct st_framebuffer_iface *stfbi,
153f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu                                        const enum st_attachment_type *statts,
154f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu                                        unsigned count,
155287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                        struct pipe_resource **out)
156f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu{
157f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   _EGLSurface *surf = (_EGLSurface *) stfbi->st_manager_private;
158f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
159f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   unsigned i;
160f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
161f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   for (i = 0; i < count; i++) {
162f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      out[i] = NULL;
163f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
164f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      if (gsurf->stvis.render_buffer != statts[i])
165f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu         continue;
166f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
167f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      if (!gsurf->render_texture) {
168a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu         switch (gsurf->client_buffer_type) {
169a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu         case EGL_NONE:
1705c9e0ad5fddf216921703a0aa9c911a51226cdfdChia-I Wu            pbuffer_allocate_pbuffer_texture(gsurf);
171a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu            break;
172a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu         case EGL_OPENVG_IMAGE:
173a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu            pbuffer_reference_openvg_image(gsurf);
174a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu            break;
175a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu         default:
176a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu            break;
177a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu         }
178a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu
179a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu         if (!gsurf->render_texture)
180a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu            return FALSE;
181f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      }
182f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
183287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(&out[i], gsurf->render_texture);
184f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   }
185f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
186f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   return TRUE;
187f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu}
188f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
189f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wustatic boolean
190a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_st_framebuffer_flush_front(struct st_framebuffer_iface *stfbi,
191a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu                                   enum st_attachment_type statt)
192a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
193a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   _EGLSurface *surf = (_EGLSurface *) stfbi->st_manager_private;
194a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
19508e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   struct native_present_control ctrl;
196a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
19708e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   memset(&ctrl, 0, sizeof(ctrl));
19808e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   ctrl.natt = NATIVE_ATTACHMENT_FRONT_LEFT;
19908e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu
20008e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   return gsurf->native->present(gsurf->native, &ctrl);
201a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
202a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
203a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wustatic boolean
204a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,
205a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu                                const enum st_attachment_type *statts,
206a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu                                unsigned count,
207287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                struct pipe_resource **out)
208a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
209a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   _EGLSurface *surf = (_EGLSurface *) stfbi->st_manager_private;
210a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
211287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *textures[NUM_NATIVE_ATTACHMENTS];
212a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   uint attachment_mask = 0;
213a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   unsigned i;
214a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
215a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   for (i = 0; i < count; i++) {
216a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      int natt;
217a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
218a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      switch (statts[i]) {
219a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_FRONT_LEFT:
220a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_FRONT_LEFT;
221a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
222a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_BACK_LEFT:
223a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_BACK_LEFT;
224a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
225a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_FRONT_RIGHT:
226a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_FRONT_RIGHT;
227a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
228a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_BACK_RIGHT:
229a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_BACK_RIGHT;
2302ae66e9b97e9864367c26fc5f9cb86896bc83b45Chia-I Wu         break;
231a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      default:
232a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = -1;
233a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
234a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      }
235a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
236a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      if (natt >= 0)
237a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         attachment_mask |= 1 << natt;
238a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   }
239a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
240a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   if (!gsurf->native->validate(gsurf->native, attachment_mask,
241a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         &gsurf->sequence_number, textures, &gsurf->base.Width,
242a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         &gsurf->base.Height))
243a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      return FALSE;
244a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
245a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   for (i = 0; i < count; i++) {
246287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      struct pipe_resource *tex;
247a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      int natt;
248a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
249a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      switch (statts[i]) {
250a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_FRONT_LEFT:
251a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_FRONT_LEFT;
252a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
253a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_BACK_LEFT:
254a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_BACK_LEFT;
255a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
256a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_FRONT_RIGHT:
257a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_FRONT_RIGHT;
258a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
259a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_BACK_RIGHT:
260a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_BACK_RIGHT;
261a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
262a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      default:
263a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = -1;
264a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
265a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      }
266a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
267a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      if (natt >= 0) {
268a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         tex = textures[natt];
269a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
270a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         if (statts[i] == stfbi->visual->render_buffer)
271287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell            pipe_resource_reference(&gsurf->render_texture, tex);
272a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
273a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         if (attachment_mask & (1 << natt)) {
274a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu            /* transfer the ownership to the caller */
275a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu            out[i] = tex;
276a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu            attachment_mask &= ~(1 << natt);
277a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         }
278a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         else {
279a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu            /* the attachment is listed more than once */
280287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell            pipe_resource_reference(&out[i], tex);
281a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         }
282a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      }
283a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   }
284a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
285a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   return TRUE;
286a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
287a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
288a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wustruct st_framebuffer_iface *
289a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_create_st_framebuffer(_EGLSurface *surf)
290a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
291a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
292a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct st_framebuffer_iface *stfbi;
293a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
294a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   stfbi = CALLOC_STRUCT(st_framebuffer_iface);
295a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   if (!stfbi)
296a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      return NULL;
297a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
298a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   stfbi->visual = &gsurf->stvis;
299ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom   p_atomic_set(&stfbi->stamp, 1);
300ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom
301f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   if (gsurf->base.Type != EGL_PBUFFER_BIT) {
302f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      stfbi->flush_front = egl_g3d_st_framebuffer_flush_front;
303f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      stfbi->validate = egl_g3d_st_framebuffer_validate;
304f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   }
305f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   else {
306f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      stfbi->flush_front = egl_g3d_st_framebuffer_flush_front_pbuffer;
307f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      stfbi->validate = egl_g3d_st_framebuffer_validate_pbuffer;
308f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   }
309a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   stfbi->st_manager_private = (void *) &gsurf->base;
310a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
311a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   return stfbi;
312a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
313a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
314a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuvoid
315a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_destroy_st_framebuffer(struct st_framebuffer_iface *stfbi)
316a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
317870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu   FREE(stfbi);
318a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
319