android — eglMakeCurrent () успешен, но контекст показывает, что поверхность не привязана

Моя платформа — встроенная система Android (4.4),
для каких-то целей я использую opengl уровня C для рисования чего-либо (не использую java opengl lib)
и мне не нужно, чтобы выходное изображение показывалось на мониторе
поэтому я использую Pbuffer для закадрового рендера

Когда я использую eglMakeCurrent (), чтобы связать поверхность и контекст, он возвращает Success.
Но в этот момент я использую

eglQueryContext(g_eglDisplay,context,EGL_RENDER_BUFFER,&value);
printf("EGL_RENDER_BUFFER[%X]\n",value);

чтобы запросить привязку поверхности с контекстом, он показывает EGL_NONE

в чем дело ? или он не может использовать opengl C lib непосредственно в Android Environmemt?

мой исходный код и Android.mk

drawline.cpp

#include <stdio.h>
#include <stdlib.h>
#include <GLES/gl.h>
#include <EGL/egl.h>

#define WIN_W 512
#define WIN_H 512

EGLDisplay g_eglDisplay = 0;
EGLConfig *g_eglConfig = NULL;
EGLContext g_eglContext = 0;
EGLSurface g_eglSurface = 0;static const EGLint g_configAttribs[] ={
EGL_RED_SIZE,             8,
EGL_GREEN_SIZE,           8,
EGL_BLUE_SIZE,            8,
EGL_ALPHA_SIZE,                   8,
EGL_DEPTH_SIZE,                   16,
EGL_SURFACE_TYPE,         EGL_PBUFFER_BIT,
EGL_RENDERABLE_TYPE,      EGL_OPENGL_ES_BIT,
EGL_NONE
};EGLint g_PBufAttribs[] = {
EGL_WIDTH,                  WIN_W,
EGL_HEIGHT,                 WIN_H,
//EGL_LARGEST_PBUFFER,  EGL_TRUE,
EGL_NONE
};
// indicate which version of OPENGL
EGLint g_textAttribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 1,
EGL_NONE
};

int printEGLConfigAttribs(EGLConfig);
int printEGLSurfaceAttribs(EGLSurface);
int printEGLContextAttribs(EGLContext);

int main(){
GLint a;

printf("hello word! 3\n");

g_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);

if (g_eglDisplay == EGL_NO_DISPLAY)
{
printf("Unable to initialise EGL display.");
return 0;
}

EGLint major,minor;
// Initialise egl, 2&3 para is null because I don't care the EGL version

if (!eglInitialize(g_eglDisplay, &major, &minor))
{
printf("Unable to initialise EGL display.");
return 0;
}
printf("eglInitialize  major[%d] minor[%d]\n",major,minor);

if( !eglBindAPI(EGL_OPENGL_ES_API)){
printf("[%s][%d] eglBindAPI  err! eglGetError():
%d\n",__FUNCTION__,__LINE__,eglGetError());
return 0;
}

printf("current rendering API : %d\n",eglQueryAPI());

// Find a matching config
EGLint numConfigsOut = 0;
//Get the config num for malloc suitable memory size
if (eglChooseConfig(g_eglDisplay, g_configAttribs, NULL, 0, &numConfigsOut) != EGL_TRUE ||
numConfigsOut == 0)
{
//fprintf(stderr, "Unable to find appropriate EGL config.");
printf("Unable to find appropriate EGL config. , eglGetError()= %d \n",eglGetError());
return 0;
}
printf("numConfigsOut = %d\n",numConfigsOut);

g_eglConfig = (EGLConfig*)malloc(numConfigsOut * sizeof(EGLConfig));
if(g_eglConfig == (EGLConfig*)0){
printf("Unable to malloc config list space. , eglGetError()= %d \n",eglGetError());
}

//get the config list
if (eglChooseConfig(g_eglDisplay, g_configAttribs, g_eglConfig, numConfigsOut, &numConfigsOut) != EGL_TRUE || numConfigsOut == 0)
{
//fprintf(stderr, "Unable to find appropriate EGL config.");
printf("Unable to get appropriate EGL config. , eglGetError()= %d \n",eglGetError());
return 0;
}

// choose one config
EGLConfig eglconfig_tmp = *(g_eglConfig);

printEGLConfigAttribs(eglconfig_tmp);g_eglSurface = eglCreatePbufferSurface(g_eglDisplay ,eglconfig_tmp ,g_PBufAttribs);

if(g_eglSurface == EGL_NO_SURFACE){
printf("Create Surface Fail! \n");
return 0;
}

printEGLSurfaceAttribs(g_eglSurface);

g_eglContext = eglCreateContext(g_eglDisplay ,eglconfig_tmp ,EGL_NO_CONTEXT ,g_textAttribs);

if(g_eglContext == EGL_NO_CONTEXT){
printf("Create eglContex Fail! \n");
return 0;
}

printEGLContextAttribs(g_eglContext);

//attach an EGL rendering context to EGL surfaces
if(!eglMakeCurrent(g_eglDisplay ,g_eglSurface ,g_eglSurface ,g_eglContext)){
printf("eglMakeCurrent Fail! \n");
return 0;
}

return 0;
}

Andorid.mk

LOCAL_PATH:= $(call my-dir)

###############################################################################
# drawline
###############################################################################
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS:= optional

# Require higher permission
#LOCAL_CERTIFICATE := platform

# All of the source files that we will compile.
LOCAL_SRC_FILES:= \
drawline.cpp

# All of the shared libraries we link against.
LOCAL_SHARED_LIBRARIES := \
libGLESv1_CM \
libEGL \

# This is the target being built.
LOCAL_MODULE := drawline

include $(BUILD_EXECUTABLE)

#include $(call all-makefiles-under,$(LOCAL_PATH))

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]