2012-05-25 43 views
1

我正在嘗試創建EGL上下文以在本機函數調用中使用OpenglES繪製所有內容。問題是我需要訪問NativeWindowType實例,但我只能找到一個函數來創建一個(我無法找到如何鏈接)。但是,即使我創建了一個,我懷疑這是錯誤的,因爲我真正需要的是由SurfaceView實例創建的,我將其稱爲此本機函數。當在Java SurfaceView中創建NativeWindowType時,如何從本地函數創建EGL上下文?

下面是代碼:

static int egl_init() { 

const EGLint attribs[] = { 
     EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 
     EGL_BLUE_SIZE, 8, 
     EGL_GREEN_SIZE, 8, 
     EGL_RED_SIZE, 8, 
     EGL_NONE 
}; 
EGLint w, h, dummy, format; 
EGLint egl_major_version, egl_minor_version; 
EGLint numConfigs; 
EGLConfig egl_config; 
EGLSurface egl_surface; 
EGLContext egl_context; 

EGLDisplay egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 

// v--------- This is where I should get the display window 
NativeWindowType display_window; 
display_window = android_createDisplaySurface(); 

eglInitialize(egl_display, &egl_major_version, &egl_minor_version); 
printf("GL Version: %d.%d\n", egl_major_version, egl_minor_version); 

if (!eglChooseConfig(egl_display, attribs, &egl_config, 1, &numConfigs)) 
{ 
    printf("eglChooseConfig failed\n"); 
    if (egl_context == 0) printf("Error code: %x\n", eglGetError()); 
} 

eglGetConfigAttrib(egl_display, egl_config, EGL_NATIVE_VISUAL_ID, &format); 

// v---------- This requires that I link libandroid, it is found in android/native_window.h 
ANativeWindow_setBuffersGeometry(display_window, 0, 0, format); 

egl_context = eglCreateContext(egl_display, egl_config, EGL_NO_CONTEXT, NULL); 
if (egl_context == 0) LOGE("Error code: %x\n", eglGetError()); 

egl_surface = eglCreateWindowSurface(egl_display, egl_config, display_window, NULL); 
if (egl_surface == 0) LOGE("Error code: %x\n", eglGetError()); 

if (eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context) == EGL_FALSE) { 
    LOGE("Unable to eglMakeCurrent"); 
    return -1; 
} 
return 0; 
} 

感謝您的幫助

+2

請勿使用android_createDisplaySurface()。它不是一個公共的API,它只適用於支持舊的幀緩衝區HAL的設備(最新的Nexus設備都不支持它)。 – fadden

回答

2

表面不能支持請求的EGL配置(紅,綠,藍是至少8位)。

const EGLint attribs[] = { 
       EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 
       EGL_BLUE_SIZE, 8, 
       EGL_GREEN_SIZE, 8, 
       EGL_RED_SIZE, 8, 
       EGL_NONE 
}; 

某些電話默認情況下會使所有表面緩衝區RGB_565。

在Java中,爲了獲得更多的顏色或alpha,你可以使用getWindow和setFormat()。像這樣: getWindow()。setFormat(PixelFormat.TRANSLUCENT); 要在本地活動中做相同的事情,您必須執行以下操作。

ANativeWindow_setBuffersGeometry(display_window, 0, 0, 1); 

在安卓/ native_window.h

/* 
* Pixel formats that a window can use. 
*/ 
enum { 
     WINDOW_FORMAT_RGBA_8888   = 1, 
     WINDOW_FORMAT_RGBX_8888   = 2, 
     WINDOW_FORMAT_RGB_565     = 4, 
}; 

希望這有助於定義。我已經看到了這個問題,我只是想出了它。