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