st/egl: Factor driver callbacks to a new file.
[mesa.git] / src / gallium / state_trackers / egl / common / egl_g3d_image.c
1 /*
2 * Mesa 3-D graphics library
3 * Version: 7.8
4 *
5 * Copyright (C) 2010 LunarG Inc.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
26 */
27
28 #include "pipe/p_screen.h"
29 #include "util/u_memory.h"
30 #include "util/u_rect.h"
31 #include "util/u_inlines.h"
32 #include "eglcurrent.h"
33
34 #include "native.h"
35 #include "egl_g3d.h"
36 #include "egl_g3d_api.h"
37 #include "egl_g3d_image.h"
38
39 /**
40 * Reference and return the front left buffer of the native pixmap.
41 */
42 static struct pipe_resource *
43 egl_g3d_reference_native_pixmap(_EGLDisplay *dpy, EGLNativePixmapType pix)
44 {
45 struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
46 struct egl_g3d_config *gconf;
47 struct native_surface *nsurf;
48 struct pipe_resource *textures[NUM_NATIVE_ATTACHMENTS];
49 enum native_attachment natt;
50
51 gconf = egl_g3d_config(egl_g3d_find_pixmap_config(dpy, pix));
52 if (!gconf)
53 return NULL;
54
55 nsurf = gdpy->native->create_pixmap_surface(gdpy->native,
56 pix, gconf->native);
57 if (!nsurf)
58 return NULL;
59
60 natt = NATIVE_ATTACHMENT_FRONT_LEFT;
61 if (!nsurf->validate(nsurf, 1 << natt, NULL, textures, NULL, NULL))
62 textures[natt] = NULL;
63
64 nsurf->destroy(nsurf);
65
66 return textures[natt];
67 }
68
69 _EGLImage *
70 egl_g3d_create_image(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx,
71 EGLenum target, EGLClientBuffer buffer,
72 const EGLint *attribs)
73 {
74 struct pipe_resource *ptex;
75 struct egl_g3d_image *gimg;
76 unsigned face = 0, level = 0, zslice = 0;
77
78 gimg = CALLOC_STRUCT(egl_g3d_image);
79 if (!gimg) {
80 _eglError(EGL_BAD_ALLOC, "eglCreatePbufferSurface");
81 return NULL;
82 }
83
84 if (!_eglInitImage(&gimg->base, dpy, attribs)) {
85 free(gimg);
86 return NULL;
87 }
88
89 switch (target) {
90 case EGL_NATIVE_PIXMAP_KHR:
91 ptex = egl_g3d_reference_native_pixmap(dpy,
92 (EGLNativePixmapType) buffer);
93 break;
94 default:
95 ptex = NULL;
96 break;
97 }
98
99 if (!ptex) {
100 free(gimg);
101 return NULL;
102 }
103
104 if (level > ptex->last_level) {
105 _eglError(EGL_BAD_MATCH, "eglCreateEGLImageKHR");
106 pipe_resource_reference(&gimg->texture, NULL);
107 free(gimg);
108 return NULL;
109 }
110 if (zslice > ptex->depth0) {
111 _eglError(EGL_BAD_PARAMETER, "eglCreateEGLImageKHR");
112 pipe_resource_reference(&gimg->texture, NULL);
113 free(gimg);
114 return NULL;
115 }
116
117 /* transfer the ownership to the image */
118 gimg->texture = ptex;
119 gimg->face = face;
120 gimg->level = level;
121 gimg->zslice = zslice;
122
123 return &gimg->base;
124 }
125
126 EGLBoolean
127 egl_g3d_destroy_image(_EGLDriver *drv, _EGLDisplay *dpy, _EGLImage *img)
128 {
129 struct egl_g3d_image *gimg = egl_g3d_image(img);
130
131 pipe_resource_reference(&gimg->texture, NULL);
132 free(gimg);
133
134 return EGL_TRUE;
135 }