1f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu/**************************************************************************
2f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
3f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
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
34adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
35adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egltypedefs.h"
36ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu#include "egldisplay.h"
37adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
38adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
39adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
40adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * "Base" class for device driver surfaces.
41adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
42adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paulstruct _egl_surface
43adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
44ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   /* A surface is a display resource */
45ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   _EGLResource Resource;
4618457cb263e3e062e12314e7b3d5c81a7f2ba048Chia-I Wu
4700e1790f3230de550121591d611b47da299ae15cChia-I Wu   /* The context that is currently bound to the surface */
4800e1790f3230de550121591d611b47da299ae15cChia-I Wu   _EGLContext *CurrentContext;
49adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5007ee01365a8bddf6f50821ecd585784498a25ff0Chia-I Wu   _EGLConfig *Config;
5107ee01365a8bddf6f50821ecd585784498a25ff0Chia-I Wu
52adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint Type; /* one of EGL_WINDOW_BIT, EGL_PIXMAP_BIT or EGL_PBUFFER_BIT */
53eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu
54eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   /* attributes set by attribute list */
55adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint Width, Height;
56eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum TextureFormat;
57eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum TextureTarget;
58eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLBoolean MipmapTexture;
59eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLBoolean LargestPbuffer;
60eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum RenderBuffer;
61eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum VGAlphaFormat;
62eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum VGColorspace;
63eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu
64eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   /* attributes set by eglSurfaceAttrib */
65eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLint MipmapLevel;
66eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum MultisampleResolve;
67eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLenum SwapBehavior;
68eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu
69eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLint HorizontalResolution, VerticalResolution;
70eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu   EGLint AspectRatio;
71eb961f81d53405ab04e021703228ddb15190d75fChia-I Wu
72adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint SwapInterval;
73adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7400e1790f3230de550121591d611b47da299ae15cChia-I Wu   /* True if the surface is bound to an OpenGL ES texture */
7500e1790f3230de550121591d611b47da299ae15cChia-I Wu   EGLBoolean BoundToTexture;
767d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
777d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   EGLBoolean PostSubBufferSupportedNV;
78adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul};
79adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
80adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
81897cb8950ae14ffe7029b1daf16113ff62ce0dfeChia-I WuPUBLIC EGLBoolean
82d69242be55091e53b0ae2cfa6282790ce1862f29Chia-I Wu_eglInitSurface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type,
83cca31340b5a9c0b941946753a31236c7201ca87cChia-I Wu                _EGLConfig *config, const EGLint *attrib_list);
84adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
85adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
86adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paulextern EGLBoolean
872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglQuerySurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint *value);
88adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
89adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
90adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paulextern EGLBoolean
912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint value);
92adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
93adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
945dc0f49084f322dd8ff6eb585212eea8b50e3377Kristian HøgsbergPUBLIC extern EGLBoolean
952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint buffer);
96adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
97adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
98adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paulextern EGLBoolean
9957da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu_eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint interval);
100adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
101adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10207ee01365a8bddf6f50821ecd585784498a25ff0Chia-I Wu/**
103dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu * Increment reference count for the surface.
104dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu */
105dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wustatic INLINE _EGLSurface *
106dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu_eglGetSurface(_EGLSurface *surf)
107dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu{
108dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu   if (surf)
109dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu      _eglGetResource(&surf->Resource);
110dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu   return surf;
111dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu}
112dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu
113dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu
114dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu/**
115dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu * Decrement reference count for the surface.
116dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu */
117dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wustatic INLINE EGLBoolean
118dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu_eglPutSurface(_EGLSurface *surf)
119dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu{
120dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu   return (surf) ? _eglPutResource(&surf->Resource) : EGL_FALSE;
121dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu}
122dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu
123dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu
124dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu/**
1254ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu * Link a surface to its display and return the handle of the link.
126ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu * The handle can be passed to client directly.
127ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu */
128ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wustatic INLINE EGLSurface
1294ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu_eglLinkSurface(_EGLSurface *surf)
130b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu{
1314ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   _eglLinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE);
132ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   return (EGLSurface) surf;
133b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu}
134b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
135b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
136ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu/**
137ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu * Unlink a linked surface from its display.
138ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu * Accessing an unlinked surface should generate EGL_BAD_SURFACE error.
139ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu */
140ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wustatic INLINE void
141ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu_eglUnlinkSurface(_EGLSurface *surf)
142ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu{
143ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   _eglUnlinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE);
144ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu}
145b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
146b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
147b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu/**
148b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu * Lookup a handle to find the linked surface.
149b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu * Return NULL if the handle has no corresponding linked surface.
150b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu */
151b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wustatic INLINE _EGLSurface *
152b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu_eglLookupSurface(EGLSurface surface, _EGLDisplay *dpy)
153b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu{
154b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu   _EGLSurface *surf = (_EGLSurface *) surface;
155dbb866ab33862defc2749134805bafebf323fd11Chia-I Wu   if (!dpy || !_eglCheckResource((void *) surf, _EGL_RESOURCE_SURFACE, dpy))
156b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu      surf = NULL;
157b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu   return surf;
158b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu}
159b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
160b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
161b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu/**
162b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu * Return the handle of a linked surface, or EGL_NO_SURFACE.
163b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu */
164b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wustatic INLINE EGLSurface
165b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu_eglGetSurfaceHandle(_EGLSurface *surf)
166b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu{
167ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   _EGLResource *res = (_EGLResource *) surf;
168ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   return (res && _eglIsResourceLinked(res)) ?
169ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu      (EGLSurface) surf : EGL_NO_SURFACE;
170b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu}
171b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
172b4d2c97a2d2cce92fa638ff74bef7dedf593fd1fChia-I Wu
173adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#endif /* EGLSURFACE_INCLUDED */
174