1f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu/**************************************************************************
2f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
3f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com>
4f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2010-2011 LunarG, Inc.
5f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * All Rights Reserved.
6f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
7f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
8f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * copy of this software and associated documentation files (the
9f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * "Software"), to deal in the Software without restriction, including
10f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * without limitation the rights to use, copy, modify, merge, publish,
11f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * distribute, sub license, and/or sell copies of the Software, and to
12f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * permit persons to whom the Software is furnished to do so, subject to
13f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * the following conditions:
14f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
15f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * The above copyright notice and this permission notice (including the
16f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * next paragraph) shall be included in all copies or substantial portions
17f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * of the Software.
18f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
19f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * DEALINGS IN THE SOFTWARE.
26f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
27f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu **************************************************************************/
28f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu
29f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu
30a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#include <assert.h>
31e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu#include <string.h>
32a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
33a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#include "eglimage.h"
34e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu#include "egllog.h"
35a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
36a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
37e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu/**
38e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu * Parse the list of image attributes and return the proper error code.
39e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu */
40713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I WuEGLint
41713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu_eglParseImageAttribList(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
42713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu                         const EGLint *attrib_list)
43a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
44e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu   EGLint i, err = EGL_SUCCESS;
45a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
46713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu   (void) dpy;
47713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu
48071501a68129768c6223beb24f7363d87c6684eaDylan Noblesmith   memset(attrs, 0, sizeof(*attrs));
49713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu   attrs->ImagePreserved = EGL_FALSE;
50713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu   attrs->GLTextureLevel = 0;
51713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu   attrs->GLTextureZOffset = 0;
52713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu
53e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu   if (!attrib_list)
54713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu      return err;
55a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
56e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu   for (i = 0; attrib_list[i] != EGL_NONE; i++) {
57e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu      EGLint attr = attrib_list[i++];
58e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu      EGLint val = attrib_list[i];
59e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu
60e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu      switch (attr) {
61713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu      /* EGL_KHR_image_base */
62a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      case EGL_IMAGE_PRESERVED_KHR:
63713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu         attrs->ImagePreserved = val;
64a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu         break;
65713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu
66713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu      /* EGL_KHR_gl_image */
670135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu      case EGL_GL_TEXTURE_LEVEL_KHR:
68713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu         attrs->GLTextureLevel = val;
690135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu         break;
700135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu      case EGL_GL_TEXTURE_ZOFFSET_KHR:
71713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu         attrs->GLTextureZOffset = val;
720135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu         break;
735664a983867038de48e71b65df89e0e254085af2Chia-I Wu
745664a983867038de48e71b65df89e0e254085af2Chia-I Wu      /* EGL_MESA_drm_image */
755664a983867038de48e71b65df89e0e254085af2Chia-I Wu      case EGL_WIDTH:
765664a983867038de48e71b65df89e0e254085af2Chia-I Wu         attrs->Width = val;
775664a983867038de48e71b65df89e0e254085af2Chia-I Wu         break;
785664a983867038de48e71b65df89e0e254085af2Chia-I Wu      case EGL_HEIGHT:
795664a983867038de48e71b65df89e0e254085af2Chia-I Wu         attrs->Height = val;
805664a983867038de48e71b65df89e0e254085af2Chia-I Wu         break;
815664a983867038de48e71b65df89e0e254085af2Chia-I Wu      case EGL_DRM_BUFFER_FORMAT_MESA:
825664a983867038de48e71b65df89e0e254085af2Chia-I Wu         attrs->DRMBufferFormatMESA = val;
835664a983867038de48e71b65df89e0e254085af2Chia-I Wu         break;
845664a983867038de48e71b65df89e0e254085af2Chia-I Wu      case EGL_DRM_BUFFER_USE_MESA:
855664a983867038de48e71b65df89e0e254085af2Chia-I Wu         attrs->DRMBufferUseMESA = val;
865664a983867038de48e71b65df89e0e254085af2Chia-I Wu         break;
875664a983867038de48e71b65df89e0e254085af2Chia-I Wu      case EGL_DRM_BUFFER_STRIDE_MESA:
885664a983867038de48e71b65df89e0e254085af2Chia-I Wu         attrs->DRMBufferStrideMESA = val;
895664a983867038de48e71b65df89e0e254085af2Chia-I Wu         break;
905664a983867038de48e71b65df89e0e254085af2Chia-I Wu
91e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg      /* EGL_WL_bind_wayland_display */
92e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg      case EGL_WAYLAND_PLANE_WL:
93e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg         attrs->PlaneWL = val;
94e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg         break;
95e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
96a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      default:
970135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu         /* unknown attrs are ignored */
98e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu         break;
99e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu      }
100e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu
101e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu      if (err != EGL_SUCCESS) {
102e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu         _eglLog(_EGL_DEBUG, "bad image attribute 0x%04x", attr);
103a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu         break;
104a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      }
105a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   }
106a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
107e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu   return err;
108e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu}
109e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu
110e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu
111e694ccad803157b71b2de78d63ee6dacc489faabChia-I WuEGLBoolean
112713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu_eglInitImage(_EGLImage *img, _EGLDisplay *dpy)
113e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu{
114dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu   _eglInitResource(&img->Resource, sizeof(*img), dpy);
115e694ccad803157b71b2de78d63ee6dacc489faabChia-I Wu
116a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   return EGL_TRUE;
117a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
118