eglsurface.c revision 848b8605
1848b8605Smrg/************************************************************************** 2848b8605Smrg * 3848b8605Smrg * Copyright 2008 VMware, Inc. 4848b8605Smrg * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com> 5848b8605Smrg * Copyright 2010 LunarG, Inc. 6848b8605Smrg * All Rights Reserved. 7848b8605Smrg * 8848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a 9848b8605Smrg * copy of this software and associated documentation files (the 10848b8605Smrg * "Software"), to deal in the Software without restriction, including 11848b8605Smrg * without limitation the rights to use, copy, modify, merge, publish, 12848b8605Smrg * distribute, sub license, and/or sell copies of the Software, and to 13848b8605Smrg * permit persons to whom the Software is furnished to do so, subject to 14848b8605Smrg * the following conditions: 15848b8605Smrg * 16848b8605Smrg * The above copyright notice and this permission notice (including the 17848b8605Smrg * next paragraph) shall be included in all copies or substantial portions 18848b8605Smrg * of the Software. 19848b8605Smrg * 20848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21848b8605Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24848b8605Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25848b8605Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26848b8605Smrg * DEALINGS IN THE SOFTWARE. 27848b8605Smrg * 28848b8605Smrg **************************************************************************/ 29848b8605Smrg 30848b8605Smrg 31848b8605Smrg/** 32848b8605Smrg * Surface-related functions. 33848b8605Smrg */ 34848b8605Smrg 35848b8605Smrg 36848b8605Smrg#include <assert.h> 37848b8605Smrg#include <stdlib.h> 38848b8605Smrg#include <string.h> 39848b8605Smrg#include "egldisplay.h" 40848b8605Smrg#include "egldriver.h" 41848b8605Smrg#include "eglcontext.h" 42848b8605Smrg#include "eglconfig.h" 43848b8605Smrg#include "eglcurrent.h" 44848b8605Smrg#include "egllog.h" 45848b8605Smrg#include "eglsurface.h" 46848b8605Smrg 47848b8605Smrg 48848b8605Smrgstatic void 49848b8605Smrg_eglClampSwapInterval(_EGLSurface *surf, EGLint interval) 50848b8605Smrg{ 51848b8605Smrg EGLint bound = surf->Config->MaxSwapInterval; 52848b8605Smrg if (interval >= bound) { 53848b8605Smrg interval = bound; 54848b8605Smrg } 55848b8605Smrg else { 56848b8605Smrg bound = surf->Config->MinSwapInterval; 57848b8605Smrg if (interval < bound) 58848b8605Smrg interval = bound; 59848b8605Smrg } 60848b8605Smrg surf->SwapInterval = interval; 61848b8605Smrg} 62848b8605Smrg 63848b8605Smrg 64848b8605Smrg#ifdef EGL_MESA_screen_surface 65848b8605Smrgstatic EGLint 66848b8605Smrg_eglParseScreenSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list) 67848b8605Smrg{ 68848b8605Smrg EGLint i, err = EGL_SUCCESS; 69848b8605Smrg 70848b8605Smrg if (!attrib_list) 71848b8605Smrg return EGL_SUCCESS; 72848b8605Smrg 73848b8605Smrg for (i = 0; attrib_list[i] != EGL_NONE; i++) { 74848b8605Smrg EGLint attr = attrib_list[i++]; 75848b8605Smrg EGLint val = attrib_list[i]; 76848b8605Smrg 77848b8605Smrg switch (attr) { 78848b8605Smrg case EGL_WIDTH: 79848b8605Smrg if (val < 0) { 80848b8605Smrg err = EGL_BAD_PARAMETER; 81848b8605Smrg break; 82848b8605Smrg } 83848b8605Smrg surf->Width = val; 84848b8605Smrg break; 85848b8605Smrg case EGL_HEIGHT: 86848b8605Smrg if (val < 0) { 87848b8605Smrg err = EGL_BAD_PARAMETER; 88848b8605Smrg break; 89848b8605Smrg } 90848b8605Smrg surf->Height = val; 91848b8605Smrg break; 92848b8605Smrg default: 93848b8605Smrg err = EGL_BAD_ATTRIBUTE; 94848b8605Smrg break; 95848b8605Smrg } 96848b8605Smrg 97848b8605Smrg if (err != EGL_SUCCESS) { 98848b8605Smrg _eglLog(_EGL_WARNING, "bad surface attribute 0x%04x", attr); 99848b8605Smrg break; 100848b8605Smrg } 101848b8605Smrg } 102848b8605Smrg 103848b8605Smrg return err; 104848b8605Smrg} 105848b8605Smrg#endif /* EGL_MESA_screen_surface */ 106848b8605Smrg 107848b8605Smrg 108848b8605Smrg/** 109848b8605Smrg * Parse the list of surface attributes and return the proper error code. 110848b8605Smrg */ 111848b8605Smrgstatic EGLint 112848b8605Smrg_eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list) 113848b8605Smrg{ 114848b8605Smrg _EGLDisplay *dpy = surf->Resource.Display; 115848b8605Smrg EGLint type = surf->Type; 116848b8605Smrg EGLint texture_type = EGL_PBUFFER_BIT; 117848b8605Smrg EGLint i, err = EGL_SUCCESS; 118848b8605Smrg 119848b8605Smrg if (!attrib_list) 120848b8605Smrg return EGL_SUCCESS; 121848b8605Smrg 122848b8605Smrg#ifdef EGL_MESA_screen_surface 123848b8605Smrg if (type == EGL_SCREEN_BIT_MESA) 124848b8605Smrg return _eglParseScreenSurfaceAttribList(surf, attrib_list); 125848b8605Smrg#endif 126848b8605Smrg 127848b8605Smrg if (dpy->Extensions.NOK_texture_from_pixmap) 128848b8605Smrg texture_type |= EGL_PIXMAP_BIT; 129848b8605Smrg 130848b8605Smrg for (i = 0; attrib_list[i] != EGL_NONE; i++) { 131848b8605Smrg EGLint attr = attrib_list[i++]; 132848b8605Smrg EGLint val = attrib_list[i]; 133848b8605Smrg 134848b8605Smrg switch (attr) { 135848b8605Smrg /* common attributes */ 136848b8605Smrg case EGL_VG_COLORSPACE: 137848b8605Smrg switch (val) { 138848b8605Smrg case EGL_VG_COLORSPACE_sRGB: 139848b8605Smrg case EGL_VG_COLORSPACE_LINEAR: 140848b8605Smrg break; 141848b8605Smrg default: 142848b8605Smrg err = EGL_BAD_ATTRIBUTE; 143848b8605Smrg break; 144848b8605Smrg } 145848b8605Smrg if (err != EGL_SUCCESS) 146848b8605Smrg break; 147848b8605Smrg surf->VGColorspace = val; 148848b8605Smrg break; 149848b8605Smrg case EGL_VG_ALPHA_FORMAT: 150848b8605Smrg switch (val) { 151848b8605Smrg case EGL_VG_ALPHA_FORMAT_NONPRE: 152848b8605Smrg case EGL_VG_ALPHA_FORMAT_PRE: 153848b8605Smrg break; 154848b8605Smrg default: 155848b8605Smrg err = EGL_BAD_ATTRIBUTE; 156848b8605Smrg break; 157848b8605Smrg } 158848b8605Smrg if (err != EGL_SUCCESS) 159848b8605Smrg break; 160848b8605Smrg surf->VGAlphaFormat = val; 161848b8605Smrg break; 162848b8605Smrg /* window surface attributes */ 163848b8605Smrg case EGL_RENDER_BUFFER: 164848b8605Smrg if (type != EGL_WINDOW_BIT) { 165848b8605Smrg err = EGL_BAD_ATTRIBUTE; 166848b8605Smrg break; 167848b8605Smrg } 168848b8605Smrg if (val != EGL_BACK_BUFFER && val != EGL_SINGLE_BUFFER) { 169848b8605Smrg err = EGL_BAD_ATTRIBUTE; 170848b8605Smrg break; 171848b8605Smrg } 172848b8605Smrg surf->RenderBuffer = val; 173848b8605Smrg break; 174848b8605Smrg case EGL_POST_SUB_BUFFER_SUPPORTED_NV: 175848b8605Smrg if (!dpy->Extensions.NV_post_sub_buffer || 176848b8605Smrg type != EGL_WINDOW_BIT) { 177848b8605Smrg err = EGL_BAD_ATTRIBUTE; 178848b8605Smrg break; 179848b8605Smrg } 180848b8605Smrg if (val != EGL_TRUE && val != EGL_FALSE) { 181848b8605Smrg err = EGL_BAD_PARAMETER; 182848b8605Smrg break; 183848b8605Smrg } 184848b8605Smrg surf->PostSubBufferSupportedNV = val; 185848b8605Smrg break; 186848b8605Smrg /* pbuffer surface attributes */ 187848b8605Smrg case EGL_WIDTH: 188848b8605Smrg if (type != EGL_PBUFFER_BIT) { 189848b8605Smrg err = EGL_BAD_ATTRIBUTE; 190848b8605Smrg break; 191848b8605Smrg } 192848b8605Smrg if (val < 0) { 193848b8605Smrg err = EGL_BAD_PARAMETER; 194848b8605Smrg break; 195848b8605Smrg } 196848b8605Smrg surf->Width = val; 197848b8605Smrg break; 198848b8605Smrg case EGL_HEIGHT: 199848b8605Smrg if (type != EGL_PBUFFER_BIT) { 200848b8605Smrg err = EGL_BAD_ATTRIBUTE; 201848b8605Smrg break; 202848b8605Smrg } 203848b8605Smrg if (val < 0) { 204848b8605Smrg err = EGL_BAD_PARAMETER; 205848b8605Smrg break; 206848b8605Smrg } 207848b8605Smrg surf->Height = val; 208848b8605Smrg break; 209848b8605Smrg case EGL_LARGEST_PBUFFER: 210848b8605Smrg if (type != EGL_PBUFFER_BIT) { 211848b8605Smrg err = EGL_BAD_ATTRIBUTE; 212848b8605Smrg break; 213848b8605Smrg } 214848b8605Smrg surf->LargestPbuffer = !!val; 215848b8605Smrg break; 216848b8605Smrg /* for eglBindTexImage */ 217848b8605Smrg case EGL_TEXTURE_FORMAT: 218848b8605Smrg if (!(type & texture_type)) { 219848b8605Smrg err = EGL_BAD_ATTRIBUTE; 220848b8605Smrg break; 221848b8605Smrg } 222848b8605Smrg switch (val) { 223848b8605Smrg case EGL_TEXTURE_RGB: 224848b8605Smrg case EGL_TEXTURE_RGBA: 225848b8605Smrg case EGL_NO_TEXTURE: 226848b8605Smrg break; 227848b8605Smrg default: 228848b8605Smrg err = EGL_BAD_ATTRIBUTE; 229848b8605Smrg break; 230848b8605Smrg } 231848b8605Smrg if (err != EGL_SUCCESS) 232848b8605Smrg break; 233848b8605Smrg surf->TextureFormat = val; 234848b8605Smrg break; 235848b8605Smrg case EGL_TEXTURE_TARGET: 236848b8605Smrg if (!(type & texture_type)) { 237848b8605Smrg err = EGL_BAD_ATTRIBUTE; 238848b8605Smrg break; 239848b8605Smrg } 240848b8605Smrg switch (val) { 241848b8605Smrg case EGL_TEXTURE_2D: 242848b8605Smrg case EGL_NO_TEXTURE: 243848b8605Smrg break; 244848b8605Smrg default: 245848b8605Smrg err = EGL_BAD_ATTRIBUTE; 246848b8605Smrg break; 247848b8605Smrg } 248848b8605Smrg if (err != EGL_SUCCESS) 249848b8605Smrg break; 250848b8605Smrg surf->TextureTarget = val; 251848b8605Smrg break; 252848b8605Smrg case EGL_MIPMAP_TEXTURE: 253848b8605Smrg if (!(type & texture_type)) { 254848b8605Smrg err = EGL_BAD_ATTRIBUTE; 255848b8605Smrg break; 256848b8605Smrg } 257848b8605Smrg surf->MipmapTexture = !!val; 258848b8605Smrg break; 259848b8605Smrg /* no pixmap surface specific attributes */ 260848b8605Smrg default: 261848b8605Smrg err = EGL_BAD_ATTRIBUTE; 262848b8605Smrg break; 263848b8605Smrg } 264848b8605Smrg 265848b8605Smrg if (err != EGL_SUCCESS) { 266848b8605Smrg _eglLog(_EGL_WARNING, "bad surface attribute 0x%04x", attr); 267848b8605Smrg break; 268848b8605Smrg } 269848b8605Smrg } 270848b8605Smrg 271848b8605Smrg return err; 272848b8605Smrg} 273848b8605Smrg 274848b8605Smrg 275848b8605Smrg/** 276848b8605Smrg * Do error check on parameters and initialize the given _EGLSurface object. 277848b8605Smrg * \return EGL_TRUE if no errors, EGL_FALSE otherwise. 278848b8605Smrg */ 279848b8605SmrgEGLBoolean 280848b8605Smrg_eglInitSurface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type, 281848b8605Smrg _EGLConfig *conf, const EGLint *attrib_list) 282848b8605Smrg{ 283848b8605Smrg const char *func; 284848b8605Smrg EGLint renderBuffer = EGL_BACK_BUFFER; 285848b8605Smrg EGLint swapBehavior = EGL_BUFFER_PRESERVED; 286848b8605Smrg EGLint err; 287848b8605Smrg 288848b8605Smrg switch (type) { 289848b8605Smrg case EGL_WINDOW_BIT: 290848b8605Smrg func = "eglCreateWindowSurface"; 291848b8605Smrg swapBehavior = EGL_BUFFER_DESTROYED; 292848b8605Smrg break; 293848b8605Smrg case EGL_PIXMAP_BIT: 294848b8605Smrg func = "eglCreatePixmapSurface"; 295848b8605Smrg renderBuffer = EGL_SINGLE_BUFFER; 296848b8605Smrg break; 297848b8605Smrg case EGL_PBUFFER_BIT: 298848b8605Smrg func = "eglCreatePBufferSurface"; 299848b8605Smrg break; 300848b8605Smrg#ifdef EGL_MESA_screen_surface 301848b8605Smrg case EGL_SCREEN_BIT_MESA: 302848b8605Smrg func = "eglCreateScreenSurface"; 303848b8605Smrg renderBuffer = EGL_SINGLE_BUFFER; /* XXX correct? */ 304848b8605Smrg break; 305848b8605Smrg#endif 306848b8605Smrg default: 307848b8605Smrg _eglLog(_EGL_WARNING, "Bad type in _eglInitSurface"); 308848b8605Smrg return EGL_FALSE; 309848b8605Smrg } 310848b8605Smrg 311848b8605Smrg if ((conf->SurfaceType & type) == 0) { 312848b8605Smrg /* The config can't be used to create a surface of this type */ 313848b8605Smrg _eglError(EGL_BAD_CONFIG, func); 314848b8605Smrg return EGL_FALSE; 315848b8605Smrg } 316848b8605Smrg 317848b8605Smrg _eglInitResource(&surf->Resource, sizeof(*surf), dpy); 318848b8605Smrg surf->Type = type; 319848b8605Smrg surf->Config = conf; 320848b8605Smrg 321848b8605Smrg surf->Width = 0; 322848b8605Smrg surf->Height = 0; 323848b8605Smrg surf->TextureFormat = EGL_NO_TEXTURE; 324848b8605Smrg surf->TextureTarget = EGL_NO_TEXTURE; 325848b8605Smrg surf->MipmapTexture = EGL_FALSE; 326848b8605Smrg surf->LargestPbuffer = EGL_FALSE; 327848b8605Smrg surf->RenderBuffer = renderBuffer; 328848b8605Smrg surf->VGAlphaFormat = EGL_VG_ALPHA_FORMAT_NONPRE; 329848b8605Smrg surf->VGColorspace = EGL_VG_COLORSPACE_sRGB; 330848b8605Smrg 331848b8605Smrg surf->MipmapLevel = 0; 332848b8605Smrg surf->MultisampleResolve = EGL_MULTISAMPLE_RESOLVE_DEFAULT; 333848b8605Smrg surf->SwapBehavior = swapBehavior; 334848b8605Smrg 335848b8605Smrg surf->HorizontalResolution = EGL_UNKNOWN; 336848b8605Smrg surf->VerticalResolution = EGL_UNKNOWN; 337848b8605Smrg surf->AspectRatio = EGL_UNKNOWN; 338848b8605Smrg 339848b8605Smrg surf->PostSubBufferSupportedNV = EGL_FALSE; 340848b8605Smrg 341848b8605Smrg /* the default swap interval is 1 */ 342848b8605Smrg _eglClampSwapInterval(surf, 1); 343848b8605Smrg 344848b8605Smrg err = _eglParseSurfaceAttribList(surf, attrib_list); 345848b8605Smrg if (err != EGL_SUCCESS) 346848b8605Smrg return _eglError(err, func); 347848b8605Smrg 348848b8605Smrg return EGL_TRUE; 349848b8605Smrg} 350848b8605Smrg 351848b8605Smrg 352848b8605SmrgEGLBoolean 353848b8605Smrg_eglQuerySurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface, 354848b8605Smrg EGLint attribute, EGLint *value) 355848b8605Smrg{ 356848b8605Smrg switch (attribute) { 357848b8605Smrg case EGL_WIDTH: 358848b8605Smrg *value = surface->Width; 359848b8605Smrg break; 360848b8605Smrg case EGL_HEIGHT: 361848b8605Smrg *value = surface->Height; 362848b8605Smrg break; 363848b8605Smrg case EGL_CONFIG_ID: 364848b8605Smrg *value = surface->Config->ConfigID; 365848b8605Smrg break; 366848b8605Smrg case EGL_LARGEST_PBUFFER: 367848b8605Smrg *value = surface->LargestPbuffer; 368848b8605Smrg break; 369848b8605Smrg case EGL_TEXTURE_FORMAT: 370848b8605Smrg /* texture attributes: only for pbuffers, no error otherwise */ 371848b8605Smrg if (surface->Type == EGL_PBUFFER_BIT) 372848b8605Smrg *value = surface->TextureFormat; 373848b8605Smrg break; 374848b8605Smrg case EGL_TEXTURE_TARGET: 375848b8605Smrg if (surface->Type == EGL_PBUFFER_BIT) 376848b8605Smrg *value = surface->TextureTarget; 377848b8605Smrg break; 378848b8605Smrg case EGL_MIPMAP_TEXTURE: 379848b8605Smrg if (surface->Type == EGL_PBUFFER_BIT) 380848b8605Smrg *value = surface->MipmapTexture; 381848b8605Smrg break; 382848b8605Smrg case EGL_MIPMAP_LEVEL: 383848b8605Smrg if (surface->Type == EGL_PBUFFER_BIT) 384848b8605Smrg *value = surface->MipmapLevel; 385848b8605Smrg break; 386848b8605Smrg case EGL_SWAP_BEHAVIOR: 387848b8605Smrg *value = surface->SwapBehavior; 388848b8605Smrg break; 389848b8605Smrg case EGL_RENDER_BUFFER: 390848b8605Smrg *value = surface->RenderBuffer; 391848b8605Smrg break; 392848b8605Smrg case EGL_PIXEL_ASPECT_RATIO: 393848b8605Smrg *value = surface->AspectRatio; 394848b8605Smrg break; 395848b8605Smrg case EGL_HORIZONTAL_RESOLUTION: 396848b8605Smrg *value = surface->HorizontalResolution; 397848b8605Smrg break; 398848b8605Smrg case EGL_VERTICAL_RESOLUTION: 399848b8605Smrg *value = surface->VerticalResolution; 400848b8605Smrg break; 401848b8605Smrg case EGL_MULTISAMPLE_RESOLVE: 402848b8605Smrg *value = surface->MultisampleResolve; 403848b8605Smrg break; 404848b8605Smrg case EGL_VG_ALPHA_FORMAT: 405848b8605Smrg *value = surface->VGAlphaFormat; 406848b8605Smrg break; 407848b8605Smrg case EGL_VG_COLORSPACE: 408848b8605Smrg *value = surface->VGColorspace; 409848b8605Smrg break; 410848b8605Smrg case EGL_POST_SUB_BUFFER_SUPPORTED_NV: 411848b8605Smrg *value = surface->PostSubBufferSupportedNV; 412848b8605Smrg break; 413848b8605Smrg case EGL_BUFFER_AGE_EXT: 414848b8605Smrg if (!dpy->Extensions.EXT_buffer_age) { 415848b8605Smrg _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface"); 416848b8605Smrg return EGL_FALSE; 417848b8605Smrg } 418848b8605Smrg *value = drv->API.QueryBufferAge(drv, dpy, surface); 419848b8605Smrg break; 420848b8605Smrg default: 421848b8605Smrg _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface"); 422848b8605Smrg return EGL_FALSE; 423848b8605Smrg } 424848b8605Smrg 425848b8605Smrg return EGL_TRUE; 426848b8605Smrg} 427848b8605Smrg 428848b8605Smrg 429848b8605Smrg/** 430848b8605Smrg * Default fallback routine - drivers might override this. 431848b8605Smrg */ 432848b8605SmrgEGLBoolean 433848b8605Smrg_eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface, 434848b8605Smrg EGLint attribute, EGLint value) 435848b8605Smrg{ 436848b8605Smrg EGLint confval; 437848b8605Smrg EGLint err = EGL_SUCCESS; 438848b8605Smrg EGLint all_es_bits = EGL_OPENGL_ES_BIT | 439848b8605Smrg EGL_OPENGL_ES2_BIT | 440848b8605Smrg EGL_OPENGL_ES3_BIT_KHR; 441848b8605Smrg 442848b8605Smrg switch (attribute) { 443848b8605Smrg case EGL_MIPMAP_LEVEL: 444848b8605Smrg confval = surface->Config->RenderableType; 445848b8605Smrg if (!(confval & all_es_bits)) { 446848b8605Smrg err = EGL_BAD_PARAMETER; 447848b8605Smrg break; 448848b8605Smrg } 449848b8605Smrg surface->MipmapLevel = value; 450848b8605Smrg break; 451848b8605Smrg case EGL_MULTISAMPLE_RESOLVE: 452848b8605Smrg switch (value) { 453848b8605Smrg case EGL_MULTISAMPLE_RESOLVE_DEFAULT: 454848b8605Smrg break; 455848b8605Smrg case EGL_MULTISAMPLE_RESOLVE_BOX: 456848b8605Smrg confval = surface->Config->SurfaceType; 457848b8605Smrg if (!(confval & EGL_MULTISAMPLE_RESOLVE_BOX_BIT)) 458848b8605Smrg err = EGL_BAD_MATCH; 459848b8605Smrg break; 460848b8605Smrg default: 461848b8605Smrg err = EGL_BAD_ATTRIBUTE; 462848b8605Smrg break; 463848b8605Smrg } 464848b8605Smrg if (err != EGL_SUCCESS) 465848b8605Smrg break; 466848b8605Smrg surface->MultisampleResolve = value; 467848b8605Smrg break; 468848b8605Smrg case EGL_SWAP_BEHAVIOR: 469848b8605Smrg switch (value) { 470848b8605Smrg case EGL_BUFFER_DESTROYED: 471848b8605Smrg break; 472848b8605Smrg case EGL_BUFFER_PRESERVED: 473848b8605Smrg confval = surface->Config->SurfaceType; 474848b8605Smrg if (!(confval & EGL_SWAP_BEHAVIOR_PRESERVED_BIT)) 475848b8605Smrg err = EGL_BAD_MATCH; 476848b8605Smrg break; 477848b8605Smrg default: 478848b8605Smrg err = EGL_BAD_ATTRIBUTE; 479848b8605Smrg break; 480848b8605Smrg } 481848b8605Smrg if (err != EGL_SUCCESS) 482848b8605Smrg break; 483848b8605Smrg surface->SwapBehavior = value; 484848b8605Smrg break; 485848b8605Smrg default: 486848b8605Smrg err = EGL_BAD_ATTRIBUTE; 487848b8605Smrg break; 488848b8605Smrg } 489848b8605Smrg 490848b8605Smrg if (err != EGL_SUCCESS) 491848b8605Smrg return _eglError(err, "eglSurfaceAttrib"); 492848b8605Smrg return EGL_TRUE; 493848b8605Smrg} 494848b8605Smrg 495848b8605Smrg 496848b8605SmrgEGLBoolean 497848b8605Smrg_eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface, 498848b8605Smrg EGLint buffer) 499848b8605Smrg{ 500848b8605Smrg EGLint texture_type = EGL_PBUFFER_BIT; 501848b8605Smrg 502848b8605Smrg /* Just do basic error checking and return success/fail. 503848b8605Smrg * Drivers must implement the real stuff. 504848b8605Smrg */ 505848b8605Smrg 506848b8605Smrg if (dpy->Extensions.NOK_texture_from_pixmap) 507848b8605Smrg texture_type |= EGL_PIXMAP_BIT; 508848b8605Smrg 509848b8605Smrg if (!(surface->Type & texture_type)) { 510848b8605Smrg _eglError(EGL_BAD_SURFACE, "eglBindTexImage"); 511848b8605Smrg return EGL_FALSE; 512848b8605Smrg } 513848b8605Smrg 514848b8605Smrg if (surface->TextureFormat == EGL_NO_TEXTURE) { 515848b8605Smrg _eglError(EGL_BAD_MATCH, "eglBindTexImage"); 516848b8605Smrg return EGL_FALSE; 517848b8605Smrg } 518848b8605Smrg 519848b8605Smrg if (surface->TextureTarget == EGL_NO_TEXTURE) { 520848b8605Smrg _eglError(EGL_BAD_MATCH, "eglBindTexImage"); 521848b8605Smrg return EGL_FALSE; 522848b8605Smrg } 523848b8605Smrg 524848b8605Smrg if (buffer != EGL_BACK_BUFFER) { 525848b8605Smrg _eglError(EGL_BAD_PARAMETER, "eglBindTexImage"); 526848b8605Smrg return EGL_FALSE; 527848b8605Smrg } 528848b8605Smrg 529848b8605Smrg surface->BoundToTexture = EGL_TRUE; 530848b8605Smrg 531848b8605Smrg return EGL_TRUE; 532848b8605Smrg} 533848b8605Smrg 534848b8605SmrgEGLBoolean 535848b8605Smrg_eglReleaseTexImage(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, 536848b8605Smrg EGLint buffer) 537848b8605Smrg{ 538848b8605Smrg /* TODO: do basic error checking and return success/fail. 539848b8605Smrg * Drivers must implement the real stuff. 540848b8605Smrg */ 541848b8605Smrg 542848b8605Smrg return EGL_TRUE; 543848b8605Smrg} 544848b8605Smrg 545848b8605Smrg 546848b8605SmrgEGLBoolean 547848b8605Smrg_eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, 548848b8605Smrg EGLint interval) 549848b8605Smrg{ 550848b8605Smrg _eglClampSwapInterval(surf, interval); 551848b8605Smrg return EGL_TRUE; 552848b8605Smrg} 553