1*54e60f84SAndroid Build Coastguard Worker /*
2*54e60f84SAndroid Build Coastguard Worker * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
3*54e60f84SAndroid Build Coastguard Worker *
4*54e60f84SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*54e60f84SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
6*54e60f84SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
7*54e60f84SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
8*54e60f84SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
9*54e60f84SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
10*54e60f84SAndroid Build Coastguard Worker * the following conditions:
11*54e60f84SAndroid Build Coastguard Worker *
12*54e60f84SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
13*54e60f84SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
14*54e60f84SAndroid Build Coastguard Worker * of the Software.
15*54e60f84SAndroid Build Coastguard Worker *
16*54e60f84SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17*54e60f84SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18*54e60f84SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19*54e60f84SAndroid Build Coastguard Worker * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20*54e60f84SAndroid Build Coastguard Worker * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21*54e60f84SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22*54e60f84SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23*54e60f84SAndroid Build Coastguard Worker */
24*54e60f84SAndroid Build Coastguard Worker
25*54e60f84SAndroid Build Coastguard Worker #include "sysdeps.h"
26*54e60f84SAndroid Build Coastguard Worker #include <stdlib.h>
27*54e60f84SAndroid Build Coastguard Worker #include "va_glx_private.h"
28*54e60f84SAndroid Build Coastguard Worker #include "va_glx_impl.h"
29*54e60f84SAndroid Build Coastguard Worker
30*54e60f84SAndroid Build Coastguard Worker #define INIT_CONTEXT(ctx, dpy) do { \
31*54e60f84SAndroid Build Coastguard Worker if (!vaDisplayIsValid(dpy)) \
32*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_DISPLAY; \
33*54e60f84SAndroid Build Coastguard Worker \
34*54e60f84SAndroid Build Coastguard Worker ctx = ((VADisplayContextP)(dpy))->pDriverContext; \
35*54e60f84SAndroid Build Coastguard Worker if (!(ctx)) \
36*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_DISPLAY; \
37*54e60f84SAndroid Build Coastguard Worker \
38*54e60f84SAndroid Build Coastguard Worker VAStatus status = va_glx_init_context(ctx); \
39*54e60f84SAndroid Build Coastguard Worker if (status != VA_STATUS_SUCCESS) \
40*54e60f84SAndroid Build Coastguard Worker return status; \
41*54e60f84SAndroid Build Coastguard Worker } while (0)
42*54e60f84SAndroid Build Coastguard Worker
43*54e60f84SAndroid Build Coastguard Worker #define INVOKE(ctx, func, args) do { \
44*54e60f84SAndroid Build Coastguard Worker VADriverVTableGLXP vtable; \
45*54e60f84SAndroid Build Coastguard Worker vtable = &VA_DRIVER_CONTEXT_GLX(ctx)->vtable; \
46*54e60f84SAndroid Build Coastguard Worker if (!vtable->va##func##GLX) \
47*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNIMPLEMENTED; \
48*54e60f84SAndroid Build Coastguard Worker status = vtable->va##func##GLX args; \
49*54e60f84SAndroid Build Coastguard Worker } while (0)
50*54e60f84SAndroid Build Coastguard Worker
51*54e60f84SAndroid Build Coastguard Worker
52*54e60f84SAndroid Build Coastguard Worker // Destroy VA/GLX display context
va_DisplayContextDestroy(VADisplayContextP pDisplayContext)53*54e60f84SAndroid Build Coastguard Worker static void va_DisplayContextDestroy(VADisplayContextP pDisplayContext)
54*54e60f84SAndroid Build Coastguard Worker {
55*54e60f84SAndroid Build Coastguard Worker VADisplayContextGLXP pDisplayContextGLX;
56*54e60f84SAndroid Build Coastguard Worker VADriverContextP pDriverContext;
57*54e60f84SAndroid Build Coastguard Worker VADriverContextGLXP pDriverContextGLX;
58*54e60f84SAndroid Build Coastguard Worker
59*54e60f84SAndroid Build Coastguard Worker if (!pDisplayContext)
60*54e60f84SAndroid Build Coastguard Worker return;
61*54e60f84SAndroid Build Coastguard Worker
62*54e60f84SAndroid Build Coastguard Worker pDriverContext = pDisplayContext->pDriverContext;
63*54e60f84SAndroid Build Coastguard Worker pDriverContextGLX = pDriverContext->glx;
64*54e60f84SAndroid Build Coastguard Worker if (pDriverContextGLX) {
65*54e60f84SAndroid Build Coastguard Worker free(pDriverContextGLX);
66*54e60f84SAndroid Build Coastguard Worker pDriverContext->glx = NULL;
67*54e60f84SAndroid Build Coastguard Worker }
68*54e60f84SAndroid Build Coastguard Worker
69*54e60f84SAndroid Build Coastguard Worker pDisplayContextGLX = pDisplayContext->opaque;
70*54e60f84SAndroid Build Coastguard Worker if (pDisplayContextGLX) {
71*54e60f84SAndroid Build Coastguard Worker vaDestroyFunc vaDestroy = pDisplayContextGLX->vaDestroy;
72*54e60f84SAndroid Build Coastguard Worker free(pDisplayContextGLX);
73*54e60f84SAndroid Build Coastguard Worker pDisplayContext->opaque = NULL;
74*54e60f84SAndroid Build Coastguard Worker if (vaDestroy)
75*54e60f84SAndroid Build Coastguard Worker vaDestroy(pDisplayContext);
76*54e60f84SAndroid Build Coastguard Worker }
77*54e60f84SAndroid Build Coastguard Worker }
78*54e60f84SAndroid Build Coastguard Worker
79*54e60f84SAndroid Build Coastguard Worker // Return a suitable VADisplay for VA API
vaGetDisplayGLX(Display * native_dpy)80*54e60f84SAndroid Build Coastguard Worker VADisplay vaGetDisplayGLX(Display *native_dpy)
81*54e60f84SAndroid Build Coastguard Worker {
82*54e60f84SAndroid Build Coastguard Worker VADisplay dpy = NULL;
83*54e60f84SAndroid Build Coastguard Worker VADisplayContextP pDisplayContext = NULL;
84*54e60f84SAndroid Build Coastguard Worker VADisplayContextGLXP pDisplayContextGLX = NULL;
85*54e60f84SAndroid Build Coastguard Worker VADriverContextP pDriverContext;
86*54e60f84SAndroid Build Coastguard Worker VADriverContextGLXP pDriverContextGLX = NULL;
87*54e60f84SAndroid Build Coastguard Worker
88*54e60f84SAndroid Build Coastguard Worker dpy = vaGetDisplay(native_dpy);
89*54e60f84SAndroid Build Coastguard Worker if (!dpy)
90*54e60f84SAndroid Build Coastguard Worker return NULL;
91*54e60f84SAndroid Build Coastguard Worker pDisplayContext = (VADisplayContextP)dpy;
92*54e60f84SAndroid Build Coastguard Worker pDriverContext = pDisplayContext->pDriverContext;
93*54e60f84SAndroid Build Coastguard Worker
94*54e60f84SAndroid Build Coastguard Worker pDisplayContextGLX = calloc(1, sizeof(*pDisplayContextGLX));
95*54e60f84SAndroid Build Coastguard Worker if (!pDisplayContextGLX)
96*54e60f84SAndroid Build Coastguard Worker goto error;
97*54e60f84SAndroid Build Coastguard Worker
98*54e60f84SAndroid Build Coastguard Worker pDriverContextGLX = calloc(1, sizeof(*pDriverContextGLX));
99*54e60f84SAndroid Build Coastguard Worker if (!pDriverContextGLX)
100*54e60f84SAndroid Build Coastguard Worker goto error;
101*54e60f84SAndroid Build Coastguard Worker
102*54e60f84SAndroid Build Coastguard Worker pDriverContext->display_type = VA_DISPLAY_GLX;
103*54e60f84SAndroid Build Coastguard Worker pDisplayContextGLX->vaDestroy = pDisplayContext->vaDestroy;
104*54e60f84SAndroid Build Coastguard Worker pDisplayContext->vaDestroy = va_DisplayContextDestroy;
105*54e60f84SAndroid Build Coastguard Worker pDisplayContext->opaque = pDisplayContextGLX;
106*54e60f84SAndroid Build Coastguard Worker pDriverContext->glx = pDriverContextGLX;
107*54e60f84SAndroid Build Coastguard Worker return dpy;
108*54e60f84SAndroid Build Coastguard Worker
109*54e60f84SAndroid Build Coastguard Worker error:
110*54e60f84SAndroid Build Coastguard Worker free(pDriverContextGLX);
111*54e60f84SAndroid Build Coastguard Worker free(pDisplayContextGLX);
112*54e60f84SAndroid Build Coastguard Worker pDisplayContext->vaDestroy(pDisplayContext);
113*54e60f84SAndroid Build Coastguard Worker return NULL;
114*54e60f84SAndroid Build Coastguard Worker }
115*54e60f84SAndroid Build Coastguard Worker
116*54e60f84SAndroid Build Coastguard Worker // Create a surface used for display to OpenGL
vaCreateSurfaceGLX(VADisplay dpy,GLenum target,GLuint texture,void ** gl_surface)117*54e60f84SAndroid Build Coastguard Worker VAStatus vaCreateSurfaceGLX(
118*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
119*54e60f84SAndroid Build Coastguard Worker GLenum target,
120*54e60f84SAndroid Build Coastguard Worker GLuint texture,
121*54e60f84SAndroid Build Coastguard Worker void **gl_surface
122*54e60f84SAndroid Build Coastguard Worker )
123*54e60f84SAndroid Build Coastguard Worker {
124*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
125*54e60f84SAndroid Build Coastguard Worker VAStatus status;
126*54e60f84SAndroid Build Coastguard Worker
127*54e60f84SAndroid Build Coastguard Worker /* Make sure it is a valid GL texture object */
128*54e60f84SAndroid Build Coastguard Worker if (!glIsTexture(texture))
129*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_PARAMETER;
130*54e60f84SAndroid Build Coastguard Worker
131*54e60f84SAndroid Build Coastguard Worker INIT_CONTEXT(ctx, dpy);
132*54e60f84SAndroid Build Coastguard Worker
133*54e60f84SAndroid Build Coastguard Worker INVOKE(ctx, CreateSurface, (ctx, target, texture, gl_surface));
134*54e60f84SAndroid Build Coastguard Worker return status;
135*54e60f84SAndroid Build Coastguard Worker }
136*54e60f84SAndroid Build Coastguard Worker
137*54e60f84SAndroid Build Coastguard Worker // Destroy a VA/GLX surface
vaDestroySurfaceGLX(VADisplay dpy,void * gl_surface)138*54e60f84SAndroid Build Coastguard Worker VAStatus vaDestroySurfaceGLX(
139*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
140*54e60f84SAndroid Build Coastguard Worker void *gl_surface
141*54e60f84SAndroid Build Coastguard Worker )
142*54e60f84SAndroid Build Coastguard Worker {
143*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
144*54e60f84SAndroid Build Coastguard Worker VAStatus status;
145*54e60f84SAndroid Build Coastguard Worker
146*54e60f84SAndroid Build Coastguard Worker INIT_CONTEXT(ctx, dpy);
147*54e60f84SAndroid Build Coastguard Worker
148*54e60f84SAndroid Build Coastguard Worker INVOKE(ctx, DestroySurface, (ctx, gl_surface));
149*54e60f84SAndroid Build Coastguard Worker return status;
150*54e60f84SAndroid Build Coastguard Worker }
151*54e60f84SAndroid Build Coastguard Worker
152*54e60f84SAndroid Build Coastguard Worker // Copy a VA surface to a VA/GLX surface
vaCopySurfaceGLX(VADisplay dpy,void * gl_surface,VASurfaceID surface,unsigned int flags)153*54e60f84SAndroid Build Coastguard Worker VAStatus vaCopySurfaceGLX(
154*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
155*54e60f84SAndroid Build Coastguard Worker void *gl_surface,
156*54e60f84SAndroid Build Coastguard Worker VASurfaceID surface,
157*54e60f84SAndroid Build Coastguard Worker unsigned int flags
158*54e60f84SAndroid Build Coastguard Worker )
159*54e60f84SAndroid Build Coastguard Worker {
160*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
161*54e60f84SAndroid Build Coastguard Worker VAStatus status;
162*54e60f84SAndroid Build Coastguard Worker
163*54e60f84SAndroid Build Coastguard Worker INIT_CONTEXT(ctx, dpy);
164*54e60f84SAndroid Build Coastguard Worker
165*54e60f84SAndroid Build Coastguard Worker INVOKE(ctx, CopySurface, (ctx, gl_surface, surface, flags));
166*54e60f84SAndroid Build Coastguard Worker return status;
167*54e60f84SAndroid Build Coastguard Worker }
168