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