Jogamp
8a9c5f948a7c24981a1db3dd5c9b6613562e6d06
[jogl.git] / src / newt / native / BroadcomEGL.c
1 /*
2  * Copyright (c) 2008 Sun Microsystems, Inc. All Rights Reserved.
3  * 
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  * 
8  * - Redistribution of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * 
11  * - Redistribution in binary form must reproduce the above copyright
12  *   notice, this list of conditions and the following disclaimer in the
13  *   documentation and/or other materials provided with the distribution.
14  * 
15  * Neither the name of Sun Microsystems, Inc. or the names of
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  * 
19  * This software is provided "AS IS," without a warranty of any kind. ALL
20  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
21  * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
22  * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
23  * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
24  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
25  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
26  * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
27  * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
28  * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
29  * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
30  * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
31  * 
32  */
33
34 #ifdef _WIN32
35   #include <windows.h>
36 #else
37   #include <inttypes.h>
38 #endif
39
40 #include <stdlib.h>
41 #include <stdio.h>
42 #include <string.h>
43
44 #include "com_jogamp_javafx_newt_opengl_broadcom_egl_Window.h"
45
46 #include "EventListener.h"
47 #include "MouseEvent.h"
48 #include "KeyEvent.h"
49
50 #include <EGL/egl.h>
51
52 typedef unsigned int    GLuint;
53
54 EGLDisplay EGLUtil_CreateDisplayByNative( GLuint uiWidth, GLuint uiHeight );
55 void EGLUtil_DestroyDisplay( EGLDisplay eglDisplay );
56
57 EGLSurface EGLUtil_CreateWindowByNative( EGLDisplay eglDisplay, /* bool */ GLuint bChromakey, GLuint *puiWidth, GLuint *puiHeight );
58 void EGLUtil_DestroyWindow( EGLDisplay eglDisplay, EGLSurface eglSurface );
59 void EGLUtil_SwapWindow( EGLDisplay eglDisplay, EGLSurface eglSurface );
60
61 #define VERBOSE_ON 1
62
63 #ifdef VERBOSE_ON
64     #define DBG_PRINT(...) fprintf(stdout, __VA_ARGS__)
65 #else
66     #define DBG_PRINT(...)
67 #endif
68
69 static jmethodID windowCreatedID = NULL;
70
71 /**
72  * Display
73  */
74
75 JNIEXPORT void JNICALL Java_com_jogamp_javafx_newt_opengl_broadcom_egl_Display_DispatchMessages
76   (JNIEnv *env, jobject obj)
77 {
78     // FIXME: n/a
79     (void) env;
80     (void) obj;
81 }
82
83 JNIEXPORT jlong JNICALL Java_com_jogamp_javafx_newt_opengl_broadcom_egl_Display_CreateDisplay
84   (JNIEnv *env, jobject obj, jint width, jint height)
85 {
86     (void) env;
87     (void) obj;
88     EGLDisplay dpy = EGLUtil_CreateDisplayByNative( (GLuint) width, (GLuint) height );
89     if(NULL==dpy) {
90         fprintf(stderr, "[CreateDisplay] failed: NULL\n");
91     } else {
92         DBG_PRINT( "[CreateDisplay] ok: %p, %ux%u\n", dpy, width, height);
93     }
94     return (jlong) (intptr_t) dpy;
95 }
96
97 JNIEXPORT void JNICALL Java_com_jogamp_javafx_newt_opengl_broadcom_egl_Display_DestroyDisplay
98   (JNIEnv *env, jobject obj, jlong display)
99 {
100     EGLDisplay dpy  = (EGLDisplay)(intptr_t)display;
101     (void) env;
102     (void) obj;
103     DBG_PRINT( "[DestroyDisplay] dpy %p\n", dpy);
104
105     EGLUtil_DestroyDisplay(dpy);
106
107     DBG_PRINT( "[DestroyDisplay] X\n");
108 }
109
110 /**
111  * Window
112  */
113
114 JNIEXPORT jboolean JNICALL Java_com_jogamp_javafx_newt_opengl_broadcom_egl_Window_initIDs
115   (JNIEnv *env, jclass clazz)
116 {
117     windowCreatedID = (*env)->GetMethodID(env, clazz, "windowCreated", "(III)V");
118     if (windowCreatedID == NULL) {
119         DBG_PRINT( "initIDs failed\n" );
120         return JNI_FALSE;
121     }
122     DBG_PRINT( "initIDs ok\n" );
123     return JNI_TRUE;
124 }
125
126 JNIEXPORT jlong JNICALL Java_com_jogamp_javafx_newt_opengl_broadcom_egl_Window_CreateWindow
127   (JNIEnv *env, jobject obj, jlong display, jboolean chromaKey, jint width, jint height)
128 {
129     EGLDisplay dpy  = (EGLDisplay)(intptr_t)display;
130     EGLSurface window = 0;
131     GLuint uiWidth=(GLuint)width, uiHeight=(GLuint)height;
132
133     if(dpy==NULL) {
134         fprintf(stderr, "[RealizeWindow] invalid display connection..\n");
135         return 0;
136     }
137     DBG_PRINT( "[RealizeWindow.Create] dpy %p %ux%u\n", dpy, uiWidth, uiHeight);
138
139     window = EGLUtil_CreateWindowByNative( dpy, chromaKey, &uiWidth, &uiHeight );
140
141     if(NULL==window) {
142         fprintf(stderr, "[RealizeWindow.Create] failed: NULL\n");
143         return 0;
144     }
145     EGLint cfgID=0;
146     if(EGL_FALSE==eglQuerySurface(dpy, window, EGL_CONFIG_ID, &cfgID)) {
147         fprintf(stderr, "[RealizeWindow.ConfigID] failed: window %p\n", window);
148         EGLUtil_DestroyWindow(dpy, window);
149         return 0;
150     }
151     (*env)->CallVoidMethod(env, obj, windowCreatedID, (jint) cfgID, (jint)uiWidth, (jint)uiHeight);
152     DBG_PRINT( "[RealizeWindow.Create] ok: win %p, cfgid %d, %ux%u\n", window, cfgID, uiWidth, uiHeight);
153
154     // release and destroy already made context ..
155     EGLContext ctx = eglGetCurrentContext();
156     DBG_PRINT( "[RealizeWindow.Create] ctx %p - KEEP ALIVE \n", ctx);
157     /*eglMakeCurrent(dpy,
158                   EGL_NO_SURFACE,
159                   EGL_NO_SURFACE,
160                   EGL_NO_CONTEXT); */
161     DBG_PRINT( "[RealizeWindow.Create] 2\n");
162     // eglDestroyContext(dpy, ctx); // culprit ? FIXME ?
163     DBG_PRINT( "[RealizeWindow.Create] 2 - eglDestroyContext - DISABLED - Duh ?\n");
164     
165     DBG_PRINT( "[RealizeWindow.Create] X\n");
166
167     return (jlong) (intptr_t) window;
168 }
169
170 JNIEXPORT void JNICALL Java_com_jogamp_javafx_newt_opengl_broadcom_egl_Window_CloseWindow
171   (JNIEnv *env, jobject obj, jlong display, jlong window)
172 {
173     EGLDisplay dpy  = (EGLDisplay) (intptr_t) display;
174     EGLSurface surf = (EGLSurface) (intptr_t) window;
175
176     DBG_PRINT( "[CloseWindow] dpy %p, win %p\n", dpy, surf);
177
178     EGLUtil_DestroyWindow(dpy, surf);
179
180     DBG_PRINT( "[CloseWindow] X\n");
181 }
182
183 JNIEXPORT void JNICALL Java_com_jogamp_javafx_newt_opengl_broadcom_egl_Window_SwapWindow
184   (JNIEnv *env, jobject obj, jlong display, jlong window)
185 {
186     EGLDisplay dpy  = (EGLDisplay) (intptr_t) display;
187     EGLSurface surf = (EGLSurface) (intptr_t) window;
188
189     DBG_PRINT( "[SwapWindow] dpy %p, win %p\n", dpy, surf);
190
191     EGLUtil_SwapWindow( dpy, surf );
192
193     DBG_PRINT( "[SwapWindow] X\n");
194 }
195
http://JogAmp.org git info: FAQ, tutorial and man pages.