1f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu/**************************************************************************
2f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2008 VMware, Inc.
4f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com>
5f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2010 LunarG, Inc.
6f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * All Rights Reserved.
7f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
8f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
9f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * copy of this software and associated documentation files (the
10f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * "Software"), to deal in the Software without restriction, including
11f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * without limitation the rights to use, copy, modify, merge, publish,
12f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * distribute, sub license, and/or sell copies of the Software, and to
13f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * permit persons to whom the Software is furnished to do so, subject to
14f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * the following conditions:
15f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
16f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * The above copyright notice and this permission notice (including the
17f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * next paragraph) shall be included in all copies or substantial portions
18f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * of the Software.
19f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
20f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
23f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * DEALINGS IN THE SOFTWARE.
27f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
28f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu **************************************************************************/
29f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu
30f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu
31adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#ifndef EGLSURFACE_INCLUDED
32adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#define EGLSURFACE_INCLUDED
33adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
347bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikov#include "c99_compat.h"
35adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
36adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egltypedefs.h"
37ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu#include "egldisplay.h"
38adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
39adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
408362068c1b28eb2d3e334abc980c4711957d61fdAlexander von Gluck IV#ifdef __cplusplus
418362068c1b28eb2d3e334abc980c4711957d61fdAlexander von Gluck IVextern "C" {
428362068c1b28eb2d3e334abc980c4711957d61fdAlexander von Gluck IV#endif
438362068c1b28eb2d3e334abc980c4711957d61fdAlexander von Gluck IV
44adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
45adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * "Base" class for device driver surfaces.
46adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
47adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paulstruct _egl_surface
48adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
49ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   /* A surface is a display resource */
50ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   _EGLResource Resource;
5118457cb263e3e062e12314e7b3d5c81a7f2ba048Chia-I Wu
5200e1790f3230de550121591d611b47da299ae15cChia-I Wu   /* The context that is currently bound to the surface */
5300e1790f3230de550121591d611b47da299ae15cChia-I Wu   _EGLContext *CurrentContext;
54adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5507ee01365a8bddf6f50821ecd585784498a25ff0Chia-I Wu   _EGLConfig *Config;
5607ee01365a8bddf6f50821ecd585784498a25ff0Chia-I Wu
57adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint Type; /* one of EGL_WINDOW_BIT, EGL_PIXMAP_BIT or EGL_PBUFFER_BIT */
58eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu
59eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   /* attributes set by attribute list */
60adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint Width, Height;
61eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum TextureFormat;
62eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum TextureTarget;
63eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLBoolean MipmapTexture;
64eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLBoolean LargestPbuffer;
65eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum RenderBuffer;
66eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum VGAlphaFormat;
67eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum VGColorspace;
68c2c2e9ab604793c6e01f85497f3f5bf645f962faMarek Olšák   EGLenum GLColorspace;
69eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu
70eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   /* attributes set by eglSurfaceAttrib */
71eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLint MipmapLevel;
72eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum MultisampleResolve;
73eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum SwapBehavior;
74eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu
75eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLint HorizontalResolution, VerticalResolution;
76eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLint AspectRatio;
77eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu
78adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint SwapInterval;
79adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8000e1790f3230de550121591d611b47da299ae15cChia-I Wu   /* True if the surface is bound to an OpenGL ES texture */
8100e1790f3230de550121591d611b47da299ae15cChia-I Wu   EGLBoolean BoundToTexture;
827d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
837d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   EGLBoolean PostSubBufferSupportedNV;
84adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul};
85adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
86adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
87dd438ae34bdbaa6651cdd226d5fec15a892923bfEmil Velikovextern EGLBoolean
88d69242be55091e53b0ae2cfa6282790ce1862f29Chia-I Wu_eglInitSurface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type,
89cca31340b5a9c0b941946753a31236c7201ca87cChia-I Wu                _EGLConfig *config, const EGLint *attrib_list);
90adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
91adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
92adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paulextern EGLBoolean
932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglQuerySurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint *value);
94adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
95adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
96adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paulextern EGLBoolean
972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint value);
98adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
99adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
100dd438ae34bdbaa6651cdd226d5fec15a892923bfEmil Velikovextern EGLBoolean
1012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint buffer);
102adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
103dd438ae34bdbaa6651cdd226d5fec15a892923bfEmil Velikovextern EGLBoolean
1049b42fd1772b13b10f397d80d11aa8351e6313085Emil Velikov_eglReleaseTexImage(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLint buffer);
1059b42fd1772b13b10f397d80d11aa8351e6313085Emil Velikov
106adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
107adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paulextern EGLBoolean
10857da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu_eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint interval);
109adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
110adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
11107ee01365a8bddf6f50821ecd585784498a25ff0Chia-I Wu/**
112dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu * Increment reference count for the surface.
113dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu */
1147bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLSurface *
115dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu_eglGetSurface(_EGLSurface *surf)
116dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu{
117dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu   if (surf)
118dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu      _eglGetResource(&surf->Resource);
119dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu   return surf;
120dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu}
121dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu
122dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu
123dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu/**
124dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu * Decrement reference count for the surface.
125dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu */
1267bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline EGLBoolean
127dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu_eglPutSurface(_EGLSurface *surf)
128dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu{
129dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu   return (surf) ? _eglPutResource(&surf->Resource) : EGL_FALSE;
130dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu}
131dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu
132dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu
133dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu/**
1344ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu * Link a surface to its display and return the handle of the link.
135ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu * The handle can be passed to client directly.
136ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu */
1377bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline EGLSurface
1384ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu_eglLinkSurface(_EGLSurface *surf)
139b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu{
1404ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   _eglLinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE);
141ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   return (EGLSurface) surf;
142b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu}
143b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
144b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
145ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu/**
146ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu * Unlink a linked surface from its display.
147ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu * Accessing an unlinked surface should generate EGL_BAD_SURFACE error.
148ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu */
1497bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline void
150ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu_eglUnlinkSurface(_EGLSurface *surf)
151ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu{
152ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   _eglUnlinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE);
153ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu}
154b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
155b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
156b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu/**
157b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu * Lookup a handle to find the linked surface.
158b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu * Return NULL if the handle has no corresponding linked surface.
159b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu */
1607bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLSurface *
161b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu_eglLookupSurface(EGLSurface surface, _EGLDisplay *dpy)
162b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu{
163b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu   _EGLSurface *surf = (_EGLSurface *) surface;
164dbb866ab33862defc2749134805bafebf323fd11Chia-I Wu   if (!dpy || !_eglCheckResource((void *) surf, _EGL_RESOURCE_SURFACE, dpy))
165b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu      surf = NULL;
166b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu   return surf;
167b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu}
168b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
169b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
170b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu/**
171b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu * Return the handle of a linked surface, or EGL_NO_SURFACE.
172b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu */
1737bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline EGLSurface
174b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu_eglGetSurfaceHandle(_EGLSurface *surf)
175b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu{
176ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   _EGLResource *res = (_EGLResource *) surf;
177ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   return (res && _eglIsResourceLinked(res)) ?
178ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu      (EGLSurface) surf : EGL_NO_SURFACE;
179b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu}
180b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
181b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
1828362068c1b28eb2d3e334abc980c4711957d61fdAlexander von Gluck IV#ifdef __cplusplus
1838362068c1b28eb2d3e334abc980c4711957d61fdAlexander von Gluck IV}
1848362068c1b28eb2d3e334abc980c4711957d61fdAlexander von Gluck IV#endif
1858362068c1b28eb2d3e334abc980c4711957d61fdAlexander von Gluck IV
186adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#endif /* EGLSURFACE_INCLUDED */
187